Skip to content

Commit

Permalink
[DNM] TMP
Browse files Browse the repository at this point in the history
Change-Id: I64051aa9b38f295146cdaf05fecabf84f264f64c
  • Loading branch information
XayahSuSuSu committed Sep 1, 2024
1 parent 0dad4fe commit 1e84037
Show file tree
Hide file tree
Showing 56 changed files with 1,421 additions and 385 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SplashActivity : AppCompatActivity() {
// There is an update
startActivity(Intent(this, SetupActivity::class.java))
} else {
WorkManagerInitializer.initializeAndUpdate(this)
WorkManagerInitializer.fullInitializeAndUpdate(this, true)
startActivity(Intent(this, MainActivity::class.java))
}
finish()
Expand Down
1 change: 1 addition & 0 deletions source/app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -358,4 +358,5 @@
<string name="refresh">刷新</string>
<string name="initializing_app_list">正在初始化应用列表</string>
<string name="updating_app_list">正在更新应用列表</string>
<string name="loading_backups">正在加载备份</string>
</resources>
1 change: 1 addition & 0 deletions source/app/src/main/res/values-zh-rHK/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -358,4 +358,5 @@
<string name="refresh">刷新</string>
<string name="initializing_app_list">正在初始化應用列表</string>
<string name="updating_app_list">正在更新應用列表</string>
<string name="loading_backups">正在加載備份</string>
</resources>
1 change: 1 addition & 0 deletions source/app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -358,4 +358,5 @@
<string name="refresh">刷新</string>
<string name="initializing_app_list">正在初始化應用列表</string>
<string name="updating_app_list">正在更新應用列表</string>
<string name="loading_backups">正在加載備份</string>
</resources>
1 change: 1 addition & 0 deletions source/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -368,4 +368,5 @@
<string name="refresh">Refresh</string>
<string name="initializing_app_list">Initializing app list</string>
<string name="updating_app_list">Updating app list</string>
<string name="loading_backups">Loading backups</string>
</resources>
3 changes: 3 additions & 0 deletions source/core/data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,7 @@ dependencies {

// PickYou
implementation(libs.pickyou)

// Work manager
implementation(libs.androidx.work.runtime.ktx)
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package com.xayah.core.data.repository

import android.content.Context
import com.xayah.core.database.dao.MediaDao
import com.xayah.core.datastore.di.DbDispatchers.Default
import com.xayah.core.datastore.di.Dispatcher
import com.xayah.core.hiddenapi.castTo
import com.xayah.core.model.File
import com.xayah.core.model.OpType
import com.xayah.core.model.database.MediaEntity
import com.xayah.core.model.database.asExternalModel
import com.xayah.core.rootservice.service.RemoteRootService
import com.xayah.core.util.PathUtil
import com.xayah.core.util.withLog
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flowOn
import javax.inject.Inject

class FilesRepo @Inject constructor(
@ApplicationContext private val context: Context,
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
private val filesDao: MediaDao,
private val mediaRepo: MediaRepository,
private val pathUtil: PathUtil,
private val rootService: RemoteRootService,
private val cloudRepo: CloudRepository,
) {
fun getFiles(
opType: OpType,
listData: Flow<ListData>,
cloudName: String,
backupDir: String
): Flow<List<File>> = combine(
listData,
when (opType) {
OpType.BACKUP -> filesDao.queryFilesFlow(opType = opType, existed = true, blocked = false)
OpType.RESTORE -> filesDao.queryFilesFlow(opType = opType, cloud = cloudName, backupDir = backupDir)
}
) { lData, files ->
val data = lData.castTo<ListData.Files>()
files.asSequence()
.filter(mediaRepo.getKeyPredicateNew(key = data.searchQuery))
.sortedWith(mediaRepo.getSortComparatorNew(sortIndex = data.sortIndex, sortType = data.sortType))
.sortedByDescending { p -> p.extraInfo.activated }.toList()
.map(MediaEntity::asExternalModel)
}.flowOn(defaultDispatcher)

fun countFiles(opType: OpType) = filesDao.countFilesFlow(opType = opType, existed = true, blocked = false)
fun countSelectedFiles(opType: OpType) = filesDao.countActivatedFilesFlow(opType = opType, existed = true, blocked = false)

suspend fun selectFile(id: Long, selected: Boolean) {
filesDao.activateById(id, selected)
}

suspend fun selectAll(ids: List<Long>) {
filesDao.activateByIds(ids, true)
}

suspend fun unselectAll(ids: List<Long>) {
filesDao.activateByIds(ids, false)
}

suspend fun reverseAll(ids: List<Long>) {
filesDao.reverseActivatedByIds(ids)
}

suspend fun blockSelected(ids: List<Long>) {
filesDao.blockByIds(ids)
}

suspend fun deleteSelected(ids: List<Long>) {
val filesDir = pathUtil.getLocalBackupFilesDir()
val deletedIds = mutableListOf<Long>()
ids.forEach {
val file = filesDao.queryById(it)
if (file != null) {
val isSuccess = if (file.indexInfo.cloud.isEmpty()) {
val src = "${filesDir}/${file.archivesRelativeDir}"
rootService.deleteRecursively(src)
} else {
runCatching {
cloudRepo.withClient(file.indexInfo.cloud) { client, entity ->
val remote = entity.remote
val remoteArchivesMediumDir = pathUtil.getCloudRemoteFilesDir(remote)
val src = "${remoteArchivesMediumDir}/${file.archivesRelativeDir}"
if (client.exists(src)) client.deleteRecursively(src)
}
}.withLog().isSuccess
}
if (isSuccess) deletedIds.add(file.id)
}
}
filesDao.deleteByIds(deletedIds)
}
}
Original file line number Diff line number Diff line change
@@ -1,85 +1,118 @@
package com.xayah.core.data.repository

import com.xayah.core.model.App
import com.xayah.core.model.File
import com.xayah.core.model.OpType
import com.xayah.core.model.SortType
import com.xayah.core.model.Target
import com.xayah.core.model.UserInfo
import com.xayah.core.util.module.combine
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flow
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class ListDataRepo @Inject constructor(
private val usersRepo: UsersRepo,
private val appsRepo: AppsRepo,
private val filesRepo: FilesRepo,
private val workRepo: WorkRepo,
) {
private lateinit var listData: Flow<ListData>

private lateinit var selected: Flow<Long>
private lateinit var total: Flow<Long>
private lateinit var searchQuery: MutableStateFlow<String>
private lateinit var showFilterSheet: MutableStateFlow<Boolean>
private lateinit var sortIndex: MutableStateFlow<Int>
private lateinit var sortType: MutableStateFlow<SortType>
private lateinit var isUpdating: Flow<Boolean>

// Apps
private lateinit var showDataItemsSheet: MutableStateFlow<Boolean>
private lateinit var showSystemApps: MutableStateFlow<Boolean>
private lateinit var sortIndex: MutableStateFlow<Int>
private lateinit var sortType: MutableStateFlow<SortType>
private lateinit var userIndex: MutableStateFlow<Int>
private lateinit var userList: Flow<List<UserInfo>>
private lateinit var userMap: Flow<Map<Int, Long>>
private lateinit var appList: Flow<List<App>>

fun initialize(target: Target, opType: OpType) {
// Files
private lateinit var fileList: Flow<List<File>>

fun initialize(target: Target, opType: OpType, cloudName: String, backupDir: String) {
when (target) {
Target.Apps -> {
selected = appsRepo.countSelectedApps(opType)
total = appsRepo.countApps(opType)
searchQuery = MutableStateFlow("")
showFilterSheet = MutableStateFlow(false)
sortIndex = MutableStateFlow(0)
sortType = MutableStateFlow(SortType.ASCENDING)
isUpdating = combine(workRepo.isFullInitAndUpdateRunning(), workRepo.isFastInitAndUpdateRunning()) { full, fast -> full || fast }

showDataItemsSheet = MutableStateFlow(false)
showSystemApps = MutableStateFlow(false)
sortIndex = MutableStateFlow(0)
sortType = MutableStateFlow(SortType.ASCENDING)
userIndex = MutableStateFlow(0)
userList = usersRepo.getUsers()
userList = usersRepo.getUsers(opType)
userMap = usersRepo.getUsersMap(opType)

listData = getAppListData()
appList = appsRepo.getApps(opType, listData)
appList = appsRepo.getApps(opType = opType, listData = listData, cloudName = cloudName, backupDir = backupDir)
}

Target.Files -> {
selected = filesRepo.countSelectedFiles(opType)
total = filesRepo.countFiles(opType)
searchQuery = MutableStateFlow("")
showFilterSheet = MutableStateFlow(false)
sortIndex = MutableStateFlow(0)
sortType = MutableStateFlow(SortType.ASCENDING)
isUpdating = flow { emit(false) }

listData = getFileListData()
fileList = filesRepo.getFiles(opType = opType, listData = listData, cloudName = cloudName, backupDir = backupDir)
}
}

}

private fun getAppListData(): Flow<ListData.Apps> = combine(
selected,
total,
searchQuery,
showFilterSheet,
showDataItemsSheet,
showSystemApps,
sortIndex,
sortType,
isUpdating,
showDataItemsSheet,
showSystemApps,
userIndex,
userList,
userMap,
) { s, t, sQuery, sFSheet, sDISheet, sSystemApps, sIndex, sType, uIndex, uList, uMap ->
ListData.Apps(s, t, sQuery, sFSheet, sDISheet, sSystemApps, sIndex, sType, uIndex, uList, uMap)
) { s, t, sQuery, sFSheet, sIndex, sType, iUpdating, sDISheet, sSystemApps, uIndex, uList, uMap ->
ListData.Apps(s, t, sQuery, sFSheet, sIndex, sType, iUpdating, sDISheet, sSystemApps, uIndex, uList, uMap)
}

private fun getFileListData(): Flow<ListData.Files> = combine(
selected,
total,
searchQuery,
showFilterSheet,
sortIndex,
sortType,
isUpdating,
) { s, t, sQuery, sFSheet, sIndex, sType, iUpdating ->
ListData.Files(s, t, sQuery, sFSheet, sIndex, sType, iUpdating)
}

fun getListData(): Flow<ListData> = listData

fun getAppList(): Flow<List<App>> = appList

fun getFileList(): Flow<List<File>> = fileList

suspend fun setShowSystemApps(block: (Boolean) -> Boolean) {
showSystemApps.emit(block(showSystemApps.value))
}
Expand Down Expand Up @@ -114,18 +147,32 @@ sealed class ListData(
open val total: Long,
open val searchQuery: String,
open val showFilterSheet: Boolean,
open val sortIndex: Int,
open val sortType: SortType,
open val isUpdating: Boolean,
) {
data class Apps(
override val selected: Long,
override val total: Long,
override val searchQuery: String,
override val showFilterSheet: Boolean,
override val sortIndex: Int,
override val sortType: SortType,
override val isUpdating: Boolean,
val showDataItemsSheet: Boolean,
val showSystemApps: Boolean,
val sortIndex: Int,
val sortType: SortType,
val userIndex: Int,
val userList: List<UserInfo>,
val userMap: Map<Int, Long>,
) : ListData(selected, total, searchQuery, showFilterSheet)
) : ListData(selected, total, searchQuery, showFilterSheet, sortIndex, sortType, isUpdating)

data class Files(
override val selected: Long,
override val total: Long,
override val searchQuery: String,
override val showFilterSheet: Boolean,
override val sortIndex: Int,
override val sortType: SortType,
override val isUpdating: Boolean,
) : ListData(selected, total, searchQuery, showFilterSheet, sortIndex, sortType, isUpdating)
}
Loading

0 comments on commit 1e84037

Please sign in to comment.