From dd2ea70c921cc038f0f2b46b797bfe71854204f2 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Fri, 15 Nov 2024 02:49:48 +0100 Subject: [PATCH] Clean up --- src/main/java/com/machiav3lli/backup/OABX.kt | 4 - .../backup/activities/MainActivityX.kt | 8 +- .../com/machiav3lli/backup/entity/Package.kt | 6 +- .../backup/handler/BackendController.kt | 67 +++++++++++++--- .../com/machiav3lli/backup/pages/AppPage.kt | 7 +- .../backup/preferences/NeoPrefs.kt | 77 +++++++++++++++++++ .../backup/sheets/SortFilterSheet.kt | 4 +- .../machiav3lli/backup/utils/FilterUtils.kt | 6 +- .../machiav3lli/backup/viewmodels/AppVM.kt | 4 +- .../backup/viewmodels/ScheduleVM.kt | 2 +- 10 files changed, 154 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/machiav3lli/backup/OABX.kt b/src/main/java/com/machiav3lli/backup/OABX.kt index 59873218dd..2638b13a69 100644 --- a/src/main/java/com/machiav3lli/backup/OABX.kt +++ b/src/main/java/com/machiav3lli/backup/OABX.kt @@ -38,7 +38,6 @@ import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColorsOptions import com.machiav3lli.backup.activities.MainActivityX import com.machiav3lli.backup.activities.viewModelsModule -import com.machiav3lli.backup.dbs.ODatabase import com.machiav3lli.backup.dbs.databaseModule import com.machiav3lli.backup.dbs.entity.Backup import com.machiav3lli.backup.dbs.entity.SpecialInfo @@ -105,7 +104,6 @@ val RESCUE_NAV get() = "rescue" class OABX : Application() { val work: WorkHandler by inject() - val db: ODatabase by inject() // TODO Add BroadcastReceiver for (UN)INSTALL_PACKAGE intents @@ -471,8 +469,6 @@ class OABX : Application() { var appsSuspendedChecked = false - val db: ODatabase get() = NB.db - var shellHandler: ShellHandler? = null private set diff --git a/src/main/java/com/machiav3lli/backup/activities/MainActivityX.kt b/src/main/java/com/machiav3lli/backup/activities/MainActivityX.kt index 443b97ca32..d249123041 100644 --- a/src/main/java/com/machiav3lli/backup/activities/MainActivityX.kt +++ b/src/main/java/com/machiav3lli/backup/activities/MainActivityX.kt @@ -32,6 +32,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.res.stringResource @@ -50,6 +52,10 @@ import com.machiav3lli.backup.OABX.Companion.addInfoLogText import com.machiav3lli.backup.OABX.Companion.startup import com.machiav3lli.backup.R import com.machiav3lli.backup.RESCUE_NAV +import com.machiav3lli.backup.dbs.repository.AppExtrasRepository +import com.machiav3lli.backup.dbs.repository.BlocklistRepository +import com.machiav3lli.backup.dbs.repository.PackageRepository +import com.machiav3lli.backup.dbs.repository.ScheduleRepository import com.machiav3lli.backup.dialogs.ActionsDialogUI import com.machiav3lli.backup.dialogs.BaseDialog import com.machiav3lli.backup.dialogs.DialogKey @@ -116,7 +122,7 @@ class MainActivityX : BaseActivity() { private lateinit var openDialog: MutableState private lateinit var dialogKey: MutableState - val viewModel: MainVM by viewModel() + val viewModel: MainVM by viewModel() // TODO remove usage in other classes @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") override fun onCreate(savedInstanceState: Bundle?) { diff --git a/src/main/java/com/machiav3lli/backup/entity/Package.kt b/src/main/java/com/machiav3lli/backup/entity/Package.kt index 20cd990984..9fc40ef826 100644 --- a/src/main/java/com/machiav3lli/backup/entity/Package.kt +++ b/src/main/java/com/machiav3lli/backup/entity/Package.kt @@ -305,7 +305,7 @@ class Package { fun deleteAllBackups() { val backups = backupsNewestFirst.toMutableList() while (backups.isNotEmpty()) - _deleteBackup(backups.removeLast()) + _deleteBackup(backups.removeLast()) // TODO if (pref_paranoidBackupLists.value) runOrLog { refreshBackupList() } // get real state of file system only once } @@ -324,7 +324,7 @@ class Package { } --> delete ${TraceUtils.formatBackups(deletableBackups)}" } while (deletableBackups.size > 0) { - val backup = deletableBackups.removeLast() + val backup = deletableBackups.removeLast() // TODO backups.remove(backup) _deleteBackup(backup) } @@ -339,7 +339,7 @@ class Package { } while (keep < backups.size && deletableBackups.size > 0) { - val backup = deletableBackups.removeLast() + val backup = deletableBackups.removeLast() // TODO backups.remove(backup) _deleteBackup(backup) } diff --git a/src/main/java/com/machiav3lli/backup/handler/BackendController.kt b/src/main/java/com/machiav3lli/backup/handler/BackendController.kt index 77b5edaa58..b19071e604 100644 --- a/src/main/java/com/machiav3lli/backup/handler/BackendController.kt +++ b/src/main/java/com/machiav3lli/backup/handler/BackendController.kt @@ -273,9 +273,9 @@ suspend fun scanBackups( } } - suspend fun handleDirectory( - file: StorageFile, - collector: FlowCollector? = null + suspend fun handleDirectory( + file: StorageFile, + collector: FlowCollector? = null ): Boolean { hitBusy() @@ -332,7 +332,14 @@ suspend fun scanBackups( !name.contains(regexSpecialFile) ) { val props = file - traceBackupsScanPackage { traceLine(">", level, props, "++++++++++++++++++++ props ok") } + traceBackupsScanPackage { + traceLine( + ">", + level, + props, + "++++++++++++++++++++ props ok" + ) + } handleProps(props, path, name, onValidBackup) @@ -352,7 +359,14 @@ suspend fun scanBackups( dir.findFile(BACKUP_INSTANCE_PROPERTIES_INDIR) // indir props ?.let { props -> - traceBackupsScanPackage { traceLine(">", level, props, "++++++++++++++++++++ props indir ok") } + traceBackupsScanPackage { + traceLine( + ">", + level, + props, + "++++++++++++++++++++ props indir ok" + ) + } handleProps(props, props.path, props.name, onValidBackup) { runCatching { @@ -410,7 +424,14 @@ suspend fun scanBackups( name.contains(regexBackupInstance) // or backup instance ) { if (forceTrace) - traceBackupsScanPackage { traceLine("B", level, file, "++++++++++++++++++++ backup") } + traceBackupsScanPackage { + traceLine( + "B", + level, + file, + "++++++++++++++++++++ backup" + ) + } if (path.contains(packageName)) { // package matches, empty matches all @@ -423,14 +444,28 @@ suspend fun scanBackups( if (file.isPropertyFile && !name.contains(regexSpecialFile) // non-instance props (wtf is that? probably a saved file) ) { - traceBackupsScanPackage { traceLine(">", level, file, "++++++++++++++++++++ non-instance props ok (a renamed backup?)") } + traceBackupsScanPackage { + traceLine( + ">", + level, + file, + "++++++++++++++++++++ non-instance props ok (a renamed backup?)" + ) + } handleProps(file, path, name, onValidBackup) } else { if (file.isDirectory) { // non-instance-directory val dir = file - traceBackupsScanPackage { traceLine("/", level, file, "++++++++++++++++++++ //////////////////// dir ok") } + traceBackupsScanPackage { + traceLine( + "/", + level, + file, + "++++++++++++++++++++ //////////////////// dir ok" + ) + } if (handleDirectory(dir).not()) { // renameDamagedToERROR(dir, "empty-folder") @@ -450,7 +485,14 @@ suspend fun scanBackups( ) { val dir = file if (forceTrace) - traceBackupsScanPackage { traceLine("F", level, file, "/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\ folder ok") } + traceBackupsScanPackage { + traceLine( + "F", + level, + file, + "/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\ folder ok" + ) + } if (handleDirectory(dir).not()) { // renameDamagedToERROR(dir, "empty-folder") @@ -629,7 +671,8 @@ fun Context.getPackageInfoList(filter: Int): List = packageManager.getInstalledPackageInfosWithPermissions() .filter { packageInfo: PackageInfo -> val isSystem = - (packageInfo.applicationInfo?.flags ?: 0) and ApplicationInfo.FLAG_SYSTEM == ApplicationInfo.FLAG_SYSTEM + (packageInfo.applicationInfo?.flags ?: 0) and ApplicationInfo.FLAG_SYSTEM == + ApplicationInfo.FLAG_SYSTEM val isIgnored = packageInfo.packageName.matches(ignoredPackages) if (isIgnored) Timber.i("ignored package: ${packageInfo.packageName}") @@ -889,6 +932,8 @@ fun Context.getSpecial(packageName: String) = val PackageInfo.grantedPermissions: List get() = requestedPermissions?.filterIndexed { index, perm -> - (requestedPermissionsFlags?.getOrNull(index) ?: 0) and PackageInfo.REQUESTED_PERMISSION_GRANTED == PackageInfo.REQUESTED_PERMISSION_GRANTED && + (requestedPermissionsFlags?.getOrNull(index) + ?: 0) and PackageInfo.REQUESTED_PERMISSION_GRANTED == + PackageInfo.REQUESTED_PERMISSION_GRANTED && perm !in IGNORED_PERMISSIONS }.orEmpty() diff --git a/src/main/java/com/machiav3lli/backup/pages/AppPage.kt b/src/main/java/com/machiav3lli/backup/pages/AppPage.kt index 498f1d7640..6060615988 100644 --- a/src/main/java/com/machiav3lli/backup/pages/AppPage.kt +++ b/src/main/java/com/machiav3lli/backup/pages/AppPage.kt @@ -244,7 +244,7 @@ fun AppPage( onDismiss() } } - AnimatedVisibility(visible = snackbarVisible) { + AnimatedVisibility(visible = snackbarVisible) { // TODO move to MainPage Text( text = snackbarText, color = MaterialTheme.colorScheme.primary, @@ -256,11 +256,10 @@ fun AppPage( InfoChipsBlock(list = pkg.infoChips()) if (snackbarVisible) LinearProgressIndicator( - modifier = Modifier - .fillMaxWidth() - .height(5.dp), + modifier = Modifier.fillMaxWidth(), trackColor = MaterialTheme.colorScheme.surface, color = MaterialTheme.colorScheme.primary, + gapSize = 2.dp, ) HorizontalDivider( thickness = 2.dp, diff --git a/src/main/java/com/machiav3lli/backup/preferences/NeoPrefs.kt b/src/main/java/com/machiav3lli/backup/preferences/NeoPrefs.kt index e235bb223c..a2f6c26814 100644 --- a/src/main/java/com/machiav3lli/backup/preferences/NeoPrefs.kt +++ b/src/main/java/com/machiav3lli/backup/preferences/NeoPrefs.kt @@ -14,7 +14,12 @@ import com.machiav3lli.backup.MAIN_FILTER_DEFAULT import com.machiav3lli.backup.Sort import com.machiav3lli.backup.UpdatedFilter import com.machiav3lli.backup.batchModesSequence +import com.machiav3lli.backup.entity.SortFilterModel import com.machiav3lli.backup.possibleMainFilters +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flowOn import org.koin.core.component.KoinComponent import org.koin.dsl.module import org.koin.java.KoinJavaComponent.getKoin @@ -208,6 +213,78 @@ class NeoPrefs private constructor(val context: Context) : KoinComponent { entries = EnabledFilter.entries.map { it.ordinal }, ) + fun homeSortFilterFlow(): Flow = combine( + sortHome.get(), + sortAscHome.get(), + mainFilterHome.get(), + backupFilterHome.get(), + installedFilterHome.get(), + launchableFilterHome.get(), + updatedFilterHome.get(), + latestFilterHome.get(), + enabledFilterHome.get(), + ) { args -> + SortFilterModel( + sort = args[0] as Int, + sortAsc = args[1] as Boolean, + mainFilter = args[2] as Int, + backupFilter = args[3] as Int, + installedFilter = args[4] as Int, + launchableFilter = args[5] as Int, + updatedFilter = args[6] as Int, + latestFilter = args[7] as Int, + enabledFilter = args[8] as Int, + ) + }.flowOn(Dispatchers.IO) + + fun backupSortFilterFlow(): Flow = combine( + sortBackup.get(), + sortAscBackup.get(), + mainFilterBackup.get(), + backupFilterBackup.get(), + installedFilterBackup.get(), + launchableFilterBackup.get(), + updatedFilterBackup.get(), + latestFilterBackup.get(), + enabledFilterBackup.get(), + ) { args -> + SortFilterModel( + sort = args[0] as Int, + sortAsc = args[1] as Boolean, + mainFilter = args[2] as Int, + backupFilter = args[3] as Int, + installedFilter = args[4] as Int, + launchableFilter = args[5] as Int, + updatedFilter = args[6] as Int, + latestFilter = args[7] as Int, + enabledFilter = args[8] as Int, + ) + }.flowOn(Dispatchers.IO) + + fun restoreSortFilterFlow(): Flow = combine( + sortRestore.get(), + sortAscRestore.get(), + mainFilterRestore.get(), + backupFilterRestore.get(), + installedFilterRestore.get(), + launchableFilterRestore.get(), + updatedFilterRestore.get(), + latestFilterRestore.get(), + enabledFilterRestore.get(), + ) { args -> + SortFilterModel( + sort = args[0] as Int, + sortAsc = args[1] as Boolean, + mainFilter = args[2] as Int, + backupFilter = args[3] as Int, + installedFilter = args[4] as Int, + launchableFilter = args[5] as Int, + updatedFilter = args[6] as Int, + latestFilter = args[7] as Int, + enabledFilter = args[8] as Int, + ) + }.flowOn(Dispatchers.IO) + companion object { val prefsModule = module { single { NeoPrefs(get()) } diff --git a/src/main/java/com/machiav3lli/backup/sheets/SortFilterSheet.kt b/src/main/java/com/machiav3lli/backup/sheets/SortFilterSheet.kt index 539d71f69d..dd7fd8ab72 100644 --- a/src/main/java/com/machiav3lli/backup/sheets/SortFilterSheet.kt +++ b/src/main/java/com/machiav3lli/backup/sheets/SortFilterSheet.kt @@ -54,7 +54,6 @@ import com.machiav3lli.backup.InstalledFilter import com.machiav3lli.backup.LatestFilter import com.machiav3lli.backup.LaunchableFilter import com.machiav3lli.backup.MAIN_FILTER_DEFAULT -import com.machiav3lli.backup.OABX import com.machiav3lli.backup.R import com.machiav3lli.backup.UpdatedFilter import com.machiav3lli.backup.enabledFilterChipItems @@ -95,6 +94,7 @@ fun SortFilterSheet( viewModel: MainVM = koinViewModel(), onDismiss: () -> Unit, ) { + val context = LocalContext.current val nestedScrollConnection = rememberNestedScrollInteropConnection() val packageList by viewModel.notBlockedList.collectAsState() var model by rememberSaveable { @@ -110,7 +110,7 @@ fun SortFilterSheet( fun currentStats() = getStats( packageList.applyFilter( model, - OABX.context, + context, ) ) //TODO hg42 use central function for all the filtering diff --git a/src/main/java/com/machiav3lli/backup/utils/FilterUtils.kt b/src/main/java/com/machiav3lli/backup/utils/FilterUtils.kt index 888aa8f88d..98ff14e1c7 100644 --- a/src/main/java/com/machiav3lli/backup/utils/FilterUtils.kt +++ b/src/main/java/com/machiav3lli/backup/utils/FilterUtils.kt @@ -97,7 +97,7 @@ fun filterPackages( //---------------------------------------- filters for activity -fun List.applySearchAndFilter( +fun Collection.applySearchAndFilter( context: Context, query: String, extras: Map, @@ -118,7 +118,7 @@ fun List.applySearchAndFilter( .applyFilter(filter, context) } -fun List.applyFilter(filter: SortFilterModel, context: Context): List { +fun Collection.applyFilter(filter: SortFilterModel, context: Context): List { val predicate: (Package) -> Boolean = { (if (filter.mainFilter and MAIN_FILTER_SYSTEM == MAIN_FILTER_SYSTEM) it.isSystem && !it.isSpecial else false) || (if (filter.mainFilter and MAIN_FILTER_USER == MAIN_FILTER_USER) !it.isSystem else false) @@ -130,7 +130,7 @@ fun List.applyFilter(filter: SortFilterModel, context: Context): List

.applyBackupFilter(backupFilter: Int): List { +private fun Collection.applyBackupFilter(backupFilter: Int): List { val predicate: (Package) -> Boolean = { (if (backupFilter and MODE_NONE == MODE_NONE) !it.hasBackups or !(it.hasApk or it.hasData) else false) diff --git a/src/main/java/com/machiav3lli/backup/viewmodels/AppVM.kt b/src/main/java/com/machiav3lli/backup/viewmodels/AppVM.kt index e6abf92c88..dde5441c90 100644 --- a/src/main/java/com/machiav3lli/backup/viewmodels/AppVM.kt +++ b/src/main/java/com/machiav3lli/backup/viewmodels/AppVM.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber -class AppVM(private val database: ODatabase) : ViewModel() { +class AppVM(private val database: ODatabase) : ViewModel() { // TODO add repos private val thePackage: MutableStateFlow = MutableStateFlow(null) @OptIn(ExperimentalCoroutinesApi::class) @@ -55,7 +55,7 @@ class AppVM(private val database: ODatabase) : ViewModel() { AppExtras(thePackage.value?.packageName ?: "") ) - val snackbarText = MutableComposableStateFlow( + val snackbarText = MutableComposableStateFlow( // TODO change to MutableStateFlow "", viewModelScope, "snackBarText" diff --git a/src/main/java/com/machiav3lli/backup/viewmodels/ScheduleVM.kt b/src/main/java/com/machiav3lli/backup/viewmodels/ScheduleVM.kt index 0e0ec93172..22d89ebbb8 100644 --- a/src/main/java/com/machiav3lli/backup/viewmodels/ScheduleVM.kt +++ b/src/main/java/com/machiav3lli/backup/viewmodels/ScheduleVM.kt @@ -41,7 +41,7 @@ import kotlinx.coroutines.plus import kotlinx.coroutines.withContext import org.koin.core.component.KoinComponent -class ScheduleVM(database: ODatabase) : ViewModel(), KoinComponent { +class ScheduleVM(database: ODatabase) : ViewModel(), KoinComponent { // TODO add repos private val cc = Dispatchers.IO private val scheduleDB: ScheduleDao = database.getScheduleDao()