mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-24 03:16:00 +00:00
146 lines
7.8 KiB
Kotlin
146 lines
7.8 KiB
Kotlin
package com.binbin.androidowner
|
|
|
|
import android.app.admin.DevicePolicyManager
|
|
import android.app.admin.SystemUpdateInfo
|
|
import android.app.admin.SystemUpdatePolicy
|
|
import android.content.ComponentName
|
|
import android.content.Context
|
|
import android.os.Build.VERSION
|
|
import android.widget.Toast
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.compose.foundation.focusable
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.foundation.text.KeyboardActions
|
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
import androidx.compose.material3.Button
|
|
import androidx.compose.material3.MaterialTheme.colorScheme
|
|
import androidx.compose.material3.MaterialTheme.typography
|
|
import androidx.compose.material3.OutlinedTextField
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.runtime.*
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.platform.LocalFocusManager
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.text.input.ImeAction
|
|
import androidx.compose.ui.text.input.KeyboardType
|
|
import androidx.compose.ui.unit.dp
|
|
import java.util.Date
|
|
|
|
@Composable
|
|
fun SysUpdatePolicy(){
|
|
val myContext = LocalContext.current
|
|
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
|
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
|
val focusMgr = LocalFocusManager.current
|
|
val sharedPref = myContext.getSharedPreferences("data", Context.MODE_PRIVATE)
|
|
val isWear = sharedPref.getBoolean("isWear",false)
|
|
val bodyTextStyle = if(isWear){ typography.bodyMedium}else{typography.bodyLarge}
|
|
Column {
|
|
if(VERSION.SDK_INT>=26&&isDeviceOwner(myDpm)){
|
|
val sysUpdateInfo = myDpm.getPendingSystemUpdate(myComponent)
|
|
Column(modifier = sections()) {
|
|
if(sysUpdateInfo!=null){
|
|
Text(text = "Update first available: ${Date(sysUpdateInfo.receivedTime)}", style = bodyTextStyle)
|
|
Text(text = "Hash code: ${sysUpdateInfo.hashCode()}", style = bodyTextStyle)
|
|
val securityStateDesc = when(sysUpdateInfo.securityPatchState){
|
|
SystemUpdateInfo.SECURITY_PATCH_STATE_UNKNOWN-> stringResource(R.string.unknown)
|
|
SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE->"true"
|
|
else->"false"
|
|
}
|
|
Text(text = stringResource(R.string.is_security_patch, securityStateDesc), style = bodyTextStyle)
|
|
}else{
|
|
Text(text = stringResource(R.string.no_system_update), style = bodyTextStyle)
|
|
}
|
|
}
|
|
}
|
|
if(VERSION.SDK_INT>=23){
|
|
Column(modifier = sections()) {
|
|
var selectedPolicy by remember{ mutableStateOf(myDpm.systemUpdatePolicy?.policyType) }
|
|
Text(text = stringResource(R.string.system_update_policy), style = typography.titleLarge, color = colorScheme.onPrimaryContainer)
|
|
RadioButtonItem(stringResource(R.string.system_update_policy_automatic),{selectedPolicy==SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC},{selectedPolicy=SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC})
|
|
RadioButtonItem(stringResource(R.string.system_update_policy_install_windowed),{selectedPolicy==SystemUpdatePolicy.TYPE_INSTALL_WINDOWED},{selectedPolicy=SystemUpdatePolicy.TYPE_INSTALL_WINDOWED})
|
|
RadioButtonItem(stringResource(R.string.system_update_policy_postpone),{selectedPolicy==SystemUpdatePolicy.TYPE_POSTPONE},{selectedPolicy=SystemUpdatePolicy.TYPE_POSTPONE})
|
|
RadioButtonItem(stringResource(R.string.none),{selectedPolicy == null},{selectedPolicy=null})
|
|
var windowedPolicyStart by remember{ mutableStateOf("") }
|
|
var windowedPolicyEnd by remember{ mutableStateOf("") }
|
|
if(selectedPolicy==2){
|
|
Spacer(Modifier.padding(vertical = 3.dp))
|
|
Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.Center) {
|
|
OutlinedTextField(
|
|
value = windowedPolicyStart,
|
|
label = { Text(stringResource(R.string.start_time))},
|
|
onValueChange = {windowedPolicyStart=it},
|
|
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
|
|
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}),
|
|
modifier = Modifier.focusable().fillMaxWidth(0.5F)
|
|
)
|
|
Spacer(Modifier.padding(horizontal = 3.dp))
|
|
OutlinedTextField(
|
|
value = windowedPolicyEnd,
|
|
onValueChange = {windowedPolicyEnd=it},
|
|
label = {Text(stringResource(R.string.end_time))},
|
|
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
|
|
keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}),
|
|
modifier = Modifier.focusable().fillMaxWidth()
|
|
)
|
|
}
|
|
Spacer(Modifier.padding(vertical = 3.dp))
|
|
Text(text = stringResource(R.string.minutes_in_one_day), style = bodyTextStyle)
|
|
}
|
|
val policy =
|
|
when(selectedPolicy){
|
|
SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC->SystemUpdatePolicy.createAutomaticInstallPolicy()
|
|
SystemUpdatePolicy.TYPE_INSTALL_WINDOWED->SystemUpdatePolicy.createWindowedInstallPolicy(windowedPolicyStart.toInt(),windowedPolicyEnd.toInt())
|
|
SystemUpdatePolicy.TYPE_POSTPONE->SystemUpdatePolicy.createPostponeInstallPolicy()
|
|
else->null
|
|
}
|
|
Button(
|
|
onClick = {myDpm.setSystemUpdatePolicy(myComponent,policy);Toast.makeText(myContext, "成功!", Toast.LENGTH_SHORT).show()},
|
|
enabled = isDeviceOwner(myDpm),
|
|
modifier = Modifier.fillMaxWidth()
|
|
) {
|
|
Text(stringResource(R.string.apply))
|
|
}
|
|
}}
|
|
/*if(VERSION.SDK_INT>=29){
|
|
Column(modifier = sections()){
|
|
var resultUri by remember{mutableStateOf(otaUri)}
|
|
Text(text = "安装系统更新", style = typography.titleLarge)
|
|
Button(
|
|
onClick = {
|
|
val getUri = Intent(Intent.ACTION_GET_CONTENT)
|
|
getUri.setType("application/zip")
|
|
getUri.addCategory(Intent.CATEGORY_OPENABLE)
|
|
getOtaPackage.launch(getUri)
|
|
},
|
|
modifier = Modifier.fillMaxWidth(),
|
|
enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm)
|
|
) {
|
|
Text("选择OTA包")
|
|
}
|
|
Button(
|
|
onClick = {resultUri = otaUri},
|
|
modifier = Modifier.fillMaxWidth(),
|
|
enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm)
|
|
) {
|
|
Text("查看OTA包详情")
|
|
}
|
|
Text("URI: $resultUri")
|
|
if(installOta){
|
|
Button(
|
|
onClick = {
|
|
val sysUpdateExecutor = Executors.newCachedThreadPool()
|
|
val sysUpdateCallback:InstallSystemUpdateCallback = InstallSystemUpdateCallback
|
|
myDpm.installSystemUpdate(myComponent,resultUri,sysUpdateExecutor,sysUpdateCallback)
|
|
},
|
|
enabled = isDeviceOwner(myDpm)||isProfileOwner(myDpm)
|
|
){
|
|
Text("安装")
|
|
}
|
|
}
|
|
}
|
|
}*/
|
|
}
|
|
}
|