support black theme

This commit is contained in:
BinTianqi
2024-03-20 21:24:52 +08:00
parent 38679507a4
commit 03005ae5e0
14 changed files with 177 additions and 114 deletions

View File

@@ -11,8 +11,8 @@ android {
applicationId = "com.binbin.androidowner" applicationId = "com.binbin.androidowner"
minSdk = 21 minSdk = 21
targetSdk = 34 targetSdk = 34
versionCode = 19 versionCode = 20
versionName = "4.2" versionName = "4.3"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables { vectorDrawables {

View File

@@ -1,6 +1,5 @@
package com.binbin.androidowner package com.binbin.androidowner
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.ComponentName import android.content.ComponentName
@@ -12,20 +11,23 @@ import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts 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.gestures.detectTapGestures
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.material3.Text 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
@@ -38,8 +40,10 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.dpm.* import com.binbin.androidowner.dpm.*
import com.binbin.androidowner.ui.theme.AndroidOwnerTheme
import com.binbin.androidowner.ui.Animations 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 lateinit var displayMetrics: DisplayMetrics
@ExperimentalMaterial3Api @ExperimentalMaterial3Api
@@ -85,7 +89,7 @@ fun MyScaffold(){
modifier = Modifier modifier = Modifier
.statusBarsPadding() .statusBarsPadding()
.fillMaxSize() .fillMaxSize()
.background(color = if(isSystemInDarkTheme()) { Color(0xFF000000) }else{ colorScheme.primary.copy(alpha = 0.05F) }) .background(bgColor)
.imePadding() .imePadding()
.pointerInput(Unit) {detectTapGestures(onTap = {focusMgr.clearFocus()})}, .pointerInput(Unit) {detectTapGestures(onTap = {focusMgr.clearFocus()})},
enterTransition = Animations().navHostEnterTransition, 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}) 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{""} else if(myDpm.isAdminActive(myComponent)){"Device Admin"}else{""}
SetDarkTheme()
Column(modifier = Modifier.verticalScroll(rememberScrollState())) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 18.dp)) 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) Text(text = stringResource(R.string.app_name), style = typography.headlineLarge, modifier = Modifier.padding(start = 10.dp), color = colorScheme.onBackground)

View File

@@ -3,11 +3,15 @@ package com.binbin.androidowner
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri 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.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.foundation.rememberScrollState
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme.typography 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.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -21,26 +25,25 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.ui.Animations import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.NavIcon import com.binbin.androidowner.ui.theme.SetDarkTheme
import com.binbin.androidowner.ui.SubPageItem import com.binbin.androidowner.ui.theme.bgColor
import com.binbin.androidowner.ui.SwitchItem
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun AppSetting(navCtrl:NavHostController){ fun AppSetting(navCtrl:NavHostController){
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"About" to R.string.about "About" to R.string.about
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.setting))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.setting))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry, navCtrl, localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -49,9 +52,7 @@ fun AppSetting(navCtrl:NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "Settings"){Settings()} composable(route = "Settings"){Settings()}
@@ -71,11 +72,21 @@ private fun Home(navCtrl: NavHostController){
@Composable @Composable
private fun Settings(){ private fun Settings(){
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
SetDarkTheme()
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
SwitchItem( SwitchItem(
R.string.dynamic_color, stringResource(R.string.dynamic_color_desc),null, R.string.dynamic_color, stringResource(R.string.dynamic_color_desc),null,
{sharedPref.getBoolean("dynamicColor",false)},{sharedPref.edit().putBoolean("dynamicColor",it).apply()} {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))
}
}
} }
} }

View File

