diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fea7bd0..43294d4 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -63,6 +63,7 @@ jobs:
path: app/build/outputs/apk/release/app-release.apk
- name: Generate and submit dependency graph
+ if: github.ref_name == 'master'
uses: gradle/actions/dependency-submission@v4
upload-telegram:
diff --git a/Readme-en.md b/Readme-en.md
index ad57dc8..6e9c16d 100644
--- a/Readme-en.md
+++ b/Readme-en.md
@@ -13,6 +13,7 @@ Use Android Device owner privilege to manage your device.
- ...
- Network
- Add/modify/delete Wi-Fi
+ - Network stats
- Minimum Wi-Fi security level
- Always-on VPN
- 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.
+## 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.md](LICENSE.md)
diff --git a/Readme.md b/Readme.md
index d808f24..fd664c6 100644
--- a/Readme.md
+++ b/Readme.md
@@ -13,6 +13,7 @@
- ...
- 网络
- 添加/修改/删除 Wi-Fi
+ - 网络统计
- 最小Wi-Fi安全等级
- VPN保持打开
- 网络日志
@@ -113,6 +114,20 @@ am broadcast -a com.bintianqi.owndroid.action.HIDE -n com.bintianqi.owndroid/.Ap
```
如果返回值为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)
diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt
index d0385b3..45e5180 100644
--- a/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt
+++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt
@@ -259,6 +259,7 @@ private fun Home(navCtrl:NavHostController, pkgName: String) {
}
}
val chooseApks = rememberLauncherForActivityResult(ActivityResultContracts.GetMultipleContents()) {
+ if(it.isEmpty()) return@rememberLauncherForActivityResult
val intent = Intent(context, AppInstallerActivity::class.java)
intent.putExtra(Intent.EXTRA_STREAM, it.toTypedArray())
startActivity(context, intent, null)
diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt
index a954ff2..94704d2 100644
--- a/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt
+++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt
@@ -95,6 +95,9 @@ fun Users(navCtrl: NavHostController) {
val profileOwner = context.isProfileOwner
var dialog by remember { mutableIntStateOf(0) }
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") }
if(deviceOwner && VERSION.SDK_INT >= 28) {
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) {
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) {
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(
- 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 = {
if(dialog == 1) {
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
val list = dpm.getSecondaryUsers(receiver)
- Column {
- if(list.isEmpty()) {
- Text(stringResource(R.string.no_secondary_users))
- } else {
- Text("(" + stringResource(R.string.serial_number) + ")")
- list.forEach {
- Text(um.getSerialNumberForUser(it).toString())
- }
- }
+ if(list.isEmpty()) {
+ Text(stringResource(R.string.no_secondary_users))
+ } else {
+ Text("(" + stringResource(R.string.serial_number) + ")\n" + list.joinToString("\n") { um.getSerialNumberForUser(it).toString() })
}
+ } else {
+ Text(stringResource(R.string.info_logout))
}
},
confirmButton = {
@@ -357,7 +354,6 @@ fun CreateUser(navCtrl: NavHostController) {
focusMgr.clearFocus()
creating = true
coroutine.launch(Dispatchers.IO) {
- println(Thread.currentThread().name)
try {
val uh = dpm.createAndManageUser(receiver, userName, receiver, null, flag)
withContext(Dispatchers.Main) {
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 1e1182d..1c36ba3 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -514,7 +514,7 @@
Серийный номер
Вторичные пользователи
Нет вторичных пользователей
- Выйти из текущего пользователя
+ Logout
Запустить в фоновом режиме
Переключиться
Создать пользователя
@@ -700,6 +700,7 @@
Пользователь не сможет очищать данные приложений или принудительно останавливать пакеты.
Установить список приложений, которые нужно сохранить в виде APK-файлов, даже если ни у одного пользователя в данный момент они не установлены.
Режим "безголового" системного пользователя означает, что системный пользователь запускает системные службы и некоторый системный интерфейс, но он не связан с каким-либо реальным человеком, и для связи с реальными людьми должны быть созданы дополнительные пользователи.
+ If the current user is not switched by OwnDroid, this function cannot be used.
Когда владелец устройства создает управляемого пользователя, управляемый пользователь не является аффилированным. Чтобы сделать управляемого пользователя аффилированным с владельцем устройства, вам следует установить одинаковые аффилированные идентификаторы в основном и управляемом пользователях.
Установить новый пароль блокировки экрана. Длина этого пароля должна быть не менее 4 цифр. Оставьте поле пустым, чтобы удалить пароль.\nЕсли вы установите цифровой пароль длиной 6 символов или меньше, он будет установлен как PIN-код.
Установить максимальное время бездействия пользователя, по истечении которого устройство будет заблокировано. Это ограничивает время, которое может установить пользователь.\nЗначение 0 означает отсутствие ограничений.
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index ea1dcf1..0ed2fed 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -518,7 +518,7 @@
Kullanıcı işlemi
User does not exist
Seri numarası
- Mevcut kullanıcıyı çıkış yap
+ Logout
Arka planda başlat
Değiştir
Kullanıcı oluştur
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 3dbc933..d461170 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -256,7 +256,7 @@
Wi-Fi SSID策略
SSID列表:
已经存在
- Network stats
+ 网络统计
类型
摘要
详情
@@ -505,7 +505,7 @@
用户操作
用户不存在
序列号
- 登出当前用户
+ 登出
在后台启动
切换
创建用户
@@ -687,6 +687,7 @@
用户无法清除这些应用的存储空间,也无法强制停止应用
这个列表中的应用的APK将会一直保留,即使没有任何用户安装这个应用
无头系统用户模式意味着系统用户运行系统服务和一些系统UI,但它不与任何真实的人相关联,必须创建额外的用户才能与真实的人相关联。
+ 如果当前用户不是由OwnDroid切换的,无法使用此功能。
当Device owner创建并管理用户时,新的用户不是附属用户。Device owner设置和受管理用户完全相同的附属用户ID后,受管理用户成为附属于Device owner的用户
设置一个新的密码,密码的长度需要4位或以上,不输入密码将会清除现有的密码。长度在6位或以下的纯数字密码将会设置为PIN码。
设置设备锁定前用户活动的最大时间。这限制了用户可以设置的时间长度。\n值为0表示不做限制。
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5b99103..9774d6b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -544,7 +544,7 @@
User operation
User does not exist
Serial number
- Logout current user
+ Logout
Start in background
Switch
Create user
@@ -726,6 +726,7 @@
User will not be able to clear app data or force-stop packages.
Set a list of apps to keep around as APKs even if no user has currently installed it.
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.
+ If the current user is not switched by OwnDroid, this function cannot be used.
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
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
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.
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f9e8738..09b077f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,5 +2,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
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
zipStorePath=wrapper/dists