From 1ea203d331d42ebf00ed84304b9faaa108dfed78 Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Sun, 11 Feb 2024 20:24:03 +0800 Subject: [PATCH] retrieve security and network logs --- Guide.md | 30 ++++---- app/build.gradle.kts | 4 +- app/src/main/AndroidManifest.xml | 1 + .../com/binbin/androidowner/DeviceControl.kt | 51 +++++++++---- .../com/binbin/androidowner/MainActivity.kt | 2 +- .../java/com/binbin/androidowner/Network.kt | 37 ++++++++-- .../java/com/binbin/androidowner/Password.kt | 72 ++++++++++--------- .../com/binbin/androidowner/Permissions.kt | 4 +- .../binbin/androidowner/SystemUpdatePolicy.kt | 8 +-- .../main/java/com/binbin/androidowner/User.kt | 6 +- .../com/binbin/androidowner/UserRestrict.kt | 5 -- .../main/res/drawable/description_fill0.xml | 9 --- app/src/main/res/values/strings.xml | 14 +--- 13 files changed, 138 insertions(+), 105 deletions(-) delete mode 100644 app/src/main/res/drawable/description_fill0.xml diff --git a/Guide.md b/Guide.md index 929c0a9..38f6191 100644 --- a/Guide.md +++ b/Guide.md @@ -184,6 +184,8 @@ adb shell dpm remove-active-admin com.binbin.androidowner/com.binbin.androidowne 需要API34或以上 +状态栏仍会显示时间和系统图标,但是通知图标会隐藏,并且状态栏不能下拉 + ### 自动设置时间 需要的权限:Device owner或由组织拥有的工作资料的Profile owner @@ -218,12 +220,6 @@ adb shell dpm remove-active-admin com.binbin.androidowner/com.binbin.androidowne 需要API23或以上 -### 安全日志 - -需要的权限:Device owner - -需要API24或以上 - ### 通用标准模式 需要的权限:Device owner @@ -339,6 +335,12 @@ MTE: Memory Tagging Extension(内存标记拓展)[安卓开发者:MTE](htt 或者清除所有用户证书 +### 安全日志 + +需要的权限:Device owner + +需要API24或以上 + ### 系统更新策略 需要的权限:Device owner @@ -388,14 +390,6 @@ MTE: Memory Tagging Extension(内存标记拓展)[安卓开发者:MTE](htt 得到的是设备真实的Wi-Fi Mac地址,不是连接Wi-Fi时随机生成的Mac地址 -### 网络日志记录 - -需要的权限:Device owner或Profile owner - -需要API26或以上 - -功能开发中 - ### 优先网络服务 需要的权限:Device owner @@ -450,6 +444,14 @@ MTE: Memory Tagging Extension(内存标记拓展)[安卓开发者:MTE](htt 也可以设置私人DNS主机名 +### 网络日志记录 + +需要的权限:Device owner或Profile owner + +需要API26或以上 + +功能开发中 + ### Wi-Fi密钥对 需要的权限:Device owner或Profile owner diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b2e4770..c771b3b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "com.binbin.androidowner" minSdk = 21 targetSdk = 34 - versionCode = 13 - versionName = "3.0" + versionCode = 14 + versionName = "3.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 991dbe7..2740399 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.AndroidOwner" android:enableOnBackInvokedCallback="true" + android:testOnly="false" tools:targetApi="34"> =34&&(isDeviceOwner(myDpm)|| (isProfileOwner(myDpm)&&myDpm.isAffiliatedUser))){ - DeviceCtrlItem(R.string.hide_status_bar,R.string.may_hide_notifi_icon_only,R.drawable.notifications_fill0, + DeviceCtrlItem(R.string.disable_status_bar,R.string.place_holder,R.drawable.notifications_fill0, {myDpm.isStatusBarDisabled},{b -> myDpm.setStatusBarDisabled(myComponent,b) } ) } @@ -85,11 +86,6 @@ fun DeviceControl(){ {myDpm.getBluetoothContactSharingDisabled(myComponent)},{b -> myDpm.setBluetoothContactSharingDisabled(myComponent,b)} ) } - if(VERSION.SDK_INT>=24&&isDeviceOwner(myDpm)){ - DeviceCtrlItem(R.string.secure_logging,R.string.no_effect,R.drawable.description_fill0, - {myDpm.isSecurityLoggingEnabled(myComponent)},{b -> myDpm.setSecurityLoggingEnabled(myComponent,b) } - ) - } if(VERSION.SDK_INT>=30&&isDeviceOwner(myDpm)){ DeviceCtrlItem(R.string.common_criteria_mode,R.string.common_criteria_mode_desc,R.drawable.security_fill0, {myDpm.isCommonCriteriaModeEnabled(myComponent)},{b -> myDpm.setCommonCriteriaModeEnabled(myComponent,b)} @@ -220,7 +216,6 @@ fun DeviceControl(){ ) { Text("应用") } - } } @@ -256,7 +251,7 @@ fun DeviceControl(){ RadioButtonItem("由用户决定",{appPolicy == NEARBY_STREAMING_NOT_CONTROLLED_BY_POLICY},{appPolicy = NEARBY_STREAMING_NOT_CONTROLLED_BY_POLICY}) RadioButtonItem("启用",{appPolicy == NEARBY_STREAMING_ENABLED},{appPolicy = NEARBY_STREAMING_ENABLED}) RadioButtonItem("禁用",{appPolicy == NEARBY_STREAMING_DISABLED},{appPolicy = NEARBY_STREAMING_DISABLED}) - RadioButtonItem("如果足够安全(默认)",{appPolicy == NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY},{appPolicy = NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY}) + RadioButtonItem("在足够安全时启用",{appPolicy == NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY},{appPolicy = NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY}) Button( onClick = { myDpm.nearbyAppStreamingPolicy = appPolicy @@ -272,7 +267,7 @@ fun DeviceControl(){ RadioButtonItem("由用户决定",{notificationPolicy == NEARBY_STREAMING_NOT_CONTROLLED_BY_POLICY},{notificationPolicy = NEARBY_STREAMING_NOT_CONTROLLED_BY_POLICY}) RadioButtonItem("启用",{notificationPolicy == NEARBY_STREAMING_ENABLED},{notificationPolicy = NEARBY_STREAMING_ENABLED}) RadioButtonItem("禁用",{notificationPolicy == NEARBY_STREAMING_DISABLED},{notificationPolicy = NEARBY_STREAMING_DISABLED}) - RadioButtonItem("如果足够安全(默认)",{notificationPolicy == NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY},{notificationPolicy = NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY}) + RadioButtonItem("在足够安全时启用",{notificationPolicy == NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY},{notificationPolicy = NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY}) Button( onClick = { myDpm.nearbyNotificationStreamingPolicy = notificationPolicy @@ -472,6 +467,36 @@ fun DeviceControl(){ } } + if(VERSION.SDK_INT>=26&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm))){ + Column(modifier = sections()){ + Text(text = "收集安全日志", style = typography.titleLarge) + Text(text = "功能开发中", style = bodyTextStyle) + Row(modifier=Modifier.fillMaxWidth().padding(horizontal=8.dp),horizontalArrangement=Arrangement.SpaceBetween,verticalAlignment=Alignment.CenterVertically){ + var checked by remember{mutableStateOf(myDpm.isSecurityLoggingEnabled(myComponent))} + Text(text = "启用", style = typography.titleLarge) + Switch( + checked = checked, + onCheckedChange = {myDpm.setSecurityLoggingEnabled(myComponent,!checked);checked=myDpm.isSecurityLoggingEnabled(myComponent)} + ) + } + Button( + onClick = { + val log = myDpm.retrieveSecurityLogs(myComponent) + if(log!=null){ + for(i in log){ Log.d("NetLog",i.toString()) } + Toast.makeText(myContext,"已输出至Log",Toast.LENGTH_SHORT).show() + }else{ + Log.d("NetLog","无") + Toast.makeText(myContext,"无",Toast.LENGTH_SHORT).show() + } + }, + modifier = Modifier.fillMaxWidth() + ) { + Text("收集") + } + } + } + if(isDeviceOwner(myDpm)){ SysUpdatePolicy() } @@ -481,11 +506,11 @@ fun DeviceControl(){ var confirmed by remember{ mutableStateOf(false) } Text(text = "清除数据",style = typography.titleLarge,modifier = Modifier.padding(6.dp),color = colorScheme.onErrorContainer) RadioButtonItem("默认",{flag==0},{flag=0}, colorScheme.onErrorContainer) - RadioButtonItem("WIPE_EXTERNAL_STORAGE",{flag==WIPE_EXTERNAL_STORAGE},{flag=WIPE_EXTERNAL_STORAGE}, colorScheme.onErrorContainer) + RadioButtonItem("清除外部存储",{flag==WIPE_EXTERNAL_STORAGE},{flag=WIPE_EXTERNAL_STORAGE}, colorScheme.onErrorContainer) if(VERSION.SDK_INT>=22&&isDeviceOwner(myDpm)){ - RadioButtonItem("WIPE_RESET_PROTECTION_DATA",{flag==WIPE_RESET_PROTECTION_DATA},{flag=WIPE_RESET_PROTECTION_DATA}, colorScheme.onErrorContainer) + RadioButtonItem("清除受保护的数据",{flag==WIPE_RESET_PROTECTION_DATA},{flag=WIPE_RESET_PROTECTION_DATA}, colorScheme.onErrorContainer) } - if(VERSION.SDK_INT>=28){ RadioButtonItem("WIPE_EUICC",{flag==WIPE_EUICC},{flag=WIPE_EUICC}, colorScheme.onErrorContainer) } + if(VERSION.SDK_INT>=28){ RadioButtonItem("清除eUICC",{flag==WIPE_EUICC},{flag=WIPE_EUICC}, colorScheme.onErrorContainer) } if(VERSION.SDK_INT>=29){ RadioButtonItem("WIPE_SILENTLY",{flag==WIPE_SILENTLY},{flag=WIPE_SILENTLY}, colorScheme.onErrorContainer) } Text(text = "清空数据的不能是系统用户",color = colorScheme.onErrorContainer, style = if(!sharedPref.getBoolean("isWear",false)){typography.bodyLarge}else{typography.bodyMedium}) @@ -522,7 +547,7 @@ fun DeviceControl(){ enabled = confirmed, modifier = Modifier.fillMaxWidth(0.96F) ) { - Text("WipeDevice(API34)") + Text("WipeDevice") } } } diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index 0630bea..607823f 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -225,7 +225,7 @@ fun HomePage(navCtrl:NavHostController){ } } HomePageItem(R.string.device_ctrl, R.drawable.mobile_phone_fill0, "DeviceControl", navCtrl) - if(VERSION.SDK_INT>=26){HomePageItem(R.string.network, R.drawable.wifi_fill0, "Network",navCtrl)} + if(VERSION.SDK_INT>=24){HomePageItem(R.string.network, R.drawable.wifi_fill0, "Network",navCtrl)} HomePageItem(R.string.work_profile, R.drawable.work_fill0, "ManagedProfile",navCtrl) HomePageItem(R.string.app_manage, R.drawable.apps_fill0, "ApplicationManage", navCtrl) HomePageItem(R.string.user_restrict, R.drawable.manage_accounts_fill0, "UserRestriction", navCtrl) diff --git a/app/src/main/java/com/binbin/androidowner/Network.kt b/app/src/main/java/com/binbin/androidowner/Network.kt index dff049d..162322d 100644 --- a/app/src/main/java/com/binbin/androidowner/Network.kt +++ b/app/src/main/java/com/binbin/androidowner/Network.kt @@ -11,6 +11,7 @@ import android.os.Build.VERSION import android.telephony.TelephonyManager import android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID import android.telephony.data.ApnSetting.* +import android.util.Log import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility @@ -52,11 +53,6 @@ fun Network(){ Text(text = "WiFi MAC: $wifimac",modifier=Modifier.fillMaxWidth(), textAlign = TextAlign.Center,style=bodyTextStyle) } - if(VERSION.SDK_INT>=26&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm))){ - DeviceCtrlItem(R.string.network_logging,R.string.developing,R.drawable.wifi_fill0, - {myDpm.isNetworkLoggingEnabled(myComponent)},{b -> myDpm.setNetworkLoggingEnabled(myComponent,b) } - ) - } if(VERSION.SDK_INT>=33&&isDeviceOwner(myDpm)){ DeviceCtrlItem(R.string.preferential_network_service,R.string.developing,R.drawable.globe_fill0, {myDpm.isPreferentialNetworkServiceEnabled},{b -> myDpm.isPreferentialNetworkServiceEnabled = b} @@ -220,6 +216,36 @@ fun Network(){ } } + if(VERSION.SDK_INT>=26&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm))){ + Column(modifier = sections()){ + Text(text = "收集网络日志", style = typography.titleLarge) + Text(text = "功能开发中", style = bodyTextStyle) + Row(modifier=Modifier.fillMaxWidth().padding(horizontal=8.dp),horizontalArrangement=Arrangement.SpaceBetween,verticalAlignment=Alignment.CenterVertically){ + var checked by remember{mutableStateOf(myDpm.isNetworkLoggingEnabled(myComponent))} + Text(text = "启用", style = typography.titleLarge) + Switch( + checked = checked, + onCheckedChange = {myDpm.setNetworkLoggingEnabled(myComponent,!checked);checked = myDpm.isNetworkLoggingEnabled(myComponent)} + ) + } + Button( + onClick = { + val log = myDpm.retrieveNetworkLogs(myComponent,1234567890) + if(log!=null){ + for(i in log){ Log.d("NetLog",i.toString()) } + Toast.makeText(myContext,"已输出至Log",Toast.LENGTH_SHORT).show() + }else{ + Log.d("NetLog","无") + Toast.makeText(myContext,"无",Toast.LENGTH_SHORT).show() + } + }, + modifier = Modifier.fillMaxWidth() + ) { + Text("收集") + } + } + } + if(VERSION.SDK_INT>=31&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm))){ Column(modifier = sections()){ var keyPair by remember{mutableStateOf("")} @@ -292,7 +318,6 @@ fun Network(){ } var result = Builder().build() AnimatedVisibility(nextStep) { - /*TODO*/ var carrierEnabled by remember{mutableStateOf(false)} var inputApnName by remember{mutableStateOf("")} var user by remember{mutableStateOf("")} diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt index 366a73c..e32fc9b 100644 --- a/app/src/main/java/com/binbin/androidowner/Password.kt +++ b/app/src/main/java/com/binbin/androidowner/Password.kt @@ -157,50 +157,52 @@ fun Password(){ Text(text = stringResource(R.string.reset_pwd_desc), modifier = Modifier.padding(vertical = 3.dp),style=bodyTextStyle) var resetPwdFlag by remember{ mutableIntStateOf(0) } if(VERSION.SDK_INT>=23){ - RadioButtonItem("开机时不要求密码(如果有指纹等其他解锁方式)", {resetPwdFlag==RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}, {resetPwdFlag=RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}) + RadioButtonItem("启动(boot)时不要求密码", {resetPwdFlag==RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}, {resetPwdFlag=RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}) } - RadioButtonItem("要求立即输入新密码",{resetPwdFlag==RESET_PASSWORD_REQUIRE_ENTRY}, {resetPwdFlag=RESET_PASSWORD_REQUIRE_ENTRY}) + RadioButtonItem("不允许其他设备管理员重置密码直至用户输入一次密码",{resetPwdFlag==RESET_PASSWORD_REQUIRE_ENTRY}, {resetPwdFlag=RESET_PASSWORD_REQUIRE_ENTRY}) RadioButtonItem("无",{resetPwdFlag==0},{resetPwdFlag=0}) - Row(modifier = if(!isWear){Modifier.fillMaxWidth()}else{Modifier.horizontalScroll(rememberScrollState())},horizontalArrangement = Arrangement.SpaceBetween) { + Button( + onClick = { + if(newPwd.length>=4||newPwd.isEmpty()){ confirmed=!confirmed + }else{ Toast.makeText(myContext, "需要4位密码", Toast.LENGTH_SHORT).show() } + }, + enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm) || myDpm.isAdminActive(myComponent), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.3F)}, + colors = ButtonDefaults.buttonColors( + containerColor = if(confirmed){ colorScheme.primary }else{ colorScheme.error }, + contentColor = if(confirmed){ colorScheme.onPrimary }else{ colorScheme.onError } + ) + ) { + Text(text = if(confirmed){"取消"}else{"确定"}) + } + if(VERSION.SDK_INT>=26){ Button( onClick = { - if(newPwd.length>=4||newPwd.isEmpty()){ confirmed=!confirmed - }else{ Toast.makeText(myContext, "需要4位密码", Toast.LENGTH_SHORT).show() } - }, - enabled = isDeviceOwner(myDpm) || isProfileOwner(myDpm) || myDpm.isAdminActive(myComponent), - modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.3F)} - ) { - Text(text = if(confirmed){"取消"}else{"确定"}) - } - if(VERSION.SDK_INT>=26){ - Button( - onClick = { - val resetSuccess = myDpm.resetPasswordWithToken(myComponent,newPwd,myByteArray,resetPwdFlag) - if(resetSuccess){ Toast.makeText(myContext, "设置成功", Toast.LENGTH_SHORT).show() - }else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() } - confirmed=false - }, - colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), - enabled = confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)), - modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.42F)} - ) { - Text("应用") - } - } - Button( - onClick = { - val resetSuccess = myDpm.resetPassword(newPwd,resetPwdFlag) + val resetSuccess = myDpm.resetPasswordWithToken(myComponent,newPwd,myByteArray,resetPwdFlag) if(resetSuccess){ Toast.makeText(myContext, "设置成功", Toast.LENGTH_SHORT).show() }else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() } confirmed=false }, - enabled = confirmed, colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), - modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.9F)} + enabled = confirmed&&(isDeviceOwner(myDpm)||isProfileOwner(myDpm)), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.42F)} ) { - Text("应用(旧)") + Text("使用令牌重置密码") } } + Button( + onClick = { + val resetSuccess = myDpm.resetPassword(newPwd,resetPwdFlag) + if(resetSuccess){ Toast.makeText(myContext, "设置成功", Toast.LENGTH_SHORT).show() + }else{ Toast.makeText(myContext, "设置失败", Toast.LENGTH_SHORT).show() } + confirmed=false + }, + enabled = confirmed, + colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError), + modifier = if(isWear){Modifier}else{Modifier.fillMaxWidth(0.9F)} + ) { + Text("重置密码(弃用)") + } } PasswordItem(R.string.max_pwd_fail,R.string.max_pwd_fail_desc,R.string.max_pwd_fail_textfield, false, @@ -315,13 +317,13 @@ fun Password(){ CheckBoxItem("禁用未经编辑的通知",{unredacted},{unredacted=!unredacted}) CheckBoxItem("禁用可信代理",{agents},{agents=!agents}) CheckBoxItem("禁用指纹解锁",{fingerprint},{fingerprint=!fingerprint}) - if(VERSION.SDK_INT>=24){ CheckBoxItem("禁止在锁屏通知中输入(弃用)",{remote}, {remote=!remote}) } + if(VERSION.SDK_INT>=24){ CheckBoxItem("禁止远程输入(弃用)",{remote}, {remote=!remote}) } if(VERSION.SDK_INT>=28){ CheckBoxItem("禁用人脸解锁",{face},{face=!face}) CheckBoxItem("禁用虹膜解锁(?)",{iris},{iris=!iris}) CheckBoxItem("禁用生物识别",{biometrics},{biometrics=!biometrics}) } - if(VERSION.SDK_INT>=34){ CheckBoxItem("禁用锁屏快捷方式",{shortcuts},{shortcuts=!shortcuts}) } + if(VERSION.SDK_INT>=34){ CheckBoxItem("禁用快捷方式",{shortcuts},{shortcuts=!shortcuts}) } } } Button( @@ -346,7 +348,7 @@ fun Password(){ Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show() calculateCustomFeature() }, - enabled = isDeviceOwner(myDpm), + enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm), modifier = Modifier.fillMaxWidth() ) { Text(text = "应用") diff --git a/app/src/main/java/com/binbin/androidowner/Permissions.kt b/app/src/main/java/com/binbin/androidowner/Permissions.kt index 877a580..0930166 100644 --- a/app/src/main/java/com/binbin/androidowner/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/Permissions.kt @@ -218,9 +218,9 @@ fun DpmPermissions(navCtrl:NavHostController){ } if(VERSION.SDK_INT>=31&&(isProfileOwner(myDpm)|| isDeviceOwner(myDpm))){ Column(modifier = sections()) { - val specificId:String = myDpm.enrollmentSpecificId + val specificId = myDpm.enrollmentSpecificId Text(text = "设备唯一标识码", style = typography.titleLarge,color = titleColor) - Text("(恢复出厂设置不变)",style=bodyTextStyle) + Text(text = "(恢复出厂设置不变)",style=bodyTextStyle) if(specificId!=""){ SelectionContainer{ Text(specificId, style = bodyTextStyle) } }else{ diff --git a/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt b/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt index 69d4b97..eef332c 100644 --- a/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt +++ b/app/src/main/java/com/binbin/androidowner/SystemUpdatePolicy.kt @@ -42,11 +42,11 @@ fun SysUpdatePolicy(){ Text(text = "Update first available: ${Date(sysUpdateInfo.receivedTime)}", style = bodyTextStyle) Text(text = "Hash code: ${sysUpdateInfo.hashCode()}", style = bodyTextStyle) val securityStateDesc = when(sysUpdateInfo.securityPatchState){ - SystemUpdateInfo.SECURITY_PATCH_STATE_UNKNOWN->"SECURITY_PATCH_STATE_UNKNOWN" - SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE->"SECURITY_PATCH_STATE_TRUE" - else->"SECURITY_PATCH_STATE_FALSE" + SystemUpdateInfo.SECURITY_PATCH_STATE_UNKNOWN->"未知" + SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE->"是" + else->"否" } - Text(text = "Security patch state: $securityStateDesc", style = bodyTextStyle) + Text(text = "安全补丁: $securityStateDesc", style = bodyTextStyle) }else{ Text(text = "暂无系统更新", style = bodyTextStyle) } diff --git a/app/src/main/java/com/binbin/androidowner/User.kt b/app/src/main/java/com/binbin/androidowner/User.kt index 6fee3b8..001dac3 100644 --- a/app/src/main/java/com/binbin/androidowner/User.kt +++ b/app/src/main/java/com/binbin/androidowner/User.kt @@ -54,7 +54,8 @@ fun UserManage(navCtrl:NavHostController){ Text("支持多用户:${UserManager.supportsMultipleUsers()}",style = bodyTextStyle) if(isWear&&UserManager.supportsMultipleUsers()){Text(text = "实际上手表可能不支持", style = typography.bodyMedium, color = colorScheme.error)} } - if(VERSION.SDK_INT>=31){ Text("系统用户: ${UserManager.isHeadlessSystemUserMode()}",style = bodyTextStyle) } + if(VERSION.SDK_INT>=23){Text(text = "系统用户:${userManager.isSystemUser}")} + if(VERSION.SDK_INT>=31){ Text(text = "无头系统用户: ${UserManager.isHeadlessSystemUserMode()}",style = bodyTextStyle) } Spacer(Modifier.padding(vertical = if(isWear){2.dp}else{5.dp})) if (VERSION.SDK_INT >= 28) { val logoutable = myDpm.isLogoutEnabled @@ -63,10 +64,9 @@ fun UserManage(navCtrl:NavHostController){ val ephemeralUser = myDpm.isEphemeralUser(myComponent) Text(text = "临时用户: $ephemeralUser",style = bodyTextStyle) } - Text(text = "次级用户: ${myDpm.isAffiliatedUser}",style = bodyTextStyle) + Text(text = "附属用户: ${myDpm.isAffiliatedUser}",style = bodyTextStyle) } Spacer(Modifier.padding(vertical = if(isWear){2.dp}else{5.dp})) - Text(text = "当前UID:${android.os.Process.myUid()}",style = bodyTextStyle) Text(text = "当前UserID:${getCurrentUserId()}",style = bodyTextStyle) Text(text = "当前用户序列号:${userManager.getSerialNumberForUser(android.os.Process.myUserHandle())}",style = bodyTextStyle) } diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt index 3007479..7f1c353 100644 --- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt +++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt @@ -216,7 +216,6 @@ private class RestrictionData{ list += Restriction(UserManager.DISALLOW_CELLULAR_2G,R.string.cellular_2g,"",R.drawable.network_cell_fill0) list += Restriction(UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO,R.string.ultra_wideband_radio,"",R.drawable.android_fill0) } - list += Restriction(UserManager.DISALLOW_CONFIG_WIFI,R.string.config_wifi,"",R.drawable.wifi_fill0) if(VERSION.SDK_INT>=33){ list += Restriction(UserManager.DISALLOW_ADD_WIFI_CONFIG,R.string.add_wifi_conf,"",R.drawable.wifi_fill0) list += Restriction(UserManager.DISALLOW_CHANGE_WIFI_STATE,R.string.change_wifi_state,"",R.drawable.wifi_fill0) @@ -280,10 +279,6 @@ private class RestrictionData{ if(VERSION.SDK_INT>=28){list += Restriction(UserManager.DISALLOW_USER_SWITCH,R.string.switch_user,"",R.drawable.account_circle_fill0)} if(VERSION.SDK_INT>=24){list += Restriction(UserManager.DISALLOW_SET_USER_ICON,R.string.set_user_icon,"",R.drawable.account_circle_fill0)} list += Restriction(UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE,R.string.cross_profile_copy, "在不同用户和工作资料之间复制粘贴",R.drawable.content_paste_fill0) - if(VERSION.SDK_INT>=26){ - list += Restriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE,R.string.add_managed_profile,"",R.drawable.work_fill0) - list += Restriction(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,R.string.remove_managed_profile,"",R.drawable.work_fill0) - } if(VERSION.SDK_INT>=28){ list += Restriction(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE,R.string.share_into_managed_profile,"",R.drawable.share_fill0) list += Restriction(UserManager.DISALLOW_UNIFIED_PASSWORD,R.string.unifiied_pwd,"",R.drawable.work_fill0) diff --git a/app/src/main/res/drawable/description_fill0.xml b/app/src/main/res/drawable/description_fill0.xml deleted file mode 100644 index 3fff890..0000000 --- a/app/src/main/res/drawable/description_fill0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1aa331..c2df3a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,12 +1,11 @@ Android Owner - 设备控制 + 系统 禁用相机 禁止截屏 对AOSP的录屏也起作用 - 隐藏状态栏 - 也许只能隐藏状态栏上的通知图标 + 禁用状态栏 自动设置时间 自动设置时区 全局静音 @@ -16,8 +15,6 @@ 挂起 隐藏 如果隐藏,有可能是没安装 - 禁止用户控制 - 阻止清除应用数据和缓存 权限 @@ -43,7 +40,7 @@ 添加WiFi配置 修改WiFi状态 配置小区广播 - 配置可信凭据 + 配置凭据 修改语言 使用2G(GSM) 修改日期、时间 @@ -83,8 +80,6 @@ 切换用户 WiFi直连 WiFi共享 - 添加工作资料 - 移除工作资料 密码与锁屏 留空可以清除密码,纯数字将使用PIN码 @@ -110,12 +105,9 @@ 设置 VPN常开 实验性功能 - 网络日志记录 - 没啥用 屏幕超时 超时后锁屏(毫秒),0为由用户决定 超时时间(ms) - 安全日志 通用标准模式 Common Criteria 优先网络服务