use a dialog to confirm before clear app storage

This commit is contained in:
BinTianqi
2024-05-27 13:48:39 +08:00
parent cb434e6794
commit fb6fd00414
4 changed files with 54 additions and 32 deletions

View File

@@ -60,4 +60,4 @@ jobs:
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: OwnDroid-CI-${{ env.SHORT_SHA }}-release-signed.apk name: OwnDroid-CI-${{ env.SHORT_SHA }}-release-signed.apk
path: app/build/outputs/apk/debug/app-release.apk path: app/build/outputs/apk/release/app-release.apk

View File

@@ -83,9 +83,10 @@ fun ApplicationManage(navCtrl:NavHostController, pkgName: MutableState<String>,
"KeepUninstalled" to R.string.keep_uninstalled_pkgs, "KeepUninstalled" to R.string.keep_uninstalled_pkgs,
"InstallApp" to R.string.install_app, "InstallApp" to R.string.install_app,
"UninstallApp" to R.string.uninstall_app, "UninstallApp" to R.string.uninstall_app,
"ClearAppData" to R.string.clear_app_data, "ClearAppData" to R.string.clear_app_storage,
"DefaultDialer" to R.string.set_default_dialer, "DefaultDialer" to R.string.set_default_dialer,
) )
val clearAppDataDialog = remember { mutableStateOf(false) }
Scaffold( Scaffold(
topBar = { topBar = {
TopBar(backStackEntry, navCtrl, localNavCtrl) { TopBar(backStackEntry, navCtrl, localNavCtrl) {
@@ -121,7 +122,7 @@ fun ApplicationManage(navCtrl:NavHostController, pkgName: MutableState<String>,
popEnterTransition = Animations.navHostPopEnterTransition, popEnterTransition = Animations.navHostPopEnterTransition,
popExitTransition = Animations.navHostPopExitTransition popExitTransition = Animations.navHostPopExitTransition
) { ) {
composable(route = "Home") { Home(localNavCtrl, pkgName.value, dialogStatus) } composable(route = "Home") { Home(localNavCtrl, pkgName.value, dialogStatus, clearAppDataDialog) }
composable(route = "UserControlDisabled") { UserCtrlDisabledPkg(pkgName.value) } composable(route = "UserControlDisabled") { UserCtrlDisabledPkg(pkgName.value) }
composable(route = "PermissionManage") { PermissionManage(pkgName.value, navCtrl) } composable(route = "PermissionManage") { PermissionManage(pkgName.value, navCtrl) }
composable(route = "CrossProfilePackage") { CrossProfilePkg(pkgName.value) } composable(route = "CrossProfilePackage") { CrossProfilePkg(pkgName.value) }
@@ -132,7 +133,6 @@ fun ApplicationManage(navCtrl:NavHostController, pkgName: MutableState<String>,
composable(route = "KeepUninstalled") { KeepUninstalledApp(pkgName.value) } composable(route = "KeepUninstalled") { KeepUninstalledApp(pkgName.value) }
composable(route = "InstallApp") { InstallApp() } composable(route = "InstallApp") { InstallApp() }
composable(route = "UninstallApp") { UninstallApp(pkgName.value) } composable(route = "UninstallApp") { UninstallApp(pkgName.value) }
composable(route = "ClearAppData") { ClearAppData(pkgName.value) }
composable(route = "DefaultDialer") { DefaultDialerApp(pkgName.value) } composable(route = "DefaultDialer") { DefaultDialerApp(pkgName.value) }
} }
} }
@@ -141,10 +141,13 @@ fun ApplicationManage(navCtrl:NavHostController, pkgName: MutableState<String>,
LocalFocusManager.current.clearFocus() LocalFocusManager.current.clearFocus()
AppControlDialog(dialogStatus) AppControlDialog(dialogStatus)
} }
if(clearAppDataDialog.value) {
ClearAppDataDialog(clearAppDataDialog, pkgName.value)
}
} }
@Composable @Composable
private fun Home(navCtrl:NavHostController, pkgName: String, dialogStatus: MutableIntState) { private fun Home(navCtrl:NavHostController, pkgName: String, dialogStatus: MutableIntState, clearAppDataDialog: MutableState<Boolean>) {
Column( Column(
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()) modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())
) { ) {
@@ -251,7 +254,9 @@ private fun Home(navCtrl:NavHostController, pkgName: String, dialogStatus: Mutab
SubPageItem(R.string.keep_uninstalled_pkgs, "", R.drawable.delete_fill0) { navCtrl.navigate("KeepUninstalled") } SubPageItem(R.string.keep_uninstalled_pkgs, "", R.drawable.delete_fill0) { navCtrl.navigate("KeepUninstalled") }
} }
if(VERSION.SDK_INT>=28) { if(VERSION.SDK_INT>=28) {
SubPageItem(R.string.clear_app_data, "", R.drawable.mop_fill0) { navCtrl.navigate("ClearAppData") } SubPageItem(R.string.clear_app_storage, "", R.drawable.mop_fill0) {
if(pkgName != "") { clearAppDataDialog.value = true }
}
} }
SubPageItem(R.string.install_app, "", R.drawable.install_mobile_fill0) { navCtrl.navigate("InstallApp") } SubPageItem(R.string.install_app, "", R.drawable.install_mobile_fill0) { navCtrl.navigate("InstallApp") }
SubPageItem(R.string.uninstall_app, "", R.drawable.delete_fill0) { navCtrl.navigate("UninstallApp") } SubPageItem(R.string.uninstall_app, "", R.drawable.delete_fill0) { navCtrl.navigate("UninstallApp") }
@@ -843,34 +848,49 @@ private fun InstallApp() {
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Composable @Composable
private fun ClearAppData(pkgName: String) { fun ClearAppDataDialog(status: MutableState<Boolean>, pkgName: String) {
val context = LocalContext.current val context = LocalContext.current
val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val receiver = ComponentName(context,Receiver::class.java) val receiver = ComponentName(context,Receiver::class.java)
val focusMgr = LocalFocusManager.current AlertDialog(
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) { title = {
Spacer(Modifier.padding(vertical = 10.dp)) Text(text = stringResource(R.string.clear_app_storage))
Button( },
onClick = { text = {
val executor = Executors.newCachedThreadPool() Text(text = stringResource(R.string.following_app_storage_will_clear) + "\n" + pkgName)
val onClear = DevicePolicyManager.OnClearApplicationUserDataListener { pkg: String, succeed: Boolean -> },
Looper.prepare() confirmButton = {
focusMgr.clearFocus() TextButton(
val toastText = onClick = {
if(pkg!="") { "$pkg\n" }else{ "" } + val executor = Executors.newCachedThreadPool()
context.getString(R.string.clear_data) + val onClear = DevicePolicyManager.OnClearApplicationUserDataListener { pkg: String, succeed: Boolean ->
context.getString(if(succeed) { R.string.success } else { R.string.fail }) Looper.prepare()
Toast.makeText(context, toastText, Toast.LENGTH_SHORT).show() val toastText =
Looper.loop() if(pkg!="") { "$pkg\n" }else{ "" } +
context.getString(R.string.clear_data) +
context.getString(if(succeed) R.string.success else R.string.fail )
Toast.makeText(context, toastText, Toast.LENGTH_SHORT).show()
Looper.loop()
}
dpm.clearApplicationUserData(receiver, pkgName, executor, onClear)
status.value = false
} }
dpm.clearApplicationUserData(receiver, pkgName, executor, onClear) ) {
}, Text(text = stringResource(R.string.clear))
enabled = isDeviceOwner(dpm) || isProfileOwner(dpm), }
modifier = Modifier.fillMaxWidth().padding(horizontal = 10.dp) },
) { dismissButton = {
Text(stringResource(R.string.clear_app_data)) TextButton(
} onClick = { status.value = false }
} ) {
Text(text = stringResource(R.string.cancel))
}
},
onDismissRequest = {
status.value = false
},
modifier = Modifier.fillMaxWidth()
)
} }
@SuppressLint("NewApi") @SuppressLint("NewApi")

View File

@@ -280,7 +280,8 @@
<string name="permitted_ime">许可的输入法</string> <string name="permitted_ime">许可的输入法</string>
<string name="keep_uninstalled_pkgs">保持卸载的应用</string> <string name="keep_uninstalled_pkgs">保持卸载的应用</string>
<string name="clear_data">数据清除</string> <string name="clear_data">数据清除</string>
<string name="clear_app_data">清除应用存储</string> <string name="clear_app_storage">清除应用存储</string>
<string name="following_app_storage_will_clear">以下应用的存储空间将被清空</string>
<string name="set_default_dialer">设为默认拨号应用</string> <string name="set_default_dialer">设为默认拨号应用</string>
<string name="uninstall_app">卸载应用</string> <string name="uninstall_app">卸载应用</string>
<string name="silent_uninstall">静默卸载</string> <string name="silent_uninstall">静默卸载</string>

View File

@@ -295,7 +295,8 @@
<string name="permitted_ime">Permitted IME</string> <string name="permitted_ime">Permitted IME</string>
<string name="keep_uninstalled_pkgs">Keep uninstalled packages</string> <string name="keep_uninstalled_pkgs">Keep uninstalled packages</string>
<string name="clear_data">Clear data</string> <string name="clear_data">Clear data</string>
<string name="clear_app_data">Clear app data</string> <string name="clear_app_storage">Clear app storage</string>
<string name="following_app_storage_will_clear">The following app\'s storage will be cleared</string>
<string name="set_default_dialer">Set default dialer</string> <string name="set_default_dialer">Set default dialer</string>
<string name="uninstall_app">Uninstall app</string> <string name="uninstall_app">Uninstall app</string>
<string name="silent_uninstall">Silent uninstall</string> <string name="silent_uninstall">Silent uninstall</string>