@@ -29,7 +29,6 @@ import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
@@ -50,6 +49,7 @@ import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.toText import com.binbin.androidowner.toText
import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.theme.bgColor
import com.binbin.androidowner.uriToStream import com.binbin.androidowner.uriToStream
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.io.IOException import java.io.IOException
@@ -61,7 +61,6 @@ private var crossProfilePkg = mutableSetOf<String>()
private var keepUninstallPkg = mutableListOf<String>() private var keepUninstallPkg = mutableListOf<String>()
private var permittedIme = mutableListOf<String>() private var permittedIme = mutableListOf<String>()
private var permittedAccessibility = mutableListOf<String>() private var permittedAccessibility = mutableListOf<String>()
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ApplicationManage(navCtrl:NavHostController){ fun ApplicationManage(navCtrl:NavHostController){
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
@@ -85,11 +84,12 @@ fun ApplicationManage(navCtrl:NavHostController){
) )
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.app_manage))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.app_manage))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry, navCtrl, localNavCtrl){Text(text = stringResource(titleMap[backStackEntry?.destination?.route] ?: R.string.app_manage))}
} }
){ paddingValues-> ){ paddingValues->
Column(modifier = Modifier.fillMaxSize().padding(top = paddingValues.calculateTopPadding())){ Column(modifier = Modifier.fillMaxSize().padding(top = paddingValues.calculateTopPadding())){
@@ -109,7 +109,7 @@ fun ApplicationManage(navCtrl:NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, 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 = "Home"){Home(localNavCtrl,pkgName)}
composable(route = "BlockUninstall"){BlockUninstall(pkgName)} composable(route = "BlockUninstall"){BlockUninstall(pkgName)}

View File

@@ -9,11 +9,14 @@ import android.os.Build.VERSION
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.animation.AnimatedVisibility 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.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
@@ -32,26 +35,27 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.theme.bgColor
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ManagedProfile(navCtrl: NavHostController) { fun ManagedProfile(navCtrl: NavHostController) {
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"OrgOwnedWorkProfile" to R.string.org_owned_work_profile, "OrgOwnedWorkProfile" to R.string.org_owned_work_profile,
"CreateWorkProfile" to R.string.create_work_profile, "CreateWorkProfile" to R.string.create_work_profile,
"SuspendPersonalApp" to R.string.suspend_personal_app, "SuspendPersonalApp" to R.string.suspend_personal_app,
"IntentFilter" to R.string.intent_filter, "IntentFilter" to R.string.intent_filter,
"OrgID" to R.string.org_id "OrgID" to R.string.org_id
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.work_profile))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.work_profile))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry,navCtrl, localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -60,9 +64,7 @@ fun ManagedProfile(navCtrl: NavHostController) {
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "OrgOwnedWorkProfile"){OrgOwnedProfile()} composable(route = "OrgOwnedWorkProfile"){OrgOwnedProfile()}
@@ -80,7 +82,7 @@ private fun Home(navCtrl: NavHostController){
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ 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)){ if(VERSION.SDK_INT>=30&&isProfileOwner(myDpm)&&myDpm.isManagedProfile(myComponent)){
SubPageItem(R.string.org_owned_work_profile,""){navCtrl.navigate("OrgOwnedWorkProfile")} SubPageItem(R.string.org_owned_work_profile,""){navCtrl.navigate("OrgOwnedWorkProfile")}
} }

View File

