mirror of
https://github.com/awfixers-stuff/OwnDroid.git
synced 2026-03-23 19:15:58 +00:00
redesign homepage
This commit is contained in:
4
Guide.md
4
Guide.md
@@ -1087,7 +1087,9 @@ API31及以上弃用,请使用[密码复杂度要求](#密码复杂度要求)
|
|||||||
|
|
||||||
## 其他功能
|
## 其他功能
|
||||||
|
|
||||||
### 手表模式
|
### ~~手表模式~~
|
||||||
|
|
||||||
|
正在修改,预计在5.0版本重新加入。
|
||||||
|
|
||||||
在Android owner的设置中打开
|
在Android owner的设置中打开
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
使用安卓的Device Admin和Device Owner特权,完全掌控你的设备。
|
使用安卓的Device Admin和Device Owner特权,完全掌控你的设备。
|
||||||
|
|
||||||
|
**从v4.2开始,重写代码,重新设计,界面会发生很大改变。**
|
||||||
|
|
||||||
### 优点
|
### 优点
|
||||||
|
|
||||||
- 开源。Device owner权限可能比root权限更危险,闭源软件的安全性没有保证
|
- 开源。Device owner权限可能比root权限更危险,闭源软件的安全性没有保证
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ import androidx.compose.foundation.layout.*
|
|||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||||
import androidx.compose.material.icons.outlined.Home
|
|
||||||
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.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
@@ -121,12 +121,9 @@ fun MyScaffold(){
|
|||||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
if(!sharedPref.getBoolean("isWear",false)){
|
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
title = {Text(text = stringResource(topBarName) , color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.padding(bottom = 2.dp))},
|
title = {Text(text = stringResource(topBarName) , color = colorScheme.onSurface, modifier = Modifier.padding(bottom = 2.dp))},
|
||||||
colors = TopAppBarDefaults.topAppBarColors(
|
colors = TopAppBarDefaults.topAppBarColors( containerColor = colorScheme.surfaceVariant ),
|
||||||
containerColor = MaterialTheme.colorScheme.surface
|
|
||||||
),
|
|
||||||
navigationIcon = {
|
navigationIcon = {
|
||||||
AnimatedVisibility(
|
AnimatedVisibility(
|
||||||
visible = topBarName!=R.string.app_name,
|
visible = topBarName!=R.string.app_name,
|
||||||
@@ -146,22 +143,6 @@ fun MyScaffold(){
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
|
||||||
floatingActionButton = {
|
|
||||||
if(sharedPref.getBoolean("isWear",false)&&topBarName!=R.string.app_name){
|
|
||||||
FloatingActionButton(
|
|
||||||
onClick = {
|
|
||||||
focusMgr.clearFocus()
|
|
||||||
navCtrl.navigateUp()
|
|
||||||
},
|
|
||||||
modifier = Modifier.size(35.dp),
|
|
||||||
containerColor = MaterialTheme.colorScheme.tertiaryContainer,
|
|
||||||
contentColor = MaterialTheme.colorScheme.tertiary
|
|
||||||
) {
|
|
||||||
Icon(imageVector = Icons.Outlined.Home, contentDescription = null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
) {
|
) {
|
||||||
val profileInited = sharedPref.getBoolean("ManagedProfileActivated",false)
|
val profileInited = sharedPref.getBoolean("ManagedProfileActivated",false)
|
||||||
var inited by remember{mutableStateOf(false)}
|
var inited by remember{mutableStateOf(false)}
|
||||||
@@ -169,7 +150,10 @@ fun MyScaffold(){
|
|||||||
NavHost(
|
NavHost(
|
||||||
navController = navCtrl,
|
navController = navCtrl,
|
||||||
startDestination = "HomePage",
|
startDestination = "HomePage",
|
||||||
modifier = Modifier.fillMaxSize().padding(top = it.calculateTopPadding()).imePadding(),
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.background(color = if(isSystemInDarkTheme()) { colorScheme.background }else{ colorScheme.primary.copy(alpha = 0.05F) })
|
||||||
|
.padding(top = it.calculateTopPadding()).imePadding(),
|
||||||
enterTransition = Animations(myContext).navHostEnterTransition,
|
enterTransition = Animations(myContext).navHostEnterTransition,
|
||||||
exitTransition = Animations(myContext).navHostExitTransition,
|
exitTransition = Animations(myContext).navHostExitTransition,
|
||||||
popEnterTransition = Animations(myContext).navHostPopEnterTransition,
|
popEnterTransition = Animations(myContext).navHostPopEnterTransition,
|
||||||
@@ -199,40 +183,35 @@ fun HomePage(navCtrl:NavHostController){
|
|||||||
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java)
|
||||||
val activateType =
|
val activateType =
|
||||||
if(isDeviceOwner(myDpm)){"Device Owner"}
|
if(isDeviceOwner(myDpm)){"Device Owner"}
|
||||||
else if(isProfileOwner(myDpm)){if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){"工作资料"}else{"Profile Owner"}}
|
else if(isProfileOwner(myDpm)){if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){stringResource(R.string.work_profile)}else{"Profile Owner"}}
|
||||||
else if(myDpm.isAdminActive(myComponent)){"Device Admin"}
|
else if(myDpm.isAdminActive(myComponent)){"Device Admin"} else{""}
|
||||||
else{""}
|
|
||||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
|
||||||
val isWear = sharedPref.getBoolean("isWear",false)
|
|
||||||
caCert = byteArrayOf()
|
caCert = byteArrayOf()
|
||||||
Column(modifier = Modifier.verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally) {
|
Column(modifier = Modifier.verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
if(isWear){ Spacer(Modifier.padding(vertical = 3.dp)) }
|
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(vertical = if (!isWear) { 5.dp } else { 2.dp }, horizontal = if (!isWear) { 8.dp } else { 4.dp })
|
.padding(vertical = 8.dp, horizontal = 8.dp)
|
||||||
.clip(RoundedCornerShape(15))
|
.clip(RoundedCornerShape(15))
|
||||||
.background(color = MaterialTheme.colorScheme.tertiaryContainer.copy(alpha = 0.7F))
|
.background(color = colorScheme.primaryContainer)
|
||||||
.clickable(onClick = { navCtrl.navigate("Permissions") })
|
.clickable(onClick = { navCtrl.navigate("Permissions") })
|
||||||
.padding(
|
.padding(vertical = 16.dp),
|
||||||
horizontal = 5.dp,
|
|
||||||
vertical = if (!isWear) { 14.dp } else { 2.dp }
|
|
||||||
),
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
|
Spacer(modifier = Modifier.fillMaxWidth(0.06F))
|
||||||
Icon(
|
Icon(
|
||||||
painter = painterResource(if(myDpm.isAdminActive(myComponent)){ R.drawable.check_fill0 }else{ R.drawable.block_fill0 }),
|
painter = painterResource(if(myDpm.isAdminActive(myComponent)){ R.drawable.check_circle_fill1 }else{ R.drawable.block_fill0 }),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
modifier = Modifier.padding(horizontal = if(!isWear){10.dp}else{6.dp}),
|
tint = colorScheme.primary
|
||||||
tint = MaterialTheme.colorScheme.tertiary
|
|
||||||
)
|
)
|
||||||
|
Spacer(modifier = Modifier.fillMaxWidth(0.05F))
|
||||||
Column {
|
Column {
|
||||||
Text(
|
Text(
|
||||||
text = if(isDeviceOwner(myDpm)||myDpm.isAdminActive(myComponent)||isProfileOwner(myDpm)){"已激活"}else{"未激活"},
|
text = if(myDpm.isAdminActive(myComponent)){"已激活"}else{"未激活"},
|
||||||
style = typography.headlineSmall,
|
style = typography.headlineSmall,
|
||||||
color = MaterialTheme.colorScheme.onTertiaryContainer
|
color = colorScheme.onPrimaryContainer,
|
||||||
|
modifier = Modifier.padding(bottom = 2.dp)
|
||||||
)
|
)
|
||||||
if(activateType!=""){ Text(activateType) }
|
if(activateType!=""){ Text(text = activateType, color = colorScheme.onPrimaryContainer, modifier = Modifier.padding(start = 2.dp)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HomePageItem(R.string.device_ctrl, R.drawable.mobile_phone_fill0, "DeviceControl", navCtrl)
|
HomePageItem(R.string.device_ctrl, R.drawable.mobile_phone_fill0, "DeviceControl", navCtrl)
|
||||||
@@ -249,32 +228,28 @@ fun HomePage(navCtrl:NavHostController){
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HomePageItem(name:Int, imgVector:Int, navTo:String, myNav:NavHostController){
|
fun HomePageItem(name:Int, imgVector:Int, navTo:String, myNav:NavHostController){
|
||||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
|
||||||
val isWear = sharedPref.getBoolean("isWear", false)
|
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(vertical = if (!isWear) { 4.dp } else { 2.dp }, horizontal = if (!isWear) { 7.dp } else { 4.dp })
|
.clip(RoundedCornerShape(25))
|
||||||
.clip(RoundedCornerShape(15))
|
|
||||||
.background(color = MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.7F))
|
|
||||||
.clickable(onClick = { myNav.navigate(navTo) })
|
.clickable(onClick = { myNav.navigate(navTo) })
|
||||||
.padding(vertical = if(isWear){6.dp}else{10.dp}, horizontal = 6.dp),
|
.padding(vertical = 13.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
|
||||||
) {
|
) {
|
||||||
|
Spacer(modifier = Modifier.fillMaxWidth(0.08F))
|
||||||
Icon(
|
Icon(
|
||||||
painter = painterResource(imgVector),
|
painter = painterResource(imgVector),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
modifier = Modifier.padding(horizontal = if(!sharedPref.getBoolean("isWear",false)){12.dp}else{6.dp}),
|
tint = colorScheme.onBackground
|
||||||
tint = MaterialTheme.colorScheme.primary
|
|
||||||
)
|
)
|
||||||
|
Spacer(modifier = Modifier.fillMaxWidth(0.05F))
|
||||||
Column {
|
Column {
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(name),
|
text = stringResource(name),
|
||||||
style = typography.headlineSmall,
|
style = typography.headlineSmall,
|
||||||
color = MaterialTheme.colorScheme.onPrimaryContainer
|
color = colorScheme.onBackground,
|
||||||
|
modifier = Modifier.padding(bottom = 2.dp)
|
||||||
)
|
)
|
||||||
Spacer(Modifier.padding(top = 2.dp))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,7 +259,7 @@ fun RadioButtonItem(
|
|||||||
text:String,
|
text:String,
|
||||||
selected:()->Boolean,
|
selected:()->Boolean,
|
||||||
operation:()->Unit,
|
operation:()->Unit,
|
||||||
textColor:Color = MaterialTheme.colorScheme.onBackground
|
textColor:Color = colorScheme.onBackground
|
||||||
){
|
){
|
||||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
val isWear = sharedPref.getBoolean("isWear",false)
|
val isWear = sharedPref.getBoolean("isWear",false)
|
||||||
@@ -304,7 +279,7 @@ fun CheckBoxItem(
|
|||||||
text:String,
|
text:String,
|
||||||
checked:()->Boolean,
|
checked:()->Boolean,
|
||||||
operation:()->Unit,
|
operation:()->Unit,
|
||||||
textColor:Color = MaterialTheme.colorScheme.onBackground
|
textColor:Color = colorScheme.onBackground
|
||||||
){
|
){
|
||||||
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
|
||||||
val isWear = sharedPref.getBoolean("isWear",false)
|
val isWear = sharedPref.getBoolean("isWear",false)
|
||||||
@@ -334,7 +309,7 @@ fun isProfileOwner(dpm:DevicePolicyManager): Boolean {
|
|||||||
@SuppressLint("ModifierFactoryExtensionFunction", "ComposableModifierFactory")
|
@SuppressLint("ModifierFactoryExtensionFunction", "ComposableModifierFactory")
|
||||||
@Composable
|
@Composable
|
||||||
@Stable
|
@Stable
|
||||||
fun sections(bgColor:Color=MaterialTheme.colorScheme.primaryContainer,onClick:()->Unit={},clickable:Boolean=false):Modifier{
|
fun sections(bgColor:Color=colorScheme.primaryContainer,onClick:()->Unit={},clickable:Boolean=false):Modifier{
|
||||||
val backgroundColor = if(isSystemInDarkTheme()){bgColor.copy(0.3F)}else{bgColor.copy(0.8F)}
|
val backgroundColor = if(isSystemInDarkTheme()){bgColor.copy(0.3F)}else{bgColor.copy(0.8F)}
|
||||||
return if(!LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE).getBoolean("isWear",false)){
|
return if(!LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE).getBoolean("isWear",false)){
|
||||||
Modifier
|
Modifier
|
||||||
|
|||||||
@@ -104,7 +104,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.surface.toArgb()
|
window.statusBarColor = colorScheme.surfaceVariant.toArgb()
|
||||||
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
|
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
9
app/src/main/res/drawable/check_circle_fill1.xml
Normal file
9
app/src/main/res/drawable/check_circle_fill1.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="m424,664 l282,-282 -56,-56 -226,226 -114,-114 -56,56 170,170ZM480,880q-83,0 -156,-31.5T197,763q-54,-54 -85.5,-127T80,480q0,-83 31.5,-156T197,197q54,-54 127,-85.5T480,80q83,0 156,31.5T763,197q54,54 85.5,127T880,480q0,83 -31.5,156T763,763q-54,54 -127,85.5T480,880Z"/>
|
||||||
|
</vector>
|
||||||
Reference in New Issue
Block a user