From 03005ae5e0f9a66dac8a621e2f0e52b39b990a0d Mon Sep 17 00:00:00 2001 From: BinTianqi <1220958406@qq.com> Date: Wed, 20 Mar 2024 21:24:52 +0800 Subject: [PATCH] support black theme --- app/build.gradle.kts | 4 +- .../com/binbin/androidowner/MainActivity.kt | 17 +++++--- .../java/com/binbin/androidowner/Setting.kt | 41 ++++++++++++------- .../androidowner/dpm/ApplicationManage.kt | 10 ++--- .../binbin/androidowner/dpm/ManagedProfile.kt | 22 +++++----- .../com/binbin/androidowner/dpm/Network.kt | 17 ++++---- .../com/binbin/androidowner/dpm/Password.kt | 21 ++++++---- .../binbin/androidowner/dpm/Permissions.kt | 25 +++++------ .../binbin/androidowner/dpm/SystemManage.kt | 23 ++++++----- .../com/binbin/androidowner/dpm/UserManage.kt | 22 +++++----- .../androidowner/dpm/UserRestriction.kt | 36 ++++++++-------- .../com/binbin/androidowner/ui/Components.kt | 19 +++++++++ .../com/binbin/androidowner/ui/theme/Theme.kt | 26 +++++++++--- app/src/main/res/values/strings.xml | 8 +++- 14 files changed, 177 insertions(+), 114 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fe7bc63..d89b10b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "com.binbin.androidowner" minSdk = 21 targetSdk = 34 - versionCode = 19 - versionName = "4.2" + versionCode = 20 + versionName = "4.3" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index ba1a3e0..beceef5 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -1,6 +1,5 @@ package com.binbin.androidowner -import android.annotation.SuppressLint import android.app.Activity import android.app.admin.DevicePolicyManager import android.content.ComponentName @@ -12,20 +11,23 @@ import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager @@ -38,8 +40,10 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.dpm.* -import com.binbin.androidowner.ui.theme.AndroidOwnerTheme import com.binbin.androidowner.ui.Animations +import com.binbin.androidowner.ui.theme.AndroidOwnerTheme +import com.binbin.androidowner.ui.theme.SetDarkTheme +import com.binbin.androidowner.ui.theme.bgColor lateinit var displayMetrics: DisplayMetrics @ExperimentalMaterial3Api @@ -85,7 +89,7 @@ fun MyScaffold(){ modifier = Modifier .statusBarsPadding() .fillMaxSize() - .background(color = if(isSystemInDarkTheme()) { Color(0xFF000000) }else{ colorScheme.primary.copy(alpha = 0.05F) }) + .background(bgColor) .imePadding() .pointerInput(Unit) {detectTapGestures(onTap = {focusMgr.clearFocus()})}, enterTransition = Animations().navHostEnterTransition, @@ -126,6 +130,7 @@ private fun HomePage(navCtrl:NavHostController){ stringResource(if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){R.string.work_profile_owner}else{R.string.profile_owner}) } else if(myDpm.isAdminActive(myComponent)){"Device Admin"}else{""} + SetDarkTheme() Column(modifier = Modifier.verticalScroll(rememberScrollState())) { Spacer(Modifier.padding(vertical = 18.dp)) Text(text = stringResource(R.string.app_name), style = typography.headlineLarge, modifier = Modifier.padding(start = 10.dp), color = colorScheme.onBackground) diff --git a/app/src/main/java/com/binbin/androidowner/Setting.kt b/app/src/main/java/com/binbin/androidowner/Setting.kt index d825f96..6adc319 100644 --- a/app/src/main/java/com/binbin/androidowner/Setting.kt +++ b/app/src/main/java/com/binbin/androidowner/Setting.kt @@ -3,11 +3,15 @@ package com.binbin.androidowner import android.content.Context import android.content.Intent import android.net.Uri -import androidx.compose.foundation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.material3.* -import androidx.compose.material3.MaterialTheme.colorScheme +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment @@ -21,26 +25,25 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import com.binbin.androidowner.ui.Animations -import com.binbin.androidowner.ui.NavIcon -import com.binbin.androidowner.ui.SubPageItem -import com.binbin.androidowner.ui.SwitchItem +import com.binbin.androidowner.ui.* +import com.binbin.androidowner.ui.theme.SetDarkTheme +import com.binbin.androidowner.ui.theme.bgColor -@OptIn(ExperimentalMaterial3Api::class) @Composable fun AppSetting(navCtrl:NavHostController){ val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "About" to R.string.about - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.setting))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry, navCtrl, localNavCtrl) } ){ NavHost( @@ -49,9 +52,7 @@ fun AppSetting(navCtrl:NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "Settings"){Settings()} @@ -71,11 +72,21 @@ private fun Home(navCtrl: NavHostController){ @Composable private fun Settings(){ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) + SetDarkTheme() Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { SwitchItem( R.string.dynamic_color, stringResource(R.string.dynamic_color_desc),null, {sharedPref.getBoolean("dynamicColor",false)},{sharedPref.edit().putBoolean("dynamicColor",it).apply()} ) + SwitchItem( + R.string.blackTheme, stringResource(R.string.blackTheme_desc),null, + {sharedPref.getBoolean("blackTheme",false)},{sharedPref.edit().putBoolean("blackTheme",it).apply()} + ) + Box(modifier = Modifier.padding(10.dp)){ + Information { + Text(text = stringResource(R.string.need_relaunch)) + } + } } } diff --git a/app/src/main/java/com/binbin/androidowner/dpm/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/dpm/ApplicationManage.kt index a08699b..b826a40 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/ApplicationManage.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/ApplicationManage.kt @@ -29,7 +29,6 @@ import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.* -import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable @@ -50,6 +49,7 @@ import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.toText import com.binbin.androidowner.ui.* +import com.binbin.androidowner.ui.theme.bgColor import com.binbin.androidowner.uriToStream import kotlinx.coroutines.delay import java.io.IOException @@ -61,7 +61,6 @@ private var crossProfilePkg = mutableSetOf() private var keepUninstallPkg = mutableListOf() private var permittedIme = mutableListOf() private var permittedAccessibility = mutableListOf() -@OptIn(ExperimentalMaterial3Api::class) @Composable fun ApplicationManage(navCtrl:NavHostController){ val focusMgr = LocalFocusManager.current @@ -85,11 +84,12 @@ fun ApplicationManage(navCtrl:NavHostController){ ) Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.app_manage))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry, navCtrl, localNavCtrl){Text(text = stringResource(titleMap[backStackEntry?.destination?.route] ?: R.string.app_manage))} } ){ paddingValues-> Column(modifier = Modifier.fillMaxSize().padding(top = paddingValues.calculateTopPadding())){ @@ -109,7 +109,7 @@ fun ApplicationManage(navCtrl:NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) + modifier = Modifier.background(bgColor) ){ composable(route = "Home"){Home(localNavCtrl,pkgName)} composable(route = "BlockUninstall"){BlockUninstall(pkgName)} diff --git a/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt b/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt index 43ec82a..134b947 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/ManagedProfile.kt @@ -9,11 +9,14 @@ import android.os.Build.VERSION import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography @@ -32,26 +35,27 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.ui.* +import com.binbin.androidowner.ui.theme.bgColor -@OptIn(ExperimentalMaterial3Api::class) @Composable fun ManagedProfile(navCtrl: NavHostController) { val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "OrgOwnedWorkProfile" to R.string.org_owned_work_profile, "CreateWorkProfile" to R.string.create_work_profile, "SuspendPersonalApp" to R.string.suspend_personal_app, "IntentFilter" to R.string.intent_filter, "OrgID" to R.string.org_id - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.work_profile))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry,navCtrl, localNavCtrl) } ){ NavHost( @@ -60,9 +64,7 @@ fun ManagedProfile(navCtrl: NavHostController) { exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "OrgOwnedWorkProfile"){OrgOwnedProfile()} @@ -80,7 +82,7 @@ private fun Home(navCtrl: NavHostController){ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ - Spacer(Modifier.padding(vertical = 10.dp)) + Text(text = stringResource(R.string.work_profile), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) if(VERSION.SDK_INT>=30&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){ SubPageItem(R.string.org_owned_work_profile,""){navCtrl.navigate("OrgOwnedWorkProfile")} } diff --git a/app/src/main/java/com/binbin/androidowner/dpm/Network.kt b/app/src/main/java/com/binbin/androidowner/dpm/Network.kt index 8b97e1f..e632fe8 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/Network.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/Network.kt @@ -43,14 +43,14 @@ import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.toText import com.binbin.androidowner.ui.* +import com.binbin.androidowner.ui.theme.bgColor var ssidSet = mutableSetOf() -@OptIn(ExperimentalMaterial3Api::class) @Composable fun Network(navCtrl: NavHostController){ val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "Home" to R.string.network, "MinWifiSecurityLevel" to R.string.min_wifi_security_level, "WifiSsidPolicy" to R.string.wifi_ssid_policy, @@ -58,14 +58,15 @@ fun Network(navCtrl: NavHostController){ "NetLog" to R.string.retrieve_net_logs, "WifiKeypair" to R.string.wifi_keypair, "APN" to R.string.apn_settings - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.network))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry, navCtrl, localNavCtrl) } ){ NavHost( @@ -74,9 +75,7 @@ fun Network(navCtrl: NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "Switches"){Switches()} @@ -96,7 +95,7 @@ private fun Home(navCtrl:NavHostController){ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ - Spacer(Modifier.padding(vertical = 5.dp)) + Text(text = stringResource(R.string.network), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) if(VERSION.SDK_INT>=24){ val wifimac = try { myDpm.getWifiMacAddress(myComponent).toString() }catch(e:SecurityException){ "没有权限" } Text(text = "WiFi MAC: $wifimac", modifier = Modifier.padding(start = 15.dp)) diff --git a/app/src/main/java/com/binbin/androidowner/dpm/Password.kt b/app/src/main/java/com/binbin/androidowner/dpm/Password.kt index 924d7ed..5bebeb6 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/Password.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/Password.kt @@ -11,10 +11,13 @@ import android.os.Build.VERSION import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography @@ -34,13 +37,13 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.ui.* +import com.binbin.androidowner.ui.theme.bgColor -@OptIn(ExperimentalMaterial3Api::class) @Composable fun Password(navCtrl: NavHostController){ val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "ResetPasswordToken" to R.string.reset_password_token, "PasswordInfo" to R.string.password_info, "ResetPassword" to R.string.reset_password, @@ -51,14 +54,15 @@ fun Password(navCtrl: NavHostController){ "MaxPasswordFail" to R.string.max_pwd_fail, "PasswordHistoryLength" to R.string.pwd_history, "RequirePasswordQuality" to R.string.required_password_quality, - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.password_and_keyguard))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry, navCtrl, localNavCtrl) } ){ NavHost( @@ -67,9 +71,7 @@ fun Password(navCtrl: NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "PasswordInfo"){PasswordInfo()} @@ -89,6 +91,7 @@ fun Password(navCtrl: NavHostController){ @Composable private fun Home(navCtrl:NavHostController){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ + Text(text = stringResource(R.string.password_and_keyguard), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) SubPageItem(R.string.password_info,""){navCtrl.navigate("PasswordInfo")} if(VERSION.SDK_INT>=26){ SubPageItem(R.string.reset_password_token,""){navCtrl.navigate("ResetPasswordToken")} diff --git a/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt b/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt index 01af126..7cddd1b 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/Permissions.kt @@ -14,9 +14,11 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer -import androidx.compose.material3.* -import androidx.compose.material3.MaterialTheme.colorScheme +import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -35,17 +37,17 @@ import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.ui.Animations import com.binbin.androidowner.ui.Information -import com.binbin.androidowner.ui.NavIcon import com.binbin.androidowner.ui.SubPageItem +import com.binbin.androidowner.ui.TopBar +import com.binbin.androidowner.ui.theme.bgColor import kotlinx.coroutines.delay import kotlinx.coroutines.launch -@OptIn(ExperimentalMaterial3Api::class) @Composable fun DpmPermissions(navCtrl:NavHostController){ val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "Home" to R.string.permission, "Shizuku" to R.string.shizuku, "DeviceAdmin" to R.string.device_admin, @@ -58,14 +60,15 @@ fun DpmPermissions(navCtrl:NavHostController){ "LockScreenInfo" to R.string.owner_lockscr_info, "SupportMsg" to R.string.support_msg, "TransformOwnership" to R.string.transform_ownership - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.permission))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry,navCtrl,localNavCtrl) } ){ NavHost( @@ -74,9 +77,7 @@ fun DpmPermissions(navCtrl:NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "Shizuku"){ShizukuActivate()} @@ -100,7 +101,7 @@ private fun Home(localNavCtrl:NavHostController){ val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { - Spacer(Modifier.padding(vertical = 10.dp)) + Text(text = stringResource(R.string.permission), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) SubPageItem( R.string.device_admin, stringResource(if(myDpm.isAdminActive(myComponent)){R.string.activated}else{R.string.deactivated}), operation = {localNavCtrl.navigate("DeviceAdmin")} diff --git a/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt b/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt index 2e7d165..703de8b 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/SystemManage.kt @@ -19,11 +19,14 @@ import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateContentSize -import androidx.compose.foundation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography @@ -43,16 +46,15 @@ import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.toText import com.binbin.androidowner.ui.* -import com.binbin.androidowner.ui.Animations +import com.binbin.androidowner.ui.theme.bgColor import kotlinx.coroutines.delay import java.util.Date -@OptIn(ExperimentalMaterial3Api::class) @Composable fun SystemManage(navCtrl:NavHostController){ val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "Switches" to R.string.options, "Keyguard" to R.string.keyguard, "BugReport" to R.string.request_bug_report, @@ -66,14 +68,15 @@ fun SystemManage(navCtrl:NavHostController){ "SecurityLogs" to R.string.security_logs, "SystemUpdatePolicy" to R.string.system_update_policy, "WipeData" to R.string.wipe_data - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.device_ctrl))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry,navCtrl,localNavCtrl) } ){ NavHost( @@ -82,9 +85,7 @@ fun SystemManage(navCtrl:NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "Switches"){Switches()} @@ -109,7 +110,7 @@ private fun Home(navCtrl: NavHostController){ val myContext = LocalContext.current val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ - Spacer(Modifier.padding(vertical = 10.dp)) + Text(text = stringResource(R.string.device_ctrl), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){ SubPageItem(R.string.options,""){navCtrl.navigate("Switches")} } diff --git a/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt b/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt index ed4dd16..2640982 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/UserManage.kt @@ -15,13 +15,15 @@ import android.provider.MediaStore import android.widget.Toast import androidx.activity.ComponentActivity import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* -import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.typography import androidx.compose.runtime.* import androidx.compose.ui.Modifier @@ -40,16 +42,16 @@ import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.toText import com.binbin.androidowner.ui.* +import com.binbin.androidowner.ui.theme.bgColor import com.binbin.androidowner.uriToStream import kotlinx.coroutines.delay var affiliationID = mutableSetOf() -@OptIn(ExperimentalMaterial3Api::class) @Composable fun UserManage(navCtrl:NavHostController) { val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "UserInfo" to R.string.user_info, "UserOperation" to R.string.user_operation, "CreateUser" to R.string.create_user, @@ -57,14 +59,15 @@ fun UserManage(navCtrl:NavHostController) { "ChangeUserIcon" to R.string.change_user_icon, "UserSessionMessage" to R.string.user_session_msg, "AffiliationID" to R.string.affiliation_id, - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_manage))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry,navCtrl,localNavCtrl) } ){ NavHost( @@ -73,9 +76,7 @@ fun UserManage(navCtrl:NavHostController) { exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Home"){Home(localNavCtrl)} composable(route = "UserInfo"){CurrentUserInfo()} @@ -94,6 +95,7 @@ private fun Home(navCtrl: NavHostController){ val myContext = LocalContext.current val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ + Text(text = stringResource(R.string.user_manage), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 5.dp, start = 15.dp)) SubPageItem(R.string.user_info,""){navCtrl.navigate("UserInfo")} SubPageItem(R.string.user_operation,""){navCtrl.navigate("UserOperation")} if(VERSION.SDK_INT>=24&&isDeviceOwner(myDpm)){ diff --git a/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt b/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt index c389dec..8d24ab7 100644 --- a/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt +++ b/app/src/main/java/com/binbin/androidowner/dpm/UserRestriction.kt @@ -11,18 +11,17 @@ import androidx.activity.ComponentActivity import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.foundation.background -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* -import androidx.compose.material3.MaterialTheme.colorScheme +import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -34,9 +33,10 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.R import com.binbin.androidowner.ui.Animations -import com.binbin.androidowner.ui.NavIcon import com.binbin.androidowner.ui.SubPageItem import com.binbin.androidowner.ui.SwitchItem +import com.binbin.androidowner.ui.TopBar +import com.binbin.androidowner.ui.theme.bgColor private data class Restriction( val restriction:String, @@ -45,26 +45,26 @@ private data class Restriction( @DrawableRes val ico:Int ) -@OptIn(ExperimentalMaterial3Api::class) @Composable fun UserRestriction(navCtrl: NavHostController){ val localNavCtrl = rememberNavController() val backStackEntry by localNavCtrl.currentBackStackEntryAsState() - val titleMap = mapOf( + /*val titleMap = mapOf( "Internet" to R.string.network_internet, "Connectivity" to R.string.more_connectivity, "Users" to R.string.users, "Media" to R.string.media, "Applications" to R.string.applications, "Other" to R.string.other - ) + )*/ Scaffold( topBar = { - TopAppBar( + /*TopAppBar( title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_restrict))}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) - ) + )*/ + TopBar(backStackEntry,navCtrl,localNavCtrl) } ){ NavHost( @@ -73,9 +73,7 @@ fun UserRestriction(navCtrl: NavHostController){ exitTransition = Animations().navHostExitTransition, popEnterTransition = Animations().navHostPopEnterTransition, popExitTransition = Animations().navHostPopExitTransition, - modifier = Modifier - .background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) }) - .padding(top = it.calculateTopPadding()) + modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding()) ){ composable(route = "Internet"){Internet()} composable(route = "Home"){Home(localNavCtrl)} @@ -93,11 +91,13 @@ private fun Home(navCtrl:NavHostController){ val myContext = LocalContext.current val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) - Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally){ - Spacer(Modifier.padding(vertical = 5.dp)) - Text(text = "打开开关后会禁用对应的功能") - if(isProfileOwner(myDpm)){ Text(text = "Profile owner无法使用部分功能") } - if(isProfileOwner(myDpm)&&(VERSION.SDK_INT<24||(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)))){ Text(text = "工作资料中部分功能无效") } + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ + Text(text = stringResource(R.string.user_restrict), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 7.dp, start = 15.dp)) + Text(text = stringResource(R.string.switch_to_disable_feature), modifier = Modifier.padding(start = 15.dp)) + if(isProfileOwner(myDpm)){ Text(text = stringResource(R.string.profile_owner_is_restricted), modifier = Modifier.padding(start = 15.dp)) } + if(isProfileOwner(myDpm)&&(VERSION.SDK_INT<24||(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)))){ + Text(text = stringResource(R.string.some_features_invalid_in_work_profile), modifier = Modifier.padding(start = 15.dp)) + } Spacer(Modifier.padding(vertical = 2.dp)) SubPageItem(R.string.network_internet,""){navCtrl.navigate("Internet")} SubPageItem(R.string.more_connectivity,""){navCtrl.navigate("Connectivity")} diff --git a/app/src/main/java/com/binbin/androidowner/ui/Components.kt b/app/src/main/java/com/binbin/androidowner/ui/Components.kt index 1804215..b461137 100644 --- a/app/src/main/java/com/binbin/androidowner/ui/Components.kt +++ b/app/src/main/java/com/binbin/androidowner/ui/Components.kt @@ -18,7 +18,10 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavHostController import com.binbin.androidowner.R +import com.binbin.androidowner.ui.theme.bgColor @Composable fun SubPageItem( @@ -136,3 +139,19 @@ fun SwitchItem( ) } } + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TopBar( + backStackEntry:NavBackStackEntry?, + navCtrl:NavHostController, + localNavCtrl:NavHostController, + title:@Composable ()->Unit = {} +){ + TopAppBar( + //Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_restrict)) + title = title, + navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, + colors = TopAppBarDefaults.topAppBarColors(containerColor = bgColor) + ) +} diff --git a/app/src/main/java/com/binbin/androidowner/ui/theme/Theme.kt b/app/src/main/java/com/binbin/androidowner/ui/theme/Theme.kt index a49c8fc..8f601f9 100644 --- a/app/src/main/java/com/binbin/androidowner/ui/theme/Theme.kt +++ b/app/src/main/java/com/binbin/androidowner/ui/theme/Theme.kt @@ -5,13 +5,11 @@ import android.content.Context import android.os.Build import android.os.Build.VERSION import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.lightColorScheme +import androidx.compose.material3.* +import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView @@ -81,11 +79,27 @@ private val LightColorScheme = lightColorScheme( scrim = md_theme_light_scrim ) +var bgColor = Color(0xFF000000) + +@Composable +fun SetDarkTheme(){ + val dark = isSystemInDarkTheme() + val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) + val bg = colorScheme.background + val lightBg = colorScheme.primary.copy(alpha = 0.05F) + bgColor = if(dark){ + if(sharedPref.getBoolean("blackTheme",true)){ Color(0xFF000000) }else{ bg } + }else{ + lightBg + } +} + @Composable fun AndroidOwnerTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { + SetDarkTheme() val context = LocalContext.current val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE) if(!sharedPref.contains("dynamicColor")&&VERSION.SDK_INT>=32){ @@ -104,7 +118,7 @@ fun AndroidOwnerTheme( if (!view.isInEditMode) { SideEffect { val window = (view.context as Activity).window - window.statusBarColor = colorScheme.surfaceVariant.toArgb() + window.statusBarColor = bgColor.toArgb() WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bef1dc2..0d7be3f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -273,6 +273,9 @@ 用户限制 + Profile owner无法使用部分功能 + 打开开关后会禁用对应的功能 + 工作资料中部分功能无效 网络和互联网 更多连接 应用 @@ -453,10 +456,13 @@ 设置 动态取色 - 打开或关闭动态取色需要重启应用 + 安卓12+ 关于 使用安卓的Device admin、Device owner 、Profile owner,全方位掌控你的设备 使用教程 源代码 + 纯黑夜间主题 + 需要打开夜间模式 + 需要重启应用