From 3c0696faa36f5fc40c04d1a7455eb41baa40ffc6 Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Sat, 15 Mar 2025 14:04:31 +0800 Subject: [PATCH] Change horizontal screen padding from 8.dp to 16.dp --- .../com/bintianqi/owndroid/MainActivity.kt | 13 ++-- .../java/com/bintianqi/owndroid/Settings.kt | 14 ++-- .../main/java/com/bintianqi/owndroid/Utils.kt | 3 + .../bintianqi/owndroid/dpm/Applications.kt | 19 +++--- .../com/bintianqi/owndroid/dpm/Network.kt | 41 ++++++------ .../com/bintianqi/owndroid/dpm/Password.kt | 21 +++--- .../com/bintianqi/owndroid/dpm/Permissions.kt | 27 ++++---- .../com/bintianqi/owndroid/dpm/Shizuku.kt | 4 +- .../java/com/bintianqi/owndroid/dpm/System.kt | 67 ++++++++++--------- .../bintianqi/owndroid/dpm/UserRestriction.kt | 4 +- .../java/com/bintianqi/owndroid/dpm/Users.kt | 16 ++--- .../com/bintianqi/owndroid/dpm/WorkProfile.kt | 12 ++-- .../com/bintianqi/owndroid/ui/Components.kt | 6 +- 13 files changed, 126 insertions(+), 121 deletions(-) diff --git a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt index 0e8bda8..7ff3010 100644 --- a/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt +++ b/app/src/main/java/com/bintianqi/owndroid/MainActivity.kt @@ -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, diff --git a/app/src/main/java/com/bintianqi/owndroid/Settings.kt b/app/src/main/java/com/bintianqi/owndroid/Settings.kt index 6866ebb..88b43cf 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Settings.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Settings.kt @@ -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") } diff --git a/app/src/main/java/com/bintianqi/owndroid/Utils.kt b/app/src/main/java/com/bintianqi/owndroid/Utils.kt index 6553439..4e1d6ad 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Utils.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Utils.kt @@ -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 NavHostController.navigate(route: T, args: Bundle) { navigate(graph.findNode(route)!!.id, args) } + +val HorizontalPadding = 16.dp diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt index 11acb6b..545b8b4 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Applications.kt @@ -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() } - 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(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)) diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt index de195c5..8e5c021 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Network.kt @@ -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() } 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(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" diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt index bcca300..5987c7a 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Password.kt @@ -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 } } diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt index dad9ae9..baf8b2c 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Permissions.kt @@ -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(), diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Shizuku.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Shizuku.kt index 65d3818..05535fc 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Shizuku.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Shizuku.kt @@ -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 diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt index a645c5f..12267c7 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/System.kt @@ -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() } 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(null) } var errorMessage by remember { mutableStateOf(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)) } diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt index c52e4f1..5f988e0 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/UserRestriction.kt @@ -36,7 +36,7 @@ fun UserRestrictionScreen(onNavigateUp: () -> Unit, onNavigate: (Int, List 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, diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt index 66924a4..bc26bba 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/Users.kt @@ -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 }, diff --git a/app/src/main/java/com/bintianqi/owndroid/dpm/WorkProfile.kt b/app/src/main/java/com/bintianqi/owndroid/dpm/WorkProfile.kt index 7e30fce..7f440d1 100644 --- a/app/src/main/java/com/bintianqi/owndroid/dpm/WorkProfile.kt +++ b/app/src/main/java/com/bintianqi/owndroid/dpm/WorkProfile.kt @@ -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 } diff --git a/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt b/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt index 28ca8cf..45cb619 100644 --- a/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt +++ b/app/src/main/java/com/bintianqi/owndroid/ui/Components.kt @@ -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(