diff --git a/app/build.gradle b/app/build.gradle index 047ed38d3c..7cd2d1bebc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,14 +8,14 @@ plugins { android { namespace 'com.xayah.databackup' - compileSdk 33 + compileSdk 34 defaultConfig { applicationId "com.xayah.databackup" minSdk 28 - targetSdk 33 - versionCode 98 - versionName "1.0.1-alpha02" + targetSdk 34 + versionCode 99 + versionName "1.0.1-alpha03" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -77,16 +77,16 @@ android { } } - android.applicationVariants.all { + android.applicationVariants.configureEach { variant -> - variant.outputs.all { + variant.outputs.configureEach { outputFileName = "DataBackup-${variant.versionName}-${variant.productFlavors[0].name}-${variant.productFlavors[1].name}-${variant.buildType.name}.apk".replaceAll("\\*", "") } } } dependencies { - implementation 'androidx.core:core-ktx:1.10.0' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.appcompat:appcompat:1.6.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' @@ -112,16 +112,16 @@ dependencies { implementation 'com.github.XayahSuSuSu:Android-MaterialYouFileExplorer:1.3.2' // zip4j - implementation 'net.lingala.zip4j:zip4j:2.10.0' + implementation 'net.lingala.zip4j:zip4j:2.11.5' // okhttp3 - implementation 'com.squareup.okhttp3:okhttp:4.10.0' + implementation 'com.squareup.okhttp3:okhttp:4.11.0' // gson - implementation 'com.google.code.gson:gson:2.9.1' + implementation 'com.google.code.gson:gson:2.10.1' // splashscreen - implementation 'androidx.core:core-splashscreen:1.0.0' + implementation 'androidx.core:core-splashscreen:1.0.1' // Markwon implementation "io.noties.markwon:core:4.6.2" @@ -132,23 +132,23 @@ dependencies { /** * Compose */ - def composeBom = platform('androidx.compose:compose-bom:2023.03.00') + def composeBom = platform('androidx.compose:compose-bom:2023.09.02') implementation composeBom androidTestImplementation composeBom // Lifecycle - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' - implementation 'androidx.activity:activity-compose:1.7.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2' + implementation 'androidx.activity:activity-compose:1.8.0' implementation "androidx.compose.ui:ui" androidTestImplementation "androidx.compose.ui:ui-test-junit4" debugImplementation "androidx.compose.ui:ui-test-manifest" // Material Design 3 - implementation 'androidx.compose.material3:material3:1.1.0-beta02' + implementation 'androidx.compose.material3:material3' // Android Studio Preview support implementation 'androidx.compose.ui:ui-tooling-preview' debugImplementation 'androidx.compose.ui:ui-tooling' // Accompanist - def accompanistVersion = '0.29.2-rc' + def accompanistVersion = '0.30.1' implementation "com.google.accompanist:accompanist-insets:$accompanistVersion" implementation "com.google.accompanist:accompanist-insets-ui:$accompanistVersion" implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion" diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/settings/SettingsViewModel.kt b/app/src/main/java/com/xayah/databackup/ui/activity/settings/SettingsViewModel.kt index f31c262505..ef4fbddecd 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/settings/SettingsViewModel.kt @@ -27,7 +27,6 @@ class SettingsViewModel : ViewModel() { } // 恢复相关设置项 - val supportAutoFixMultiUserContext by lazy { mutableStateOf(false) } val restoreSwitchItems by lazy { MutableStateFlow(SnapshotStateList()) } diff --git a/app/src/main/java/com/xayah/databackup/ui/activity/settings/components/content/Restore.kt b/app/src/main/java/com/xayah/databackup/ui/activity/settings/components/content/Restore.kt index b0fd2849ad..d1a3f2c26a 100644 --- a/app/src/main/java/com/xayah/databackup/ui/activity/settings/components/content/Restore.kt +++ b/app/src/main/java/com/xayah/databackup/ui/activity/settings/components/content/Restore.kt @@ -12,22 +12,16 @@ import com.xayah.databackup.ui.activity.settings.SettingsViewModel import com.xayah.databackup.ui.activity.settings.components.SwitchItem import com.xayah.databackup.ui.activity.settings.components.clickable.Switch import com.xayah.databackup.ui.activity.settings.components.clickable.Title -import com.xayah.databackup.util.* -import com.xayah.databackup.util.command.Command +import com.xayah.databackup.util.readIsCleanRestoring +import com.xayah.databackup.util.readIsReadIcon +import com.xayah.databackup.util.readIsResetRestoreList +import com.xayah.databackup.util.saveIsCleanRestoring +import com.xayah.databackup.util.saveIsReadIcon +import com.xayah.databackup.util.saveIsResetRestoreList -suspend fun onRestoreInitialize(viewModel: SettingsViewModel, context: Context) { - viewModel.supportAutoFixMultiUserContext.value = Command.checkLsZd() - context.saveAutoFixMultiUserContext(viewModel.supportAutoFixMultiUserContext.value) +fun onRestoreInitialize(viewModel: SettingsViewModel, context: Context) { if (viewModel.restoreSwitchItems.value.isEmpty()) viewModel.restoreSwitchItems.value.apply { - add(SwitchItem( - title = context.getString(R.string.auto_fix_multi_user_context), - subtitle = context.getString(R.string.auto_fix_multi_user_context_title), - iconId = R.drawable.ic_round_apps, - isChecked = viewModel.supportAutoFixMultiUserContext, - isEnabled = false, - onCheckedChange = {} - )) add(SwitchItem( title = context.getString(R.string.clean_restoring), subtitle = context.getString(R.string.clean_restoring_help), diff --git a/app/src/main/java/com/xayah/databackup/ui/components/BottomSheet.kt b/app/src/main/java/com/xayah/databackup/ui/components/BottomSheet.kt index b306dc54ac..a4ccaff9bb 100644 --- a/app/src/main/java/com/xayah/databackup/ui/components/BottomSheet.kt +++ b/app/src/main/java/com/xayah/databackup/ui/components/BottomSheet.kt @@ -1,11 +1,13 @@ package com.xayah.databackup.ui.components import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState +import androidx.compose.ui.unit.dp @ExperimentalMaterial3Api @Composable @@ -15,6 +17,7 @@ fun BottomSheet(isOpen: MutableState, content: @Composable (ColumnScope ModalBottomSheet( onDismissRequest = { isOpen.value = false }, sheetState = bottomSheetState, + windowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp) ) { content() } diff --git a/app/src/main/java/com/xayah/databackup/util/command/Command.kt b/app/src/main/java/com/xayah/databackup/util/command/Command.kt index 3a52eee7f7..6fb15f58d7 100644 --- a/app/src/main/java/com/xayah/databackup/util/command/Command.kt +++ b/app/src/main/java/com/xayah/databackup/util/command/Command.kt @@ -56,7 +56,6 @@ import com.xayah.databackup.util.GlobalString import com.xayah.databackup.util.GsonUtil import com.xayah.databackup.util.Logcat import com.xayah.databackup.util.Path -import com.xayah.databackup.util.readAutoFixMultiUserContext import com.xayah.databackup.util.readBackupStrategy import com.xayah.databackup.util.readBackupUser import com.xayah.databackup.util.readBlackListMapPath @@ -726,11 +725,9 @@ class Command { val tag = "# Set owner and SELinux #" updateState(ProcessSettingSELinux, null) val (setOwnerAndSELinuxSuccess, out) = SELinux.setOwnerAndContext( - dataType, packageName, path, userId, - App.globalContext.readAutoFixMultiUserContext(), context ) if (setOwnerAndSELinuxSuccess.not()) { diff --git a/app/src/main/java/com/xayah/databackup/util/command/Compression.kt b/app/src/main/java/com/xayah/databackup/util/command/Compression.kt index 8656b8861d..39219b0f72 100644 --- a/app/src/main/java/com/xayah/databackup/util/command/Compression.kt +++ b/app/src/main/java/com/xayah/databackup/util/command/Compression.kt @@ -1,5 +1,6 @@ package com.xayah.databackup.util.command +import com.topjohnwu.superuser.Shell import com.xayah.databackup.App import com.xayah.databackup.data.CompressionType import com.xayah.databackup.data.DataType @@ -35,11 +36,13 @@ class Compression { return "$dataPath/$MEDIA_PATH_FILE_NAME" } + fun isCompressionSucceed(result: Shell.Result) = result.code in intArrayOf(0, 1) + suspend fun compressAPK( compressionType: CompressionType, apkPath: String, outPut: String, - compatibleMode: Boolean + compatibleMode: Boolean, ): Pair { var isSuccess = true var out = "" @@ -60,7 +63,7 @@ class Compression { else "$target ./*.apk ${if (compressionType == CompressionType.TAR) "" else "-I $QUOTE$type$QUOTE"}" val exec = Command.execute("tar --totals -cpf $cmd") - if (exec.isSuccess.not()) isSuccess = false + if (isCompressionSucceed(exec).not()) isSuccess = false out += exec.out.joinToLineString + "\n" // Cd back Command.execute("cd /").apply { @@ -157,7 +160,7 @@ class Compression { if (dataType == DataType.MEDIA) { RootService.getInstance().deleteRecursively(getMediaPathFilePath(dataPath)) } - if (exec.isSuccess.not()) isSuccess = false + if (isCompressionSucceed(exec).not()) isSuccess = false out = exec.out.joinToLineString } return Pair(isSuccess, out.trim()) @@ -192,7 +195,7 @@ class Compression { // Get the media path Command.execute("tar -xpf $QUOTE$inputPath$QUOTE -C $QUOTE$tmpDir$QUOTE --wildcards --no-anchored $QUOTE$MEDIA_PATH_FILE_NAME$QUOTE ${if (compressionType == CompressionType.TAR) "" else "-I ${QUOTE}zstd$QUOTE"}") .apply { - if (this.isSuccess.not()) { + if (isCompressionSucceed(this).not()) { isSuccess = false out = "Failed to extract $MEDIA_PATH_FILE_NAME from this archive: $inputPath." return@runOnIO @@ -229,7 +232,7 @@ class Compression { RootService.getInstance().deleteRecursively(getMediaPathFilePath(mediaPath)) RootService.getInstance().deleteRecursively(tmpDir) } - if (exec.isSuccess.not()) isSuccess = false + if (isCompressionSucceed(exec).not()) isSuccess = false out = exec.out.joinToLineString } return Pair(isSuccess, out.trim()) diff --git a/app/src/main/java/com/xayah/databackup/util/command/Installation.kt b/app/src/main/java/com/xayah/databackup/util/command/Installation.kt index 669ad23da9..cc870f456f 100644 --- a/app/src/main/java/com/xayah/databackup/util/command/Installation.kt +++ b/app/src/main/java/com/xayah/databackup/util/command/Installation.kt @@ -54,7 +54,7 @@ class Installation { } } Command.execute("tar --totals $input -xmpf $QUOTE$apkPath$QUOTE -C $QUOTE$apkDir$QUOTE").apply { - if (this.isSuccess.not()) onSuccess(false) + if (Compression.isCompressionSucceed(this).not()) onSuccess(false) onLog(this.out.joinToLineString + "\n") } return RootService.getInstance().listFilesPath(apkDir) diff --git a/app/src/main/java/com/xayah/databackup/util/command/SELinux.kt b/app/src/main/java/com/xayah/databackup/util/command/SELinux.kt index 2e1067d8ea..eef3f467a7 100644 --- a/app/src/main/java/com/xayah/databackup/util/command/SELinux.kt +++ b/app/src/main/java/com/xayah/databackup/util/command/SELinux.kt @@ -1,6 +1,5 @@ package com.xayah.databackup.util.command -import com.xayah.databackup.data.DataType import com.xayah.databackup.librootservice.RootService import com.xayah.databackup.util.joinToLineString import kotlinx.coroutines.Dispatchers @@ -20,7 +19,7 @@ class SELinux { return Pair(exec.isSuccess, if (exec.isSuccess) exec.out.joinToLineString.trim() else "") } - suspend fun setOwnerAndContext(dataType: DataType, packageName: String, path: String, userId: String, supportFixContext: Boolean, context: String): Pair { + suspend fun setOwnerAndContext(packageName: String, path: String, userId: String, context: String): Pair { var isSuccess = true var out = "" @@ -31,14 +30,14 @@ class SELinux { if (this.isSuccess.not()) isSuccess = false out += this.out.joinToLineString + "\n" } - if (supportFixContext) { - if (context.isNotEmpty()) { - Command.execute("chcon -hR $QUOTE$context$QUOTE $QUOTE$path/$QUOTE").apply { - if (this.isSuccess.not()) isSuccess = false - out += this.out.joinToLineString + "\n" - } - } else { - Command.execute("ls -Zd $QUOTE$path/../$QUOTE | awk 'NF>1{print ${USD}1}' | sed -e ${QUOTE}s/system_data_file/app_data_file/g$QUOTE; ls -Zd $QUOTE$path/../$QUOTE > /dev/null 2>&1").apply { + if (context.isNotEmpty()) { + Command.execute("chcon -hR $QUOTE$context$QUOTE $QUOTE$path/$QUOTE").apply { + if (this.isSuccess.not()) isSuccess = false + out += this.out.joinToLineString + "\n" + } + } else { + Command.execute("ls -Zd $QUOTE$path/../$QUOTE | awk 'NF>1{print ${USD}1}' | sed -e ${QUOTE}s/system_data_file/app_data_file/g$QUOTE; ls -Zd $QUOTE$path/../$QUOTE > /dev/null 2>&1") + .apply { if (this.isSuccess.not()) { isSuccess = false out += this.out.joinToLineString + "\n" @@ -49,7 +48,6 @@ class SELinux { out += this.out.joinToLineString + "\n" } } - } } } else { isSuccess = false diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 7e99c0c346..81365e35bd 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -85,8 +85,6 @@ Изчакайте Инсталиране Потвърждавате ли изход\? - Поправка на контекста - Автоматично поправя многопотребителски контекст без необходимост от рестарт при възстановяване на многопотребителски приложения Не е избрано Всичко Пиктограма на резервно копие diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 18c728f525..7ee57d946b 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -6,8 +6,6 @@ Napredak Kompresija Filtriraj - Automatsko popravljanje konteksta za više korisnika, nije potrebno ponovno pokretanje za vraćene višekorisničke aplikacije - Ispravka konteksta Svi podaci koje generira ova aplikacija koriste se samo za sigurnosno kopiranje/obnovu pohranjuju se samo lokalno. Interna memorija Spremno diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 98dfa51510..e117e6c4ec 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -46,8 +46,6 @@ Velocidad Más reciente Fallido - Corrección automática del contexto multiusuario, sin necesidad de reiniciar las aplicaciones multiusuario restauradas - Corrección del contexto Cree ¡Repetir para añadir! Todo diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1d06cb4277..33b085aac7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -47,8 +47,6 @@ Monet Бекап DataBackup При создании бекапа DataBackup автоматически создает резервную копию собственного установочного пакета в папке бекапов. - Исправление контекста - Автоматическое исправление многопользовательского контекста. Не требуется перезапуск для восстановления многопользовательских приложений. Создать Повторить, чтобы добавить! Установка diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6b088be8f3..775b615e1a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -38,8 +38,6 @@ Ayarlar İzlenimcilik Kendini yedekleme - Bağlam düzeltmesi - Çok kullanıcılı bağlamı otomatik düzeltin,geri yüklenen çok kullanıcılı uygulamalar için yeniden başlatma gerekmez Oluştur Eklemek için tekrarlayın! Kuruluyor diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 30808386ad..ad8dffba79 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -47,8 +47,6 @@ Монет Бекап DataBackup Під час створення бекапа DataBackup автоматично створює резервну копію власного інсталяційного пакета до каталогу бекапів - Виправлення контексту - Автоматичне виправлення багатокористувацького контексту, перезавантаження відновлених багатокористувацьких програм не потрібне Створити Повторити, щоб додати! Установка diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index af3a910a1c..d3ed19f319 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -13,8 +13,6 @@ Nén Khôi phục Bộ lọc - Tự động sửa ngữ cảnh nhiều người dùng, không cần khởi động lại để khôi phục các ứng dụng nhiều người dùng - Sửa ngữ cảnh Cảnh báo Ứng dụng đã chọn Người dùng diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f0d2f9ff13..1e822b2232 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -47,8 +47,6 @@ 启用 Material You 的莫奈主题引擎 备份自身 备份应用时自动备份自身安装包至备份目录下 - Context修复 - 自动修复多用户Context,免重启使用恢复后的多用户应用 创建 重复添加! 安装中 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 1b5d75c901..9b66d8fe78 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -47,8 +47,6 @@ 啟用 Material You 的莫奈主題引擎 備份自身 備份應用時自動備份自身安裝包至備份目錄下 - Context修復 - 自動修復多用戶Context,免重啟使用恢復後的多用戶應用 創建 重複添加! 安裝中 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 36d3f215fa..2fbb198e1b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -47,8 +47,6 @@ 啟用 Material You 的莫奈主題引擎 備份自身 備份應用時自動備份自身安裝包至備份目錄下 - Context修復 - 自動修復多使用者 Context,免重新啟動使用恢復後的多使用者應用程式 建立 重複增加! 安裝中 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dbdff13f96..b2450fba1e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -49,8 +49,6 @@ Enable monet theme engine of Material You Backup itself When backing up the application, it automatically backs up its own installation package to the backup directory - Context fix - Auto fix multi-user context, no restart needed for restored multi-user applications Create Repeat to add! Installing diff --git a/build.gradle b/build.gradle index 0ae97359fc..9b281ce5f4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,17 @@ buildscript { ext { - lifecycle_version = '2.6.1' - libsu_version = '5.0.5' + lifecycle_version = '2.6.2' + libsu_version = '5.2.1' } dependencies { // Firebase - classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' + classpath 'com.google.gms:google-services:4.4.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' } }// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.0.0' apply false - id 'com.android.library' version '8.0.0' apply false + id 'com.android.application' version '8.1.2' apply false + id 'com.android.library' version '8.1.2' apply false id 'org.jetbrains.kotlin.android' version '1.8.0' apply false } \ No newline at end of file diff --git a/libhiddenapi/build.gradle b/libhiddenapi/build.gradle index 0d808bb270..97c1d1efc0 100644 --- a/libhiddenapi/build.gradle +++ b/libhiddenapi/build.gradle @@ -5,7 +5,7 @@ plugins { android { namespace 'com.xayah.databackup.libhiddenapi' - compileSdk 33 + compileSdk 34 compileOptions { sourceCompatibility JavaVersion.VERSION_17 diff --git a/librootservice/build.gradle b/librootservice/build.gradle index 9284e9a808..18187f738a 100644 --- a/librootservice/build.gradle +++ b/librootservice/build.gradle @@ -5,11 +5,11 @@ plugins { android { namespace 'com.xayah.databackup.librootservice' - compileSdk 33 + compileSdk 34 defaultConfig { minSdk 28 - targetSdk 33 + targetSdk 34 } compileOptions { @@ -24,6 +24,6 @@ android { dependencies { implementation project(path: ':libhiddenapi') - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3" implementation "com.github.topjohnwu.libsu:service:$libsu_version" } \ No newline at end of file