diff --git a/Guide.md b/Guide.md index 3ced034..4aa9f2c 100644 --- a/Guide.md +++ b/Guide.md @@ -158,22 +158,14 @@ dpm remove-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver 请自己学习如何启动[Shizuku](https://github.com/RikkaApps/Shizuku) -如果Shizuku正在运行但是OwnDroid无法申请权限,请关闭Shizuku和OwnDroid的电池优化(这种情况在非原生系统中比较常见) - 功能: -- 激活Device admin -- 激活Profile owner -- 激活Device admin +- 激活[Device admin](#device-admin) +- 激活[Profile owner](#profile-owner) +- 激活[Device owner](#device-owner) - 激活[由组织拥有的工作资料](#由组织拥有的工作资料) - 列出所有Device owner和Profile owner -Shizuku的本质是ADB。在安卓10或以下,你还是要连接电脑激活Shizuku - -不能在非主用户中使用 - -因为作者懒得研究Shizuku-API,所以OwnDroid没有添加任何Shizuku相关依赖。以上功能均是通过rish实现。因为是套壳的rish,所以不支持Sui - ### 设备唯一标识码 需API31或以上 diff --git a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt index 0cc2665..55be95d 100644 --- a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt +++ b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt @@ -45,7 +45,9 @@ import com.bintianqi.owndroid.ui.Animations import com.bintianqi.owndroid.ui.theme.OwnDroidTheme import com.bintianqi.owndroid.ui.theme.SetDarkTheme import com.bintianqi.owndroid.ui.theme.bgColor +import kotlinx.coroutines.delay +var backToHome = false lateinit var displayMetrics: DisplayMetrics @ExperimentalMaterial3Api class MainActivity : ComponentActivity() { @@ -86,6 +88,12 @@ fun MyScaffold(){ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val focusMgr = LocalFocusManager.current SetDarkTheme() + LaunchedEffect(Unit){ + while(true){ + if(backToHome){ navCtrl.navigateUp(); backToHome=false } + delay(200) + } + } NavHost( navController = navCtrl, startDestination = "HomePage", @@ -128,12 +136,13 @@ private fun HomePage(navCtrl:NavHostController){ val myContext = LocalContext.current val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,Receiver::class.java) - val activateType = - if(isDeviceOwner(myDpm)){"Device Owner"} + val activateType = stringResource( + if(isDeviceOwner(myDpm)){R.string.device_owner} else if(isProfileOwner(myDpm)){ - stringResource(if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){R.string.work_profile_owner}else{R.string.profile_owner}) + if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){R.string.work_profile_owner}else{R.string.profile_owner} } - else if(myDpm.isAdminActive(myComponent)){"Device Admin"}else{""} + else if(myDpm.isAdminActive(myComponent)){R.string.device_admin}else{R.string.click_to_activate} + ) Column(modifier = Modifier.statusBarsPadding().verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 25.dp)) Text(text = stringResource(R.string.app_name), style = typography.headlineLarge, modifier = Modifier.padding(start = 10.dp), color = colorScheme.onBackground) @@ -144,7 +153,7 @@ private fun HomePage(navCtrl:NavHostController){ .padding(vertical = 8.dp, horizontal = 8.dp) .clip(RoundedCornerShape(15)) .background(color = colorScheme.primary) - .clickable(onClick = { navCtrl.navigate("Permissions") }) + .clickable(onClick = {navCtrl.navigate("Permissions")}) .padding(vertical = 16.dp), verticalAlignment = Alignment.CenterVertically ) { @@ -162,7 +171,7 @@ private fun HomePage(navCtrl:NavHostController){ color = colorScheme.onPrimary, modifier = Modifier.padding(bottom = 2.dp) ) - if(activateType!=""){ Text(text = activateType, color = colorScheme.onPrimary, modifier = Modifier.padding(start = 2.dp)) } + if(activateType!=""){ Text(text = activateType, color = colorScheme.onPrimary) } } } HomePageItem(R.string.system_manage, R.drawable.mobile_phone_fill0, "SystemManage", navCtrl) @@ -192,7 +201,7 @@ fun HomePageItem(name:Int, imgVector:Int, navTo:String, myNav:NavHostController) modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(25)) - .clickable(onClick = { myNav.navigate(navTo) }) + .clickable(onClick = {myNav.navigate(navTo)}) .padding(vertical = 13.dp), verticalAlignment = Alignment.CenterVertically ) { diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt index 96c379c..d63bf1b 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -35,6 +35,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.bintianqi.owndroid.R import com.bintianqi.owndroid.Receiver +import com.bintianqi.owndroid.backToHome import com.bintianqi.owndroid.ui.* import com.bintianqi.owndroid.ui.theme.bgColor import kotlinx.coroutines.delay @@ -231,8 +232,12 @@ private fun ProfileOwner(){ Text(stringResource(if(isProfileOwner(myDpm)){R.string.activated}else{R.string.deactivated}), style = typography.titleLarge) Spacer(Modifier.padding(vertical = 5.dp)) if(isProfileOwner(myDpm)&&VERSION.SDK_INT>=24){ + val co = rememberCoroutineScope() Button( - onClick = {myDpm.clearProfileOwner(myComponent)}, + onClick = { + myDpm.clearProfileOwner(myComponent) + co.launch { delay(600); if(!isProfileOwner(myDpm)){ backToHome=true } } + }, colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError) ) { Text(stringResource(R.string.deactivate)) @@ -261,7 +266,7 @@ private fun DeviceOwner(navCtrl: NavHostController){ Button( onClick = { myDpm.clearDeviceOwnerApp(myContext.packageName) - co.launch{ delay(600); if(!isDeviceOwner(myDpm)){navCtrl.navigateUp()} } + co.launch{ delay(600); if(!isDeviceOwner(myDpm)){ backToHome=true } } }, colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError) ) { @@ -308,7 +313,7 @@ fun DeviceInfo(){ ) if(VERSION.SDK_INT>=23){ encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY] = stringResource(R.string.es_active_default_key) } if(VERSION.SDK_INT>=24){ encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = stringResource(R.string.es_active_per_user) } - Text("加密状态:${encryptionStatus[myDpm.storageEncryptionStatus]}") + Text(stringResource(R.string.encrypt_status_is)+encryptionStatus[myDpm.storageEncryptionStatus]) Spacer(Modifier.padding(vertical = 2.dp)) val adminList = myDpm.activeAdmins if(adminList!=null){ diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt index bc6a963..9eeb9fa 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/ShizukuActivate.kt @@ -8,7 +8,6 @@ import android.content.pm.PackageManager import android.os.Binder import android.os.Build.VERSION import android.os.IBinder -import android.util.Log import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility @@ -38,6 +37,8 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import rikka.shizuku.Shizuku +private var waitGrantPermission = false + @Composable fun ShizukuActivate(){ val myContext = LocalContext.current @@ -202,11 +203,14 @@ private fun checkPermission(context: Context):String{ fun checkShizukuStatus():Int{ val status = try { - if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { 1 } - else if (Shizuku.shouldShowRequestPermissionRationale()) { 0 } - else { Shizuku.requestPermission(0); 0 } + if(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { waitGrantPermission = false; 1 } + else if(Shizuku.shouldShowRequestPermissionRationale()) { 0 } + else{ + if(!waitGrantPermission){Shizuku.requestPermission(0)} + waitGrantPermission = true + 0 + } }catch(e:Exception){ -1 } - Log.e("Shizuku",status.toString()) return status } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index cb99ebf..6b8484e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -37,13 +37,13 @@ 由用户决定 不支持 功能开发中 - 请再试一次 效果未知 选项 复制代码 未知状态 + 点击以激活 Device admin Profile owner Device owner @@ -75,9 +75,7 @@ 在这里激活Device admin - 暂不支持在非主用户中使用Shizuku 检查Shizuku - 请输入工作资料的UserID 列出Owners 服务未启动 已授权(Shell) @@ -89,7 +87,6 @@ Shizuku未连接 无效Binder 连接Shizuku - 未授权 系统 @@ -149,6 +146,7 @@ 静默清除 将会删除工作资料 API34或以上将不能在系统用户中使用WipeData + 加密状态: 安全补丁: %1$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3174665..4552847 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,7 +38,6 @@ Decide by user Unsupported Developing - Try again Unknown effect Options Copy Command @@ -47,6 +46,7 @@ Unknown status + Click to activate Device admin Profile owner Device owner @@ -83,9 +83,7 @@ Shizuku - You can only use this feature in the primary user. Check permission - Enter UserID of work profile List owners Shizuku not started. dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver @@ -100,7 +98,6 @@ Invalid binder Connect Shizuku Shizuku disconnected - Permission denied System manager @@ -159,6 +156,7 @@ Wipe silently Work profile will be deleted. You cannot use WipeData in system user. + Encrypt status: Security patch: %1$s