Update README

Use Compose AlertDialog instead android.app.AlertDialog
Set default affiliation id after activation
The 'dev' branch will be deleted, use 'master' instead
This commit is contained in:
BinTianqi
2025-03-08 18:08:24 +08:00
parent f399866944
commit ada12bf3dc
10 changed files with 57 additions and 38 deletions

View File

@@ -14,6 +14,7 @@ import com.bintianqi.owndroid.dpm.handleNetworkLogs
import com.bintianqi.owndroid.dpm.isDeviceOwner
import com.bintianqi.owndroid.dpm.isProfileOwner
import com.bintianqi.owndroid.dpm.processSecurityLogs
import com.bintianqi.owndroid.dpm.setDefaultAffiliationID
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -34,6 +35,7 @@ class Receiver : DeviceAdminReceiver() {
override fun onEnabled(context: Context, intent: Intent) {
super.onEnabled(context, intent)
if(context.isProfileOwner || context.isDeviceOwner){
setDefaultAffiliationID(context)
Toast.makeText(context, context.getString(R.string.onEnabled), Toast.LENGTH_SHORT).show()
}
}
@@ -41,6 +43,7 @@ class Receiver : DeviceAdminReceiver() {
override fun onDisabled(context: Context, intent: Intent) {
super.onDisabled(context, intent)
Toast.makeText(context, R.string.onDisabled, Toast.LENGTH_SHORT).show()
SharedPrefs(context).isDefaultAffiliationIdSet = false
}
override fun onProfileProvisioningComplete(context: Context, intent: Intent) {

View File

@@ -1,6 +1,5 @@
package com.bintianqi.owndroid.dpm
import android.app.AlertDialog
import android.app.PendingIntent
import android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT
import android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED
@@ -91,9 +90,9 @@ import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.showOperationResultToast
import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.FunctionItem
import com.bintianqi.owndroid.ui.Notes
import com.bintianqi.owndroid.ui.ListItem
import com.bintianqi.owndroid.ui.NavIcon
import com.bintianqi.owndroid.ui.Notes
import com.bintianqi.owndroid.ui.RadioButtonItem
import com.bintianqi.owndroid.ui.SwitchItem
import kotlinx.serialization.Serializable
@@ -901,6 +900,7 @@ private fun KeepUninstalledPackagesScreen(pkgName: String) {
@Composable
private fun UninstallPackageScreen(pkgName: String) {
val context = LocalContext.current
var errorMessage by remember { mutableStateOf<String?>(null) }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.uninstall_app), style = typography.headlineLarge)
@@ -919,11 +919,7 @@ private fun UninstallPackageScreen(pkgName: String) {
if(statusExtra == PackageInstaller.STATUS_SUCCESS) {
context.showOperationResultToast(true)
} else {
AlertDialog.Builder(context)
.setTitle(R.string.failure)
.setMessage(parsePackageInstallerMessage(context, intent))
.setPositiveButton(R.string.confirm) { dialog, _ -> dialog.dismiss() }
.show()
errorMessage = parsePackageInstallerMessage(context, intent)
}
}
}
@@ -960,5 +956,13 @@ private fun UninstallPackageScreen(pkgName: String) {
}
}
}
if(errorMessage != null) AlertDialog(
title = { Text(stringResource(R.string.failure)) },
text = { Text(errorMessage!!) },
confirmButton = {
TextButton({ errorMessage = null }) { Text(stringResource(R.string.confirm)) }
},
onDismissRequest = { errorMessage = null }
)
}

View File