@@ -43,14 +43,14 @@ import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.toText import com.binbin.androidowner.toText
import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.theme.bgColor
var ssidSet = mutableSetOf<WifiSsid>() var ssidSet = mutableSetOf<WifiSsid>()
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Network(navCtrl: NavHostController){ fun Network(navCtrl: NavHostController){
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"Home" to R.string.network, "Home" to R.string.network,
"MinWifiSecurityLevel" to R.string.min_wifi_security_level, "MinWifiSecurityLevel" to R.string.min_wifi_security_level,
"WifiSsidPolicy" to R.string.wifi_ssid_policy, "WifiSsidPolicy" to R.string.wifi_ssid_policy,
@@ -58,14 +58,15 @@ fun Network(navCtrl: NavHostController){
"NetLog" to R.string.retrieve_net_logs, "NetLog" to R.string.retrieve_net_logs,
"WifiKeypair" to R.string.wifi_keypair, "WifiKeypair" to R.string.wifi_keypair,
"APN" to R.string.apn_settings "APN" to R.string.apn_settings
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.network))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.network))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry, navCtrl, localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -74,9 +75,7 @@ fun Network(navCtrl: NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "Switches"){Switches()} composable(route = "Switches"){Switches()}
@@ -96,7 +95,7 @@ private fun Home(navCtrl:NavHostController){
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ 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){ if(VERSION.SDK_INT>=24){
val wifimac = try { myDpm.getWifiMacAddress(myComponent).toString() }catch(e:SecurityException){ "没有权限" } val wifimac = try { myDpm.getWifiMacAddress(myComponent).toString() }catch(e:SecurityException){ "没有权限" }
Text(text = "WiFi MAC: $wifimac", modifier = Modifier.padding(start = 15.dp)) Text(text = "WiFi MAC: $wifimac", modifier = Modifier.padding(start = 15.dp))

View File

@@ -11,10 +11,13 @@ import android.os.Build.VERSION
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.animation.AnimatedVisibility 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.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
@@ -34,13 +37,13 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.theme.bgColor
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Password(navCtrl: NavHostController){ fun Password(navCtrl: NavHostController){
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"ResetPasswordToken" to R.string.reset_password_token, "ResetPasswordToken" to R.string.reset_password_token,
"PasswordInfo" to R.string.password_info, "PasswordInfo" to R.string.password_info,
"ResetPassword" to R.string.reset_password, "ResetPassword" to R.string.reset_password,
@@ -51,14 +54,15 @@ fun Password(navCtrl: NavHostController){
"MaxPasswordFail" to R.string.max_pwd_fail, "MaxPasswordFail" to R.string.max_pwd_fail,
"PasswordHistoryLength" to R.string.pwd_history, "PasswordHistoryLength" to R.string.pwd_history,
"RequirePasswordQuality" to R.string.required_password_quality, "RequirePasswordQuality" to R.string.required_password_quality,
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.password_and_keyguard))}, 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()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry, navCtrl, localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -67,9 +71,7 @@ fun Password(navCtrl: NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "PasswordInfo"){PasswordInfo()} composable(route = "PasswordInfo"){PasswordInfo()}
@@ -89,6 +91,7 @@ fun Password(navCtrl: NavHostController){
@Composable @Composable
private fun Home(navCtrl:NavHostController){ private fun Home(navCtrl:NavHostController){
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ 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")} SubPageItem(R.string.password_info,""){navCtrl.navigate("PasswordInfo")}
if(VERSION.SDK_INT>=26){ if(VERSION.SDK_INT>=26){
SubPageItem(R.string.reset_password_token,""){navCtrl.navigate("ResetPasswordToken")} SubPageItem(R.string.reset_password_token,""){navCtrl.navigate("ResetPasswordToken")}

View File

@@ -14,9 +14,11 @@ import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.* import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography 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.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
@@ -35,17 +37,17 @@ import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.ui.Animations import com.binbin.androidowner.ui.Animations
import com.binbin.androidowner.ui.Information import com.binbin.androidowner.ui.Information
import com.binbin.androidowner.ui.NavIcon
import com.binbin.androidowner.ui.SubPageItem 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.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun DpmPermissions(navCtrl:NavHostController){ fun DpmPermissions(navCtrl:NavHostController){
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"Home" to R.string.permission, "Home" to R.string.permission,
"Shizuku" to R.string.shizuku, "Shizuku" to R.string.shizuku,
"DeviceAdmin" to R.string.device_admin, "DeviceAdmin" to R.string.device_admin,
@@ -58,14 +60,15 @@ fun DpmPermissions(navCtrl:NavHostController){
"LockScreenInfo" to R.string.owner_lockscr_info, "LockScreenInfo" to R.string.owner_lockscr_info,
"SupportMsg" to R.string.support_msg, "SupportMsg" to R.string.support_msg,
"TransformOwnership" to R.string.transform_ownership "TransformOwnership" to R.string.transform_ownership
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.permission))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.permission))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry,navCtrl,localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -74,9 +77,7 @@ fun DpmPermissions(navCtrl:NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "Shizuku"){ShizukuActivate()} composable(route = "Shizuku"){ShizukuActivate()}
@@ -100,7 +101,7 @@ private fun Home(localNavCtrl:NavHostController){
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { 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( SubPageItem(
R.string.device_admin, stringResource(if(myDpm.isAdminActive(myComponent)){R.string.activated}else{R.string.deactivated}), R.string.device_admin, stringResource(if(myDpm.isAdminActive(myComponent)){R.string.activated}else{R.string.deactivated}),
operation = {localNavCtrl.navigate("DeviceAdmin")} operation = {localNavCtrl.navigate("DeviceAdmin")}

View File

@@ -19,11 +19,14 @@ import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateContentSize 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.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
@@ -43,16 +46,15 @@ import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.toText import com.binbin.androidowner.toText
import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.Animations import com.binbin.androidowner.ui.theme.bgColor
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.util.Date import java.util.Date
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SystemManage(navCtrl:NavHostController){ fun SystemManage(navCtrl:NavHostController){
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"Switches" to R.string.options, "Switches" to R.string.options,
"Keyguard" to R.string.keyguard, "Keyguard" to R.string.keyguard,
"BugReport" to R.string.request_bug_report, "BugReport" to R.string.request_bug_report,
@@ -66,14 +68,15 @@ fun SystemManage(navCtrl:NavHostController){
"SecurityLogs" to R.string.security_logs, "SecurityLogs" to R.string.security_logs,
"SystemUpdatePolicy" to R.string.system_update_policy, "SystemUpdatePolicy" to R.string.system_update_policy,
"WipeData" to R.string.wipe_data "WipeData" to R.string.wipe_data
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.device_ctrl))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.device_ctrl))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry,navCtrl,localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -82,9 +85,7 @@ fun SystemManage(navCtrl:NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "Switches"){Switches()} composable(route = "Switches"){Switches()}
@@ -109,7 +110,7 @@ private fun Home(navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ 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)){ if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){
SubPageItem(R.string.options,""){navCtrl.navigate("Switches")} SubPageItem(R.string.options,""){navCtrl.navigate("Switches")}
} }

View File

@@ -15,13 +15,15 @@ import android.provider.MediaStore
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.animation.AnimatedVisibility 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.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -40,16 +42,16 @@ import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.toText import com.binbin.androidowner.toText
import com.binbin.androidowner.ui.* import com.binbin.androidowner.ui.*
import com.binbin.androidowner.ui.theme.bgColor
import com.binbin.androidowner.uriToStream import com.binbin.androidowner.uriToStream
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
var affiliationID = mutableSetOf<String>() var affiliationID = mutableSetOf<String>()
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun UserManage(navCtrl:NavHostController) { fun UserManage(navCtrl:NavHostController) {
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"UserInfo" to R.string.user_info, "UserInfo" to R.string.user_info,
"UserOperation" to R.string.user_operation, "UserOperation" to R.string.user_operation,
"CreateUser" to R.string.create_user, "CreateUser" to R.string.create_user,
@@ -57,14 +59,15 @@ fun UserManage(navCtrl:NavHostController) {
"ChangeUserIcon" to R.string.change_user_icon, "ChangeUserIcon" to R.string.change_user_icon,
"UserSessionMessage" to R.string.user_session_msg, "UserSessionMessage" to R.string.user_session_msg,
"AffiliationID" to R.string.affiliation_id, "AffiliationID" to R.string.affiliation_id,
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_manage))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_manage))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry,navCtrl,localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -73,9 +76,7 @@ fun UserManage(navCtrl:NavHostController) {
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
composable(route = "UserInfo"){CurrentUserInfo()} composable(route = "UserInfo"){CurrentUserInfo()}
@@ -94,6 +95,7 @@ private fun Home(navCtrl: NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ 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_info,""){navCtrl.navigate("UserInfo")}
SubPageItem(R.string.user_operation,""){navCtrl.navigate("UserOperation")} SubPageItem(R.string.user_operation,""){navCtrl.navigate("UserOperation")}
if(VERSION.SDK_INT>=24&&isDeviceOwner(myDpm)){ if(VERSION.SDK_INT>=24&&isDeviceOwner(myDpm)){

View File

@@ -11,18 +11,17 @@ import androidx.activity.ComponentActivity
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.* import androidx.compose.material3.MaterialTheme.typography
import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -34,9 +33,10 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.ui.Animations import com.binbin.androidowner.ui.Animations
import com.binbin.androidowner.ui.NavIcon
import com.binbin.androidowner.ui.SubPageItem import com.binbin.androidowner.ui.SubPageItem
import com.binbin.androidowner.ui.SwitchItem import com.binbin.androidowner.ui.SwitchItem
import com.binbin.androidowner.ui.TopBar
import com.binbin.androidowner.ui.theme.bgColor
private data class Restriction( private data class Restriction(
val restriction:String, val restriction:String,
@@ -45,26 +45,26 @@ private data class Restriction(
@DrawableRes val ico:Int @DrawableRes val ico:Int
) )
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun UserRestriction(navCtrl: NavHostController){ fun UserRestriction(navCtrl: NavHostController){
val localNavCtrl = rememberNavController() val localNavCtrl = rememberNavController()
val backStackEntry by localNavCtrl.currentBackStackEntryAsState() val backStackEntry by localNavCtrl.currentBackStackEntryAsState()
val titleMap = mapOf( /*val titleMap = mapOf(
"Internet" to R.string.network_internet, "Internet" to R.string.network_internet,
"Connectivity" to R.string.more_connectivity, "Connectivity" to R.string.more_connectivity,
"Users" to R.string.users, "Users" to R.string.users,
"Media" to R.string.media, "Media" to R.string.media,
"Applications" to R.string.applications, "Applications" to R.string.applications,
"Other" to R.string.other "Other" to R.string.other
) )*/
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( /*TopAppBar(
title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_restrict))}, title = {Text(text = stringResource(titleMap[backStackEntry?.destination?.route]?:R.string.user_restrict))},
navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}}, navigationIcon = {NavIcon{if(backStackEntry?.destination?.route=="Home"){navCtrl.navigateUp()}else{localNavCtrl.navigateUp()}}},
colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant) colors = TopAppBarDefaults.topAppBarColors(containerColor = colorScheme.surfaceVariant)
) )*/
TopBar(backStackEntry,navCtrl,localNavCtrl)
} }
){ ){
NavHost( NavHost(
@@ -73,9 +73,7 @@ fun UserRestriction(navCtrl: NavHostController){
exitTransition = Animations().navHostExitTransition, exitTransition = Animations().navHostExitTransition,
popEnterTransition = Animations().navHostPopEnterTransition, popEnterTransition = Animations().navHostPopEnterTransition,
popExitTransition = Animations().navHostPopExitTransition, popExitTransition = Animations().navHostPopExitTransition,
modifier = Modifier modifier = Modifier.background(bgColor).padding(top = it.calculateTopPadding())
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
.padding(top = it.calculateTopPadding())
){ ){
composable(route = "Internet"){Internet()} composable(route = "Internet"){Internet()}
composable(route = "Home"){Home(localNavCtrl)} composable(route = "Home"){Home(localNavCtrl)}
@@ -93,11 +91,13 @@ private fun Home(navCtrl:NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally){ Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){
Spacer(Modifier.padding(vertical = 5.dp)) Text(text = stringResource(R.string.user_restrict), style = typography.headlineLarge, modifier = Modifier.padding(top = 8.dp, bottom = 7.dp, start = 15.dp))
Text(text = "打开开关后会禁用对应的功能") Text(text = stringResource(R.string.switch_to_disable_feature), modifier = Modifier.padding(start = 15.dp))
if(isProfileOwner(myDpm)){ Text(text = "Profile owner无法使用部分功能") } 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 = "工作资料中部分功能无效") } 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)) Spacer(Modifier.padding(vertical = 2.dp))
SubPageItem(R.string.network_internet,""){navCtrl.navigate("Internet")} SubPageItem(R.string.network_internet,""){navCtrl.navigate("Internet")}
SubPageItem(R.string.more_connectivity,""){navCtrl.navigate("Connectivity")} SubPageItem(R.string.more_connectivity,""){navCtrl.navigate("Connectivity")}

View File

@@ -18,7 +18,10 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController
import com.binbin.androidowner.R import com.binbin.androidowner.R
import com.binbin.androidowner.ui.theme.bgColor
@Composable @Composable
fun SubPageItem( 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)
)
}

View File

@@ -5,13 +5,11 @@ import android.content.Context
import android.os.Build import android.os.Build
import android.os.Build.VERSION import android.os.Build.VERSION
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.*
import androidx.compose.material3.darkColorScheme import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
@@ -81,11 +79,27 @@ private val LightColorScheme = lightColorScheme(
scrim = md_theme_light_scrim 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 @Composable
fun AndroidOwnerTheme( fun AndroidOwnerTheme(
darkTheme: Boolean = isSystemInDarkTheme(), darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
SetDarkTheme()
val context = LocalContext.current val context = LocalContext.current
val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = context.getSharedPreferences("data", Context.MODE_PRIVATE)
if(!sharedPref.contains("dynamicColor")&&VERSION.SDK_INT>=32){ if(!sharedPref.contains("dynamicColor")&&VERSION.SDK_INT>=32){
@@ -104,7 +118,7 @@ fun AndroidOwnerTheme(
if (!view.isInEditMode) { if (!view.isInEditMode) {
SideEffect { SideEffect {
val window = (view.context as Activity).window val window = (view.context as Activity).window
window.statusBarColor = colorScheme.surfaceVariant.toArgb() window.statusBarColor = bgColor.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
} }
} }

View File

@@ -273,6 +273,9 @@
<!--UserRestriction--> <!--UserRestriction-->
<string name="user_restrict">用户限制</string> <string name="user_restrict">用户限制</string>
<string name="profile_owner_is_restricted">Profile owner无法使用部分功能</string>
<string name="switch_to_disable_feature">打开开关后会禁用对应的功能</string>
<string name="some_features_invalid_in_work_profile">工作资料中部分功能无效</string>
<string name="network_internet">网络和互联网</string> <string name="network_internet">网络和互联网</string>
<string name="more_connectivity">更多连接</string> <string name="more_connectivity">更多连接</string>
<string name="applications">应用</string> <string name="applications">应用</string>
@@ -453,10 +456,13 @@
<!--Settings&About--> <!--Settings&About-->
<string name="setting">设置</string> <string name="setting">设置</string>
<string name="dynamic_color">动态取色</string> <string name="dynamic_color">动态取色</string>
<string name="dynamic_color_desc">打开或关闭动态取色需要重启应用</string> <string name="dynamic_color_desc">安卓12+</string>
<string name="about">关于</string> <string name="about">关于</string>
<string name="about_desc">使用安卓的Device admin、Device owner 、Profile owner全方位掌控你的设备</string> <string name="about_desc">使用安卓的Device admin、Device owner 、Profile owner全方位掌控你的设备</string>
<string name="user_guide">使用教程</string> <string name="user_guide">使用教程</string>
<string name="source_code">源代码</string> <string name="source_code">源代码</string>
<string name="blackTheme">纯黑夜间主题</string>
<string name="blackTheme_desc">需要打开夜间模式</string>
<string name="need_relaunch">需要重启应用</string>
</resources> </resources>