mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 11:05:59 +00:00
Add a description to Logout (#98)
Add build guide in READMEs Update github workflow file, submit dependency graph only on master branch
This commit is contained in:
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@@ -63,6 +63,7 @@ jobs:
|
|||||||
path: app/build/outputs/apk/release/app-release.apk
|
path: app/build/outputs/apk/release/app-release.apk
|
||||||
|
|
||||||
- name: Generate and submit dependency graph
|
- name: Generate and submit dependency graph
|
||||||
|
if: github.ref_name == 'master'
|
||||||
uses: gradle/actions/dependency-submission@v4
|
uses: gradle/actions/dependency-submission@v4
|
||||||
|
|
||||||
upload-telegram:
|
upload-telegram:
|
||||||
|
|||||||
12
Readme-en.md
12
Readme-en.md
@@ -13,6 +13,7 @@ Use Android Device owner privilege to manage your device.
|
|||||||
- ...
|
- ...
|
||||||
- Network
|
- Network
|
||||||
- Add/modify/delete Wi-Fi
|
- Add/modify/delete Wi-Fi
|
||||||
|
- Network stats
|
||||||
- Minimum Wi-Fi security level
|
- Minimum Wi-Fi security level
|
||||||
- Always-on VPN
|
- Always-on VPN
|
||||||
- Network logging
|
- Network logging
|
||||||
@@ -113,6 +114,17 @@ am broadcast -a com.bintianqi.owndroid.action.HIDE -n com.bintianqi.owndroid/.Ap
|
|||||||
```
|
```
|
||||||
If the return value is 0, the operation is successful.
|
If the return value is 0, the operation is successful.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
You can use Gradle in command line to build OwnDroid.
|
||||||
|
```shell
|
||||||
|
# Use testkey for signing (default)
|
||||||
|
./gradlew build
|
||||||
|
# Use your custom .jks key for signing
|
||||||
|
./gradlew build -PStoreFile="/path/to/your/jks/file" -PStorePassword="YOUR_KEYSTORE_PASSWORD" -PKeyPassword="YOUR_KEY_PASSWORD" -PKeyAlias="YOUR_KEY_ALIAS"
|
||||||
|
```
|
||||||
|
(Use `./gradlew.bat` instead on Windows)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
[License.md](LICENSE.md)
|
[License.md](LICENSE.md)
|
||||||
|
|||||||
15
Readme.md
15
Readme.md
@@ -13,6 +13,7 @@
|
|||||||
- ...
|
- ...
|
||||||
- 网络
|
- 网络
|
||||||
- 添加/修改/删除 Wi-Fi
|
- 添加/修改/删除 Wi-Fi
|
||||||
|
- 网络统计
|
||||||
- 最小Wi-Fi安全等级
|
- 最小Wi-Fi安全等级
|
||||||
- VPN保持打开
|
- VPN保持打开
|
||||||
- 网络日志
|
- 网络日志
|
||||||
@@ -113,6 +114,20 @@ am broadcast -a com.bintianqi.owndroid.action.HIDE -n com.bintianqi.owndroid/.Ap
|
|||||||
```
|
```
|
||||||
如果返回值为0,操作成功
|
如果返回值为0,操作成功
|
||||||
|
|
||||||
|
## 构建
|
||||||
|
|
||||||
|
你可以在命令行中使用Gradle以构建OwnDroid
|
||||||
|
```shell
|
||||||
|
# 使用testkey签名(默认)
|
||||||
|
./gradlew build
|
||||||
|
# 使用你的jks密钥签名
|
||||||
|
./gradlew build -PStoreFile="/path/to/your/jks/file" -PStorePassword="YOUR_KEYSTORE_PASSWORD" -PKeyPassword="YOUR_KEY_PASSWORD" -PKeyAlias="YOUR_KEY_ALIAS"
|
||||||
|
```
|
||||||
|
(在Windows系统中应使用`./gradlew.bat`)
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> 在中国大陆下载Gradle速度慢?打开`gradle/wrapper/gradle-wrapper.properties`文件,注释官方下载地址,取消注释一个镜像地址。
|
||||||
|
|
||||||
## 许可证
|
## 许可证
|
||||||
|
|
||||||
[License.md](LICENSE.md)
|
[License.md](LICENSE.md)
|
||||||
|
|||||||
@@ -259,6 +259,7 @@ private fun Home(navCtrl:NavHostController, pkgName: String) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val chooseApks = rememberLauncherForActivityResult(ActivityResultContracts.GetMultipleContents()) {
|
val chooseApks = rememberLauncherForActivityResult(ActivityResultContracts.GetMultipleContents()) {
|
||||||
|
if(it.isEmpty()) return@rememberLauncherForActivityResult
|
||||||
val intent = Intent(context, AppInstallerActivity::class.java)
|
val intent = Intent(context, AppInstallerActivity::class.java)
|
||||||
intent.putExtra(Intent.EXTRA_STREAM, it.toTypedArray())
|
intent.putExtra(Intent.EXTRA_STREAM, it.toTypedArray())
|
||||||
startActivity(context, intent, null)
|
startActivity(context, intent, null)
|
||||||
|
|||||||
@@ -95,6 +95,9 @@ fun Users(navCtrl: NavHostController) {
|
|||||||
val profileOwner = context.isProfileOwner
|
val profileOwner = context.isProfileOwner
|
||||||
var dialog by remember { mutableIntStateOf(0) }
|
var dialog by remember { mutableIntStateOf(0) }
|
||||||
MyScaffold(R.string.users, 0.dp, navCtrl) {
|
MyScaffold(R.string.users, 0.dp, navCtrl) {
|
||||||
|
if(VERSION.SDK_INT >= 28 && profileOwner && dpm.isAffiliatedUser) {
|
||||||
|
FunctionItem(R.string.logout, icon = R.drawable.logout_fill0) { dialog = 2 }
|
||||||
|
}
|
||||||
FunctionItem(R.string.user_info, icon = R.drawable.person_fill0) { navCtrl.navigate("UserInfo") }
|
FunctionItem(R.string.user_info, icon = R.drawable.person_fill0) { navCtrl.navigate("UserInfo") }
|
||||||
if(deviceOwner && VERSION.SDK_INT >= 28) {
|
if(deviceOwner && VERSION.SDK_INT >= 28) {
|
||||||
FunctionItem(R.string.secondary_users, icon = R.drawable.list_fill0) { dialog = 1 }
|
FunctionItem(R.string.secondary_users, icon = R.drawable.list_fill0) { dialog = 1 }
|
||||||
@@ -106,9 +109,6 @@ fun Users(navCtrl: NavHostController) {
|
|||||||
if(VERSION.SDK_INT >= 24 && deviceOwner) {
|
if(VERSION.SDK_INT >= 24 && deviceOwner) {
|
||||||
FunctionItem(R.string.create_user, icon = R.drawable.person_add_fill0) { navCtrl.navigate("CreateUser") }
|
FunctionItem(R.string.create_user, icon = R.drawable.person_add_fill0) { navCtrl.navigate("CreateUser") }
|
||||||
}
|
}
|
||||||
if(VERSION.SDK_INT >= 28 && profileOwner && dpm.isAffiliatedUser) {
|
|
||||||
FunctionItem(R.string.logout_current_user, icon = R.drawable.logout_fill0) { dialog = 2 }
|
|
||||||
}
|
|
||||||
if(deviceOwner || profileOwner) {
|
if(deviceOwner || profileOwner) {
|
||||||
FunctionItem(R.string.change_username, icon = R.drawable.edit_fill0) { navCtrl.navigate("ChangeUsername") }
|
FunctionItem(R.string.change_username, icon = R.drawable.edit_fill0) { navCtrl.navigate("ChangeUsername") }
|
||||||
}
|
}
|
||||||
@@ -123,21 +123,18 @@ fun Users(navCtrl: NavHostController) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(dialog != 0 && VERSION.SDK_INT >= 28) AlertDialog(
|
if(dialog != 0 && VERSION.SDK_INT >= 28) AlertDialog(
|
||||||
title = { Text(stringResource(if(dialog == 1) R.string.secondary_users else R.string.logout_current_user)) },
|
title = { Text(stringResource(if(dialog == 1) R.string.secondary_users else R.string.logout)) },
|
||||||
text = {
|
text = {
|
||||||
if(dialog == 1) {
|
if(dialog == 1) {
|
||||||
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
|
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
|
||||||
val list = dpm.getSecondaryUsers(receiver)
|
val list = dpm.getSecondaryUsers(receiver)
|
||||||
Column {
|
|
||||||
if(list.isEmpty()) {
|
if(list.isEmpty()) {
|
||||||
Text(stringResource(R.string.no_secondary_users))
|
Text(stringResource(R.string.no_secondary_users))
|
||||||
} else {
|
} else {
|
||||||
Text("(" + stringResource(R.string.serial_number) + ")")
|
Text("(" + stringResource(R.string.serial_number) + ")\n" + list.joinToString("\n") { um.getSerialNumberForUser(it).toString() })
|
||||||
list.forEach {
|
|
||||||
Text(um.getSerialNumberForUser(it).toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Text(stringResource(R.string.info_logout))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
confirmButton = {
|
confirmButton = {
|
||||||
@@ -357,7 +354,6 @@ fun CreateUser(navCtrl: NavHostController) {
|
|||||||
focusMgr.clearFocus()
|
focusMgr.clearFocus()
|
||||||
creating = true
|
creating = true
|
||||||
coroutine.launch(Dispatchers.IO) {
|
coroutine.launch(Dispatchers.IO) {
|
||||||
println(Thread.currentThread().name)
|
|
||||||
try {
|
try {
|
||||||
val uh = dpm.createAndManageUser(receiver, userName, receiver, null, flag)
|
val uh = dpm.createAndManageUser(receiver, userName, receiver, null, flag)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
|||||||
@@ -514,7 +514,7 @@
|
|||||||
<string name="serial_number">Серийный номер</string>
|
<string name="serial_number">Серийный номер</string>
|
||||||
<string name="secondary_users">Вторичные пользователи</string>
|
<string name="secondary_users">Вторичные пользователи</string>
|
||||||
<string name="no_secondary_users">Нет вторичных пользователей</string>
|
<string name="no_secondary_users">Нет вторичных пользователей</string>
|
||||||
<string name="logout_current_user">Выйти из текущего пользователя</string>
|
<string name="logout">Logout</string> <!--TODO-->
|
||||||
<string name="start_in_background">Запустить в фоновом режиме</string>
|
<string name="start_in_background">Запустить в фоновом режиме</string>
|
||||||
<string name="user_operation_switch">Переключиться</string>
|
<string name="user_operation_switch">Переключиться</string>
|
||||||
<string name="create_user">Создать пользователя</string>
|
<string name="create_user">Создать пользователя</string>
|
||||||
@@ -700,6 +700,7 @@
|
|||||||
<string name="info_disable_user_control">Пользователь не сможет очищать данные приложений или принудительно останавливать пакеты.</string>
|
<string name="info_disable_user_control">Пользователь не сможет очищать данные приложений или принудительно останавливать пакеты.</string>
|
||||||
<string name="info_keep_uninstalled_apps">Установить список приложений, которые нужно сохранить в виде APK-файлов, даже если ни у одного пользователя в данный момент они не установлены.</string>
|
<string name="info_keep_uninstalled_apps">Установить список приложений, которые нужно сохранить в виде APK-файлов, даже если ни у одного пользователя в данный момент они не установлены.</string>
|
||||||
<string name="info_headless_system_user_mode">Режим "безголового" системного пользователя означает, что системный пользователь запускает системные службы и некоторый системный интерфейс, но он не связан с каким-либо реальным человеком, и для связи с реальными людьми должны быть созданы дополнительные пользователи.</string>
|
<string name="info_headless_system_user_mode">Режим "безголового" системного пользователя означает, что системный пользователь запускает системные службы и некоторый системный интерфейс, но он не связан с каким-либо реальным человеком, и для связи с реальными людьми должны быть созданы дополнительные пользователи.</string>
|
||||||
|
<string name="info_logout">If the current user is not switched by OwnDroid, this function cannot be used.</string> <!--TODO-->
|
||||||
<string name="info_affiliated_id">Когда владелец устройства создает управляемого пользователя, управляемый пользователь не является аффилированным. Чтобы сделать управляемого пользователя аффилированным с владельцем устройства, вам следует установить одинаковые аффилированные идентификаторы в основном и управляемом пользователях.</string>
|
<string name="info_affiliated_id">Когда владелец устройства создает управляемого пользователя, управляемый пользователь не является аффилированным. Чтобы сделать управляемого пользователя аффилированным с владельцем устройства, вам следует установить одинаковые аффилированные идентификаторы в основном и управляемом пользователях.</string>
|
||||||
<string name="info_reset_password">Установить новый пароль блокировки экрана. Длина этого пароля должна быть не менее 4 цифр. Оставьте поле пустым, чтобы удалить пароль.\nЕсли вы установите цифровой пароль длиной 6 символов или меньше, он будет установлен как PIN-код.</string>
|
<string name="info_reset_password">Установить новый пароль блокировки экрана. Длина этого пароля должна быть не менее 4 цифр. Оставьте поле пустым, чтобы удалить пароль.\nЕсли вы установите цифровой пароль длиной 6 символов или меньше, он будет установлен как PIN-код.</string>
|
||||||
<string name="info_screen_timeout">Установить максимальное время бездействия пользователя, по истечении которого устройство будет заблокировано. Это ограничивает время, которое может установить пользователь.\nЗначение 0 означает отсутствие ограничений.</string>
|
<string name="info_screen_timeout">Установить максимальное время бездействия пользователя, по истечении которого устройство будет заблокировано. Это ограничивает время, которое может установить пользователь.\nЗначение 0 означает отсутствие ограничений.</string>
|
||||||
|
|||||||
@@ -518,7 +518,7 @@
|
|||||||
<string name="user_operation">Kullanıcı işlemi</string>
|
<string name="user_operation">Kullanıcı işlemi</string>
|
||||||
<string name="user_not_exist">User does not exist</string> <!--TODO-->
|
<string name="user_not_exist">User does not exist</string> <!--TODO-->
|
||||||
<string name="serial_number">Seri numarası</string>
|
<string name="serial_number">Seri numarası</string>
|
||||||
<string name="logout_current_user">Mevcut kullanıcıyı çıkış yap</string>
|
<string name="logout">Logout</string> <!--TODO-->
|
||||||
<string name="start_in_background">Arka planda başlat</string>
|
<string name="start_in_background">Arka planda başlat</string>
|
||||||
<string name="user_operation_switch">Değiştir</string>
|
<string name="user_operation_switch">Değiştir</string>
|
||||||
<string name="create_user">Kullanıcı oluştur</string>
|
<string name="create_user">Kullanıcı oluştur</string>
|
||||||
|
|||||||
@@ -256,7 +256,7 @@
|
|||||||
<string name="wifi_ssid_policy">Wi-Fi SSID策略</string>
|
<string name="wifi_ssid_policy">Wi-Fi SSID策略</string>
|
||||||
<string name="ssid_list_is">SSID列表:</string>
|
<string name="ssid_list_is">SSID列表:</string>
|
||||||
<string name="already_exist">已经存在</string>
|
<string name="already_exist">已经存在</string>
|
||||||
<string name="network_stats">Network stats</string>
|
<string name="network_stats">网络统计</string>
|
||||||
<string name="type">类型</string>
|
<string name="type">类型</string>
|
||||||
<string name="summary">摘要</string>
|
<string name="summary">摘要</string>
|
||||||
<string name="details">详情</string>
|
<string name="details">详情</string>
|
||||||
@@ -505,7 +505,7 @@
|
|||||||
<string name="user_operation">用户操作</string>
|
<string name="user_operation">用户操作</string>
|
||||||
<string name="user_not_exist">用户不存在</string>
|
<string name="user_not_exist">用户不存在</string>
|
||||||
<string name="serial_number">序列号</string>
|
<string name="serial_number">序列号</string>
|
||||||
<string name="logout_current_user">登出当前用户</string>
|
<string name="logout">登出</string>
|
||||||
<string name="start_in_background">在后台启动</string>
|
<string name="start_in_background">在后台启动</string>
|
||||||
<string name="user_operation_switch">切换</string>
|
<string name="user_operation_switch">切换</string>
|
||||||
<string name="create_user">创建用户</string>
|
<string name="create_user">创建用户</string>
|
||||||
@@ -687,6 +687,7 @@
|
|||||||
<string name="info_disable_user_control">用户无法清除这些应用的存储空间,也无法强制停止应用</string>
|
<string name="info_disable_user_control">用户无法清除这些应用的存储空间,也无法强制停止应用</string>
|
||||||
<string name="info_keep_uninstalled_apps">这个列表中的应用的APK将会一直保留,即使没有任何用户安装这个应用</string>
|
<string name="info_keep_uninstalled_apps">这个列表中的应用的APK将会一直保留,即使没有任何用户安装这个应用</string>
|
||||||
<string name="info_headless_system_user_mode">无头系统用户模式意味着系统用户运行系统服务和一些系统UI,但它不与任何真实的人相关联,必须创建额外的用户才能与真实的人相关联。</string>
|
<string name="info_headless_system_user_mode">无头系统用户模式意味着系统用户运行系统服务和一些系统UI,但它不与任何真实的人相关联,必须创建额外的用户才能与真实的人相关联。</string>
|
||||||
|
<string name="info_logout">如果当前用户不是由OwnDroid切换的,无法使用此功能。</string>
|
||||||
<string name="info_affiliated_id">当Device owner创建并管理用户时,新的用户不是附属用户。Device owner设置和受管理用户完全相同的附属用户ID后,受管理用户成为附属于Device owner的用户</string>
|
<string name="info_affiliated_id">当Device owner创建并管理用户时,新的用户不是附属用户。Device owner设置和受管理用户完全相同的附属用户ID后,受管理用户成为附属于Device owner的用户</string>
|
||||||
<string name="info_reset_password">设置一个新的密码,密码的长度需要4位或以上,不输入密码将会清除现有的密码。长度在6位或以下的纯数字密码将会设置为PIN码。</string>
|
<string name="info_reset_password">设置一个新的密码,密码的长度需要4位或以上,不输入密码将会清除现有的密码。长度在6位或以下的纯数字密码将会设置为PIN码。</string>
|
||||||
<string name="info_screen_timeout">设置设备锁定前用户活动的最大时间。这限制了用户可以设置的时间长度。\n值为0表示不做限制。</string>
|
<string name="info_screen_timeout">设置设备锁定前用户活动的最大时间。这限制了用户可以设置的时间长度。\n值为0表示不做限制。</string>
|
||||||
|
|||||||
@@ -544,7 +544,7 @@
|
|||||||
<string name="user_operation">User operation</string>
|
<string name="user_operation">User operation</string>
|
||||||
<string name="user_not_exist">User does not exist</string>
|
<string name="user_not_exist">User does not exist</string>
|
||||||
<string name="serial_number">Serial number</string>
|
<string name="serial_number">Serial number</string>
|
||||||
<string name="logout_current_user">Logout current user</string>
|
<string name="logout">Logout</string>
|
||||||
<string name="start_in_background">Start in background</string>
|
<string name="start_in_background">Start in background</string>
|
||||||
<string name="user_operation_switch">Switch</string>
|
<string name="user_operation_switch">Switch</string>
|
||||||
<string name="create_user">Create user</string>
|
<string name="create_user">Create user</string>
|
||||||
@@ -726,6 +726,7 @@
|
|||||||
<string name="info_disable_user_control">User will not be able to clear app data or force-stop packages.</string>
|
<string name="info_disable_user_control">User will not be able to clear app data or force-stop packages.</string>
|
||||||
<string name="info_keep_uninstalled_apps">Set a list of apps to keep around as APKs even if no user has currently installed it. </string>
|
<string name="info_keep_uninstalled_apps">Set a list of apps to keep around as APKs even if no user has currently installed it. </string>
|
||||||
<string name="info_headless_system_user_mode">Headless system user mode means the system user runs system services and some system UI, but it is not associated with any real person and additional users must be created to be associated with real persons.</string>
|
<string name="info_headless_system_user_mode">Headless system user mode means the system user runs system services and some system UI, but it is not associated with any real person and additional users must be created to be associated with real persons.</string>
|
||||||
|
<string name="info_logout">If the current user is not switched by OwnDroid, this function cannot be used.</string>
|
||||||
<string name="info_affiliated_id">When Device owner create a managed user, the managed user isn\'t affiliated. In order to make the managed user affiliated with the Device owner, you should set same affiliated IDs in main user and managed user</string>
|
<string name="info_affiliated_id">When Device owner create a managed user, the managed user isn\'t affiliated. In order to make the managed user affiliated with the Device owner, you should set same affiliated IDs in main user and managed user</string>
|
||||||
<string name="info_reset_password">Set a new lockscreen password. The length of this password must be at least 4 digits. Keep it empty to remove password.\nIf you set a numeric password that length is 6 or lower, it will set as PIN</string>
|
<string name="info_reset_password">Set a new lockscreen password. The length of this password must be at least 4 digits. Keep it empty to remove password.\nIf you set a numeric password that length is 6 or lower, it will set as PIN</string>
|
||||||
<string name="info_screen_timeout">Set the maximum time for user activity until the device will lock. This limits the length that the user can set.\nA value of 0 means there is no restriction.</string>
|
<string name="info_screen_timeout">Set the maximum time for user activity until the device will lock. This limits the length that the user can set.\nA value of 0 means there is no restriction.</string>
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -2,5 +2,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
|
#distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.10.2-bin.zip
|
||||||
|
#distributionUrl=https://mirrors.aliyun.com/gradle/gradle-8.10.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
Reference in New Issue
Block a user