@@ -2,7 +2,6 @@ package com.bintianqi.owndroid.dpm
import android.Manifest
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.admin.DevicePolicyManager.PRIVATE_DNS_MODE_OFF
import android.app.admin.DevicePolicyManager.PRIVATE_DNS_MODE_OPPORTUNISTIC
import android.app.admin.DevicePolicyManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME
@@ -133,14 +132,15 @@ import com.bintianqi.owndroid.humanReadableDate
import com.bintianqi.owndroid.humanReadableDateTime
import com.bintianqi.owndroid.showOperationResultToast
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.ErrorDialog
import com.bintianqi.owndroid.ui.ExpandExposedTextFieldIcon
import com.bintianqi.owndroid.ui.FullWidthRadioButtonItem
import com.bintianqi.owndroid.ui.FunctionItem
import com.bintianqi.owndroid.ui.Notes
import com.bintianqi.owndroid.ui.ListItem
import com.bintianqi.owndroid.ui.MyScaffold
import com.bintianqi.owndroid.ui.MySmallTitleScaffold
import com.bintianqi.owndroid.ui.NavIcon
import com.bintianqi.owndroid.ui.Notes
import com.bintianqi.owndroid.ui.RadioButtonItem
import com.bintianqi.owndroid.ui.SwitchItem
import com.bintianqi.owndroid.writeClipBoard
@@ -507,6 +507,7 @@ private fun AddNetworkScreen(wifiConfig: WifiConfiguration? = null, onNavigateUp
ssid = wifiConfig.SSID.removeSurrounding("\"")
}
}
var errorMessage by remember { mutableStateOf<String?>(null) }
Column(
modifier = (if(wifiConfig == null) Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(bottom = 60.dp) else Modifier)
.padding(start = 8.dp, end = 8.dp, top = 12.dp)
@@ -721,11 +722,7 @@ private fun AddNetworkScreen(wifiConfig: WifiConfiguration? = null, onNavigateUp
resultDialog = true
} catch(e: Exception) {
e.printStackTrace()
AlertDialog.Builder(context)
.setTitle(R.string.error)
.setPositiveButton(R.string.confirm) { dialog, _ -> dialog.cancel() }
.setMessage(e.message ?: "")
.show()
errorMessage = e.message
}
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp)
@@ -755,6 +752,7 @@ private fun AddNetworkScreen(wifiConfig: WifiConfiguration? = null, onNavigateUp
onDismissRequest = { resultDialog = false }
)
}
ErrorDialog(errorMessage) { errorMessage = null }
}
@Serializable object WifiSecurityLevel
@@ -914,6 +912,7 @@ fun NetworkStatsScreen(onNavigateUp: () -> Unit, onNavigateToViewer: (NetworkSta
val endTimeTextFieldInteractionSource = remember { MutableInteractionSource() }
if(startTimeTextFieldInteractionSource.collectIsPressedAsState().value) activeTextField = NetworkStatsActiveTextField.StartTime
if(endTimeTextFieldInteractionSource.collectIsPressedAsState().value) activeTextField = NetworkStatsActiveTextField.EndTime
var errorMessage by remember { mutableStateOf<String?>(null) }
MyScaffold(R.string.network_stats, 8.dp, onNavigateUp) {
ExposedDropdownMenuBox(
activeTextField == NetworkStatsActiveTextField.Type,
@@ -1202,14 +1201,10 @@ fun NetworkStatsScreen(onNavigateUp: () -> Unit, onNavigateToViewer: (NetworkSta
e.printStackTrace()
withContext(Dispatchers.Main) {
querying = false
AlertDialog.Builder(context)
.setTitle(R.string.error)
.setMessage(e.message ?: "")
.setPositiveButton(R.string.confirm) { dialog, _ -> dialog.dismiss() }
.show()
errorMessage = e.message
}
return@launch
}
}.filterNot { it == null }
if(buckets.isEmpty()) {
withContext(Dispatchers.Main) {
querying = false
@@ -1263,6 +1258,7 @@ fun NetworkStatsScreen(onNavigateUp: () -> Unit, onNavigateToViewer: (NetworkSta
}
}
}
ErrorDialog(errorMessage) { errorMessage = null }
}
@Serializable

View File

@@ -2,7 +2,6 @@ package com.bintianqi.owndroid.dpm
import android.annotation.SuppressLint
import android.app.ActivityOptions
import android.app.AlertDialog
import android.app.admin.DevicePolicyManager
import android.app.admin.DevicePolicyManager.FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY
import android.app.admin.DevicePolicyManager.InstallSystemUpdateCallback
@@ -126,6 +125,7 @@ import com.bintianqi.owndroid.humanReadableDate
import com.bintianqi.owndroid.parseDate
import com.bintianqi.owndroid.showOperationResultToast
import com.bintianqi.owndroid.ui.CheckBoxItem
import com.bintianqi.owndroid.ui.ErrorDialog
import com.bintianqi.owndroid.ui.FullWidthCheckBoxItem
import com.bintianqi.owndroid.ui.FullWidthRadioButtonItem
import com.bintianqi.owndroid.ui.FunctionItem
@@ -286,7 +286,7 @@ fun SystemOptionsScreen(onNavigateUp: () -> Unit) {
}
}
if(deviceOwner || profileOwner) {
SwitchItem(R.string.master_mute, icon = R.drawable.volume_up_fill0,
SwitchItem(R.string.master_mute, icon = R.drawable.volume_off_fill0,
getState = { dpm.isMasterVolumeMuted(receiver) }, onCheckedChange = { dpm.setMasterVolumeMuted(receiver,it) }
)
}
@@ -1197,6 +1197,7 @@ private fun ColumnScope.LockTaskFeatures() {
val receiver = context.getReceiver()
var flags by remember { mutableIntStateOf(0) }
var custom by rememberSaveable { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
fun refresh() {
flags = dpm.getLockTaskFeatures(receiver)
custom = flags != 0
@@ -1230,17 +1231,14 @@ private fun ColumnScope.LockTaskFeatures() {
dpm.setLockTaskFeatures(receiver, flags)
context.showOperationResultToast(true)
} catch (e: IllegalArgumentException) {
AlertDialog.Builder(context)
.setTitle(R.string.error)
.setMessage(e.message)
.setPositiveButton(R.string.confirm) { dialog, _ -> dialog.dismiss() }
.show()
errorMessage = e.message
}
refresh()
}
) {
Text(stringResource(R.string.apply))
}
ErrorDialog(errorMessage) { errorMessage = null }
}
data class CaCertInfo(

View File

@@ -357,3 +357,15 @@ fun ExpandExposedTextFieldIcon(active: Boolean) {
modifier = Modifier.rotate(degrees)
)
}
@Composable
fun ErrorDialog(message: String?, onDismiss: () -> Unit) {
if(!message.isNullOrEmpty()) AlertDialog(
title = { Text(stringResource(R.string.error)) },
text = { Text(message) },
confirmButton = {
TextButton(onDismiss) { Text(stringResource(R.string.confirm)) }
},
onDismissRequest = onDismiss
)
}