mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 11:05:59 +00:00
Request Shizuku permission before enter Shizuku screen
Bind Shizuku service automatically after enter Shizuku functions page
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
package com.bintianqi.owndroid;
|
package com.bintianqi.owndroid;
|
||||||
|
|
||||||
interface IUserService {
|
interface IUserService {
|
||||||
void destroy() = 16777114;
|
|
||||||
String execute(String command) = 1;
|
String execute(String command) = 1;
|
||||||
int getUid() = 2;
|
int getUid() = 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ fun Home(activity: FragmentActivity, vm: MyViewModel) {
|
|||||||
composable(route = "HomePage") { HomePage(navCtrl) }
|
composable(route = "HomePage") { HomePage(navCtrl) }
|
||||||
|
|
||||||
composable(route = "Permissions") { Permissions(navCtrl) }
|
composable(route = "Permissions") { Permissions(navCtrl) }
|
||||||
composable(route = "Shizuku") { Shizuku(navCtrl) }
|
composable(route = "Shizuku") { Shizuku(vm, navCtrl) }
|
||||||
composable(route = "DeviceAdmin") { DeviceAdmin(navCtrl) }
|
composable(route = "DeviceAdmin") { DeviceAdmin(navCtrl) }
|
||||||
composable(route = "ProfileOwner") { ProfileOwner(navCtrl) }
|
composable(route = "ProfileOwner") { ProfileOwner(navCtrl) }
|
||||||
composable(route = "DeviceOwner") { DeviceOwner(navCtrl) }
|
composable(route = "DeviceOwner") { DeviceOwner(navCtrl) }
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.bintianqi.owndroid
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.os.IBinder
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
@@ -9,6 +10,7 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
class MyViewModel: ViewModel() {
|
class MyViewModel: ViewModel() {
|
||||||
val theme = MutableStateFlow(ThemeSettings())
|
val theme = MutableStateFlow(ThemeSettings())
|
||||||
|
val shizukuBinder = MutableStateFlow<IBinder?>(null)
|
||||||
|
|
||||||
var initialized = false
|
var initialized = false
|
||||||
fun initialize(context: Context) {
|
fun initialize(context: Context) {
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ import com.bintianqi.owndroid.yesOrNo
|
|||||||
import com.rosan.dhizuku.api.Dhizuku
|
import com.rosan.dhizuku.api.Dhizuku
|
||||||
import com.rosan.dhizuku.api.DhizukuRequestPermissionListener
|
import com.rosan.dhizuku.api.DhizukuRequestPermissionListener
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import rikka.shizuku.Shizuku
|
||||||
|
import rikka.sui.Sui
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Composable
|
@Composable
|
||||||
@@ -76,7 +78,30 @@ fun Permissions(navCtrl: NavHostController) {
|
|||||||
operation = { navCtrl.navigate("DeviceOwner") }
|
operation = { navCtrl.navigate("DeviceOwner") }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
FunctionItem(R.string.shizuku,"") { navCtrl.navigate("Shizuku") }
|
FunctionItem(R.string.shizuku,"") {
|
||||||
|
try {
|
||||||
|
if(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { navCtrl.navigate("Shizuku") }
|
||||||
|
else if(Shizuku.shouldShowRequestPermissionRationale()) {
|
||||||
|
Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
Sui.init(context.packageName)
|
||||||
|
val listener = object: Shizuku.OnRequestPermissionResultListener {
|
||||||
|
override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) {
|
||||||
|
if(grantResult == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
navCtrl.navigate("Shizuku")
|
||||||
|
} else {
|
||||||
|
Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
Shizuku.removeRequestPermissionResultListener(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Shizuku.addRequestPermissionResultListener(listener)
|
||||||
|
Shizuku.requestPermission(0)
|
||||||
|
}
|
||||||
|
} catch(_: IllegalStateException) {
|
||||||
|
Toast.makeText(context, R.string.shizuku_not_started, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
FunctionItem(R.string.device_info, "", R.drawable.perm_device_information_fill0) { navCtrl.navigate("DeviceInfo") }
|
FunctionItem(R.string.device_info, "", R.drawable.perm_device_information_fill0) { navCtrl.navigate("DeviceInfo") }
|
||||||
if((VERSION.SDK_INT >= 26 && deviceOwner) || (VERSION.SDK_INT>=24 && profileOwner)) {
|
if((VERSION.SDK_INT >= 26 && deviceOwner) || (VERSION.SDK_INT>=24 && profileOwner)) {
|
||||||
FunctionItem(R.string.org_name, "", R.drawable.corporate_fare_fill0) { dialog = 2 }
|
FunctionItem(R.string.org_name, "", R.drawable.corporate_fare_fill0) { dialog = 2 }
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package com.bintianqi.owndroid.dpm
|
|||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.ServiceConnection
|
import android.content.ServiceConnection
|
||||||
import android.content.pm.PackageManager
|
|
||||||
import android.os.Binder
|
import android.os.Binder
|
||||||
import android.os.Build.VERSION
|
import android.os.Build.VERSION
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
@@ -13,14 +12,14 @@ import androidx.compose.foundation.horizontalScroll
|
|||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.wrapContentWidth
|
|
||||||
import androidx.compose.foundation.rememberScrollState
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.text.selection.SelectionContainer
|
import androidx.compose.foundation.text.selection.SelectionContainer
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
@@ -32,74 +31,53 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.window.Dialog
|
||||||
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import androidx.navigation.NavHostController
|
import androidx.navigation.NavHostController
|
||||||
import com.bintianqi.owndroid.IUserService
|
import com.bintianqi.owndroid.IUserService
|
||||||
|
import com.bintianqi.owndroid.MyViewModel
|
||||||
import com.bintianqi.owndroid.R
|
import com.bintianqi.owndroid.R
|
||||||
import com.bintianqi.owndroid.ui.MyScaffold
|
import com.bintianqi.owndroid.ui.MyScaffold
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import rikka.shizuku.Shizuku
|
import rikka.shizuku.Shizuku
|
||||||
|
|
||||||
private var waitGrantPermission = false
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun Shizuku(navCtrl: NavHostController) {
|
fun Shizuku(vm: MyViewModel, navCtrl: NavHostController) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val dpm = context.getDPM()
|
val dpm = context.getDPM()
|
||||||
val receiver = context.getReceiver()
|
val receiver = context.getReceiver()
|
||||||
val coScope = rememberCoroutineScope()
|
val coScope = rememberCoroutineScope()
|
||||||
val outputTextScrollState = rememberScrollState()
|
val outputTextScrollState = rememberScrollState()
|
||||||
var enabled by remember { mutableStateOf(false) }
|
|
||||||
var bindShizuku by remember { mutableStateOf(false) }
|
|
||||||
var outputText by rememberSaveable { mutableStateOf("") }
|
var outputText by rememberSaveable { mutableStateOf("") }
|
||||||
var showDeviceAdminButton by remember { mutableStateOf(!context.isDeviceAdmin) }
|
var showDeviceAdminButton by remember { mutableStateOf(!context.isDeviceAdmin) }
|
||||||
var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) }
|
var showDeviceOwnerButton by remember { mutableStateOf(!context.isDeviceOwner) }
|
||||||
var showOrgProfileOwnerButton by remember { mutableStateOf(true) }
|
var showOrgProfileOwnerButton by remember { mutableStateOf(true) }
|
||||||
val service by shizukuService.collectAsState()
|
val binder by vm.shizukuBinder.collectAsStateWithLifecycle()
|
||||||
LaunchedEffect(service) {
|
var service by remember { mutableStateOf<IUserService?>(null) }
|
||||||
if(service == null) {
|
var loading by remember { mutableStateOf(true) }
|
||||||
enabled = false
|
LaunchedEffect(binder) {
|
||||||
bindShizuku = checkShizukuStatus() == 1
|
if(binder != null && binder!!.pingBinder()) {
|
||||||
|
service = IUserService.Stub.asInterface(binder)
|
||||||
|
loading = false
|
||||||
} else {
|
} else {
|
||||||
enabled = true
|
service = null
|
||||||
bindShizuku = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LaunchedEffect(service) {
|
||||||
|
if(service == null && !loading) navCtrl.navigateUp()
|
||||||
|
}
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
shizukuService.value = null
|
if(binder == null) bindShizukuService(context, vm.shizukuBinder)
|
||||||
userServiceControl(context, true)
|
|
||||||
}
|
}
|
||||||
MyScaffold(R.string.shizuku, 0.dp, navCtrl, false) {
|
MyScaffold(R.string.shizuku, 0.dp, navCtrl, false) {
|
||||||
AnimatedVisibility(visible = bindShizuku, modifier = Modifier.fillMaxWidth()) {
|
if(loading) {
|
||||||
Button(
|
Dialog(onDismissRequest = { navCtrl.navigateUp() }) {
|
||||||
onClick = {
|
CircularProgressIndicator()
|
||||||
userServiceControl(context, true)
|
|
||||||
outputText = ""
|
|
||||||
},
|
|
||||||
modifier = Modifier.wrapContentWidth(Alignment.CenterHorizontally)
|
|
||||||
) {
|
|
||||||
Text(stringResource(R.string.bind_shizuku))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Button(
|
|
||||||
onClick = {
|
|
||||||
outputText = checkPermission(context)
|
|
||||||
if(service != null) {
|
|
||||||
enabled = true
|
|
||||||
bindShizuku = false
|
|
||||||
} else {
|
|
||||||
enabled = false
|
|
||||||
bindShizuku = checkShizukuStatus() == 1
|
|
||||||
}
|
|
||||||
coScope.launch {
|
|
||||||
outputTextScrollState.animateScrollTo(0)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
|
||||||
) {
|
|
||||||
Text(text = stringResource(R.string.check_shizuku))
|
|
||||||
}
|
|
||||||
|
|
||||||
Button(
|
Button(
|
||||||
onClick = {
|
onClick = {
|
||||||
@@ -108,7 +86,6 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
outputTextScrollState.animateScrollTo(0)
|
outputTextScrollState.animateScrollTo(0)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled,
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.list_owners))
|
Text(text = stringResource(R.string.list_owners))
|
||||||
@@ -120,7 +97,6 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
outputTextScrollState.animateScrollTo(0)
|
outputTextScrollState.animateScrollTo(0)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled,
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.list_users))
|
Text(text = stringResource(R.string.list_users))
|
||||||
@@ -132,7 +108,6 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
outputTextScrollState.animateScrollTo(0)
|
outputTextScrollState.animateScrollTo(0)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled,
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.list_accounts))
|
Text(text = stringResource(R.string.list_accounts))
|
||||||
@@ -149,7 +124,6 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
showDeviceAdminButton = !context.isDeviceAdmin
|
showDeviceAdminButton = !context.isDeviceAdmin
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled,
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.activate_device_admin))
|
Text(text = stringResource(R.string.activate_device_admin))
|
||||||
@@ -166,7 +140,6 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
showDeviceOwnerButton = !context.isDeviceOwner
|
showDeviceOwnerButton = !context.isDeviceOwner
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled,
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.activate_device_owner))
|
Text(text = stringResource(R.string.activate_device_owner))
|
||||||
@@ -187,7 +160,6 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
showOrgProfileOwnerButton = !dpm.isOrganizationOwnedDeviceWithManagedProfile
|
showOrgProfileOwnerButton = !dpm.isOrganizationOwnedDeviceWithManagedProfile
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled = enabled,
|
|
||||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||||
) {
|
) {
|
||||||
Text(text = stringResource(R.string.activate_org_profile))
|
Text(text = stringResource(R.string.activate_org_profile))
|
||||||
@@ -201,63 +173,24 @@ fun Shizuku(navCtrl: NavHostController) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkPermission(context: Context): String {
|
fun bindShizukuService(context: Context, shizukuBinder: MutableStateFlow<IBinder?>) {
|
||||||
if(checkShizukuStatus() == -1) { return context.getString(R.string.shizuku_not_started) }
|
|
||||||
return shizukuService.value.let {
|
|
||||||
if(it == null) {
|
|
||||||
context.getString(R.string.shizuku_not_bind)
|
|
||||||
} else {
|
|
||||||
when(it.uid) {
|
|
||||||
2000 -> context.getString(R.string.shizuku_activated_shell)
|
|
||||||
0 -> context.getString(R.string.shizuku_activated_root)
|
|
||||||
else -> context.getString(R.string.unknown_status) + "\nUID: ${it.uid}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun checkShizukuStatus(): Int {
|
|
||||||
val status = try {
|
|
||||||
if(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { waitGrantPermission = false; 1 }
|
|
||||||
else if(Shizuku.shouldShowRequestPermissionRationale()) { 0 }
|
|
||||||
else{
|
|
||||||
if(!waitGrantPermission) { Shizuku.requestPermission(0) }
|
|
||||||
waitGrantPermission = true
|
|
||||||
0
|
|
||||||
}
|
|
||||||
} catch(_: Exception) { -1 }
|
|
||||||
return status
|
|
||||||
}
|
|
||||||
|
|
||||||
fun userServiceControl(context:Context, status:Boolean) {
|
|
||||||
if(checkShizukuStatus() != 1) { return }
|
|
||||||
val userServiceConnection = object : ServiceConnection {
|
val userServiceConnection = object : ServiceConnection {
|
||||||
override fun onServiceConnected(componentName: ComponentName, binder: IBinder) {
|
override fun onServiceConnected(componentName: ComponentName, binder: IBinder) {
|
||||||
if (binder.pingBinder()) {
|
shizukuBinder.value = binder
|
||||||
shizukuService.value = IUserService.Stub.asInterface(binder)
|
|
||||||
} else {
|
|
||||||
Toast.makeText(context, R.string.invalid_binder, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
override fun onServiceDisconnected(componentName: ComponentName) {
|
override fun onServiceDisconnected(componentName: ComponentName) {
|
||||||
shizukuService.value = null
|
shizukuBinder.value = null
|
||||||
Toast.makeText(context, R.string.shizuku_service_disconnected, Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, R.string.shizuku_service_disconnected, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val userServiceArgs = Shizuku.UserServiceArgs(
|
val userServiceArgs = Shizuku.UserServiceArgs(ComponentName(context, ShizukuService::class.java))
|
||||||
ComponentName(
|
|
||||||
context.packageName,ShizukuService::class.java.name
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.daemon(false)
|
.daemon(false)
|
||||||
.processNameSuffix("service")
|
.processNameSuffix("shizuku-service")
|
||||||
.debuggable(true)
|
.debuggable(false)
|
||||||
.version(26)
|
.version(26)
|
||||||
try {
|
try {
|
||||||
if(status) {
|
Shizuku.bindUserService(userServiceArgs, userServiceConnection)
|
||||||
Shizuku.bindUserService(userServiceArgs, userServiceConnection)
|
} catch(e: Exception) {
|
||||||
}else{
|
e.printStackTrace()
|
||||||
Shizuku.unbindUserService(userServiceArgs, userServiceConnection, false)
|
}
|
||||||
}
|
|
||||||
} catch(_: Exception) { }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,23 +3,18 @@ package com.bintianqi.owndroid.dpm
|
|||||||
import android.system.Os
|
import android.system.Os
|
||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
import com.bintianqi.owndroid.IUserService
|
import com.bintianqi.owndroid.IUserService
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
|
|
||||||
val shizukuService = MutableStateFlow<IUserService?>(null)
|
|
||||||
|
|
||||||
@Keep
|
@Keep
|
||||||
class ShizukuService: IUserService.Stub() {
|
class ShizukuService: IUserService.Stub() {
|
||||||
override fun destroy() { }
|
|
||||||
|
|
||||||
override fun execute(command: String): String {
|
override fun execute(command: String): String {
|
||||||
var result = ""
|
var result = ""
|
||||||
val process: Process
|
val process: Process
|
||||||
try {
|
try {
|
||||||
process = Runtime.getRuntime().exec(command)
|
process = Runtime.getRuntime().exec(command)
|
||||||
val exitCode = process.waitFor()
|
val exitCode = process.waitFor()
|
||||||
if(exitCode != 0){ result += "Error: $exitCode" }
|
if(exitCode != 0) { result += "Error: $exitCode" }
|
||||||
} catch(e: Exception) {
|
} catch(e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
return e.toString()
|
return e.toString()
|
||||||
@@ -34,11 +29,8 @@ class ShizukuService: IUserService.Stub() {
|
|||||||
} catch(e: NullPointerException) {
|
} catch(e: NullPointerException) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
if(result == "") { return "No result" }
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getUid(): Int {
|
override fun getUid(): Int = Os.getuid()
|
||||||
return Os.getuid()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,6 @@
|
|||||||
<string name="copy_command">Копировать команду</string>
|
<string name="copy_command">Копировать команду</string>
|
||||||
<string name="package_name">Имя пакета</string>
|
<string name="package_name">Имя пакета</string>
|
||||||
<string name="not_exist">Не существует</string>
|
<string name="not_exist">Не существует</string>
|
||||||
<string name="unknown_status">Неизвестный статус</string>
|
|
||||||
<string name="copy">Копировать</string>
|
<string name="copy">Копировать</string>
|
||||||
<string name="file_not_exist">Файл не существует</string>
|
<string name="file_not_exist">Файл не существует</string>
|
||||||
<string name="io_exception">Ошибка ввода/вывода</string>
|
<string name="io_exception">Ошибка ввода/вывода</string>
|
||||||
@@ -58,10 +57,12 @@
|
|||||||
<string name="no">Нет</string>
|
<string name="no">Нет</string>
|
||||||
<string name="previous">Предыдущий</string>
|
<string name="previous">Предыдущий</string>
|
||||||
<string name="next">Следующий</string>
|
<string name="next">Следующий</string>
|
||||||
<string name="on">On</string> <!--TODO-->
|
<!--TODO-->
|
||||||
<string name="off">Off</string> <!--TODO-->
|
<string name="on">On</string>
|
||||||
<string name="alias">Alias</string> <!--TODO-->
|
<string name="off">Off</string>
|
||||||
<string name="unknown_error">Unknown error</string> <!--TODO-->
|
<string name="alias">Alias</string>
|
||||||
|
<string name="unknown_error">Unknown error</string>
|
||||||
|
<string name="permission_denied">Permission denied</string>
|
||||||
|
|
||||||
|
|
||||||
<!--Разрешения-->
|
<!--Разрешения-->
|
||||||
@@ -109,19 +110,13 @@
|
|||||||
<string name="dhizuku_permission_not_granted">Разрешение Dhizuku не предоставлено</string>
|
<string name="dhizuku_permission_not_granted">Разрешение Dhizuku не предоставлено</string>
|
||||||
<string name="dhizuku_mode_disabled">Режим Dhizuku отключен</string>
|
<string name="dhizuku_mode_disabled">Режим Dhizuku отключен</string>
|
||||||
<!--Shizuku-->
|
<!--Shizuku-->
|
||||||
<string name="check_shizuku">Проверить разрешение</string>
|
|
||||||
<string name="list_owners">Список владельцев</string>
|
<string name="list_owners">Список владельцев</string>
|
||||||
<string name="list_users">Список пользователей</string>
|
<string name="list_users">Список пользователей</string>
|
||||||
<string name="list_accounts">Список аккаунтов</string>
|
<string name="list_accounts">Список аккаунтов</string>
|
||||||
<string name="shizuku_not_started">Shizuku не запущен. </string>
|
<string name="shizuku_not_started">Shizuku не запущен. </string>
|
||||||
<string name="shizuku_activated_shell">Разрешение предоставлено (Shell)</string>
|
|
||||||
<string name="shizuku_activated_root">Разрешение предоставлено (Root)</string>
|
|
||||||
<string name="activate_device_owner">Активировать владельца устройства</string>
|
<string name="activate_device_owner">Активировать владельца устройства</string>
|
||||||
<string name="activate_org_profile">Активировать рабочий профиль, принадлежащий организации</string>
|
<string name="activate_org_profile">Активировать рабочий профиль, принадлежащий организации</string>
|
||||||
<string name="shizuku_service_disconnected">Служба Shizuku отключена</string>
|
<string name="shizuku_service_disconnected">Служба Shizuku отключена</string>
|
||||||
<string name="invalid_binder">Неверный binder</string>
|
|
||||||
<string name="bind_shizuku">Подключить Shizuku</string>
|
|
||||||
<string name="shizuku_not_bind">Shizuku отключен</string>
|
|
||||||
|
|
||||||
|
|
||||||
<!--Системные-->
|
<!--Системные-->
|
||||||
|
|||||||
@@ -44,7 +44,6 @@
|
|||||||
<string name="copy_command">Komutu Kopyala</string>
|
<string name="copy_command">Komutu Kopyala</string>
|
||||||
<string name="package_name">Paket Adı</string>
|
<string name="package_name">Paket Adı</string>
|
||||||
<string name="not_exist">Mevcut Değil</string>
|
<string name="not_exist">Mevcut Değil</string>
|
||||||
<string name="unknown_status">Bilinmeyen Durum</string>
|
|
||||||
<string name="copy">Kopyala</string>
|
<string name="copy">Kopyala</string>
|
||||||
<string name="file_not_exist">Dosya Mevcut Değil</string>
|
<string name="file_not_exist">Dosya Mevcut Değil</string>
|
||||||
<string name="io_exception">G/Ç Hatası</string>
|
<string name="io_exception">G/Ç Hatası</string>
|
||||||
@@ -53,16 +52,18 @@
|
|||||||
<string name="allow_all">Tümünü İzin Ver</string>
|
<string name="allow_all">Tümünü İzin Ver</string>
|
||||||
<string name="use_policy">Politika Kullan</string>
|
<string name="use_policy">Politika Kullan</string>
|
||||||
<string name="account">Hesap</string>
|
<string name="account">Hesap</string>
|
||||||
<string name="warning">Warning</string> <!--TODO-->
|
<!--TODO-->
|
||||||
<string name="delete">Delete</string> <!--TODO-->
|
<string name="warning">Warning</string>
|
||||||
<string name="yes">Yes</string> <!--TODO-->
|
<string name="delete">Delete</string>
|
||||||
<string name="no">No</string> <!--TODO-->
|
<string name="yes">Yes</string>
|
||||||
<string name="previous">Previous</string> <!--TODO-->
|
<string name="no">No</string>
|
||||||
<string name="next">Next</string> <!--TODO-->
|
<string name="previous">Previous</string>
|
||||||
<string name="on">On</string> <!--TODO-->
|
<string name="next">Next</string>
|
||||||
<string name="off">Off</string> <!--TODO-->
|
<string name="on">On</string>
|
||||||
<string name="alias">Alias</string> <!--TODO-->
|
<string name="off">Off</string>
|
||||||
<string name="unknown_error">Unknown error</string> <!--TODO-->
|
<string name="alias">Alias</string>
|
||||||
|
<string name="unknown_error">Unknown error</string>
|
||||||
|
<string name="permission_denied">Permission denied</string>
|
||||||
|
|
||||||
<!--Permissions-->
|
<!--Permissions-->
|
||||||
<string name="click_to_activate">Etkinleştirmek İçin Tıklayın</string>
|
<string name="click_to_activate">Etkinleştirmek İçin Tıklayın</string>
|
||||||
@@ -111,19 +112,13 @@
|
|||||||
<string name="dhizuku_mode_disabled">Dhizuku mode disabled</string>
|
<string name="dhizuku_mode_disabled">Dhizuku mode disabled</string>
|
||||||
|
|
||||||
<!--Shizuku-->
|
<!--Shizuku-->
|
||||||
<string name="check_shizuku">İzni Kontrol Et</string>
|
|
||||||
<string name="list_owners">Sahipleri Listele</string>
|
<string name="list_owners">Sahipleri Listele</string>
|
||||||
<string name="list_users">List users</string> <!--TODO-->
|
<string name="list_users">List users</string> <!--TODO-->
|
||||||
<string name="list_accounts">List accounts</string> <!--TODO-->
|
<string name="list_accounts">List accounts</string> <!--TODO-->
|
||||||
<string name="shizuku_not_started">Shizuku Başlatılmadı. </string>
|
<string name="shizuku_not_started">Shizuku Başlatılmadı. </string>
|
||||||
<string name="shizuku_activated_shell">İzin Verildi (Kabuk)</string>
|
|
||||||
<string name="shizuku_activated_root">İzin Verildi (Root)</string>
|
|
||||||
<string name="activate_device_owner">Cihaz Sahibini Etkinleştir</string>
|
<string name="activate_device_owner">Cihaz Sahibini Etkinleştir</string>
|
||||||
<string name="activate_org_profile">Kuruluş Profili Sahibini Etkinleştir</string>
|
<string name="activate_org_profile">Kuruluş Profili Sahibini Etkinleştir</string>
|
||||||
<string name="shizuku_service_disconnected">Shizuku Hizmeti Bağlantısı Kesildi</string>
|
<string name="shizuku_service_disconnected">Shizuku Hizmeti Bağlantısı Kesildi</string>
|
||||||
<string name="invalid_binder">Geçersiz Bağlayıcı</string>
|
|
||||||
<string name="bind_shizuku">Shizuku\'ya Bağlan</string>
|
|
||||||
<string name="shizuku_not_bind">Shizuku Bağlantısı Kesildi</string>
|
|
||||||
|
|
||||||
<!--System-->
|
<!--System-->
|
||||||
<string name="system">Sistem</string>
|
<string name="system">Sistem</string>
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
<string name="developing">功能开发中</string>
|
<string name="developing">功能开发中</string>
|
||||||
<string name="options">选项</string>
|
<string name="options">选项</string>
|
||||||
<string name="copy_command">复制代码</string>
|
<string name="copy_command">复制代码</string>
|
||||||
<string name="unknown_status">未知状态</string>
|
|
||||||
<string name="copy">复制</string>
|
<string name="copy">复制</string>
|
||||||
<string name="file_not_exist">文件不存在</string>
|
<string name="file_not_exist">文件不存在</string>
|
||||||
<string name="io_exception">IO异常</string>
|
<string name="io_exception">IO异常</string>
|
||||||
@@ -60,6 +59,7 @@
|
|||||||
<string name="off">关闭</string>
|
<string name="off">关闭</string>
|
||||||
<string name="alias">别名</string>
|
<string name="alias">别名</string>
|
||||||
<string name="unknown_error">未知错误</string>
|
<string name="unknown_error">未知错误</string>
|
||||||
|
<string name="permission_denied">无权限</string>
|
||||||
|
|
||||||
<!--Permissions-->
|
<!--Permissions-->
|
||||||
<string name="click_to_activate">点击以激活</string>
|
<string name="click_to_activate">点击以激活</string>
|
||||||
@@ -106,19 +106,13 @@
|
|||||||
<string name="dhizuku_mode_disabled">Dhizuku模式已禁用</string>
|
<string name="dhizuku_mode_disabled">Dhizuku模式已禁用</string>
|
||||||
|
|
||||||
<!--Shizuku-->
|
<!--Shizuku-->
|
||||||
<string name="check_shizuku">检查Shizuku</string>
|
|
||||||
<string name="list_owners">列出Owners</string>
|
<string name="list_owners">列出Owners</string>
|
||||||
<string name="list_users">列出用户</string>
|
<string name="list_users">列出用户</string>
|
||||||
<string name="list_accounts">列出账号</string>
|
<string name="list_accounts">列出账号</string>
|
||||||
<string name="shizuku_not_started">服务未启动</string>
|
<string name="shizuku_not_started">服务未启动</string>
|
||||||
<string name="shizuku_activated_shell">已授权(Shell)</string>
|
|
||||||
<string name="shizuku_activated_root">已授权(Root)</string>
|
|
||||||
<string name="activate_device_owner">激活Device owner</string>
|
<string name="activate_device_owner">激活Device owner</string>
|
||||||
<string name="activate_org_profile">激活由组织拥有的工作资料</string>
|
<string name="activate_org_profile">激活由组织拥有的工作资料</string>
|
||||||
<string name="shizuku_service_disconnected">Shizuku服务断开连接</string>
|
<string name="shizuku_service_disconnected">Shizuku服务断开连接</string>
|
||||||
<string name="shizuku_not_bind">Shizuku未连接</string>
|
|
||||||
<string name="invalid_binder">无效Binder</string>
|
|
||||||
<string name="bind_shizuku">连接Shizuku</string>
|
|
||||||
|
|
||||||
<!--System-->
|
<!--System-->
|
||||||
<string name="system">系统</string>
|
<string name="system">系统</string>
|
||||||
|
|||||||
@@ -44,7 +44,6 @@
|
|||||||
<string name="copy_command">Copy Command</string>
|
<string name="copy_command">Copy Command</string>
|
||||||
<string name="package_name">Package name</string>
|
<string name="package_name">Package name</string>
|
||||||
<string name="not_exist">Not exist</string>
|
<string name="not_exist">Not exist</string>
|
||||||
<string name="unknown_status">Unknown status</string>
|
|
||||||
<string name="copy">Copy</string>
|
<string name="copy">Copy</string>
|
||||||
<string name="file_not_exist">File not exist</string>
|
<string name="file_not_exist">File not exist</string>
|
||||||
<string name="io_exception">IO Exception</string>
|
<string name="io_exception">IO Exception</string>
|
||||||
@@ -63,6 +62,7 @@
|
|||||||
<string name="off">Off</string>
|
<string name="off">Off</string>
|
||||||
<string name="alias">Alias</string>
|
<string name="alias">Alias</string>
|
||||||
<string name="unknown_error">Unknown error</string>
|
<string name="unknown_error">Unknown error</string>
|
||||||
|
<string name="permission_denied">Permission denied</string>
|
||||||
|
|
||||||
<!--Permissions-->
|
<!--Permissions-->
|
||||||
<string name="click_to_activate">Click to activate</string>
|
<string name="click_to_activate">Click to activate</string>
|
||||||
@@ -114,21 +114,15 @@
|
|||||||
<string name="dhizuku_mode_disabled">Dhizuku mode disabled</string>
|
<string name="dhizuku_mode_disabled">Dhizuku mode disabled</string>
|
||||||
<!--Shizuku-->
|
<!--Shizuku-->
|
||||||
<string name="shizuku" translatable="false">Shizuku</string>
|
<string name="shizuku" translatable="false">Shizuku</string>
|
||||||
<string name="check_shizuku">Check permission</string>
|
|
||||||
<string name="list_owners">List owners</string>
|
<string name="list_owners">List owners</string>
|
||||||
<string name="list_users">List users</string>
|
<string name="list_users">List users</string>
|
||||||
<string name="list_accounts">List accounts</string>
|
<string name="list_accounts">List accounts</string>
|
||||||
<string name="shizuku_not_started">Shizuku not started. </string>
|
<string name="shizuku_not_started">Shizuku not started. </string>
|
||||||
<string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
|
<string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
|
||||||
<string name="dpm_activate_da_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
|
<string name="dpm_activate_da_command" translatable="false">dpm set-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
|
||||||
<string name="shizuku_activated_shell">Permission granted (Shell)</string>
|
|
||||||
<string name="shizuku_activated_root">Permission granted (Root)</string>
|
|
||||||
<string name="activate_device_owner">Activate Device owner</string>
|
<string name="activate_device_owner">Activate Device owner</string>
|
||||||
<string name="activate_org_profile">Activate organization-owned work profile</string>
|
<string name="activate_org_profile">Activate organization-owned work profile</string>
|
||||||
<string name="shizuku_service_disconnected">Shizuku service disconnected</string>
|
<string name="shizuku_service_disconnected">Shizuku service disconnected</string>
|
||||||
<string name="invalid_binder">Invalid binder</string>
|
|
||||||
<string name="bind_shizuku">Connect Shizuku</string>
|
|
||||||
<string name="shizuku_not_bind">Shizuku disconnected</string>
|
|
||||||
|
|
||||||
<!--System-->
|
<!--System-->
|
||||||
<string name="system">System</string>
|
<string name="system">System</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user