Rename project

from 'Android Owner' to 'OwnDroid'
resolve #2
This commit is contained in:
BinTianqi
2024-04-21 09:11:16 +08:00
parent c0df796610
commit 26793f510b
38 changed files with 265 additions and 224 deletions

View File

@@ -1,11 +1,13 @@
# 使用指南 # 使用指南
欢迎来到Android owner使用教程 欢迎来到OwnDroid使用教程
在这里了解各个功能所需的权限、兼容的安卓版本和注意事项 在这里了解各个功能所需的权限、兼容的安卓版本和注意事项
## 目录 ## 目录
0. [使用前须知](#使用前须知)
1. [权限](#权限) 1. [权限](#权限)
@@ -25,6 +27,12 @@
9. [其他功能](#其他功能) 9. [其他功能](#其他功能)
## 使用前须知
1. device admin, profile owner和device owner有极高的特权包括但不限于让你的设备丢失所有数据。所以请谨慎使用
2. 以下的所有命令都需要在`adb shell`中执行。请进入`adb shell`后执行,不要直接`adb shell xxx`,容易出问题
3. ColorOS用户请在release页面下载testKey版否则无法激活Device owner
## 权限 ## 权限
### Device admin ### Device admin
@@ -41,7 +49,7 @@
ADB激活命令 ADB激活命令
```shell ```shell
adb shell dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
``` ```
一个设备可以同时存在多个Device admin。 一个设备可以同时存在多个Device admin。
@@ -72,7 +80,7 @@ adb shell dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.d
ADB激活命令 ADB激活命令
```shell ```shell
adb shell dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver dpm set-profile-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
``` ```
#### 停用 #### 停用
@@ -97,7 +105,7 @@ adb shell dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.
ADB激活命令 ADB激活命令
```shell ```shell
adb shell dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
``` ```
ADB激活有一定局限性 ADB激活有一定局限性
@@ -105,20 +113,20 @@ ADB激活有一定局限性
激活前必须删除所有用户user否则会报错。你可以使用下面这条ADB命令查看已有的用户 激活前必须删除所有用户user否则会报错。你可以使用下面这条ADB命令查看已有的用户
```shell ```shell
adb shell pm list users pm list users
``` ```
激活前也要删除所有账号account否则会报错。你可以使用下面这条ADB命令查看已有的账号 激活前也要删除所有账号account否则会报错。你可以使用下面这条ADB命令查看已有的账号
```shell ```shell
adb shell dumpsys account dumpsys account
``` ```
上面两个是安卓系统的限制,此外,还有设备生产商的限制 上面两个是安卓系统的限制,此外,还有设备生产商的限制
MIUI需要在开发者选项中打开”USB调试安全设置 MIUI需要在开发者选项中打开”USB调试安全设置
ColorOS请使用调试签名的apk ColorOS请使用testKey的apk否则只能使用Device admin和工作资料中的Profile owner
小天才电话手表Android 8.1完全不支持Device owner 小天才电话手表Android 8.1完全不支持Device owner
@@ -130,14 +138,14 @@ ColorOS请使用调试签名的apk
ADB命令停用十分麻烦你需要修改AndroidManifest.xml并自己编译项目。 ADB命令停用十分麻烦你需要修改AndroidManifest.xml并自己编译项目。
你需要把AndroidManifest.xml中第39行`android:testOnly="false"`的值改为true 你需要把AndroidManifest.xml中的`android:testOnly="false"`的值改为true
由于签名校验如果你已经安装了release那这个方法没用 签名校验问题请自己解决
然后使用这条ADB命令停用 然后使用这条ADB命令停用
```shell ```shell
adb shell dpm remove-active-admin com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver dpm remove-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
``` ```
使用这条命令也可以停用Device admin和Profile owner 使用这条命令也可以停用Device admin和Profile owner
@@ -148,7 +156,7 @@ adb shell dpm remove-active-admin com.binbin.androidowner/com.binbin.androidowne
请自己学习如何启动[Shizuku](https://github.com/RikkaApps/Shizuku) 请自己学习如何启动[Shizuku](https://github.com/RikkaApps/Shizuku)
如果Shizuku正在运行但是Android owner无法申请权限请关闭Shizuku和Android owner的电池优化(这种情况在非原生系统中比较常见) 如果Shizuku正在运行但是OwnDroid无法申请权限请关闭Shizuku和OwnDroid的电池优化(这种情况在非原生系统中比较常见)
功能: 功能:
@@ -162,7 +170,7 @@ Shizuku的本质是ADB。在安卓10或以下你还是要连接电脑激活Sh
不能在非主用户中使用 不能在非主用户中使用
因为作者懒得研究Shizuku-API所以Android owner没有添加任何Shizuku相关依赖。以上功能均是通过rish实现。因为是套壳的rish所以不支持Sui 因为作者懒得研究Shizuku-API所以OwnDroid没有添加任何Shizuku相关依赖。以上功能均是通过rish实现。因为是套壳的rish所以不支持Sui
### 设备唯一标识码 ### 设备唯一标识码
@@ -534,7 +542,7 @@ API34或以上将不能在系统用户中使用WipeData如果要恢复出厂
## 工作资料 ## 工作资料
工作资料是一种特殊的用户,使用`adb shell pm list user`命令可以看到工作资料工作资料的默认用户名是“工作资料”或“Work Profile” 工作资料是一种特殊的用户,使用`pm list user`命令可以看到工作资料工作资料的默认用户名是“工作资料”或“Work Profile”
工作资料创建后默认禁用[安装未知来源应用](#应用) 工作资料创建后默认禁用[安装未知来源应用](#应用)
@@ -548,9 +556,9 @@ API34或以上将不能在系统用户中使用WipeData如果要恢复出厂
- 跳过加密需要API24或以上没有实际作用 - 跳过加密需要API24或以上没有实际作用
创建后会跳转到工作资料中的Android owner,请立即按照指引激活工作资料 创建后会跳转到工作资料中的OwnDroid,请立即按照指引激活工作资料
创建后工作资料中的Android owner会成为Profile owner 创建后工作资料中的OwnDroid会成为Profile owner
在WearOS上可以创建工作资料但是会导致SystemUI停止运行一次。WearOS原生的启动器不会显示工作资料中的应用你需要使用支持工作资料的启动器。你可以通过[ADB命令移除工作资料](#删除工作资料)。此外不要尝试给工作资料重置密码因为WearOS不能输入工作资料的密码。测试环境WearOS4(AVD) 在WearOS上可以创建工作资料但是会导致SystemUI停止运行一次。WearOS原生的启动器不会显示工作资料中的应用你需要使用支持工作资料的启动器。你可以通过[ADB命令移除工作资料](#删除工作资料)。此外不要尝试给工作资料重置密码因为WearOS不能输入工作资料的密码。测试环境WearOS4(AVD)
@@ -560,15 +568,14 @@ API34或以上将不能在系统用户中使用WipeData如果要恢复出厂
成为由组织拥有的工作资料后可以使用更多功能 成为由组织拥有的工作资料后可以使用更多功能
前提条件:Android owner是工作资料中的Profile owner 前提条件:OwnDroid是工作资料中的Profile owner
首先,你需要在工作资料中的Android owner的“用户管理”页面中查看UserID 首先,你需要在工作资料中的OwnDroid的“用户管理”页面中查看UserID
然后执行下面这个ADB命令 然后执行下面这个ADB命令
```shell ```shell
adb shell dpm mark-profile-owner-on-organization-owned-device --user USER_ID com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
dpm mark-profile-owner-on-organization-owned-device --user USER_ID com.binbin.androidowner/com.binbin.androidowner.MyDeviceAdminReceiver
``` ```
把命令中的USER_ID替换为你的UserID 把命令中的USER_ID替换为你的UserID
@@ -579,7 +586,7 @@ dpm mark-profile-owner-on-organization-owned-device --user USER_ID com.binbin.an
需要的权限由组织拥有的工作资料的Profile owner 需要的权限由组织拥有的工作资料的Profile owner
只会挂起个人的用户应用,系统应用和Android owner仍然可以打开 只会挂起个人的用户应用,系统应用和OwnDroid仍然可以打开
### 资料最长关闭时间 ### 资料最长关闭时间
@@ -611,12 +618,12 @@ dpm mark-profile-owner-on-organization-owned-device --user USER_ID com.binbin.an
你可以在工作资料中使用 [恢复出厂设置](#恢复出厂设置) 来删除工作资料 你可以在工作资料中使用 [恢复出厂设置](#恢复出厂设置) 来删除工作资料
如果你的工作资料不是由组织拥有的,你可以打开安卓设置->安全->更多安全设置->设备管理器->带工作资料图标的Android owner->移除工作资料(非原生用户自己找) 如果你的工作资料不是由组织拥有的,你可以打开安卓设置->安全->更多安全设置->设备管理器->带工作资料图标的OwnDroid->移除工作资料(非原生用户自己找)
你也可以使用ADB命令移除工作资料把USER_ID替换为工作资料的UserID 你也可以使用ADB命令移除工作资料把USER_ID替换为工作资料的UserID
```shell ```shell
adb shell pm remove-user USER_ID pm remove-user USER_ID
``` ```
## 应用管理 ## 应用管理
@@ -628,7 +635,7 @@ adb shell pm remove-user USER_ID
除了安装应用所有的操作都需要应用的包名你可以通过ADB命令查看所有已安装应用的包名 除了安装应用所有的操作都需要应用的包名你可以通过ADB命令查看所有已安装应用的包名
```shell ```shell
adb shell pm list packages pm list packages
``` ```
### 应用详情 ### 应用详情
@@ -680,7 +687,7 @@ adb shell pm list packages
使用这个ADB命令查看系统支持的所有权限 使用这个ADB命令查看系统支持的所有权限
```shell ```shell
adb shell pm list permissions pm list permissions
``` ```
权限有三种状态: 权限有三种状态:
@@ -859,7 +866,7 @@ Profile owner无法禁用部分功能工作资料中部分功能无效wear
使用ADB查看所有用户 使用ADB查看所有用户
```shell ```shell
adb shell pm list users pm list users
``` ```
上面这条命令返回的结果中用户名前面的数字就是UserID 上面这条命令返回的结果中用户名前面的数字就是UserID
@@ -913,12 +920,12 @@ UserID不是UID。系统用户的UserID为0其他用户包括工作资
- 临时用户需API28 - 临时用户需API28
- 启用所有系统应用有些系统应用在新用户中是默认不启用的比如谷歌手机上的YouTube - 启用所有系统应用有些系统应用在新用户中是默认不启用的比如谷歌手机上的YouTube
创建后,Android owner会成为受管理用户中的Profile owner 创建后,OwnDroid会成为受管理用户中的Profile owner
这个功能在WearOS上使用会导致SystemUI停止运行一次过几秒恢复正常。创建用户实际上成功了回到Android owner后能看到新用户的序列号,`pm list users`也能看到新用户。如果切换到新用户SystemUI无法使用表现为黑屏可以用ADB命令启动别的应用。如果黑屏无法使用ADB执行下面这个命令把USER_ID替换成受管理用户的用户序列号 这个功能在WearOS上使用会导致SystemUI停止运行一次过几秒恢复正常。创建用户实际上成功了回到OwnDroid后能看到新用户的序列号,`pm list users`也能看到新用户。如果切换到新用户SystemUI无法使用表现为黑屏可以用ADB命令启动别的应用。如果黑屏无法使用ADB执行下面这个命令把USER_ID替换成受管理用户的用户序列号
```shell ```shell
adb shell pm remove-user --set-ephemeral-if-in-use USER_ID pm remove-user --set-ephemeral-if-in-use USER_ID
``` ```
新用户会被设为临时用户,重启后临时用户会被删除并切换到主用户 新用户会被设为临时用户,重启后临时用户会被删除并切换到主用户
@@ -1009,7 +1016,7 @@ Device owner无论在何时都是附属于设备的用户
需要Device owner 需要Device owner
输入密码错误次数达到限制后会恢复出厂设置(前提是Android owner有权限恢复出厂设置) 输入密码错误次数达到限制后会恢复出厂设置(前提是OwnDroid有权限恢复出厂设置)
### 密码失效超时时间 ### 密码失效超时时间
@@ -1060,7 +1067,7 @@ Device owner无论在何时都是附属于设备的用户
自定义的项目: 自定义的项目:
- 禁用小工具API21或以上弃用Android owner的最小兼容API版本21所以这个功能没用 - 禁用小工具API21或以上弃用OwnDroid的最小兼容API版本21所以这个功能没用
- 禁用相机 - 禁用相机
- 禁用通知(不知道是否包含音乐播放器) - 禁用通知(不知道是否包含音乐播放器)
- 禁用未经编辑的通知(作用未知) - 禁用未经编辑的通知(作用未知)
@@ -1095,7 +1102,7 @@ API31及以上弃用请使用[密码复杂度要求](#密码复杂度要求)
正在修改预计在5.0版本重新加入。 正在修改预计在5.0版本重新加入。
Android owner的设置中打开 OwnDroid的设置中打开
适配手表的屏幕大小添加一些WearOS/AndroidWear相关的提示比如[密码与锁屏](#密码与锁屏) 适配手表的屏幕大小添加一些WearOS/AndroidWear相关的提示比如[密码与锁屏](#密码与锁屏)
@@ -1105,8 +1112,8 @@ API31及以上弃用请使用[密码复杂度要求](#密码复杂度要求)
在安卓12或以上此功能默认打开 在安卓12或以上此功能默认打开
打开后Android owner中的颜色方案将会跟随系统 打开后OwnDroid中的颜色方案将会跟随系统
建议打开,因为自带的颜色方案不好看 建议打开,因为自带的颜色方案不好看
打开或关闭此功能都要重启Android owner 打开或关闭此功能都要重启OwnDroid

View File

@@ -4,13 +4,9 @@
### Description ### Description
Use Device admin and Device owner privilege to fully manage your Android device. Use Device admin and Device owner privilege to take full control of your device.
I'm renaming this app, from "Android Owner" to "OwnDroid". This app is renamed to "OwnDroid" from "Android Owner".
- [x] rename app
- [ ] update guide
- [ ] rename repo
### Advantage ### Advantage
@@ -40,7 +36,7 @@ This software may not have as many features as Google's official [TestDPC](https
### License ### License
[License.md](License.md) [License.md](LICENSE.md)
> Copyright (C) 2024 BinTianqi > Copyright (C) 2024 BinTianqi
> >

View File

@@ -6,11 +6,7 @@
使用安卓的Device Admin和Device Owner特权完全掌控你的设备。 使用安卓的Device Admin和Device Owner特权完全掌控你的设备。
这个APP正在从"Android Owner"改名为"OwnDroid" 这个APP已经改名为"OwnDroid",原名"Android Owner"
- [x] 重命名app
- [ ] 修改使用指南
- [ ] 修改仓库名
### 优点 ### 优点

View File

@@ -4,11 +4,11 @@ plugins {
} }
android { android {
namespace = "com.binbin.androidowner" namespace = "com.bintianqi.owndroid"
compileSdk = 34 compileSdk = 34
defaultConfig { defaultConfig {
applicationId = "com.binbin.androidowner" applicationId = "com.bintianqi.owndroid"
minSdk = 21 minSdk = 21
targetSdk = 34 targetSdk = 34
versionCode = 24 versionCode = 24

View File

@@ -25,7 +25,7 @@
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.AndroidOwner" android:theme="@style/Theme.OwnDroid"
android:enableOnBackInvokedCallback="true" android:enableOnBackInvokedCallback="true"
android:testOnly="false" android:testOnly="false"
tools:targetApi="34"> tools:targetApi="34">
@@ -33,21 +33,20 @@
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:windowSoftInputMode="adjustResize|stateHidden" android:windowSoftInputMode="adjustResize|stateHidden"
android:theme="@style/Theme.AndroidOwner"> android:theme="@style/Theme.OwnDroid">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<action android:name="android.app.action.PROVISIONING_SUCCESSFUL" /> <action android:name="android.app.action.PROVISIONING_SUCCESSFUL" />
<action android:name="android.app.action.PROVISION_MANAGED_PROFILE"/> <action android:name="android.app.action.PROVISION_MANAGED_PROFILE"/>
<action android:name="android.app.action.MANAGED_PROFILE_PROVISIONED"/> <action android:name="android.app.action.MANAGED_PROFILE_PROVISIONED"/>
<action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/> <action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/>
<action android:name="com.binbin.androidowner.MAIN_ACTION"/>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<receiver <receiver
android:name=".dpm.MyDeviceAdminReceiver" android:name=".Receiver"
android:description="@string/app_name" android:description="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN" android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true"> android:exported="true">
@@ -65,12 +64,12 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver <receiver
android:name=".dpm.PackageInstallerReceiver" android:name=".PackageInstallerReceiver"
android:description="@string/app_name" android:description="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN" android:permission="android.permission.BIND_DEVICE_ADMIN"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="com.binbin.androidowner.PKG_INSTALL_RESULT"/> <action android:name="com.bintianqi.owndroid.PKG_INSTALL_RESULT"/>
</intent-filter> </intent-filter>
</receiver> </receiver>
</application> </application>

View File

@@ -1,5 +1,5 @@
#!/system/bin/sh #!/system/bin/sh
BASEDIR=$(dirname "$0") BASEDIR=$(dirname "$0")
DEX="$BASEDIR"/rish_shizuku.dex DEX="$BASEDIR"/rish_shizuku.dex
[ -z "$RISH_APPLICATION_ID" ] && export RISH_APPLICATION_ID="com.binbin.androidowner" [ -z "$RISH_APPLICATION_ID" ] && export RISH_APPLICATION_ID="com.bintianqi.owndroid"
/system/bin/app_process -Djava.class.path="$DEX" /system/bin --nice-name=rish rikka.shizuku.shell.ShizukuShellLoader "$@" /system/bin/app_process -Djava.class.path="$DEX" /system/bin --nice-name=rish rikka.shizuku.shell.ShizukuShellLoader "$@"

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner package com.bintianqi.owndroid
import android.app.Activity import android.app.Activity
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -40,11 +40,11 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.dpm.* import com.bintianqi.owndroid.dpm.*
import com.binbin.androidowner.ui.Animations import com.bintianqi.owndroid.ui.Animations
import com.binbin.androidowner.ui.theme.OwnDroidTheme import com.bintianqi.owndroid.ui.theme.OwnDroidTheme
import com.binbin.androidowner.ui.theme.SetDarkTheme import com.bintianqi.owndroid.ui.theme.SetDarkTheme
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
lateinit var displayMetrics: DisplayMetrics lateinit var displayMetrics: DisplayMetrics
@ExperimentalMaterial3Api @ExperimentalMaterial3Api
@@ -82,7 +82,7 @@ fun MyScaffold(){
val navCtrl = rememberNavController() val navCtrl = rememberNavController()
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
SetDarkTheme() SetDarkTheme()
@@ -127,7 +127,7 @@ fun MyScaffold(){
private fun HomePage(navCtrl:NavHostController){ private fun HomePage(navCtrl:NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val activateType = val activateType =
if(isDeviceOwner(myDpm)){"Device Owner"} if(isDeviceOwner(myDpm)){"Device Owner"}
else if(isProfileOwner(myDpm)){ else if(isProfileOwner(myDpm)){

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner package com.bintianqi.owndroid
import android.Manifest import android.Manifest
import android.os.Build.VERSION import android.os.Build.VERSION
@@ -14,10 +14,10 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.binbin.androidowner.dpm.applySelectedPermission import com.bintianqi.owndroid.dpm.applySelectedPermission
import com.binbin.androidowner.dpm.selectedPermission import com.bintianqi.owndroid.dpm.selectedPermission
import com.binbin.androidowner.ui.NavIcon import com.bintianqi.owndroid.ui.NavIcon
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner package com.bintianqi.owndroid
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.widget.Toast import android.widget.Toast
@@ -21,10 +21,10 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.binbin.androidowner.dpm.applySelectedPackage import com.bintianqi.owndroid.dpm.applySelectedPackage
import com.binbin.androidowner.dpm.selectedPackage import com.bintianqi.owndroid.dpm.selectedPackage
import com.binbin.androidowner.ui.NavIcon import com.bintianqi.owndroid.ui.NavIcon
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.google.accompanist.drawablepainter.rememberDrawablePainter
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -57,7 +57,7 @@ fun PackageSelector(navCtrl:NavHostController){
pkgs.clear() pkgs.clear()
for(pkg in apps){ for(pkg in apps){
val srcDir = pkg.sourceDir val srcDir = pkg.sourceDir
pkgs+=PkgInfo( pkgs += PkgInfo(
pkg.packageName, pkg.loadLabel(pm).toString(), pkg.loadIcon(pm), pkg.packageName, pkg.loadLabel(pm).toString(), pkg.loadIcon(pm),
if(srcDir.contains("/data/")){ "data" } if(srcDir.contains("/data/")){ "data" }
else if( else if(
@@ -168,12 +168,12 @@ fun PackageSelector(navCtrl:NavHostController){
} }
@Composable @Composable
private fun PackageItem(pkg:PkgInfo, navCtrl: NavHostController){ private fun PackageItem(pkg: PkgInfo, navCtrl: NavHostController){
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clickable{selectedPackage=pkg.pkgName;applySelectedPackage=true;navCtrl.navigateUp()} .clickable{selectedPackage =pkg.pkgName;applySelectedPackage =true;navCtrl.navigateUp()}
.padding(vertical = 3.dp) .padding(vertical = 3.dp)
){ ){
Spacer(Modifier.padding(start = 15.dp)) Spacer(Modifier.padding(start = 15.dp))

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DeviceAdminReceiver import android.app.admin.DeviceAdminReceiver
@@ -11,7 +11,7 @@ import android.os.PersistableBundle
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
class MyDeviceAdminReceiver : DeviceAdminReceiver() { class Receiver : DeviceAdminReceiver() {
override fun onEnabled(context: Context, intent: Intent) { override fun onEnabled(context: Context, intent: Intent) {
super.onEnabled(context, intent) super.onEnabled(context, intent)
Toast.makeText(context, "已启用", Toast.LENGTH_SHORT).show() Toast.makeText(context, "已启用", Toast.LENGTH_SHORT).show()

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner package com.bintianqi.owndroid
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -24,9 +24,9 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.ui.*
import com.binbin.androidowner.ui.theme.SetDarkTheme import com.bintianqi.owndroid.ui.theme.SetDarkTheme
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
@Composable @Composable
fun AppSetting(navCtrl:NavHostController){ fun AppSetting(navCtrl:NavHostController){

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner package com.bintianqi.owndroid
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.PendingIntent import android.app.PendingIntent
@@ -49,11 +49,10 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.*
import com.binbin.androidowner.toText import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.ui.*
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
import com.binbin.androidowner.uriToStream
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
@@ -153,7 +152,7 @@ private fun Home(navCtrl:NavHostController, pkgName: String){
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT>=24&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){ if(VERSION.SDK_INT>=24&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){
Text(text = stringResource(R.string.scope_is_work_profile), textAlign = TextAlign.Center,modifier = Modifier.fillMaxWidth()) Text(text = stringResource(R.string.scope_is_work_profile), textAlign = TextAlign.Center,modifier = Modifier.fillMaxWidth())
@@ -186,7 +185,7 @@ private fun Home(navCtrl:NavHostController, pkgName: String){
{ {
try { try {
myDpm.setAlwaysOnVpnPackage(myComponent, pkgName, it) myDpm.setAlwaysOnVpnPackage(myComponent, pkgName, it)
} catch(e: java.lang.UnsupportedOperationException) { } catch(e: UnsupportedOperationException) {
Toast.makeText(myContext, myContext.getString(R.string.unsupported), Toast.LENGTH_SHORT).show() Toast.makeText(myContext, myContext.getString(R.string.unsupported), Toast.LENGTH_SHORT).show()
} catch(e: NameNotFoundException) { } catch(e: NameNotFoundException) {
Toast.makeText(myContext, myContext.getString(R.string.not_installed), Toast.LENGTH_SHORT).show() Toast.makeText(myContext, myContext.getString(R.string.not_installed), Toast.LENGTH_SHORT).show()
@@ -238,7 +237,7 @@ private fun Home(navCtrl:NavHostController, pkgName: String){
private fun UserCtrlDisabledPkg(pkgName:String){ private fun UserCtrlDisabledPkg(pkgName:String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
var pkgList = myDpm.getUserControlDisabledPackages(myComponent) var pkgList = myDpm.getUserControlDisabledPackages(myComponent)
var listText by remember{mutableStateOf("")} var listText by remember{mutableStateOf("")}
@@ -302,7 +301,7 @@ private fun UserCtrlDisabledPkg(pkgName:String){
private fun BlockUninstall(pkgName: String){ private fun BlockUninstall(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
var state by remember{mutableStateOf(myDpm.isUninstallBlocked(myComponent,pkgName))} var state by remember{mutableStateOf(myDpm.isUninstallBlocked(myComponent,pkgName))}
@@ -346,7 +345,7 @@ private fun BlockUninstall(pkgName: String){
private fun PermissionManage(pkgName: String, navCtrl: NavHostController){ private fun PermissionManage(pkgName: String, navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var inputPermission by remember{mutableStateOf(selectedPermission)} var inputPermission by remember{mutableStateOf(selectedPermission)}
var currentState by remember{mutableStateOf(myContext.getString(R.string.unknown))} var currentState by remember{mutableStateOf(myContext.getString(R.string.unknown))}
@@ -427,7 +426,7 @@ private fun PermissionManage(pkgName: String, navCtrl: NavHostController){
private fun CrossProfilePkg(pkgName: String){ private fun CrossProfilePkg(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.cross_profile_package), style = typography.headlineLarge) Text(text = stringResource(R.string.cross_profile_package), style = typography.headlineLarge)
@@ -444,7 +443,8 @@ private fun CrossProfilePkg(pkgName: String){
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween){ Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween){
Button( Button(
onClick = { onClick = {
if(pkgName!=""){crossProfilePkg.add(pkgName)} if(pkgName!=""){
crossProfilePkg.add(pkgName)}
myDpm.setCrossProfilePackages(myComponent, crossProfilePkg) myDpm.setCrossProfilePackages(myComponent, crossProfilePkg)
refresh() refresh()
}, },
@@ -454,7 +454,8 @@ private fun CrossProfilePkg(pkgName: String){
} }
Button( Button(
onClick = { onClick = {
if(pkgName!=""){crossProfilePkg.remove(pkgName)} if(pkgName!=""){
crossProfilePkg.remove(pkgName)}
myDpm.setCrossProfilePackages(myComponent, crossProfilePkg) myDpm.setCrossProfilePackages(myComponent, crossProfilePkg)
refresh() refresh()
}, },
@@ -471,7 +472,7 @@ private fun CrossProfilePkg(pkgName: String){
private fun CrossProfileWidget(pkgName: String){ private fun CrossProfileWidget(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
var pkgList: MutableList<String> var pkgList: MutableList<String>
var list by remember{mutableStateOf("")} var list by remember{mutableStateOf("")}
@@ -547,7 +548,8 @@ private fun CredentialManagePolicy(pkgName: String){
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween){ Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween){
Button( Button(
onClick = { onClick = {
if(pkgName!=""){credentialList.add(pkgName)} if(pkgName!=""){
credentialList.add(pkgName)}
credentialListText = credentialList.toText() credentialListText = credentialList.toText()
}, },
modifier = Modifier.fillMaxWidth(0.49F) modifier = Modifier.fillMaxWidth(0.49F)
@@ -556,7 +558,8 @@ private fun CredentialManagePolicy(pkgName: String){
} }
Button( Button(
onClick = { onClick = {
if(pkgName!=""){credentialList.remove(pkgName)} if(pkgName!=""){
credentialList.remove(pkgName)}
credentialListText = credentialList.toText() credentialListText = credentialList.toText()
}, },
modifier = Modifier.fillMaxWidth(0.96F) modifier = Modifier.fillMaxWidth(0.96F)
@@ -571,7 +574,7 @@ private fun CredentialManagePolicy(pkgName: String){
focusMgr.clearFocus() focusMgr.clearFocus()
try{ try{
if(policyType!=-1&&credentialList.isNotEmpty()){ if(policyType!=-1&&credentialList.isNotEmpty()){
myDpm.credentialManagerPolicy = PackagePolicy(policyType,credentialList) myDpm.credentialManagerPolicy = PackagePolicy(policyType, credentialList)
}else{ }else{
myDpm.credentialManagerPolicy = null myDpm.credentialManagerPolicy = null
} }
@@ -595,7 +598,7 @@ private fun CredentialManagePolicy(pkgName: String){
private fun PermittedAccessibility(pkgName: String){ private fun PermittedAccessibility(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -646,7 +649,7 @@ private fun PermittedAccessibility(pkgName: String){
private fun PermittedIME(pkgName: String){ private fun PermittedIME(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -698,7 +701,7 @@ private fun PermittedIME(pkgName: String){
private fun KeepUninstalledApp(pkgName: String){ private fun KeepUninstalledApp(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -762,7 +765,7 @@ private fun UninstallApp(pkgName: String){
Column(modifier = Modifier.fillMaxWidth()){ Column(modifier = Modifier.fillMaxWidth()){
Button( Button(
onClick = { onClick = {
val intent = Intent(myContext,PackageInstallerReceiver::class.java) val intent = Intent(myContext, PackageInstallerReceiver::class.java)
val intentSender = PendingIntent.getBroadcast(myContext, 8, intent, PendingIntent.FLAG_IMMUTABLE).intentSender val intentSender = PendingIntent.getBroadcast(myContext, 8, intent, PendingIntent.FLAG_IMMUTABLE).intentSender
val pkgInstaller = myContext.packageManager.packageInstaller val pkgInstaller = myContext.packageManager.packageInstaller
pkgInstaller.uninstall(pkgName, intentSender) pkgInstaller.uninstall(pkgName, intentSender)
@@ -837,7 +840,7 @@ private fun InstallApp(){
private fun ClearAppData(pkgName: String){ private fun ClearAppData(pkgName: String){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -898,6 +901,6 @@ private fun installPackage(context: Context, inputStream: InputStream){
session.fsync(out) session.fsync(out)
inputStream.close() inputStream.close()
out.close() out.close()
val pendingIntent = PendingIntent.getBroadcast(context, sessionId, Intent(context,PackageInstallerReceiver::class.java), PendingIntent.FLAG_IMMUTABLE).intentSender val pendingIntent = PendingIntent.getBroadcast(context, sessionId, Intent(context, PackageInstallerReceiver::class.java), PendingIntent.FLAG_IMMUTABLE).intentSender
session.commit(pendingIntent) session.commit(pendingIntent)
} }

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.Intent import android.content.Intent
@@ -19,10 +19,10 @@ var apkUri: Uri? = null
var caCert = byteArrayOf() var caCert = byteArrayOf()
fun isDeviceOwner(dpm: DevicePolicyManager): Boolean { fun isDeviceOwner(dpm: DevicePolicyManager): Boolean {
return dpm.isDeviceOwnerApp("com.binbin.androidowner") return dpm.isDeviceOwnerApp("com.bintianqi.owndroid")
} }
fun isProfileOwner(dpm: DevicePolicyManager): Boolean { fun isProfileOwner(dpm: DevicePolicyManager): Boolean {
return dpm.isProfileOwnerApp("com.binbin.androidowner") return dpm.isProfileOwnerApp("com.bintianqi.owndroid")
} }

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -33,9 +33,10 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.ui.theme.bgColor
@Composable @Composable
fun ManagedProfile(navCtrl: NavHostController) { fun ManagedProfile(navCtrl: NavHostController) {
@@ -80,7 +81,7 @@ fun ManagedProfile(navCtrl: NavHostController) {
private fun Home(navCtrl: NavHostController){ private fun Home(navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){
Text(text = stringResource(R.string.work_profile), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) Text(text = stringResource(R.string.work_profile), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp))
if(VERSION.SDK_INT>=30&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){ if(VERSION.SDK_INT>=30&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){
@@ -105,13 +106,15 @@ private fun Home(navCtrl: NavHostController){
@Composable @Composable
private fun CreateWorkProfile(){ private fun CreateWorkProfile(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.create_work_profile), style = typography.headlineLarge) Text(text = stringResource(R.string.create_work_profile), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
var skipEncrypt by remember{mutableStateOf(false)} var skipEncrypt by remember{mutableStateOf(false)}
if(VERSION.SDK_INT>=24){CheckBoxItem(stringResource(R.string.skip_encryption),{skipEncrypt},{skipEncrypt=!skipEncrypt})} if(VERSION.SDK_INT>=24){
CheckBoxItem(stringResource(R.string.skip_encryption),{skipEncrypt},{skipEncrypt=!skipEncrypt})
}
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
Button( Button(
onClick = { onClick = {
@@ -202,7 +205,7 @@ private fun OrgID(){
private fun SuspendPersonalApp(){ private fun SuspendPersonalApp(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -239,7 +242,7 @@ private fun SuspendPersonalApp(){
private fun IntentFilter(){ private fun IntentFilter(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
var action by remember{mutableStateOf("")} var action by remember{mutableStateOf("")}

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -41,10 +41,12 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.dpm.scrollAnim
import com.binbin.androidowner.toText import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.toText
import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.ui.theme.bgColor
var ssidSet = mutableSetOf<WifiSsid>() var ssidSet = mutableSetOf<WifiSsid>()
@Composable @Composable
@@ -102,7 +104,7 @@ fun Network(navCtrl: NavHostController){
private fun Home(navCtrl:NavHostController,scrollState: ScrollState){ private fun Home(navCtrl:NavHostController,scrollState: ScrollState){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)){
Text(text = stringResource(R.string.network), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) Text(text = stringResource(R.string.network), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp))
if(VERSION.SDK_INT>=24&&isDeviceOwner(myDpm)){ if(VERSION.SDK_INT>=24&&isDeviceOwner(myDpm)){
@@ -139,7 +141,7 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState){
private fun Switches(){ private fun Switches(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize()){ Column(modifier = Modifier.fillMaxSize()){
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT>=33&&isDeviceOwner(myDpm)){ if(VERSION.SDK_INT>=33&&isDeviceOwner(myDpm)){
@@ -200,7 +202,7 @@ private fun WifiSsidPolicy(){
selectedPolicyType = policy?.policyType ?: -1 selectedPolicyType = policy?.policyType ?: -1
ssidSet = policy?.ssids ?: mutableSetOf() ssidSet = policy?.ssids ?: mutableSetOf()
} }
LaunchedEffect(Unit){refreshPolicy(); ssidList=ssidSet.toText()} LaunchedEffect(Unit){refreshPolicy(); ssidList= ssidSet.toText()}
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.wifi_ssid_policy), style = typography.headlineLarge) Text(text = stringResource(R.string.wifi_ssid_policy), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
@@ -290,7 +292,7 @@ private fun WifiSsidPolicy(){
private fun PrivateDNS(){ private fun PrivateDNS(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -360,7 +362,7 @@ private fun PrivateDNS(){
private fun NetLog(){ private fun NetLog(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.retrieve_net_logs), style = typography.headlineLarge) Text(text = stringResource(R.string.retrieve_net_logs), style = typography.headlineLarge)
@@ -438,7 +440,7 @@ private fun WifiKeypair(){
private fun APN(){ private fun APN(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
val setting = myDpm.getOverrideApns(myComponent) val setting = myDpm.getOverrideApns(myComponent)

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.KeyguardManager import android.app.KeyguardManager
@@ -33,9 +33,10 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.ui.theme.bgColor
@Composable @Composable
fun Password(navCtrl: NavHostController){ fun Password(navCtrl: NavHostController){
@@ -120,7 +121,7 @@ private fun Home(navCtrl:NavHostController,scrollState: ScrollState){
private fun PasswordInfo(){ private fun PasswordInfo(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.password_info), style = typography.headlineLarge) Text(text = stringResource(R.string.password_info), style = typography.headlineLarge)
@@ -152,7 +153,7 @@ private fun PasswordInfo(){
private fun ResetPasswordToken(){ private fun ResetPasswordToken(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val myByteArray by remember{ mutableStateOf(byteArrayOf(1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0)) } val myByteArray by remember{ mutableStateOf(byteArrayOf(1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0)) }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -206,7 +207,7 @@ private fun ResetPasswordToken(){
private fun ResetPassword(){ private fun ResetPassword(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var newPwd by remember{ mutableStateOf("") } var newPwd by remember{ mutableStateOf("") }
val myByteArray by remember{ mutableStateOf(byteArrayOf(1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0)) } val myByteArray by remember{ mutableStateOf(byteArrayOf(1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0)) }
@@ -334,7 +335,7 @@ private fun PasswordComplexity(){
private fun ScreenTimeout(){ private fun ScreenTimeout(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getMaximumTimeToLock(myComponent).toString()}else{""}) } var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getMaximumTimeToLock(myComponent).toString()}else{""}) }
var ableToApply by remember{ mutableStateOf(inputContent!="") } var ableToApply by remember{ mutableStateOf(inputContent!="") }
@@ -370,7 +371,7 @@ private fun ScreenTimeout(){
private fun MaxFailedPasswordForWipe(){ private fun MaxFailedPasswordForWipe(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getMaximumFailedPasswordsForWipe(myComponent).toString()}else{""}) } var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getMaximumFailedPasswordsForWipe(myComponent).toString()}else{""}) }
var ableToApply by remember{ mutableStateOf(inputContent!=""&&inputContent!="0") } var ableToApply by remember{ mutableStateOf(inputContent!=""&&inputContent!="0") }
@@ -406,7 +407,7 @@ private fun MaxFailedPasswordForWipe(){
private fun PasswordExpiration(){ private fun PasswordExpiration(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getPasswordExpirationTimeout(myComponent).toString()}else{""}) } var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getPasswordExpirationTimeout(myComponent).toString()}else{""}) }
var ableToApply by remember{ mutableStateOf(inputContent!="") } var ableToApply by remember{ mutableStateOf(inputContent!="") }
@@ -442,7 +443,7 @@ private fun PasswordExpiration(){
private fun PasswordHistoryLength(){ private fun PasswordHistoryLength(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getPasswordHistoryLength(myComponent).toString()}else{""}) } var inputContent by remember{ mutableStateOf(if(isDeviceOwner(myDpm)){myDpm.getPasswordHistoryLength(myComponent).toString()}else{""}) }
var ableToApply by remember{ mutableStateOf(inputContent!="") } var ableToApply by remember{ mutableStateOf(inputContent!="") }
@@ -478,7 +479,7 @@ private fun PasswordHistoryLength(){
private fun KeyguardDisabledFeatures(){ private fun KeyguardDisabledFeatures(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
var state by remember{mutableIntStateOf(-1)} var state by remember{mutableIntStateOf(-1)}
var shortcuts by remember{mutableStateOf(false)} var shortcuts by remember{mutableStateOf(false)}
var biometrics by remember{mutableStateOf(false)} var biometrics by remember{mutableStateOf(false)}
@@ -576,7 +577,7 @@ private fun KeyguardDisabledFeatures(){
private fun PasswordQuality(){ private fun PasswordQuality(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val passwordQuality = mapOf( val passwordQuality = mapOf(
PASSWORD_QUALITY_UNSPECIFIED to stringResource(R.string.password_quality_unspecified), PASSWORD_QUALITY_UNSPECIFIED to stringResource(R.string.password_quality_unspecified),
PASSWORD_QUALITY_SOMETHING to stringResource(R.string.password_quality_something), PASSWORD_QUALITY_SOMETHING to stringResource(R.string.password_quality_something),

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -33,9 +33,10 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.ui.theme.bgColor
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -103,7 +104,7 @@ fun DpmPermissions(navCtrl:NavHostController){
private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState){ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(listScrollState)) { Column(modifier = Modifier.fillMaxSize().verticalScroll(listScrollState)) {
Text(text = stringResource(R.string.permission), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) Text(text = stringResource(R.string.permission), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp))
SubPageItem( SubPageItem(
@@ -147,7 +148,7 @@ private fun Home(localNavCtrl:NavHostController,listScrollState:ScrollState){
private fun LockScreenInfo(){ private fun LockScreenInfo(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var infoText by remember{mutableStateOf(myDpm.deviceOwnerLockScreenInfo?.toString() ?: "")} var infoText by remember{mutableStateOf(myDpm.deviceOwnerLockScreenInfo?.toString() ?: "")}
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
@@ -185,7 +186,7 @@ private fun LockScreenInfo(){
private fun DeviceAdmin(navCtrl: NavHostController){ private fun DeviceAdmin(navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val co = rememberCoroutineScope() val co = rememberCoroutineScope()
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -223,7 +224,7 @@ private fun DeviceAdmin(navCtrl: NavHostController){
private fun ProfileOwner(){ private fun ProfileOwner(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.profile_owner), style = typography.headlineLarge) Text(text = stringResource(R.string.profile_owner), style = typography.headlineLarge)
@@ -349,7 +350,7 @@ private fun SpecificID(){
private fun OrgName(){ private fun OrgName(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
var orgName by remember{mutableStateOf(try{myDpm.getOrganizationName(myComponent).toString()}catch(e:SecurityException){""})} var orgName by remember{mutableStateOf(try{myDpm.getOrganizationName(myComponent).toString()}catch(e:SecurityException){""})}
@@ -381,7 +382,7 @@ private fun OrgName(){
private fun SupportMsg(){ private fun SupportMsg(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var shortMsg by remember{mutableStateOf(myDpm.getShortSupportMessage(myComponent)?.toString() ?: "")} var shortMsg by remember{mutableStateOf(myDpm.getShortSupportMessage(myComponent)?.toString() ?: "")}
var longMsg by remember{mutableStateOf(myDpm.getLongSupportMessage(myComponent)?.toString() ?: "")} var longMsg by remember{mutableStateOf(myDpm.getLongSupportMessage(myComponent)?.toString() ?: "")}
@@ -436,7 +437,7 @@ private fun SupportMsg(){
private fun NoManageAccount(){ private fun NoManageAccount(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -490,7 +491,7 @@ private fun NoManageAccount(){
private fun TransformOwnership(){ private fun TransformOwnership(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
val focusRequester = FocusRequester() val focusRequester = FocusRequester()
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = 8.dp)){

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.ComponentName import android.content.ComponentName
@@ -35,7 +35,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.Receiver
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -46,7 +47,7 @@ import java.io.*
fun ShizukuActivate(){ fun ShizukuActivate(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
val filesDir = myContext.filesDir val filesDir = myContext.filesDir
LaunchedEffect(Unit){ extractRish(myContext) } LaunchedEffect(Unit){ extractRish(myContext) }
@@ -88,7 +89,7 @@ fun ShizukuActivate(){
Button( Button(
onClick = { onClick = {
coScope.launch{ coScope.launch{
outputText=executeCommand(myContext, "sh rish.sh","dpm list-owners",null,filesDir) outputText= executeCommand(myContext, "sh rish.sh","dpm list-owners",null,filesDir)
scrollState.animateScrollTo(scrollState.maxValue, scrollAnim()) scrollState.animateScrollTo(scrollState.maxValue, scrollAnim())
outputTextScrollState.animateScrollTo(0, scrollAnim()) outputTextScrollState.animateScrollTo(0, scrollAnim())
} }

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -41,10 +41,11 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.toText import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.toText
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.ui.theme.bgColor
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.util.Date import java.util.Date
@@ -151,7 +152,7 @@ private fun Home(navCtrl: NavHostController,scrollState: ScrollState){
} }
SubPageItem(R.string.wipe_data,"",R.drawable.warning_fill0){navCtrl.navigate("WipeData")} SubPageItem(R.string.wipe_data,"",R.drawable.warning_fill0){navCtrl.navigate("WipeData")}
Spacer(Modifier.padding(vertical = 30.dp)) Spacer(Modifier.padding(vertical = 30.dp))
LaunchedEffect(Unit){caCert=byteArrayOf()} LaunchedEffect(Unit){caCert =byteArrayOf()}
} }
} }
@@ -159,7 +160,7 @@ private fun Home(navCtrl: NavHostController,scrollState: ScrollState){
private fun Switches(){ private fun Switches(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){ if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){
@@ -229,7 +230,7 @@ private fun Switches(){
private fun Keyguard(){ private fun Keyguard(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.keyguard), style = typography.headlineLarge) Text(text = stringResource(R.string.keyguard), style = typography.headlineLarge)
@@ -277,7 +278,7 @@ private fun Keyguard(){
private fun BugReport(){ private fun BugReport(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Button( Button(
@@ -298,7 +299,7 @@ private fun BugReport(){
private fun Reboot(){ private fun Reboot(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp)){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp)){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Button( Button(
@@ -316,7 +317,7 @@ private fun Reboot(){
private fun EditTime(){ private fun EditTime(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -356,7 +357,7 @@ private fun EditTime(){
private fun PermissionPolicy(){ private fun PermissionPolicy(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
var selectedPolicy by remember{mutableIntStateOf(myDpm.getPermissionPolicy(myComponent))} var selectedPolicy by remember{mutableIntStateOf(myDpm.getPermissionPolicy(myComponent))}
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -462,7 +463,7 @@ private fun NearbyStreamingPolicy(){
private fun LockTaskFeatures(){ private fun LockTaskFeatures(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
val lockTaskPolicyList = mutableListOf( val lockTaskPolicyList = mutableListOf(
@@ -595,7 +596,7 @@ private fun LockTaskFeatures(){
private fun CaCert(){ private fun CaCert(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
var exist by remember{mutableStateOf(false)} var exist by remember{mutableStateOf(false)}
var isEmpty by remember{mutableStateOf(true)} var isEmpty by remember{mutableStateOf(true)}
val refresh = { val refresh = {
@@ -663,7 +664,7 @@ private fun CaCert(){
private fun SecurityLogs(){ private fun SecurityLogs(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.security_logs), style = typography.headlineLarge) Text(text = stringResource(R.string.security_logs), style = typography.headlineLarge)
@@ -708,7 +709,7 @@ private fun WipeData(){
val myContext = LocalContext.current val myContext = LocalContext.current
val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
var flag by remember{ mutableIntStateOf(0) } var flag by remember{ mutableIntStateOf(0) }
@@ -794,7 +795,7 @@ private fun WipeData(){
private fun SysUpdatePolicy(){ private fun SysUpdatePolicy(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
val sharedPref = myContext.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = myContext.getSharedPreferences("data", Context.MODE_PRIVATE)
val isWear = sharedPref.getBoolean("isWear",false) val isWear = sharedPref.getBoolean("isWear",false)

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -20,8 +20,11 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.* import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
@@ -37,11 +40,12 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.toText import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.* import com.bintianqi.owndroid.toText
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.*
import com.binbin.androidowner.uriToStream import com.bintianqi.owndroid.ui.theme.bgColor
import com.bintianqi.owndroid.uriToStream
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
var affiliationID = mutableSetOf<String>() var affiliationID = mutableSetOf<String>()
@@ -125,7 +129,7 @@ private fun Home(navCtrl: NavHostController,scrollState: ScrollState){
private fun CurrentUserInfo(){ private fun CurrentUserInfo(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -157,7 +161,7 @@ private fun UserOperation(){
val myContext = LocalContext.current val myContext = LocalContext.current
val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 10.dp)) Spacer(Modifier.padding(vertical = 10.dp))
@@ -272,7 +276,7 @@ private fun CreateUser(){
val myContext = LocalContext.current val myContext = LocalContext.current
val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var userName by remember{ mutableStateOf("") } var userName by remember{ mutableStateOf("") }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
@@ -319,7 +323,7 @@ private fun CreateUser(){
private fun AffiliationID(){ private fun AffiliationID(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var input by remember{mutableStateOf("")} var input by remember{mutableStateOf("")}
var list by remember{mutableStateOf("")} var list by remember{mutableStateOf("")}
@@ -387,7 +391,7 @@ private fun AffiliationID(){
private fun Username(){ private fun Username(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
var inputUsername by remember{mutableStateOf("")} var inputUsername by remember{mutableStateOf("")}
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){
@@ -431,7 +435,7 @@ private fun Username(){
private fun UserSessionMessage(){ private fun UserSessionMessage(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
val getStart = myDpm.getStartUserSessionMessage(myComponent)?:"" val getStart = myDpm.getStartUserSessionMessage(myComponent)?:""
val getEnd = myDpm.getEndUserSessionMessage(myComponent)?:"" val getEnd = myDpm.getEndUserSessionMessage(myComponent)?:""
@@ -492,7 +496,7 @@ private fun UserSessionMessage(){
private fun UserIcon(){ private fun UserIcon(){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
var getContent by remember{mutableStateOf(false)} var getContent by remember{mutableStateOf(false)}
var canApply by remember{mutableStateOf(false)} var canApply by remember{mutableStateOf(false)}
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){ Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())){

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.dpm package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
@@ -33,12 +33,13 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.Animations import com.bintianqi.owndroid.Receiver
import com.binbin.androidowner.ui.SubPageItem import com.bintianqi.owndroid.ui.Animations
import com.binbin.androidowner.ui.SwitchItem import com.bintianqi.owndroid.ui.SubPageItem
import com.binbin.androidowner.ui.TopBar import com.bintianqi.owndroid.ui.SwitchItem
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.TopBar
import com.bintianqi.owndroid.ui.theme.bgColor
private data class Restriction( private data class Restriction(
val restriction:String, val restriction:String,
@@ -100,7 +101,7 @@ fun UserRestriction(navCtrl: NavHostController){
private fun Home(navCtrl:NavHostController,scrollState: ScrollState){ private fun Home(navCtrl:NavHostController,scrollState: ScrollState){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext, Receiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)){ Column(modifier = Modifier.fillMaxSize().verticalScroll(scrollState)){
Text(text = stringResource(R.string.user_restrict), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 7.dp, start = 15.dp)) Text(text = stringResource(R.string.user_restrict), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 7.dp, start = 15.dp))
Text(text = stringResource(R.string.switch_to_disable_feature), modifier = Modifier.padding(start = 15.dp)) Text(text = stringResource(R.string.switch_to_disable_feature), modifier = Modifier.padding(start = 15.dp))
@@ -192,7 +193,7 @@ private fun UserRestrictionItem(
){ ){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
SwitchItem( SwitchItem(
itemName,restrictionDescription,leadIcon, itemName,restrictionDescription,leadIcon,
{ if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){ myDpm.getUserRestrictions(myComponent).getBoolean(restriction) }else{ false } }, { if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){ myDpm.getUserRestrictions(myComponent).getBoolean(restriction) }else{ false } },

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.ui package com.bintianqi.owndroid.ui
import androidx.compose.animation.* import androidx.compose.animation.*
import androidx.compose.animation.core.FiniteAnimationSpec import androidx.compose.animation.core.FiniteAnimationSpec
@@ -8,7 +8,7 @@ import androidx.compose.animation.core.spring
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.IntSize
import androidx.navigation.NavBackStackEntry import androidx.navigation.NavBackStackEntry
import com.binbin.androidowner.displayMetrics import com.bintianqi.owndroid.displayMetrics
class Animations{ class Animations{
private val fade: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow) private val fade: FiniteAnimationSpec<Float> = spring(stiffness = Spring.StiffnessMediumLow)

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.ui package com.bintianqi.owndroid.ui
import android.content.Context import android.content.Context
import android.widget.Toast import android.widget.Toast
@@ -22,9 +22,9 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavBackStackEntry import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.binbin.androidowner.R import com.bintianqi.owndroid.R
import com.binbin.androidowner.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
import com.binbin.androidowner.writeClipBoard import com.bintianqi.owndroid.writeClipBoard
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.ui.theme package com.bintianqi.owndroid.ui.theme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.ui.theme package com.bintianqi.owndroid.ui.theme
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context

View File

@@ -1,4 +1,4 @@
package com.binbin.androidowner.ui.theme package com.bintianqi.owndroid.ui.theme
import androidx.compose.material3.Typography import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle

View File

@@ -1 +1 @@
unqualifiedResLocale=en unqualifiedResLocale=en-US

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.AndroidOwner" parent="android:Theme.Material.Light.NoActionBar"> <style name="Theme.OwnDroid" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:windowSplashScreenBackground">#000000</item> <item name="android:windowSplashScreenBackground">#000000</item>
</style> </style>
</resources> </resources>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.AndroidOwner" parent="android:Theme.Material.Light.NoActionBar"> <style name="Theme.OwnDroid" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:windowSplashScreenBackground">#F1F5F4</item> <item name="android:windowSplashScreenBackground">#F1F5F4</item>
</style> </style>
</resources> </resources>

View File

@@ -47,9 +47,6 @@
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
<string name="activate_device_admin">激活Device admin</string> <string name="activate_device_admin">激活Device admin</string>
<string name="activate_device_admin_command">adb shell dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
<string name="activate_profile_owner_command">adb shell dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
<string name="activate_device_owner_command">adb shell dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string>
<string name="device_info">设备信息</string> <string name="device_info">设备信息</string>
<string name="is_device_financed">Financed device: %1$s</string> <string name="is_device_financed">Financed device: %1$s</string>
<string name="dpmrh">设备策略管理器角色(DPMRH)%1$s</string> <string name="dpmrh">设备策略管理器角色(DPMRH)%1$s</string>

View File

@@ -50,9 +50,9 @@
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
<string name="activate_device_admin">Activate Device admin</string> <string name="activate_device_admin">Activate Device admin</string>
<string name="activate_device_admin_command">adb shell dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string> <string name="activate_device_admin_command" translatable="false">adb shell dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="activate_profile_owner_command">adb shell dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string> <string name="activate_profile_owner_command" translatable="false">adb shell dpm set-profile-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="activate_device_owner_command">adb shell dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string> <string name="activate_device_owner_command" translatable="false">adb shell dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="device_info">Device info</string> <string name="device_info">Device info</string>
<string name="is_device_financed">Financed device: %1$s</string> <string name="is_device_financed">Financed device: %1$s</string>
<string name="dpmrh">Device policy manager role holder%1$s</string> <string name="dpmrh">Device policy manager role holder%1$s</string>
@@ -88,11 +88,11 @@
<string name="list_owners">List owners</string> <string name="list_owners">List owners</string>
<string name="shizuku_not_started">Shizuku not started. </string> <string name="shizuku_not_started">Shizuku not started. </string>
<string name="activate_org_profile_command_with_user_id" tools:ignore="TypographyDashes" translatable="false"> <string name="activate_org_profile_command_with_user_id" tools:ignore="TypographyDashes" translatable="false">
dpm mark-profile-owner-on-organization-owned-device --user %1$s com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver dpm mark-profile-owner-on-organization-owned-device --user %1$s com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
</string> </string>
<string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string> <string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="dpm_activate_po_command" translatable="false">dpm set-profile-owner com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string> <string name="dpm_activate_po_command" translatable="false">dpm set-profile-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="dpm_activate_da_command" translatable="false">dpm set-active-admin com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver</string> <string name="dpm_activate_da_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
<string name="shizuku_activated_shell">Permission granted (Shell)</string> <string name="shizuku_activated_shell">Permission granted (Shell)</string>
<string name="shizuku_activated_root">Permission granted (Root)</string> <string name="shizuku_activated_root">Permission granted (Root)</string>
<string name="activate_profile_owner">Activate profile owner</string> <string name="activate_profile_owner">Activate profile owner</string>
@@ -222,7 +222,7 @@
<string name="is_org_owned_profile">Organization owned work profile: %1$s</string> <string name="is_org_owned_profile">Organization owned work profile: %1$s</string>
<string name="org_owned_work_profile">Organization work profile</string> <string name="org_owned_work_profile">Organization work profile</string>
<string name="activate_org_profile_command" tools:ignore="TypographyDashes" translatable="false"> <string name="activate_org_profile_command" tools:ignore="TypographyDashes" translatable="false">
adb shell \"dpm mark-profile-owner-on-organization-owned-device --user %1$s com.binbin.androidowner/com.binbin.androidowner.dpm.MyDeviceAdminReceiver\" adb shell \"dpm mark-profile-owner-on-organization-owned-device --user %1$s com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver\"
</string> </string>
<string name="skip_encryption">Skip encryption</string> <string name="skip_encryption">Skip encryption</string>
<string name="create">Create</string> <string name="create">Create</string>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.AndroidOwner" parent="android:Theme.Material.Light.NoActionBar"> <style name="Theme.OwnDroid" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:navigationBarColor">#FFFFFF</item> <item name="android:navigationBarColor">#FFFFFF</item>
<item name="android:statusBarColor">#FFFFFF</item> <item name="android:statusBarColor">#FFFFFF</item>
<item name="android:windowSwipeToDismiss">true</item> <item name="android:windowSwipeToDismiss">true</item>

View File

@@ -1,5 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins { plugins {
id("com.android.application") version "8.2.1" apply false id("com.android.application") version "8.3.2" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false id("org.jetbrains.kotlin.android") version "1.9.0" apply false
} }

View File

@@ -1,6 +1,6 @@
#Fri Jan 12 20:22:20 CST 2024 #Fri Jan 12 20:22:20 CST 2024
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -0,0 +1,2 @@
apksigner sign --key testkey.pk8 --cert testkey.x509.pem ..\app\build\outputs\apk\release\app-release-unsigned.apk
ren ..\app\build\outputs\apk\release\app-release-unsigned.apk ..\app\build\outputs\apk\release\app-testkey.apk

BIN
signature/testkey.pk8 Normal file

Binary file not shown.

View File

@@ -0,0 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
Fw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzET
MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
hvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waM
qOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4
wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy
4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzU
RNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97s
zI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkw
HQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZ
AFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1Ud
EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZa
J6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4Y
LCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe
+ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX
31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwr
sBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE0=
-----END CERTIFICATE-----