diff --git a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt index 1d6643f..2162102 100644 --- a/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt +++ b/app/src/main/java/com/binbin/androidowner/ApplicationManage.kt @@ -77,7 +77,7 @@ fun ApplicationManage(){ keyboardActions = KeyboardActions(onDone = {focusMgr.clearFocus()}) ) } - Column(modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) { + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { if(isWear){ TextField( value = pkgName, diff --git a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt index 2f4ec8d..ba60421 100644 --- a/app/src/main/java/com/binbin/androidowner/DeviceControl.kt +++ b/app/src/main/java/com/binbin/androidowner/DeviceControl.kt @@ -48,7 +48,7 @@ fun SystemManage(){ val userManager = myContext.getSystemService(Context.USER_SERVICE) as UserManager val bodyTextStyle = if(isWear){typography.bodyMedium}else{typography.bodyLarge} val focusMgr = LocalFocusManager.current - Column(modifier = Modifier.verticalScroll(rememberScrollState()).navigationBarsPadding()) { + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { if(isDeviceOwner(myDpm)||isProfileOwner(myDpm)){ DeviceCtrlItem(R.string.disable_cam,R.string.place_holder, R.drawable.photo_camera_fill0, {myDpm.getCameraDisabled(null)},{b -> myDpm.setCameraDisabled(myComponent,b)} diff --git a/app/src/main/java/com/binbin/androidowner/MainActivity.kt b/app/src/main/java/com/binbin/androidowner/MainActivity.kt index 5ca7153..b85e856 100644 --- a/app/src/main/java/com/binbin/androidowner/MainActivity.kt +++ b/app/src/main/java/com/binbin/androidowner/MainActivity.kt @@ -15,11 +15,13 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateContentSize import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.outlined.Home import androidx.compose.material3.* import androidx.compose.material3.MaterialTheme.typography @@ -40,6 +42,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.binbin.androidowner.ui.theme.AndroidOwnerTheme +import com.binbin.androidowner.ui.theme.Animations import java.io.FileNotFoundException import java.io.IOException import java.io.InputStream @@ -121,14 +124,18 @@ fun MyScaffold(){ topBar = { if(!sharedPref.getBoolean("isWear",false)){ TopAppBar( - title = { Text(text = stringResource(topBarName) , color = MaterialTheme.colorScheme.onSurface) }, + title = {Text(text = stringResource(topBarName) , color = MaterialTheme.colorScheme.onSurface, modifier = Modifier.padding(bottom = 2.dp))}, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.surface ), navigationIcon = { - if(topBarName!=R.string.app_name){ + AnimatedVisibility( + visible = topBarName!=R.string.app_name, + enter = Animations(myContext).navIconEnterTransition, + exit = Animations(myContext).navIconExitTransition + ){ Icon( - imageVector = Icons.Outlined.ArrowBack, + imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = "Back", modifier = Modifier .padding(horizontal = 6.dp) @@ -163,7 +170,11 @@ fun MyScaffold(){ NavHost( navController = navCtrl, startDestination = "HomePage", - modifier = Modifier.padding(top = it.calculateTopPadding()).imePadding() + modifier = Modifier.fillMaxSize().padding(top = it.calculateTopPadding()).imePadding(), + enterTransition = Animations(myContext).navHostEnterTransition, + exitTransition = Animations(myContext).navHostExitTransition, + popEnterTransition = Animations(myContext).navHostPopEnterTransition, + popExitTransition = Animations(myContext).navHostPopExitTransition ){ composable(route = "HomePage", content = { HomePage(navCtrl)}) composable(route = "DeviceControl", content = { SystemManage()}) diff --git a/app/src/main/java/com/binbin/androidowner/ManagedProfile.kt b/app/src/main/java/com/binbin/androidowner/ManagedProfile.kt index d031697..afb0434 100644 --- a/app/src/main/java/com/binbin/androidowner/ManagedProfile.kt +++ b/app/src/main/java/com/binbin/androidowner/ManagedProfile.kt @@ -43,7 +43,7 @@ fun ManagedProfile() { val isWear = sharedPref.getBoolean("isWear",false) val bodyTextStyle = if(isWear){ typography.bodyMedium}else{ typography.bodyLarge} val titleColor = colorScheme.onPrimaryContainer - Column(modifier = Modifier.verticalScroll(rememberScrollState())){ + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ Column(modifier = sections()){ Text(text = stringResource(R.string.info), style = typography.titleLarge, color = titleColor) diff --git a/app/src/main/java/com/binbin/androidowner/Network.kt b/app/src/main/java/com/binbin/androidowner/Network.kt index 654fbaf..e30acea 100644 --- a/app/src/main/java/com/binbin/androidowner/Network.kt +++ b/app/src/main/java/com/binbin/androidowner/Network.kt @@ -46,7 +46,7 @@ import androidx.core.net.toUri var ssidSet = mutableSetOf() @Composable fun Network(){ - Column(modifier = Modifier.verticalScroll(rememberScrollState()).fillMaxWidth()){ + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())){ val myContext = LocalContext.current val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) diff --git a/app/src/main/java/com/binbin/androidowner/Password.kt b/app/src/main/java/com/binbin/androidowner/Password.kt index fc92d6b..226133d 100644 --- a/app/src/main/java/com/binbin/androidowner/Password.kt +++ b/app/src/main/java/com/binbin/androidowner/Password.kt @@ -48,7 +48,7 @@ fun Password(){ val scrollState = rememberScrollState() Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.fillMaxWidth().verticalScroll(scrollState) + modifier = Modifier.fillMaxSize().verticalScroll(scrollState) ) { val myByteArray by remember{ mutableStateOf(byteArrayOf(1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0,1,1,4,5,1,4,1,9,1,9,8,1,0)) } Text( diff --git a/app/src/main/java/com/binbin/androidowner/Permissions.kt b/app/src/main/java/com/binbin/androidowner/Permissions.kt index 48f9017..be395e2 100644 --- a/app/src/main/java/com/binbin/androidowner/Permissions.kt +++ b/app/src/main/java/com/binbin/androidowner/Permissions.kt @@ -50,7 +50,7 @@ fun DpmPermissions(navCtrl:NavHostController){ val bodyTextStyle = if(isWear){typography.bodyMedium}else{typography.bodyLarge} var expandCommandBlock by remember{mutableStateOf("")} Column( - modifier = Modifier.verticalScroll(rememberScrollState()), + modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally ) { Row( diff --git a/app/src/main/java/com/binbin/androidowner/Setting.kt b/app/src/main/java/com/binbin/androidowner/Setting.kt index 124755e..17976d4 100644 --- a/app/src/main/java/com/binbin/androidowner/Setting.kt +++ b/app/src/main/java/com/binbin/androidowner/Setting.kt @@ -34,7 +34,7 @@ fun AppSetting(navCtrl:NavHostController){ val verCode = pkgInfo.versionCode val verName = pkgInfo.versionName Column(modifier = sections()) { - Row(modifier = Modifier.fillMaxWidth().padding(horizontal = 3.dp),horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { + Row(modifier = Modifier.fillMaxSize().padding(horizontal = 3.dp),horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { Text(text = "Wear", style = typography.titleLarge, color = titleColor) Switch( checked = isWear, diff --git a/app/src/main/java/com/binbin/androidowner/User.kt b/app/src/main/java/com/binbin/androidowner/User.kt index 25f8c92..5d22145 100644 --- a/app/src/main/java/com/binbin/androidowner/User.kt +++ b/app/src/main/java/com/binbin/androidowner/User.kt @@ -36,7 +36,7 @@ import androidx.core.os.UserManagerCompat var affiliationID = mutableSetOf() @Composable fun UserManage() { - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) { val myContext = LocalContext.current val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myComponent = ComponentName(myContext,MyDeviceAdminReceiver::class.java) diff --git a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt index fdb8ce6..109e367 100644 --- a/app/src/main/java/com/binbin/androidowner/UserRestrict.kt +++ b/app/src/main/java/com/binbin/androidowner/UserRestrict.kt @@ -53,7 +53,7 @@ fun UserRestriction(){ val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val isWear = sharedPref.getBoolean("isWear",false) val bodyTextStyle = if(isWear){typography.bodyMedium}else{typography.bodyLarge} - Column(modifier = Modifier.verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally){ + Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally){ Text(text = "打开开关后会禁用对应的功能",style = bodyTextStyle) if(VERSION.SDK_INT<24){ Text(text = "所有的用户限制都需要API24,你的设备低于API24,无法使用。", style = bodyTextStyle, color = colorScheme.error) diff --git a/app/src/main/java/com/binbin/androidowner/ui/theme/Animations.kt b/app/src/main/java/com/binbin/androidowner/ui/theme/Animations.kt new file mode 100644 index 0000000..ff49afb --- /dev/null +++ b/app/src/main/java/com/binbin/androidowner/ui/theme/Animations.kt @@ -0,0 +1,58 @@ +package com.binbin.androidowner.ui.theme + +import android.content.Context +import androidx.compose.animation.* +import androidx.compose.animation.core.* +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize +import androidx.navigation.NavBackStackEntry + +class Animations(myContext: Context){ + private val springFade = tween(durationMillis = 150) + private val springSlide:SpringSpec = SpringSpec(Spring.DampingRatioNoBouncy, Spring.StiffnessMediumLow, null) + + private val navIconSpringSlide:SpringSpec = SpringSpec(Spring.DampingRatioNoBouncy, Spring.StiffnessMediumLow, null) + val navIconEnterTransition:EnterTransition = expandHorizontally(navIconSpringSlide) + fadeIn() + val navIconExitTransition:ExitTransition = shrinkHorizontally(navIconSpringSlide) + fadeOut() + + private val screenWidth = myContext.resources.displayMetrics.widthPixels + private val initialOffsetValue = screenWidth/12 + private val targetOffsetValue = screenWidth/12 + + val navHostEnterTransition: AnimatedContentTransitionScope.() -> EnterTransition = { + fadeIn(animationSpec = springFade) + + slideIntoContainer( + animationSpec = springSlide, + towards = AnimatedContentTransitionScope.SlideDirection.End, + initialOffset = {initialOffsetValue} + ) + } + + val navHostExitTransition: AnimatedContentTransitionScope.() -> ExitTransition = { + fadeOut(animationSpec = springFade) + + slideOutOfContainer( + animationSpec = springSlide, + towards = AnimatedContentTransitionScope.SlideDirection.Start, + targetOffset = {-targetOffsetValue} + ) + } + + val navHostPopEnterTransition: AnimatedContentTransitionScope.() -> EnterTransition = { + fadeIn(animationSpec = springFade) + + slideIntoContainer( + animationSpec = springSlide, + towards = AnimatedContentTransitionScope.SlideDirection.End, + initialOffset = {-initialOffsetValue} + ) + } + + val navHostPopExitTransition: AnimatedContentTransitionScope.() -> ExitTransition = { + fadeOut(animationSpec = springFade) + + slideOutOfContainer( + animationSpec = springSlide, + towards = AnimatedContentTransitionScope.SlideDirection.Start, + targetOffset = {targetOffsetValue} + ) + } + +}