Change horizontal screen padding from 8.dp to 16.dp

This commit is contained in:
BinTianqi
2025-03-15 14:04:31 +08:00
parent b7e37a59d4
commit 3c0696faa3
13 changed files with 126 additions and 121 deletions

View File

@@ -457,27 +457,24 @@ private fun HomeScreen(onNavigate: (Any) -> Unit) {
Spacer(Modifier.padding(vertical = 25.dp))
Text(
text = stringResource(R.string.app_name), style = typography.headlineLarge,
modifier = Modifier.padding(start = 10.dp)
modifier = Modifier.padding(start = HorizontalPadding)
)
Spacer(Modifier.padding(vertical = 8.dp))
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp, horizontal = 8.dp)
.padding(vertical = 8.dp, horizontal = HorizontalPadding)
.clip(RoundedCornerShape(15))
.background(color = colorScheme.primary)
.clickable(onClick = { onNavigate(Permissions) })
.padding(vertical = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Spacer(modifier = Modifier.padding(start = 22.dp))
Icon(
painter = painterResource(if(activated) R.drawable.check_circle_fill1 else R.drawable.block_fill0),
contentDescription = null,
tint = colorScheme.onPrimary
painterResource(if(activated) R.drawable.check_circle_fill1 else R.drawable.block_fill0), null,
Modifier.padding(start = 14.dp), colorScheme.onPrimary
)
Spacer(modifier = Modifier.padding(start = 10.dp))
Column {
Column(Modifier.padding(start = 12.dp)) {
Text(
text = stringResource(if(activated) R.string.activated else R.string.deactivated),
style = typography.headlineSmall,

View File

@@ -63,7 +63,7 @@ fun SettingsScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
val exportLogsLauncher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) {
if(it != null) exportLogs(context, it)
}
MyScaffold(R.string.settings, 0.dp, onNavigateUp) {
MyScaffold(R.string.settings, onNavigateUp, 0.dp) {
FunctionItem(title = R.string.options, icon = R.drawable.tune_fill0) { onNavigate(SettingsOptions) }
FunctionItem(title = R.string.appearance, icon = R.drawable.format_paint_fill0) { onNavigate(Appearance) }
FunctionItem(R.string.app_lock, icon = R.drawable.lock_fill0) { onNavigate(AppLockSettings) }
@@ -82,7 +82,7 @@ fun SettingsScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
@Composable
fun SettingsOptionsScreen(onNavigateUp: () -> Unit) {
val sp = SharedPrefs(LocalContext.current)
MyScaffold(R.string.options, 0.dp, onNavigateUp) {
MyScaffold(R.string.options, onNavigateUp, 0.dp) {
SwitchItem(
R.string.show_dangerous_features, icon = R.drawable.warning_fill0,
getState = { sp.displayDangerousFeatures },
@@ -102,7 +102,7 @@ fun AppearanceScreen(onNavigateUp: () -> Unit, currentTheme: ThemeSettings, onTh
0 -> R.string.off
else -> R.string.follow_system
}
MyScaffold(R.string.appearance, 0.dp, onNavigateUp) {
MyScaffold(R.string.appearance, onNavigateUp, 0.dp) {
if(VERSION.SDK_INT >= 31) {
SwitchItem(
R.string.material_you_color,
@@ -153,7 +153,7 @@ fun AppearanceScreen(onNavigateUp: () -> Unit, currentTheme: ThemeSettings, onTh
@Serializable object AppLockSettings
@Composable
fun AppLockSettingsScreen(onNavigateUp: () -> Unit) = MyScaffold(R.string.app_lock, 0.dp, onNavigateUp) {
fun AppLockSettingsScreen(onNavigateUp: () -> Unit) = MyScaffold(R.string.app_lock, onNavigateUp, 0.dp) {
val fm = LocalFocusManager.current
val sp = SharedPrefs(LocalContext.current)
var password by remember { mutableStateOf("") }
@@ -212,7 +212,7 @@ fun AppLockSettingsScreen(onNavigateUp: () -> Unit) = MyScaffold(R.string.app_lo
fun ApiSettings(onNavigateUp: () -> Unit) {
val context = LocalContext.current
val sp = SharedPrefs(context)
MyScaffold(R.string.api, 8.dp, onNavigateUp) {
MyScaffold(R.string.api, onNavigateUp) {
var enabled by remember { mutableStateOf(sp.isApiEnabled) }
SwitchItem(R.string.enable, state = enabled, onCheckedChange = {
enabled = it
@@ -253,7 +253,7 @@ fun ApiSettings(onNavigateUp: () -> Unit) {
@Serializable object Notifications
@Composable
fun NotificationsScreen(onNavigateUp: () -> Unit) = MyScaffold(R.string.notifications, 0.dp, onNavigateUp) {
fun NotificationsScreen(onNavigateUp: () -> Unit) = MyScaffold(R.string.notifications, onNavigateUp, 0.dp) {
val sp = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
val map = mapOf(
NotificationUtils.ID.PASSWORD_CHANGED to R.string.password_changed, NotificationUtils.ID.USER_ADDED to R.string.user_added,
@@ -277,7 +277,7 @@ fun AboutScreen(onNavigateUp: () -> Unit) {
val pkgInfo = context.packageManager.getPackageInfo(context.packageName,0)
val verCode = pkgInfo.versionCode
val verName = pkgInfo.versionName
MyScaffold(R.string.about, 0.dp, onNavigateUp) {
MyScaffold(R.string.about, onNavigateUp, 0.dp) {
Text(text = stringResource(R.string.app_name)+" v$verName ($verCode)", modifier = Modifier.padding(start = 16.dp))
Spacer(Modifier.padding(vertical = 5.dp))
FunctionItem(R.string.project_homepage, "GitHub", R.drawable.open_in_new) { shareLink(context, "https://github.com/BinTianqi/OwnDroid") }

View File

@@ -16,6 +16,7 @@ import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.annotation.StringRes
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import com.bintianqi.owndroid.dpm.addDeviceAdmin
@@ -142,3 +143,5 @@ fun exportLogs(context: Context, uri: Uri) {
fun <T> NavHostController.navigate(route: T, args: Bundle) {
navigate(graph.findNode(route)!!.id, args)
}
val HorizontalPadding = 16.dp

View File

@@ -86,6 +86,7 @@ import com.bintianqi.owndroid.APK_MIME
import com.bintianqi.owndroid.AppInstallerActivity
import com.bintianqi.owndroid.AppInstallerViewModel
import com.bintianqi.owndroid.ChoosePackageContract
import com.bintianqi.owndroid.HorizontalPadding
import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.showOperationResultToast
import com.bintianqi.owndroid.ui.Animations
@@ -439,7 +440,7 @@ private fun UserControlDisabledPackagesScreen(pkgName:String) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val pkgList = remember { mutableStateListOf<String>() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
val refresh = {
pkgList.clear()
pkgList.addAll(dpm.getUserControlDisabledPackages(receiver))
@@ -591,7 +592,7 @@ private fun DisableMeteredDataScreen(pkgName: String) {
packages.addAll(dpm.getMeteredDataDisabledPackages(receiver))
}
LaunchedEffect(Unit) { refresh() }
Column(Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Text(stringResource(R.string.disable_metered_data), Modifier.padding(vertical = 8.dp), style = typography.headlineLarge)
Column(Modifier.animateContentSize()) {
packages.forEach { pkg ->
@@ -631,7 +632,7 @@ private fun CrossProfilePackagesScreen(pkgName: String) {
crossProfilePkg.addAll(dpm.getCrossProfilePackages(receiver))
}
LaunchedEffect(Unit) { refresh() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.cross_profile_package), style = typography.headlineLarge)
Text(text = stringResource(R.string.app_list_is))
@@ -673,7 +674,7 @@ private fun CrossProfileWidgetProvidersScreen(pkgName: String) {
pkgList.addAll(dpm.getCrossProfileWidgetProviders(receiver))
}
LaunchedEffect(Unit) { refresh() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.cross_profile_widget), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
@@ -718,7 +719,7 @@ private fun CredentialManagerPolicyScreen(pkgName: String) { // TODO: rename "ma
pkgList.addAll(policy?.packageNames ?: setOf())
}
LaunchedEffect(Unit) { refreshPolicy() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.credential_manager_policy), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
@@ -786,7 +787,7 @@ private fun PermittedAccessibilityServicesScreen(pkgName: String) {
pkgList.addAll(getList ?: listOf())
}
LaunchedEffect(Unit) { refresh() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.permitted_accessibility_services), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
@@ -851,7 +852,7 @@ private fun PermittedInputMethodsScreen(pkgName: String) {
pkgList.addAll(getList ?: listOf())
}
LaunchedEffect(Unit) { refresh() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.permitted_ime), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
@@ -907,7 +908,7 @@ private fun KeepUninstalledPackagesScreen(pkgName: String) {
dpm.getKeepUninstalledPackages(receiver)?.forEach { pkgList += it }
}
LaunchedEffect(Unit) { refresh() }
Column(modifier = Modifier.fillMaxSize().padding(horizontal = 8.dp).verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.keep_uninstalled_packages), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))
@@ -945,7 +946,7 @@ private fun KeepUninstalledPackagesScreen(pkgName: String) {
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())) {
Column(modifier = Modifier.fillMaxSize().padding(horizontal = HorizontalPadding).verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 10.dp))
Text(text = stringResource(R.string.uninstall_app), style = typography.headlineLarge)
Spacer(Modifier.padding(vertical = 5.dp))

View File

@@ -125,6 +125,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.core.os.bundleOf
import com.bintianqi.owndroid.ChoosePackageContract
import com.bintianqi.owndroid.HorizontalPadding
import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.SharedPrefs
import com.bintianqi.owndroid.formatFileSize
@@ -164,7 +165,7 @@ fun NetworkScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
val dhizuku = SharedPrefs(context).dhizuku
MyScaffold(R.string.network, 0.dp, onNavigateUp) {
MyScaffold(R.string.network, onNavigateUp, 0.dp) {
if(!dhizuku) FunctionItem(R.string.wifi, icon = R.drawable.wifi_fill0) { onNavigate(WiFi) }
if(VERSION.SDK_INT >= 30) {
FunctionItem(R.string.options, icon = R.drawable.tune_fill0) { onNavigate(NetworkOptions) }
@@ -204,7 +205,7 @@ fun NetworkOptionsScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
val deviceOwner = context.isDeviceOwner
var dialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.options, 0.dp, onNavigateUp) {
MyScaffold(R.string.options, onNavigateUp, 0.dp) {
if(VERSION.SDK_INT>=30 && (deviceOwner || dpm.isOrgProfile(receiver))) {
SwitchItem(R.string.lockdown_admin_configured_network, icon = R.drawable.wifi_password_fill0,
getState = { dpm.hasLockdownAdminConfiguredNetworks(receiver) }, onCheckedChange = { dpm.setConfiguredNetworksLockdownState(receiver,it) },
@@ -471,7 +472,7 @@ object AddNetwork
@Composable
fun AddNetworkScreen(data: Bundle, onNavigateUp: () -> Unit) {
MySmallTitleScaffold(R.string.update_network, 0.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.update_network, onNavigateUp, 0.dp) {
AddNetworkScreen(data.getParcelable("wifi_configuration"), onNavigateUp)
}
}
@@ -764,7 +765,7 @@ fun WifiSecurityLevelScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
var selectedWifiSecLevel by remember { mutableIntStateOf(0) }
LaunchedEffect(Unit) { selectedWifiSecLevel = dpm.minimumRequiredWifiSecurityLevel }
MySmallTitleScaffold(R.string.min_wifi_security_level, 0.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.min_wifi_security_level, onNavigateUp, 0.dp) {
FullWidthRadioButtonItem(R.string.wifi_security_open, selectedWifiSecLevel == WIFI_SECURITY_OPEN) { selectedWifiSecLevel = WIFI_SECURITY_OPEN }
FullWidthRadioButtonItem("WEP, WPA(2)-PSK", selectedWifiSecLevel == WIFI_SECURITY_PERSONAL) { selectedWifiSecLevel = WIFI_SECURITY_PERSONAL }
FullWidthRadioButtonItem("WPA-EAP", selectedWifiSecLevel == WIFI_SECURITY_ENTERPRISE_EAP) { selectedWifiSecLevel = WIFI_SECURITY_ENTERPRISE_EAP }
@@ -774,11 +775,11 @@ fun WifiSecurityLevelScreen(onNavigateUp: () -> Unit) {
dpm.minimumRequiredWifiSecurityLevel = selectedWifiSecLevel
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
Notes(R.string.info_minimum_wifi_security_level, 8.dp)
Notes(R.string.info_minimum_wifi_security_level, HorizontalPadding)
}
}
@@ -790,7 +791,7 @@ fun WifiSsidPolicyScreen(onNavigateUp: () -> Unit) {
val context = LocalContext.current
val dpm = context.getDPM()
val focusMgr = LocalFocusManager.current
MyScaffold(R.string.wifi_ssid_policy, 0.dp, onNavigateUp) {
MyScaffold(R.string.wifi_ssid_policy, onNavigateUp, 0.dp) {
var selectedPolicyType by remember { mutableIntStateOf(-1) }
val ssidList = remember { mutableStateListOf<WifiSsid>() }
fun refreshPolicy() {
@@ -809,7 +810,7 @@ fun WifiSsidPolicyScreen(onNavigateUp: () -> Unit) {
}
AnimatedVisibility(selectedPolicyType != -1) {
var inputSsid by remember { mutableStateOf("") }
Column(Modifier.padding(horizontal = 8.dp)) {
Column(Modifier.padding(horizontal = HorizontalPadding)) {
Text(stringResource(R.string.ssid_list_is))
if(ssidList.isEmpty()) Text(stringResource(R.string.none))
Column(modifier = Modifier.animateContentSize()) {
@@ -850,7 +851,7 @@ fun WifiSsidPolicyScreen(onNavigateUp: () -> Unit) {
refreshPolicy()
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
@@ -913,7 +914,7 @@ fun NetworkStatsScreen(onNavigateUp: () -> Unit, onNavigateToViewer: (NetworkSta
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) {
MyScaffold(R.string.network_stats, onNavigateUp) {
ExposedDropdownMenuBox(
activeTextField == NetworkStatsActiveTextField.Type,
{ activeTextField = if(it) NetworkStatsActiveTextField.Type else NetworkStatsActiveTextField.Type }
@@ -1286,7 +1287,7 @@ data class NetworkStatsViewer(
fun NetworkStatsViewerScreen(nsv: NetworkStatsViewer, onNavigateUp: () -> Unit) {
var index by remember { mutableIntStateOf(0) }
val size = nsv.stats.size
MySmallTitleScaffold(R.string.network_stats, 8.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.network_stats, onNavigateUp) {
if(size > 1) Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.align(Alignment.CenterHorizontally).padding(bottom = 8.dp)
@@ -1371,7 +1372,7 @@ fun PrivateDnsScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
MyScaffold(R.string.private_dns, 8.dp, onNavigateUp) {
MyScaffold(R.string.private_dns, onNavigateUp) {
val dnsStatus = mapOf(
PRIVATE_DNS_MODE_UNKNOWN to stringResource(R.string.unknown),
PRIVATE_DNS_MODE_OFF to stringResource(R.string.disabled),
@@ -1467,7 +1468,7 @@ fun AlwaysOnVpnPackageScreen(onNavigateUp: () -> Unit) {
false
}
}
MyScaffold(R.string.always_on_vpn, 8.dp, onNavigateUp) {
MyScaffold(R.string.always_on_vpn, onNavigateUp) {
OutlinedTextField(
value = pkgName,
onValueChange = { pkgName = it },
@@ -1515,7 +1516,7 @@ fun RecommendedGlobalProxyScreen(onNavigateUp: () -> Unit) {
var specifyPort by remember { mutableStateOf(false) }
var proxyPort by remember { mutableStateOf("") }
var exclList by remember { mutableStateOf("") }
MyScaffold(R.string.recommended_global_proxy, 8.dp, onNavigateUp) {
MyScaffold(R.string.recommended_global_proxy, onNavigateUp) {
RadioButtonItem(R.string.proxy_type_off, proxyType == 0) { proxyType = 0 }
RadioButtonItem(R.string.proxy_type_pac, proxyType == 1) { proxyType = 1 }
RadioButtonItem(R.string.proxy_type_direct, proxyType == 2) { proxyType = 2 }
@@ -1620,7 +1621,7 @@ fun NetworkLoggingScreen(onNavigateUp: () -> Unit) {
context.showOperationResultToast(true)
}
}
MyScaffold(R.string.network_logging, 8.dp, onNavigateUp) {
MyScaffold(R.string.network_logging, onNavigateUp) {
SwitchItem(
R.string.enable,
getState = { dpm.isNetworkLoggingEnabled(receiver) },
@@ -1662,7 +1663,7 @@ fun WifiAuthKeypairScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val focusMgr = LocalFocusManager.current
var keyPair by remember { mutableStateOf("") }
MyScaffold(R.string.wifi_auth_keypair, 8.dp, onNavigateUp) {
MyScaffold(R.string.wifi_auth_keypair, onNavigateUp) {
OutlinedTextField(
value = keyPair,
label = { Text(stringResource(R.string.alias)) },
@@ -1712,7 +1713,7 @@ fun PreferentialNetworkServiceScreen(onNavigateUp: () -> Unit, onNavigate: (AddP
configs.addAll(dpm.preferentialNetworkServiceConfigs)
}
LaunchedEffect(Unit) { refresh() }
MySmallTitleScaffold(R.string.preferential_network_service, 0.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.preferential_network_service, onNavigateUp, 0.dp) {
SwitchItem(R.string.enabled, state = masterEnabled, onCheckedChange = {
dpm.isPreferentialNetworkServiceEnabled = it
refresh()
@@ -1776,7 +1777,7 @@ fun AddPreferentialNetworkServiceConfigScreen(route: AddPreferentialNetworkServi
var blockNonMatching by remember { mutableStateOf(route.blockNonMatching) }
var excludedUids by remember { mutableStateOf(route.excludedUids.joinToString("\n")) }
var includedUids by remember { mutableStateOf(route.includedUids.joinToString("\n")) }
MySmallTitleScaffold(R.string.preferential_network_service, 8.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.preferential_network_service, onNavigateUp) {
SwitchItem(title = R.string.enabled, state = enabled, onCheckedChange = { enabled = it }, padding = false)
AnimatedVisibility(enabled) {
Row(verticalAlignment = Alignment.CenterVertically) {
@@ -1878,7 +1879,7 @@ fun OverrideApnScreen(onNavigateUp: () -> Unit, onNavigateToAddSetting: (Bundle)
settings.addAll(dpm.getOverrideApns(receiver))
}
LaunchedEffect(Unit) { refresh() }
MyScaffold(R.string.override_apn, 0.dp, onNavigateUp) {
MyScaffold(R.string.override_apn, onNavigateUp, 0.dp) {
SwitchItem(
R.string.enable, state = enabled,
onCheckedChange = {
@@ -1962,7 +1963,7 @@ fun AddApnSettingScreen(origin: ApnSetting?, onNavigateUp: () -> Unit) {
var persistent by remember { mutableStateOf(if(VERSION.SDK_INT >= 33) origin?.isPersistent == true else false) }
var alwaysOn by remember { mutableStateOf(VERSION.SDK_INT >= 35 && origin?.isAlwaysOn == true) }
var errorMessage: String? by remember { mutableStateOf(null) }
MySmallTitleScaffold(R.string.apn_setting, 8.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.apn_setting, onNavigateUp) {
val protocolMap = mapOf(
ApnSetting.PROTOCOL_IP to "IPv4", ApnSetting.PROTOCOL_IPV6 to "IPv6",
ApnSetting.PROTOCOL_IPV4V6 to "IPv4/v6", ApnSetting.PROTOCOL_PPP to "PPP"

View File

@@ -65,6 +65,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat.startActivity
import com.bintianqi.owndroid.HorizontalPadding
import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.SharedPrefs
import com.bintianqi.owndroid.showOperationResultToast
@@ -89,7 +90,7 @@ fun PasswordScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
var dialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.password_and_keyguard, 0.dp, onNavigateUp) {
MyScaffold(R.string.password_and_keyguard, onNavigateUp, 0.dp) {
FunctionItem(R.string.password_info, icon = R.drawable.info_fill0) { onNavigate(PasswordInfo) }
if(SharedPrefs(context).displayDangerousFeatures) {
if(VERSION.SDK_INT >= 26 && (deviceOwner || profileOwner)) {
@@ -219,7 +220,7 @@ fun PasswordInfoScreen(onNavigateUp: () -> Unit) {
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
var dialog by remember { mutableIntStateOf(0) } // 0:none, 1:password complexity
MyScaffold(R.string.password_info, 8.dp, onNavigateUp) {
MyScaffold(R.string.password_info, onNavigateUp) {
if(VERSION.SDK_INT >= 29) {
val text = when(dpm.passwordComplexity) {
PASSWORD_COMPLEXITY_NONE -> R.string.none
@@ -259,7 +260,7 @@ fun ResetPasswordTokenScreen(onNavigateUp: () -> Unit) {
var token by remember { mutableStateOf("") }
val tokenByteArray = token.toByteArray()
val focusMgr = LocalFocusManager.current
MyScaffold(R.string.reset_password_token, 8.dp, onNavigateUp) {
MyScaffold(R.string.reset_password_token, onNavigateUp) {
OutlinedTextField(
value = token, onValueChange = { token = it },
label = { Text(stringResource(R.string.token)) },
@@ -326,7 +327,7 @@ fun ResetPasswordScreen(onNavigateUp: () -> Unit) {
val tokenByteArray = token.toByteArray()
var flag by remember { mutableIntStateOf(0) }
var confirmDialog by remember { mutableStateOf(false) }
MyScaffold(R.string.reset_password, 8.dp, onNavigateUp) {
MyScaffold(R.string.reset_password, onNavigateUp) {
if(VERSION.SDK_INT >= 26) {
OutlinedTextField(
value = token, onValueChange = { token = it },
@@ -447,7 +448,7 @@ fun RequiredPasswordComplexityScreen(onNavigateUp: () -> Unit) {
)
var selectedItem by remember { mutableIntStateOf(PASSWORD_COMPLEXITY_NONE) }
LaunchedEffect(Unit) { selectedItem = dpm.requiredPasswordComplexity }
MyScaffold(R.string.required_password_complexity, 0.dp, onNavigateUp) {
MyScaffold(R.string.required_password_complexity, onNavigateUp, 0.dp) {
passwordComplexity.forEach {
FullWidthRadioButtonItem(it.value, selectedItem == it.key) { selectedItem = it.key }
}
@@ -458,11 +459,11 @@ fun RequiredPasswordComplexityScreen(onNavigateUp: () -> Unit) {
selectedItem = dpm.requiredPasswordComplexity
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(text = stringResource(R.string.apply))
}
Notes(R.string.info_password_complexity, 8.dp)
Notes(R.string.info_password_complexity, HorizontalPadding)
}
}
@@ -499,7 +500,7 @@ fun KeyguardDisabledFeaturesScreen(onNavigateUp: () -> Unit) {
}
LaunchedEffect(mode) { if(mode != 2) flag = dpm.getKeyguardDisabledFeatures(receiver) }
LaunchedEffect(Unit) { refresh() }
MyScaffold(R.string.disable_keyguard_features, 0.dp, onNavigateUp) {
MyScaffold(R.string.disable_keyguard_features, onNavigateUp) {
FullWidthRadioButtonItem(R.string.enable_all, mode == 0) { mode = 0 }
FullWidthRadioButtonItem(R.string.disable_all, mode == 1) { mode = 1 }
FullWidthRadioButtonItem(R.string.custom, mode == 2) { mode = 2 }
@@ -519,7 +520,7 @@ fun KeyguardDisabledFeaturesScreen(onNavigateUp: () -> Unit) {
refresh()
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(text = stringResource(R.string.apply))
}
@@ -544,7 +545,7 @@ fun RequiredPasswordQualityScreen(onNavigateUp: () -> Unit) {
)
var selectedItem by remember { mutableIntStateOf(PASSWORD_QUALITY_UNSPECIFIED) }
LaunchedEffect(Unit) { selectedItem=dpm.getPasswordQuality(receiver) }
MyScaffold(R.string.required_password_quality, 8.dp, onNavigateUp) {
MyScaffold(R.string.required_password_quality, onNavigateUp) {
passwordQuality.forEach {
RadioButtonItem(it.value, selectedItem == it.key) { selectedItem = it.key }
}

View File

@@ -44,6 +44,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.core.os.bundleOf
import com.bintianqi.owndroid.ChoosePackageContract
import com.bintianqi.owndroid.HorizontalPadding
import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.SharedPrefs
import com.bintianqi.owndroid.backToHomeStateFlow
@@ -73,7 +74,7 @@ fun PermissionsScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit, onNav
var dialog by remember { mutableIntStateOf(0) }
var bindingShizuku by remember { mutableStateOf(false) }
val enrollmentSpecificId = if(VERSION.SDK_INT >= 31 && (deviceOwner || profileOwner)) dpm.enrollmentSpecificId else ""
MyScaffold(R.string.permissions, 0.dp, onNavigateUp) {
MyScaffold(R.string.permissions, onNavigateUp, 0.dp) {
if(!dpm.isDeviceOwnerApp(context.packageName)) {
SwitchItem(
R.string.dhizuku,
@@ -276,7 +277,7 @@ fun LockScreenInfoScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
var infoText by remember { mutableStateOf(dpm.deviceOwnerLockScreenInfo?.toString() ?: "") }
MyScaffold(R.string.lock_screen_info, 8.dp, onNavigateUp) {
MyScaffold(R.string.lock_screen_info, onNavigateUp) {
OutlinedTextField(
value = infoText,
label = { Text(stringResource(R.string.lock_screen_info)) },
@@ -319,7 +320,7 @@ fun DeviceAdminScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
var deactivateDialog by remember { mutableStateOf(false) }
val deviceAdmin = context.isDeviceAdmin
MyScaffold(R.string.device_admin, 8.dp, onNavigateUp) {
MyScaffold(R.string.device_admin, onNavigateUp) {
Text(text = stringResource(if(context.isDeviceAdmin) R.string.activated else R.string.deactivated), style = typography.titleLarge)
Spacer(Modifier.padding(vertical = 5.dp))
AnimatedVisibility(deviceAdmin) {
@@ -378,7 +379,7 @@ fun ProfileOwnerScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
var deactivateDialog by remember { mutableStateOf(false) }
val profileOwner = context.isProfileOwner
MyScaffold(R.string.profile_owner, 8.dp, onNavigateUp) {
MyScaffold(R.string.profile_owner, onNavigateUp) {
Text(stringResource(if(profileOwner) R.string.activated else R.string.deactivated), style = typography.titleLarge)
Spacer(Modifier.padding(vertical = 5.dp))
if(VERSION.SDK_INT >= 24 && profileOwner) {
@@ -432,7 +433,7 @@ fun DeviceOwnerScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
var deactivateDialog by remember { mutableStateOf(false) }
val deviceOwner = context.isDeviceOwner
MyScaffold(R.string.device_owner, 8.dp, onNavigateUp) {
MyScaffold(R.string.device_owner, onNavigateUp) {
Text(text = stringResource(if(deviceOwner) R.string.activated else R.string.deactivated), style = typography.titleLarge)
Spacer(Modifier.padding(vertical = 5.dp))
AnimatedVisibility(deviceOwner) {
@@ -538,7 +539,7 @@ fun DelegatedAdminsScreen(onNavigateUp: () -> Unit, onNavigate: (AddDelegatedAdm
packages.putAll(list)
}
LaunchedEffect(Unit) { refresh() }
MyScaffold(R.string.delegated_admins, 0.dp, onNavigateUp) {
MyScaffold(R.string.delegated_admins, onNavigateUp, 0.dp) {
packages.forEach { (pkg, scopes) ->
Row(
Modifier.fillMaxWidth().padding(vertical = 8.dp).padding(start = 14.dp, end = 8.dp),
@@ -587,7 +588,7 @@ fun AddDelegatedAdminScreen(data: AddDelegatedAdmin, onNavigateUp: () -> Unit) {
val choosePackage = rememberLauncherForActivityResult(ChoosePackageContract()) { result ->
result?.let { input = it }
}
MySmallTitleScaffold(if(updateMode) R.string.place_holder else R.string.add_delegated_admin, 0.dp, onNavigateUp) {
MySmallTitleScaffold(if(updateMode) R.string.place_holder else R.string.add_delegated_admin, onNavigateUp, 0.dp) {
OutlinedTextField(
value = input, onValueChange = { input = it },
label = { Text(stringResource(R.string.package_name)) },
@@ -599,7 +600,7 @@ fun AddDelegatedAdminScreen(data: AddDelegatedAdmin, onNavigateUp: () -> Unit) {
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Done),
keyboardActions = KeyboardActions { fm.clearFocus() },
readOnly = updateMode,
modifier = Modifier.fillMaxWidth().padding(8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp, horizontal = HorizontalPadding)
)
DelegatedScope.entries.filter { VERSION.SDK_INT >= it.requiresApi }.forEach {scope ->
FullWidthCheckBoxItem(scope.string, scope in scopes) {
@@ -611,7 +612,7 @@ fun AddDelegatedAdminScreen(data: AddDelegatedAdmin, onNavigateUp: () -> Unit) {
context.getDPM().setDelegatedScopes(context.getReceiver(), input, scopes.map { it.id })
onNavigateUp()
},
modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp, vertical = 4.dp),
modifier = Modifier.fillMaxWidth().padding(HorizontalPadding, vertical = 4.dp),
enabled = input.isNotBlank() && (!updateMode || scopes.toList() != data.scopes)
) {
Text(stringResource(if(updateMode) R.string.update else R.string.add))
@@ -621,7 +622,7 @@ fun AddDelegatedAdminScreen(data: AddDelegatedAdmin, onNavigateUp: () -> Unit) {
context.getDPM().setDelegatedScopes(context.getReceiver(), input, emptyList())
onNavigateUp()
},
modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp),
modifier = Modifier.fillMaxWidth().padding(HorizontalPadding),
colors = ButtonDefaults.buttonColors(colorScheme.error, colorScheme.onError)
) {
Text(stringResource(R.string.delete))
@@ -637,7 +638,7 @@ fun DeviceInfoScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
var dialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.device_info, 8.dp, onNavigateUp) {
MyScaffold(R.string.device_info, onNavigateUp) {
if(VERSION.SDK_INT>=34 && (context.isDeviceOwner || dpm.isOrgProfile(receiver))) {
CardItem(R.string.financed_device, dpm.isDeviceFinanced.yesOrNo)
}
@@ -686,7 +687,7 @@ fun SupportMessageScreen(onNavigateUp: () -> Unit) {
longMsg = dpm.getLongSupportMessage(receiver)?.toString() ?: ""
}
LaunchedEffect(Unit) { refreshMsg() }
MyScaffold(R.string.support_messages, 8.dp, onNavigateUp) {
MyScaffold(R.string.support_messages, onNavigateUp) {
OutlinedTextField(
value = shortMsg,
label = { Text(stringResource(R.string.short_support_msg)) },
@@ -761,7 +762,7 @@ fun TransferOwnershipScreen(onNavigateUp: () -> Unit) {
var input by remember { mutableStateOf("") }
val componentName = ComponentName.unflattenFromString(input)
var dialog by remember { mutableStateOf(false) }
MyScaffold(R.string.transfer_ownership, 8.dp, onNavigateUp) {
MyScaffold(R.string.transfer_ownership, onNavigateUp) {
OutlinedTextField(
value = input, onValueChange = { input = it }, label = { Text(stringResource(R.string.target_component_name)) },
modifier = Modifier.fillMaxWidth(),

View File

@@ -66,7 +66,7 @@ fun ShizukuScreen(navArgs: Bundle, onNavigateUp: () -> Unit, onNavigateToAccount
null
}
}
MySmallTitleScaffold(R.string.shizuku, 0.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.shizuku, onNavigateUp, 0.dp) {
Button(
onClick = {
@@ -185,7 +185,7 @@ data class Accounts(
@Composable
fun AccountsScreen(accounts: Accounts, onNavigateUp: () -> Unit) {
MySmallTitleScaffold(R.string.accounts, 8.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.accounts, onNavigateUp) {
accounts.list.forEach {
Column(
modifier = Modifier

View File

@@ -117,6 +117,7 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import com.bintianqi.owndroid.ChoosePackageContract
import com.bintianqi.owndroid.HorizontalPadding
import com.bintianqi.owndroid.NotificationUtils
import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.SharedPrefs
@@ -163,7 +164,7 @@ fun SystemManagerScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
var dialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.system, 0.dp, onNavigateUp) {
MyScaffold(R.string.system, onNavigateUp, 0.dp) {
if(deviceOwner || profileOwner) {
FunctionItem(R.string.options, icon = R.drawable.tune_fill0) { onNavigate(SystemOptions) }
}
@@ -256,7 +257,7 @@ fun SystemOptionsScreen(onNavigateUp: () -> Unit) {
val profileOwner = context.isProfileOwner
val um = context.getSystemService(Context.USER_SERVICE) as UserManager
var dialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.options, 0.dp, onNavigateUp) {
MyScaffold(R.string.options, onNavigateUp, 0.dp) {
if(deviceOwner || profileOwner) {
SwitchItem(R.string.disable_cam, icon = R.drawable.photo_camera_fill0,
getState = { dpm.getCameraDisabled(null) }, onCheckedChange = { dpm.setCameraDisabled(receiver,it) }
@@ -341,7 +342,7 @@ fun KeyguardScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
MyScaffold(R.string.keyguard, 8.dp, onNavigateUp) {
MyScaffold(R.string.keyguard, onNavigateUp) {
if(VERSION.SDK_INT >= 23) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
@@ -425,8 +426,8 @@ fun HardwareMonitorScreen(onNavigateUp: () -> Unit) {
delay(refreshIntervalMs)
}
}
MySmallTitleScaffold(R.string.hardware_monitor, 8.dp, onNavigateUp) {
Text(stringResource(R.string.refresh_interval), style = typography.titleLarge, modifier = Modifier.padding(vertical = 4.dp))
MyScaffold(R.string.hardware_monitor, onNavigateUp) {
Text(stringResource(R.string.refresh_interval), style = typography.titleLarge, modifier = Modifier.padding(top = 8.dp, bottom = 4.dp))
Slider(refreshInterval, { refreshInterval = it }, valueRange = 0.5F..2F, steps = 14)
Text("${refreshIntervalMs}ms")
Spacer(Modifier.padding(vertical = 10.dp))
@@ -491,7 +492,7 @@ fun ChangeTimeScreen(onNavigateUp: () -> Unit) {
val timeInteractionSource = remember { MutableInteractionSource() }
if(dateInteractionSource.collectIsPressedAsState().value) picker = 1
if(timeInteractionSource.collectIsPressedAsState().value) picker = 2
MyScaffold(R.string.change_time, 8.dp, onNavigateUp) {
MyScaffold(R.string.change_time, onNavigateUp) {
SingleChoiceSegmentedButtonRow(
modifier = Modifier.fillMaxWidth().padding(top = 4.dp)
) {
@@ -603,7 +604,7 @@ fun ChangeTimeZoneScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
var inputTimezone by remember { mutableStateOf("") }
var dialog by remember { mutableStateOf(false) }
MyScaffold(R.string.change_timezone, 8.dp, onNavigateUp) {
MyScaffold(R.string.change_timezone, onNavigateUp) {
OutlinedTextField(
value = inputTimezone,
label = { Text(stringResource(R.string.timezone_id)) },
@@ -848,7 +849,7 @@ fun ContentProtectionPolicyScreen(onNavigateUp: () -> Unit) {
var policy by remember { mutableIntStateOf(DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY) }
fun refresh() { policy = dpm.getContentProtectionPolicy(receiver) }
LaunchedEffect(Unit) { refresh() }
MyScaffold(R.string.content_protection_policy, 0.dp, onNavigateUp) {
MyScaffold(R.string.content_protection_policy, onNavigateUp, 0.dp) {
mapOf(
DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY to R.string.not_controlled_by_policy,
DevicePolicyManager.CONTENT_PROTECTION_ENABLED to R.string.enabled,
@@ -862,11 +863,11 @@ fun ContentProtectionPolicyScreen(onNavigateUp: () -> Unit) {
refresh()
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
Notes(R.string.info_content_protection_policy, 8.dp)
Notes(R.string.info_content_protection_policy, HorizontalPadding)
}
}
@@ -879,7 +880,7 @@ fun PermissionPolicyScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
var selectedPolicy by remember { mutableIntStateOf(dpm.getPermissionPolicy(receiver)) }
MyScaffold(R.string.permission_policy, 0.dp, onNavigateUp) {
MyScaffold(R.string.permission_policy, onNavigateUp, 0.dp) {
FullWidthRadioButtonItem(R.string.default_stringres, selectedPolicy == PERMISSION_POLICY_PROMPT) {
selectedPolicy = PERMISSION_POLICY_PROMPT
}
@@ -895,11 +896,11 @@ fun PermissionPolicyScreen(onNavigateUp: () -> Unit) {
dpm.setPermissionPolicy(receiver,selectedPolicy)
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
Notes(R.string.info_permission_policy, 8.dp)
Notes(R.string.info_permission_policy, HorizontalPadding)
}
}
@@ -911,7 +912,7 @@ fun MtePolicyScreen(onNavigateUp: () -> Unit) {
val context = LocalContext.current
val dpm = context.getDPM()
var selectedMtePolicy by remember { mutableIntStateOf(dpm.mtePolicy) }
MyScaffold(R.string.mte_policy, 0.dp, onNavigateUp) {
MyScaffold(R.string.mte_policy, onNavigateUp, 0.dp) {
FullWidthRadioButtonItem(R.string.decide_by_user, selectedMtePolicy == MTE_NOT_CONTROLLED_BY_POLICY) {
selectedMtePolicy = MTE_NOT_CONTROLLED_BY_POLICY
}
@@ -927,11 +928,11 @@ fun MtePolicyScreen(onNavigateUp: () -> Unit) {
}
selectedMtePolicy = dpm.mtePolicy
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
Notes(R.string.info_mte_policy, 8.dp)
Notes(R.string.info_mte_policy, HorizontalPadding)
}
}
@@ -943,7 +944,7 @@ fun NearbyStreamingPolicyScreen(onNavigateUp: () -> Unit) {
val context = LocalContext.current
val dpm = context.getDPM()
var appPolicy by remember { mutableIntStateOf(dpm.nearbyAppStreamingPolicy) }
MySmallTitleScaffold(R.string.nearby_streaming_policy, 0.dp, onNavigateUp) {
MySmallTitleScaffold(R.string.nearby_streaming_policy, onNavigateUp, 0.dp) {
Text(
stringResource(R.string.nearby_app_streaming),
Modifier.padding(start = 8.dp, top = 10.dp, bottom = 4.dp), style = typography.titleLarge
@@ -964,11 +965,11 @@ fun NearbyStreamingPolicyScreen(onNavigateUp: () -> Unit) {
appPolicy = dpm.nearbyAppStreamingPolicy
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
Notes(R.string.info_nearby_app_streaming_policy, 8.dp)
Notes(R.string.info_nearby_app_streaming_policy, HorizontalPadding)
var notificationPolicy by remember { mutableIntStateOf(dpm.nearbyNotificationStreamingPolicy) }
Text(
stringResource(R.string.nearby_notification_streaming),
@@ -996,11 +997,11 @@ fun NearbyStreamingPolicyScreen(onNavigateUp: () -> Unit) {
notificationPolicy = dpm.nearbyNotificationStreamingPolicy
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
Notes(R.string.info_nearby_notification_streaming_policy, 8.dp)
Notes(R.string.info_nearby_notification_streaming_policy, HorizontalPadding)
}
}
@@ -1043,7 +1044,7 @@ fun LockTaskModeScreen(onNavigateUp: () -> Unit) {
HorizontalPager(pagerState, verticalAlignment = Alignment.Top) { page ->
if(page == 0 || page == 1) {
Column(
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(start = 8.dp, end = 8.dp, bottom = 80.dp)
Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(horizontal = HorizontalPadding).padding(bottom = 80.dp)
) {
if(page == 0) StartLockTaskMode()
else LockTaskPackages()
@@ -1225,7 +1226,7 @@ private fun ColumnScope.LockTaskFeatures() {
}
}
Button(
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp),
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding),
onClick = {
try {
dpm.setLockTaskFeatures(receiver, flags)
@@ -1428,7 +1429,7 @@ fun SecurityLoggingScreen(onNavigateUp: () -> Unit) {
context.showOperationResultToast(true)
}
}
MyScaffold(R.string.security_logging, 8.dp, onNavigateUp) {
MyScaffold(R.string.security_logging, onNavigateUp) {
SwitchItem(
R.string.enable,
getState = { dpm.isSecurityLoggingEnabled(receiver) }, onCheckedChange = { dpm.setSecurityLoggingEnabled(receiver, it) },
@@ -1489,7 +1490,7 @@ fun DisableAccountManagementScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
MyScaffold(R.string.disable_account_management, 8.dp, onNavigateUp) {
MyScaffold(R.string.disable_account_management, onNavigateUp) {
val list = remember { mutableStateListOf<String>() }
fun refreshList() {
list.clear()
@@ -1561,7 +1562,7 @@ fun FrpPolicyScreen(onNavigateUp: () -> Unit) {
}
}
}
MyScaffold(R.string.frp_policy, 8.dp, onNavigateUp) {
MyScaffold(R.string.frp_policy, onNavigateUp) {
if(unsupported) {
Column(
Modifier.fillMaxWidth().padding(vertical = 8.dp)
@@ -1639,7 +1640,7 @@ fun WipeDataScreen(onNavigateUp: () -> Unit) {
var wipeDevice by remember { mutableStateOf(false) }
var silent by remember { mutableStateOf(false) }
var reason by remember { mutableStateOf("") }
MyScaffold(R.string.wipe_data, 8.dp, onNavigateUp) {
MyScaffold(R.string.wipe_data, onNavigateUp) {
CheckBoxItem(R.string.wipe_external_storage, flag and WIPE_EXTERNAL_STORAGE != 0) { flag = flag xor WIPE_EXTERNAL_STORAGE }
if(VERSION.SDK_INT >= 22 && context.isDeviceOwner) CheckBoxItem(
R.string.wipe_reset_protection_data, flag and WIPE_RESET_PROTECTION_DATA != 0) { flag = flag xor WIPE_RESET_PROTECTION_DATA }
@@ -1743,7 +1744,7 @@ fun SystemUpdatePolicyScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
MyScaffold(R.string.system_update_policy, 0.dp, onNavigateUp) {
MyScaffold(R.string.system_update_policy, onNavigateUp, 0.dp) {
var selectedPolicy by remember { mutableStateOf(dpm.systemUpdatePolicy?.policyType) }
FullWidthRadioButtonItem(
R.string.system_update_policy_automatic,
@@ -1761,7 +1762,7 @@ fun SystemUpdatePolicyScreen(onNavigateUp: () -> Unit) {
var windowedPolicyStart by remember { mutableStateOf("") }
var windowedPolicyEnd by remember { mutableStateOf("") }
AnimatedVisibility(selectedPolicy == 2) {
Column(Modifier.padding(horizontal = 8.dp)) {
Column(Modifier.padding(horizontal = HorizontalPadding)) {
Row(Modifier.fillMaxWidth().padding(vertical = 4.dp), Arrangement.SpaceBetween) {
OutlinedTextField(
value = windowedPolicyStart,
@@ -1795,13 +1796,13 @@ fun SystemUpdatePolicyScreen(onNavigateUp: () -> Unit) {
dpm.setSystemUpdatePolicy(receiver,policy)
context.showOperationResultToast(true)
},
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = 8.dp)
modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp, horizontal = HorizontalPadding)
) {
Text(stringResource(R.string.apply))
}
if(VERSION.SDK_INT >= 26) {
val sysUpdateInfo = dpm.getPendingSystemUpdate(receiver)
Column(Modifier.padding(8.dp)) {
Column(Modifier.padding(HorizontalPadding)) {
if(sysUpdateInfo != null) {
Text(text = stringResource(R.string.update_received_time, Date(sysUpdateInfo.receivedTime)))
val securityPatchStateText = when(sysUpdateInfo.securityPatchState) {
@@ -1843,12 +1844,12 @@ fun InstallSystemUpdateScreen(onNavigateUp: () -> Unit) {
var uri by remember { mutableStateOf<Uri?>(null) }
var errorMessage by remember { mutableStateOf<String?>(null) }
val getFileLauncher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri = it }
MyScaffold(R.string.install_system_update, 8.dp, onNavigateUp) {
MyScaffold(R.string.install_system_update, onNavigateUp) {
Button(
onClick = {
getFileLauncher.launch("application/zip")
},
modifier = Modifier.fillMaxWidth()
modifier = Modifier.fillMaxWidth().padding(top = 8.dp)
) {
Text(stringResource(R.string.select_ota_package))
}

View File

@@ -36,7 +36,7 @@ fun UserRestrictionScreen(onNavigateUp: () -> Unit, onNavigate: (Int, List<Restr
val context = LocalContext.current
val dpm = context.getDPM()
val receiver = context.getReceiver()
MyScaffold(R.string.user_restriction, 0.dp, onNavigateUp) {
MyScaffold(R.string.user_restriction, onNavigateUp, 0.dp) {
Spacer(Modifier.padding(vertical = 2.dp))
Text(text = stringResource(R.string.switch_to_disable_feature), modifier = Modifier.padding(start = 16.dp))
if(context.isProfileOwner) { Text(text = stringResource(R.string.profile_owner_is_restricted), modifier = Modifier.padding(start = 16.dp)) }
@@ -76,7 +76,7 @@ fun UserRestrictionOptionsScreen(
data: UserRestrictionOptions, restrictions: Bundle,
onNavigateUp: () -> Unit, onRestrictionChange: (String, Boolean) -> Unit
) {
MyScaffold(data.title, 0.dp, onNavigateUp) {
MyScaffold(data.title, onNavigateUp, 0.dp) {
data.items.filter { Build.VERSION.SDK_INT >= it.requiresApi }.forEach { restriction ->
SwitchItem(
restriction.name, restriction.id, restriction.icon,

View File

@@ -91,7 +91,7 @@ fun UsersScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
val deviceOwner = context.isDeviceOwner
val profileOwner = context.isProfileOwner
var dialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.users, 0.dp, onNavigateUp) {
MyScaffold(R.string.users, onNavigateUp, 0.dp) {
if(VERSION.SDK_INT >= 28 && profileOwner && dpm.isAffiliatedUser) {
FunctionItem(R.string.logout, icon = R.drawable.logout_fill0) { dialog = 2 }
}
@@ -175,7 +175,7 @@ fun UsersOptionsScreen(onNavigateUp: () -> Unit) {
val context = LocalContext.current
val dpm = context.getDPM()
val receiver = context.getReceiver()
MyScaffold(R.string.options, 0.dp, onNavigateUp) {
MyScaffold(R.string.options, onNavigateUp, 0.dp) {
if(VERSION.SDK_INT >= 28) {
SwitchItem(R.string.enable_logout, getState = { dpm.isLogoutEnabled }, onCheckedChange = { dpm.setLogoutEnabled(receiver, it) })
}
@@ -192,7 +192,7 @@ fun UserInfoScreen(onNavigateUp: () -> Unit) {
val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager
val user = Process.myUserHandle()
var infoDialog by remember { mutableIntStateOf(0) }
MyScaffold(R.string.user_info, 8.dp, onNavigateUp) {
MyScaffold(R.string.user_info, onNavigateUp) {
if(VERSION.SDK_INT >= 24) CardItem(R.string.support_multiuser, UserManager.supportsMultipleUsers().yesOrNo)
if(VERSION.SDK_INT >= 31) CardItem(R.string.headless_system_user_mode, UserManager.isHeadlessSystemUserMode().yesOrNo) { infoDialog = 1 }
Spacer(Modifier.padding(vertical = 8.dp))
@@ -247,7 +247,7 @@ fun UserOperationScreen(onNavigateUp: () -> Unit) {
}
}
val legalInput = input.toIntOrNull() != null
MyScaffold(R.string.user_operation, 8.dp, onNavigateUp) {
MyScaffold(R.string.user_operation, onNavigateUp) {
if(VERSION.SDK_INT >= 24) SingleChoiceSegmentedButtonRow(modifier = Modifier.fillMaxWidth()) {
SegmentedButton(!useUserId, { useUserId = false }, SegmentedButtonDefaults.itemShape(0, 2)) {
Text(stringResource(R.string.serial_number))
@@ -343,7 +343,7 @@ fun CreateUserScreen(onNavigateUp: () -> Unit) {
var createdUserSerialNumber by remember { mutableLongStateOf(-1) }
var flag by remember { mutableIntStateOf(0) }
val coroutine = rememberCoroutineScope()
MyScaffold(R.string.create_user, 8.dp, onNavigateUp) {
MyScaffold(R.string.create_user, onNavigateUp) {
OutlinedTextField(
value = userName,
onValueChange = { userName= it },
@@ -418,7 +418,7 @@ fun AffiliationIdScreen(onNavigateUp: () -> Unit) {
list.addAll(dpm.getAffiliationIds(receiver))
}
LaunchedEffect(Unit) { refreshIds() }
MyScaffold(R.string.affiliation_id, 8.dp, onNavigateUp) {
MyScaffold(R.string.affiliation_id, onNavigateUp) {
Column(modifier = Modifier.animateContentSize()) {
if(list.isEmpty()) Text(stringResource(R.string.none))
for(i in list) {
@@ -470,7 +470,7 @@ fun ChangeUsernameScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
var inputUsername by remember { mutableStateOf("") }
MyScaffold(R.string.change_username, 8.dp, onNavigateUp) {
MyScaffold(R.string.change_username, onNavigateUp) {
OutlinedTextField(
value = inputUsername,
onValueChange = { inputUsername= it },
@@ -514,7 +514,7 @@ fun UserSessionMessageScreen(onNavigateUp: () -> Unit) {
end = dpm.getEndUserSessionMessage(receiver)?.toString() ?: ""
}
LaunchedEffect(Unit) { refreshMsg() }
MyScaffold(R.string.user_session_msg, 8.dp, onNavigateUp) {
MyScaffold(R.string.user_session_msg, onNavigateUp) {
OutlinedTextField(
value = start,
onValueChange = { start= it },

View File

@@ -73,7 +73,7 @@ fun WorkProfileScreen(onNavigateUp: () -> Unit, onNavigate: (Any) -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val profileOwner = context.isProfileOwner
MyScaffold(R.string.work_profile, 0.dp, onNavigateUp) {
MyScaffold(R.string.work_profile, onNavigateUp, 0.dp) {
if(VERSION.SDK_INT >= 30 && profileOwner && dpm.isManagedProfile(receiver)) {
FunctionItem(R.string.org_owned_work_profile, icon = R.drawable.corporate_fare_fill0) { onNavigate(OrganizationOwnedProfile) }
}
@@ -100,7 +100,7 @@ fun CreateWorkProfileScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { }
MyScaffold(R.string.create_work_profile, 8.dp, onNavigateUp) {
MyScaffold(R.string.create_work_profile, onNavigateUp) {
var skipEncrypt by remember { mutableStateOf(false) }
var offlineProvisioning by remember { mutableStateOf(true) }
var migrateAccount by remember { mutableStateOf(false) }
@@ -171,7 +171,7 @@ fun CreateWorkProfileScreen(onNavigateUp: () -> Unit) {
fun OrganizationOwnedProfileScreen(onNavigateUp: () -> Unit) {
val context = LocalContext.current
val dpm = context.getDPM()
MyScaffold(R.string.org_owned_work_profile, 8.dp, onNavigateUp) {
MyScaffold(R.string.org_owned_work_profile, onNavigateUp) {
CardItem(R.string.org_owned_work_profile, dpm.isOrganizationOwnedDeviceWithManagedProfile.yesOrNo)
Spacer(Modifier.padding(vertical = 5.dp))
if(!dpm.isOrganizationOwnedDeviceWithManagedProfile) {
@@ -196,7 +196,7 @@ fun SuspendPersonalAppScreen(onNavigateUp: () -> Unit) {
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
var suspend by remember { mutableStateOf(dpm.getPersonalAppsSuspendedReasons(receiver) != PERSONAL_APPS_NOT_SUSPENDED) }
MyScaffold(R.string.suspend_personal_app, 8.dp, onNavigateUp) {
MyScaffold(R.string.suspend_personal_app, onNavigateUp) {
SwitchItem(R.string.suspend_personal_app, state = suspend,
onCheckedChange = {
dpm.setPersonalAppsSuspended(receiver,it)
@@ -242,7 +242,7 @@ fun CrossProfileIntentFilterScreen(onNavigateUp: () -> Unit) {
val dpm = context.getDPM()
val receiver = context.getReceiver()
val focusMgr = LocalFocusManager.current
MyScaffold(R.string.intent_filter, 8.dp, onNavigateUp) {
MyScaffold(R.string.intent_filter, onNavigateUp) {
var action by remember { mutableStateOf("") }
OutlinedTextField(
value = action, onValueChange = { action = it },
@@ -295,7 +295,7 @@ fun DeleteWorkProfileScreen(onNavigateUp: () -> Unit) {
var warning by remember { mutableStateOf(false) }
var silent by remember { mutableStateOf(false) }
var reason by remember { mutableStateOf("") }
MyScaffold(R.string.delete_work_profile, 8.dp, onNavigateUp) {
MyScaffold(R.string.delete_work_profile, onNavigateUp) {
CheckBoxItem(R.string.wipe_external_storage, flag and WIPE_EXTERNAL_STORAGE != 0) { flag = flag xor WIPE_EXTERNAL_STORAGE }
if(VERSION.SDK_INT >= 28) CheckBoxItem(R.string.wipe_euicc, flag and WIPE_EUICC != 0) { flag = flag xor WIPE_EUICC }
CheckBoxItem(R.string.wipe_silently, silent) { silent = it }

View File

@@ -280,7 +280,7 @@ fun ListItem(text: String, onDelete: () -> Unit) {
@Composable
fun Notes(@StringRes strID: Int, horizonPadding: Dp = 0.dp) {
Icon(Icons.Outlined.Info, null, Modifier.padding(horizontal = horizonPadding).padding(top = 4.dp, bottom = 8.dp))
Icon(Icons.Outlined.Info, null, Modifier.padding(horizontal = horizonPadding).padding(top = 4.dp, bottom = 8.dp), colorScheme.onSurfaceVariant)
Text(
stringResource(strID), Modifier.padding(horizontal = horizonPadding),
color = colorScheme.onSurfaceVariant, style = typography.bodyMedium
@@ -291,8 +291,8 @@ fun Notes(@StringRes strID: Int, horizonPadding: Dp = 0.dp) {
@Composable
fun MyScaffold(
@StringRes title: Int,
horizonPadding: Dp,
onNavIconClicked: () -> Unit,
horizonPadding: Dp = 16.dp,
content: @Composable ColumnScope.() -> Unit
) {
val sb = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
@@ -323,8 +323,8 @@ fun MyScaffold(
@Composable
fun MySmallTitleScaffold(
@StringRes title: Int,
horizonPadding: Dp,
onNavIconClicked: () -> Unit,
horizonPadding: Dp = 16.dp,
content: @Composable ColumnScope.() -> Unit
) {
Scaffold(