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