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