diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 506c110..e328d50 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -12,6 +12,8 @@
+
+
+ android:exported="false">
@@ -99,6 +101,12 @@
android:name=".ApiReceiver"
android:exported="true">
+
+
+
Unit, onDismiss: () -> Unit) = Dialog(onDismi
IconButton(onClick = { showPassword = !showPassword }) {
Icon(
painter = painterResource(
- id = if (showPassword) R.drawable.visibility_off_fill0 else R.drawable.visibility_fill0
+ id = if (showPassword) R.drawable.visibility_fill0 else R.drawable.visibility_off_fill0
),
contentDescription = if (showPassword) "Hide password" else "Show password"
)
diff --git a/app/src/main/java/com/bintianqi/owndroid/LockTaskService.kt b/app/src/main/java/com/bintianqi/owndroid/LockTaskService.kt
new file mode 100644
index 0000000..2efcc5f
--- /dev/null
+++ b/app/src/main/java/com/bintianqi/owndroid/LockTaskService.kt
@@ -0,0 +1,82 @@
+package com.bintianqi.owndroid
+
+import android.app.ActivityManager
+import android.app.PendingIntent
+import android.app.Service
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.pm.ServiceInfo
+import android.os.Build
+import android.os.IBinder
+import androidx.annotation.RequiresApi
+import androidx.core.app.NotificationCompat
+import androidx.core.app.ServiceCompat
+import androidx.core.content.ContextCompat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+
+@RequiresApi(28)
+class LockTaskService: Service() {
+ val coroutineScope = CoroutineScope(Dispatchers.IO)
+
+ override fun onBind(intent: Intent?): IBinder? = null
+
+ val stopReceiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ coroutineScope.cancel()
+ stopLockTask()
+ stop()
+ }
+ }
+
+ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ super.onStartCommand(intent, flags, startId)
+ val filter = IntentFilter(STOP_ACTION)
+ ContextCompat.registerReceiver(
+ this, stopReceiver, filter, ContextCompat.RECEIVER_NOT_EXPORTED
+ )
+ val pendingIntent = PendingIntent.getBroadcast(
+ this, 0, Intent(STOP_ACTION).setPackage(this.packageName), PendingIntent.FLAG_IMMUTABLE
+ )
+ val notification = NotificationCompat.Builder(this, MyNotificationChannel.LockTaskMode.id)
+ .setContentTitle(getText(R.string.lock_task_mode))
+ .setSmallIcon(R.drawable.lock_fill0)
+ .addAction(NotificationCompat.Action.Builder(null, getString(R.string.stop), pendingIntent).build())
+ .build()
+ ServiceCompat.startForeground(
+ this, NotificationType.LockTaskMode.id, notification,
+ if (Build.VERSION.SDK_INT < 34) 0 else ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST
+ )
+ coroutineScope.launch {
+ val am = getSystemService(ActivityManager::class.java)
+ delay(3000)
+ while (am.lockTaskModeState == ActivityManager.LOCK_TASK_MODE_LOCKED) {
+ delay(1000)
+ }
+ stop()
+ }
+ return START_NOT_STICKY
+ }
+
+ fun stop() {
+ unregisterReceiver(stopReceiver)
+ stopSelf()
+ }
+
+ fun stopLockTask() {
+ val features = Privilege.DPM.getLockTaskFeatures(Privilege.DAR)
+ val packages = Privilege.DPM.getLockTaskPackages(Privilege.DAR)
+ Privilege.DPM.setLockTaskPackages(Privilege.DAR, arrayOf())
+ Privilege.DPM.setLockTaskPackages(Privilege.DAR, packages)
+ Privilege.DPM.setLockTaskFeatures(Privilege.DAR, features)
+ }
+
+ companion object {
+ const val STOP_ACTION = "com.bintianqi.owndroid.action.STOP_LOCK_TASK_MODE"
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/bintianqi/owndroid/MyViewModel.kt b/app/src/main/java/com/bintianqi/owndroid/MyViewModel.kt
index ee9371f..f20e3c5 100644
--- a/app/src/main/java/com/bintianqi/owndroid/MyViewModel.kt
+++ b/app/src/main/java/com/bintianqi/owndroid/MyViewModel.kt
@@ -2,6 +2,7 @@ package com.bintianqi.owndroid
import android.accounts.Account
import android.annotation.SuppressLint
+import android.app.ActivityManager
import android.app.ActivityOptions
import android.app.Application
import android.app.KeyguardManager
@@ -886,6 +887,7 @@ class MyViewModel(application: Application): AndroidViewModel(application) {
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
application.startActivity(intent, options.toBundle())
+ application.startForegroundService(Intent(application, LockTaskService::class.java))
return true
} else {
return false
diff --git a/app/src/main/java/com/bintianqi/owndroid/Receiver.kt b/app/src/main/java/com/bintianqi/owndroid/Receiver.kt
index b542132..f5cd676 100644
--- a/app/src/main/java/com/bintianqi/owndroid/Receiver.kt
+++ b/app/src/main/java/com/bintianqi/owndroid/Receiver.kt
@@ -1,31 +1,17 @@
package com.bintianqi.owndroid
-import android.app.NotificationManager
-import android.app.PendingIntent
import android.app.admin.DeviceAdminReceiver
-import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Binder
import android.os.Build.VERSION
import android.os.UserHandle
import android.os.UserManager
-import androidx.core.app.NotificationCompat
import com.bintianqi.owndroid.dpm.handlePrivilegeChange
import com.bintianqi.owndroid.dpm.retrieveNetworkLogs
import com.bintianqi.owndroid.dpm.retrieveSecurityLogs
class Receiver : DeviceAdminReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- super.onReceive(context, intent)
- if(VERSION.SDK_INT >= 26 && intent.action == "com.bintianqi.owndroid.action.STOP_LOCK_TASK_MODE") {
- val receiver = ComponentName(context, this::class.java)
- val packages = Privilege.DPM.getLockTaskPackages(receiver)
- Privilege.DPM.setLockTaskPackages(receiver, arrayOf())
- Privilege.DPM.setLockTaskPackages(receiver, packages)
- }
- }
-
override fun onEnabled(context: Context, intent: Intent) {
super.onEnabled(context, intent)
Privilege.updateStatus()
@@ -56,25 +42,6 @@ class Receiver : DeviceAdminReceiver() {
}
}
- override fun onLockTaskModeEntering(context: Context, intent: Intent, pkg: String) {
- super.onLockTaskModeEntering(context, intent, pkg)
- val stopIntent = Intent(context, this::class.java)
- .setAction("com.bintianqi.owndroid.action.STOP_LOCK_TASK_MODE")
- val pendingIntent = PendingIntent.getBroadcast(context, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE)
- val notification = NotificationCompat.Builder(context, MyNotificationChannel.LockTaskMode.id)
- .setContentTitle(context.getText(R.string.lock_task_mode))
- .setSmallIcon(R.drawable.lock_fill0)
- .addAction(NotificationCompat.Action.Builder(null, context.getString(R.string.stop), pendingIntent).build())
- .build()
- val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
- nm.notify(NotificationType.LockTaskMode.id, notification)
- }
-
- override fun onLockTaskModeExiting(context: Context, intent: Intent) {
- super.onLockTaskModeExiting(context, intent)
- NotificationUtils.cancel(context, NotificationType.LockTaskMode)
- }
-
override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) {
super.onPasswordChanged(context, intent, userHandle)
sendUserRelatedNotification(context, userHandle, NotificationType.PasswordChanged)
diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt
index 2ca218c..07b61e6 100644
--- a/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt
+++ b/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt
@@ -1224,17 +1224,6 @@ private fun StartLockTaskMode(
.verticalScroll(rememberScrollState())
) {
Spacer(Modifier.height(5.dp))
- if (privilege.dhizuku) Column(
- Modifier
- .fillMaxWidth().padding(vertical = 8.dp)
- .background(colorScheme.errorContainer, RoundedCornerShape(10.dp))
- .padding(8.dp)
- ) {
- Text(
- stringResource(R.string.start_lock_task_mode_not_supported),
- color = colorScheme.onErrorContainer
- )
- }
PackageNameTextField(packageName, onChoosePackage) { packageName = it }
Row(
Modifier
@@ -1264,7 +1253,6 @@ private fun StartLockTaskMode(
if (!result) context.showOperationResultToast(false)
},
enabled = packageName.isNotBlank() && (!specifyActivity || activity.isNotBlank())
- && !privilege.dhizuku
) {
Text(stringResource(R.string.start))
}
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 258abcd..ea24a39 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -278,7 +278,6 @@
Сетевой журнал
Удалить журналы
Экспортировать журналы
- Пара ключей Wi-Fi
Предпочтительная сетевая служба
Add config
Идентификатор сети
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 33d5f12..9195b73 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -307,7 +307,6 @@
Ağ Kayıtları
Kayıtları Sil
Kayıtları Dışa Aktar
- Wi-Fi Kimlik Doğrulama Anahtar Çifti
Tercihli Ağ Servisi
Yapılandırma Ekle
Ağ Kimliği
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 9fab479..b67a883 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -173,7 +173,6 @@
附近通知传输
在足够安全时启用
锁定任务模式
- Dhizuku模式下不支持启动锁定任务模式
应用未被允许
禁用全部
允许状态栏信息
@@ -294,7 +293,6 @@
网络日志已收集
删除日志
导出日志
- Wi-Fi密钥对
首选网络服务
添加配置
网络ID
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 332e8ec..924b30f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -102,7 +102,7 @@
Organization name
Disable account management
Account type
- Transfer Ownership
+ Transfer ownership
Lock screen info
Support Messages
Short message
@@ -201,7 +201,6 @@
Nearby notification streaming policy
Same managed account only
Lock task mode
- Starting lock task mode is not supported under Dhizuku mode
App is not allowed
Disable all
@@ -328,7 +327,6 @@
Network logs collected
Delete logs
Export logs
- Wi-Fi keypair
Preferential network service
Add config
Network ID