From e75a0946dbb0ea58c9741ed34b5529720e5c3c0e Mon Sep 17 00:00:00 2001
From: BinTianqi <1220958406@qq.com>
Date: Wed, 24 Jan 2024 10:23:20 +0800
Subject: [PATCH] fix context problems
---
app/src/main/AndroidManifest.xml | 3 -
.../binbin/androidowner/ApplicationManage.kt | 7 +-
.../com/binbin/androidowner/DeviceControl.kt | 8 +-
.../com/binbin/androidowner/MainActivity.kt | 40 ++++++----
.../java/com/binbin/androidowner/Password.kt | 15 ++--
.../com/binbin/androidowner/Permissions.kt | 34 ++++----
.../java/com/binbin/androidowner/Setting.kt | 78 +++++++++++++++++++
.../main/java/com/binbin/androidowner/User.kt | 40 +++++-----
.../com/binbin/androidowner/UserRestrict.kt | 7 +-
app/src/main/res/drawable/open_in_new.xml | 9 +++
app/src/main/res/values/strings.xml | 2 +
11 files changed, 177 insertions(+), 66 deletions(-)
create mode 100644 app/src/main/java/com/binbin/androidowner/Setting.kt
create mode 100644 app/src/main/res/drawable/open_in_new.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4c771b7..4d2fad8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,7 +3,6 @@
xmlns:tools="http://schemas.android.com/tools">
-
@@ -32,8 +31,6 @@
-
-
diff --git a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt
index 7c853ab..b83281d 100644
--- a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt
+++ b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt
@@ -12,6 +12,7 @@ import android.net.Uri
import android.os.Build.VERSION
import android.util.Log
import android.widget.Toast
+import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -33,6 +34,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat.startActivity
@@ -41,7 +43,10 @@ import java.io.InputStream
@Composable
-fun ApplicationManage(myDpm:DevicePolicyManager, myComponent:ComponentName,myContext:Context){
+fun ApplicationManage(){
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
var pkgName by remember { mutableStateOf("") }
Column(
modifier = Modifier
diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt
index 15d2d35..d6024b9 100644
--- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt
+++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt
@@ -2,9 +2,9 @@ package com.binbin.androidowner
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
-import android.content.Context
import android.os.Build.VERSION
import android.widget.Toast
+import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -28,13 +28,17 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@Composable
-fun DeviceControl(myDpm: DevicePolicyManager, myComponent: ComponentName,myContext: Context){
+fun DeviceControl(){
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt
index 0757fa7..4e88e2e 100644
--- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt
+++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt
@@ -15,7 +15,9 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -33,6 +35,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -47,14 +50,12 @@ import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.ui.theme.AndroidOwnerTheme
import com.google.accompanist.systemuicontroller.rememberSystemUiController
+@ExperimentalMaterial3Api
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, false)
super.onCreate(savedInstanceState)
- val context = applicationContext
- val dpm = context.getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager
- val adminComponent = ComponentName(context,MyDeviceAdminReceiver::class.java)
setContent {
val sysUiCtrl = rememberSystemUiController()
val useDarkIcon = !isSystemInDarkTheme()
@@ -63,16 +64,15 @@ class MainActivity : ComponentActivity() {
sysUiCtrl.setNavigationBarColor(Color.Transparent,useDarkIcon)
sysUiCtrl.setStatusBarColor(Color.Transparent,useDarkIcon)
}
- MyScaffold(dpm,adminComponent,context)
+ MyScaffold()
}
}
}
}
-@OptIn(ExperimentalMaterial3Api::class)
-@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
+@ExperimentalMaterial3Api
@Composable
-fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainContext:Context){
+fun MyScaffold(){
val focusMgr = LocalFocusManager.current
val navCtrl = rememberNavController()
val backStackEntry by navCtrl.currentBackStackEntryAsState()
@@ -83,7 +83,8 @@ fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainCon
"UserManage" to R.string.user_manage,
"ApplicationManage" to R.string.app_manage,
"UserRestriction" to R.string.user_restrict,
- "Password" to R.string.password
+ "Password" to R.string.password,
+ "AppSetting" to R.string.setting
)
val topBarName = topBarNameMap[backStackEntry?.destination?.route]?: R.string.app_name
Scaffold(
@@ -128,24 +129,28 @@ fun MyScaffold(mainDpm:DevicePolicyManager, mainComponent:ComponentName, mainCon
.padding(top = it.calculateTopPadding())
.imePadding()
){
- composable(route = "HomePage", content = { HomePage(navCtrl,mainDpm,mainComponent)})
- composable(route = "DeviceControl", content = { DeviceControl(mainDpm,mainComponent,mainContext)})
- composable(route = "Permissions", content = { DpmPermissions(mainDpm,mainComponent,mainContext,navCtrl)})
- composable(route = "ApplicationManage", content = { ApplicationManage(mainDpm,mainComponent,mainContext)})
- composable(route = "UserRestriction", content = { UserRestriction(mainDpm,mainComponent,mainContext)})
- composable(route = "UserManage", content = { UserManage(mainDpm,mainComponent,mainContext)})
- composable(route = "Password", content = { Password(mainDpm,mainComponent,mainContext)})
+ composable(route = "HomePage", content = { HomePage(navCtrl)})
+ composable(route = "DeviceControl", content = { DeviceControl()})
+ composable(route = "Permissions", content = { DpmPermissions(navCtrl)})
+ composable(route = "ApplicationManage", content = { ApplicationManage()})
+ composable(route = "UserRestriction", content = { UserRestriction()})
+ composable(route = "UserManage", content = { UserManage()})
+ composable(route = "Password", content = { Password()})
+ composable(route = "AppSetting", content = { AppSetting()})
}
}
}
@Composable
-fun HomePage(navCtrl:NavHostController,myDpm:DevicePolicyManager,myComponent:ComponentName){
+fun HomePage(navCtrl:NavHostController){
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
val isda = myDpm.isAdminActive(myComponent)
val isdo = myDpm.isDeviceOwnerApp("com.binbin.androidowner")
val activateType = if(isDeviceOwner(myDpm)){"Device Owner"}else if(isProfileOwner(myDpm)){"Profile Owner"}else if(isda){"Device Admin"}else{""}
val isActivated = if(isdo||isda){"已激活"}else{"未激活"}
- Column {
+ Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
Row(
modifier = Modifier
.fillMaxWidth()
@@ -185,6 +190,7 @@ fun HomePage(navCtrl:NavHostController,myDpm:DevicePolicyManager,myComponent:Com
HomePageItem(R.string.user_restrict, R.drawable.manage_accounts_fill0, R.string.user_restrict_desc, "UserRestriction", navCtrl)
HomePageItem(R.string.user_manage,R.drawable.account_circle_fill0,R.string.user_manage_desc,"UserManage",navCtrl)
HomePageItem(R.string.password, R.drawable.password_fill0,R.string.security_desc, "Password",navCtrl)
+ HomePageItem(R.string.setting, R.drawable.info_fill0, R.string.setting_desc, "AppSetting",navCtrl)
}
}
diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt
index a3ad27d..520d857 100644
--- a/app/src/main/java/com/binbin/androidowner/Password.kt
+++ b/app/src/main/java/com/binbin/androidowner/Password.kt
@@ -4,9 +4,9 @@ import android.app.KeyguardManager
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
-import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Build.VERSION
import android.widget.Toast
+import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -38,6 +38,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
@@ -46,7 +47,10 @@ import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat.startActivity
@Composable
-fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Context){
+fun Password(){
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
var newPwd by remember{ mutableStateOf("") }
var confirmed by remember{ mutableStateOf(false) }
val focusMgr = LocalFocusManager.current
@@ -151,7 +155,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
}else{ Toast.makeText(myContext, "需要4位数字或字母", Toast.LENGTH_SHORT).show() }
},
modifier = Modifier.padding(end = 10.dp),
- enabled = isDeviceOwner(myDpm)|| isProfileOwner(myDpm)
+ enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm) || myDpm.isAdminActive(myComponent)
) {
Text("确认密码")
}
@@ -163,7 +167,6 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
}else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() }
confirmed=false
},
- enabled = confirmed,
colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError)
) {
Text("设置密码")
@@ -176,6 +179,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
}else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() }
confirmed=false
},
+ enabled = confirmed,
colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError)
) {
Text("设置密码")
@@ -234,7 +238,7 @@ fun Password(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext:Conte
DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC to "数字字母各至少一个",
DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK to "生物识别(弱)",
DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX to "复杂数字(无连续性)",
- DevicePolicyManager.PASSWORD_QUALITY_COMPLEX to "自定义",
+ DevicePolicyManager.PASSWORD_QUALITY_COMPLEX to "自定义(暂不支持)",
).toList()
var selectedItem by remember{ mutableIntStateOf(passwordQuality[0].first) }
if(isDeviceOwner(myDpm) || isProfileOwner(myDpm)){
@@ -329,7 +333,6 @@ fun activateToken(myContext: Context){
val ACTIVATE_TOKEN_PROMPT = "在这里激活密码重置令牌"
val keyguardManager = myContext.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
val confirmIntent = keyguardManager.createConfirmDeviceCredentialIntent(null, ACTIVATE_TOKEN_PROMPT)
- confirmIntent.setFlags(FLAG_ACTIVITY_NEW_TASK)
if (confirmIntent != null) {
startActivity(myContext,confirmIntent, null)
} else {
diff --git a/app/src/main/java/com/binbin/androidowner/Permissions.kt b/app/src/main/java/com/binbin/androidowner/Permissions.kt
index 260113f..6d8fe57 100644
--- a/app/src/main/java/com/binbin/androidowner/Permissions.kt
+++ b/app/src/main/java/com/binbin/androidowner/Permissions.kt
@@ -4,9 +4,9 @@ import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
-import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Build.VERSION
import android.widget.Toast
+import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -30,6 +30,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
@@ -40,10 +41,12 @@ import androidx.navigation.NavHostController
@Composable
-fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myContext:Context,navCtrl:NavHostController){
+fun DpmPermissions(navCtrl:NavHostController){
//da:DeviceAdmin do:DeviceOwner
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
val isda = myDpm.isAdminActive(myComponent)
- val isdo = myDpm.isDeviceOwnerApp("com.binbin.androidowner")
val focusManager = LocalFocusManager.current
Column(
modifier = Modifier.verticalScroll(rememberScrollState()),
@@ -139,9 +142,9 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
) {
Column {
Text(text = "Device Owner", style = MaterialTheme.typography.titleLarge)
- Text(if(isdo){"已激活"}else{"未激活"})
+ Text(if(isDeviceOwner(myDpm)){"已激活"}else{"未激活"})
}
- if(isdo){
+ if(isDeviceOwner(myDpm)){
Button(
onClick = {
myDpm.clearDeviceOwnerApp("com.binbin.androidowner")
@@ -156,14 +159,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
}
}
}
- if(isDeviceOwner(myDpm)|| isProfileOwner(myDpm)||myDpm.isAdminActive(myComponent)){
- Text(
- text = "注意!在这里撤销权限不会清除配置。比如:被停用的应用会保持停用状态",
- color = MaterialTheme.colorScheme.onErrorContainer,
- modifier = sections(MaterialTheme.colorScheme.errorContainer)
- )
- }
- if(!isdo&&!isProfileOwner(myDpm)){
+ if(!isDeviceOwner(myDpm)&&!isProfileOwner(myDpm)){
Column(
modifier = sections(MaterialTheme.colorScheme.tertiaryContainer),
horizontalAlignment = Alignment.Start
@@ -178,6 +174,13 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
}
}
}
+ if(isDeviceOwner(myDpm)|| isProfileOwner(myDpm)||myDpm.isAdminActive(myComponent)){
+ Text(
+ text = "注意!在这里撤销权限不会清除配置。比如:被停用的应用会保持停用状态",
+ color = MaterialTheme.colorScheme.onErrorContainer,
+ modifier = sections(MaterialTheme.colorScheme.errorContainer)
+ )
+ }
if(VERSION.SDK_INT>=30){
Column(
modifier = sections()
@@ -205,7 +208,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
Text("(恢复出厂设置不变)")
if(specificId!=""){
Text(specificId)
- Button(onClick = {myDpm.setOrganizationId(specificId)}, enabled = specificId!="") {
+ Button(onClick = {myDpm.setOrganizationId(specificId)}) {
Text("设置为组织ID")
}
}else{
@@ -259,7 +262,7 @@ fun DpmPermissions(myDpm: DevicePolicyManager, myComponent: ComponentName, myCon
}
}
- if(isdo&&VERSION.SDK_INT>=24){
+ if(isDeviceOwner(myDpm)&&VERSION.SDK_INT>=24){
DeviceOwnerInfo(R.string.owner_lockscr_info,R.string.place_holder,R.string.owner_lockscr_info,focusManager,myContext,
{myDpm.deviceOwnerLockScreenInfo},{content -> myDpm.setDeviceOwnerLockScreenInfo(myComponent,content)})
DeviceOwnerInfo(R.string.support_msg,R.string.support_msg_desc,R.string.message,focusManager,myContext,
@@ -326,6 +329,5 @@ fun activateDeviceAdmin(inputContext:Context,inputComponent:ComponentName){
val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, inputComponent)
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "在这里激活Android Owner")
- intent.setFlags(FLAG_ACTIVITY_NEW_TASK)
startActivity(inputContext,intent,null)
}
diff --git a/app/src/main/java/com/binbin/androidowner/Setting.kt b/app/src/main/java/com/binbin/androidowner/Setting.kt
new file mode 100644
index 0000000..ca92fa5
--- /dev/null
+++ b/app/src/main/java/com/binbin/androidowner/Setting.kt
@@ -0,0 +1,78 @@
+package com.binbin.androidowner
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+
+@Composable
+fun AppSetting(){
+ Column(
+ modifier = Modifier.verticalScroll(rememberScrollState())
+ ) {
+ val myContext = LocalContext.current
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 8.dp, vertical = 4.dp)
+ .clip(RoundedCornerShape(14.dp))
+ .background(color = MaterialTheme.colorScheme.primaryContainer)
+ .padding(vertical = 6.dp)
+ ) {
+ Column(
+ modifier = Modifier.padding(start = 8.dp, end = 8.dp, bottom = 12.dp)
+ ) {
+ Text(text = "Android owner", style = MaterialTheme.typography.headlineMedium, color = MaterialTheme.colorScheme.onPrimaryContainer)
+ Text(text = "使用安卓的Device admin、Device owner 、Profile owner,全方位掌控你的设备")
+ Spacer(Modifier.padding(vertical = 4.dp))
+ Text("这个应用只在AOSP和LineageOS上测试过,不确保每个功能都在其它系统可用,尤其是国内的魔改系统。")
+ }
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier
+ .fillMaxWidth()
+ .clickable { shareLink(myContext, "https://github.com/BinTianqi/AndroidOwner") }
+ .padding(start = 8.dp, bottom = 4.dp)
+ ) {
+ Icon(
+ painter = painterResource(id = R.drawable.open_in_new),
+ contentDescription = null,
+ modifier = Modifier.padding(start = 6.dp, end = 8.dp),
+ tint = MaterialTheme.colorScheme.primary
+ )
+ Column {
+ Text(text = "源代码", fontSize = 18.sp, fontWeight = FontWeight.SemiBold)
+ Text(text = "https://github.com/BinTianqi/AndroidOwner", color = MaterialTheme.colorScheme.onPrimaryContainer)
+ Text(text = "欢迎提交issue、给小星星")
+ }
+ }
+ }
+ }
+}
+
+fun shareLink(inputContext:Context,link:String){
+ val uri = Uri.parse(link)
+ val intent = Intent(Intent.ACTION_VIEW, uri)
+ inputContext.startActivity(Intent.createChooser(intent, "Hello"),null)
+}
diff --git a/app/src/main/java/com/binbin/androidowner/User.kt b/app/src/main/java/com/binbin/androidowner/User.kt
index b795453..db12029 100644
--- a/app/src/main/java/com/binbin/androidowner/User.kt
+++ b/app/src/main/java/com/binbin/androidowner/User.kt
@@ -4,12 +4,11 @@ import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
-import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Build.VERSION
-import android.os.Build.VERSION_CODES
import android.os.UserHandle
import android.os.UserManager
import android.widget.Toast
+import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -29,19 +28,23 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
-import androidx.core.content.ContextCompat.startActivity
import androidx.core.os.UserManagerCompat
@Composable
-fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Context){
+fun UserManage(){
Column(
modifier = Modifier.verticalScroll(rememberScrollState())
) {
//val myUM = myContext.getSystemService(Context.USER_SERVICE)
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
+ val focusMgr = LocalFocusManager.current
val currentUser = android.os.Process.myUserHandle()
val userList = Test.returnUsers(myContext)
Column(modifier = sections()) {
@@ -108,7 +111,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co
) {
Text("移除用户")
}
- Button(onClick = { createWorkProfile(myContext,myComponent) }) {
+ Button(onClick = { createWorkProfile(myContext)}) {
Text("创建工作资料")
}
Text("可能无法创建工作资料")
@@ -135,7 +138,7 @@ fun UserManage(myDpm:DevicePolicyManager,myComponent:ComponentName,myContext: Co
var newUserHandle: UserHandle? by remember{ mutableStateOf(null) }
Row {
Button(
- onClick = {newUserHandle=myDpm.createAndManageUser(myComponent,userName,myComponent,null,selectedFlag)},
+ onClick = {newUserHandle=myDpm.createAndManageUser(myComponent,userName,myComponent,null,selectedFlag);focusMgr.clearFocus()},
enabled = isDeviceOwner(myDpm)
) {
Text("创建")
@@ -232,20 +235,17 @@ fun userOperationResultCode(result:Int): String {
}
}
-private fun createWorkProfile(myContext: Context,myComponent: ComponentName) {
+private fun createWorkProfile(myContext: Context) {
val intent = Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE)
- intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.binbin.androidowner")
- intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, myComponent)
- if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
- intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_ALLOW_OFFLINE, true)
- }
+ intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, ComponentName(myContext,MyDeviceAdminReceiver::class.java))
+ intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, myContext.packageName)
+ if (VERSION.SDK_INT >= 33) { intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_ALLOW_OFFLINE,true) }
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"hello")
- /*
- intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_SKIP_USER_CONSENT, false)
- val adminExtras = PersistableBundle()
- if (adminExtras.size() > 0) {
- intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, adminExtras)
- }*/
- intent.setFlags(FLAG_ACTIVITY_NEW_TASK)
- startActivity(myContext,intent,null)
+ myContext.startActivity(intent)
+}
+
+private fun createManagedDevice(myContext: Context) {
+ val intent = Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE)
+ intent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, ComponentName(myContext,MyDeviceAdminReceiver::class.java))
+ myContext.startActivity(intent)
}
diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt
index 5f12a93..5d4d103 100644
--- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt
+++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt
@@ -6,6 +6,7 @@ import android.content.Context
import android.os.Build.VERSION
import android.os.UserManager
import android.widget.Toast
+import androidx.activity.ComponentActivity
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.foundation.background
@@ -31,6 +32,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
@@ -45,7 +47,10 @@ private data class Restriction(
@Composable
-fun UserRestriction(myDpm: DevicePolicyManager, myComponent: ComponentName,myContext: Context){
+fun UserRestriction(){
+ val myContext = LocalContext.current
+ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
var internetVisible by remember{ mutableStateOf(false) }
var connectivityVisible by remember{ mutableStateOf(false) }
var applicationVisible by remember{ mutableStateOf(false) }
diff --git a/app/src/main/res/drawable/open_in_new.xml b/app/src/main/res/drawable/open_in_new.xml
new file mode 100644
index 0000000..b1e84e6
--- /dev/null
+++ b/app/src/main/res/drawable/open_in_new.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7274e80..da7fc6e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -128,4 +128,6 @@
禁止锁屏(需无密码)
用户管理
查看用户状态,添加用户
+ 设置
+ 关于此应用
\ No newline at end of file