diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 93b4c89..9c895ed 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -90,6 +90,13 @@
android:description="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN">
+
+
+
+
+
, bl
composable(route = "Home") { Home(localNavCtrl) }
composable(route = "Theme") { ThemeSettings(materialYou, blackTheme) }
composable(route = "Auth") { AuthSettings() }
+ composable(route = "Automation") { Automation() }
composable(route = "About") { About() }
}
}
@@ -53,6 +56,7 @@ private fun Home(navCtrl: NavHostController) {
Column(modifier = Modifier.fillMaxSize()) {
SubPageItem(R.string.theme, "", R.drawable.format_paint_fill0) { navCtrl.navigate("Theme") }
SubPageItem(R.string.security, "", R.drawable.lock_fill0) { navCtrl.navigate("Auth") }
+ SubPageItem(R.string.automation, "", R.drawable.apps_fill0) { navCtrl.navigate("Automation") }
SubPageItem(R.string.about, "", R.drawable.info_fill0) { navCtrl.navigate("About") }
}
}
@@ -122,6 +126,21 @@ private fun AuthSettings() {
}
}
+@Composable
+private fun Automation() {
+ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
+ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
+ var pkgName by remember { mutableStateOf("") }
+ LaunchedEffect(Unit) {
+ pkgName = sharedPref.getString("AutomationApp", "")?: ""
+ }
+ TextField(value = pkgName, onValueChange = { pkgName = it }, label = { Text("Package name")})
+ Button(onClick = {sharedPref.edit().putString("AutomationApp", pkgName).apply()}) {
+ Text("apply")
+ }
+ }
+}
+
@Composable
private fun About() {
val context = LocalContext.current
diff --git a/app/src/main/java/com/bintianqi/owndroid/TaskReceiver.kt b/app/src/main/java/com/bintianqi/owndroid/TaskReceiver.kt
new file mode 100644
index 0000000..ddf601b
--- /dev/null
+++ b/app/src/main/java/com/bintianqi/owndroid/TaskReceiver.kt
@@ -0,0 +1,38 @@
+package com.bintianqi.owndroid
+
+import android.app.admin.DevicePolicyManager
+import android.content.BroadcastReceiver
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.os.Build.VERSION
+import android.util.Log
+import androidx.activity.ComponentActivity
+
+class TaskReceiver: BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ Log.d("OwnDroid", ("TaskReceiver: pkgName: " + intent.component?.packageName))
+ Log.d("OwnDroid", ("TaskReceiver: pkg: " + intent.`package`))
+ val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE)
+ if(sharedPref.getString("AutomationApp", "") != intent.component?.packageName) return
+ val category = intent.getStringExtra("category")
+ if(category == "app") {
+ val action = intent.getStringExtra("action")
+ if(action == "suspend") {
+ val dpm = context.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val receiver = ComponentName(context,Receiver::class.java)
+ val app = intent.getStringExtra("app")
+ val mode = intent.getBooleanExtra("mode", false)
+ if(VERSION.SDK_INT >= 24) {
+ dpm.setPackagesSuspended(receiver, arrayOf(app), mode)
+ } else {
+ Log.d("OwnDroid", "unsupported")
+ }
+ } else {
+ Log.d("OwnDroid", "unknown action")
+ }
+ } else {
+ Log.d("OwnDroid", "unknown category")
+ }
+ }
+}
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 05a71bb..585b315 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -535,6 +535,7 @@
你不能清除OwnDroid的存储空间
清除存储空间
清除存储空间成功\n应用即将退出
+ 自动化
读取外部存储
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index da159d2..21abef9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -551,6 +551,7 @@
You can\'t clear storage of OwnDroid
Clear storage
Clear storage success\nApplication will exit
+ Automation
Read external storage