浏览代码

launch crash, permission loop, landscape

Milan Jurkulak 4 天之前
父节点
当前提交
29e873e63e

+ 2 - 2
androidApp/src/main/AndroidManifest.xml

@@ -3,7 +3,7 @@
     xmlns:tools="http://schemas.android.com/tools">
 
     <application
-        android:name="com.mjdev.android.MjdevApplication"
+        android:name="org.mjdev.desktop.app.App"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
@@ -13,7 +13,7 @@
         tools:targetApi="31">
         
         <activity
-            android:name="com.mjdev.android.MainActivity"
+            android:name="org.mjdev.desktop.activity.MainActivity"
             android:exported="true"
             android:launchMode="singleTop"
             android:theme="@style/Theme.Mjdev"

+ 3 - 4
androidApp/src/main/kotlin/org/mjdev/desktop/activity/MainActivity.kt

@@ -99,10 +99,9 @@ class MainActivity : ComponentActivity() {
 private fun ActivityMain(activity: ComponentActivity? = null) {
     DesktopTheme {
         Scaffold(
-            modifier =
-                Modifier
-                    .fillMaxSize()
-                    .background(Black),
+            modifier = Modifier.fillMaxSize(),
+            // default container is white, the activity background follows the desktop color instead
+            containerColor = Color.Transparent,
         ) { paddingValues ->
             Box(
                 modifier =

+ 3 - 1
androidApp/src/main/kotlin/org/mjdev/desktop/components/OrientatedView.kt

@@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalConfiguration
 import androidx.compose.ui.tooling.preview.Preview
 import org.mjdev.desktop.context.DesktopContextScope.Companion.withDesktopContext
 
@@ -18,7 +19,8 @@ fun OrientatedView(
     Box(
         modifier = modifier
     ) {
-        if (context.platformContext?.resources?.configuration?.orientation == ORIENTATION_PORTRAIT) {
+        // LocalConfiguration is observed by compose, the activity handles rotation without recreation
+        if (LocalConfiguration.current.orientation == ORIENTATION_PORTRAIT) {
             portrait()
         } else {
             landscape()

+ 8 - 2
androidApp/src/main/kotlin/org/mjdev/desktop/main/MainView.kt

@@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
@@ -36,6 +37,10 @@ import org.mjdev.desktop.extensions.MutableStateExt.rememberCalculated
 fun MainView(onBackgroundChange: (Color) -> Unit = {}) =
     withDesktopContext {
         val tooltipState: TooltipState = rememberTooltipState()
+        // wallpaper change is the only other trigger, the activity background must follow the desktop from start
+        LaunchedEffect(backgroundColor) {
+            onBackgroundChange(backgroundColor)
+        }
         val appsMenuState =
             rememberAppsMenuState(
                 visible = isDesign,
@@ -45,9 +50,10 @@ fun MainView(onBackgroundChange: (Color) -> Unit = {}) =
                 visible = isDesign,
             )
         val panelState =
+            // touch has no hover to reveal an auto-hidden panel, so it stays pinned visible
             rememberVisibilityState(
-                visible = isDesign || !panelAutoHideEnabled,
-                enabled = panelAutoHideEnabled,
+                visible = true,
+                enabled = false,
                 autoHideDelay = panelHideDelay,
             )
         val bottomPadding by rememberCalculated(

+ 10 - 1
shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/permission/PermissonManager.kt

@@ -16,6 +16,9 @@ import android.content.pm.PackageManager
 import android.os.Build
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.platform.LocalContext
 import androidx.lifecycle.Lifecycle
@@ -75,12 +78,18 @@ fun rememberPermissionManager(
                 onPermissionsResult = onPermissionsResult,
             )
         _ps = permissionsState
+        // the system dialog pauses/resumes the activity, ask only once or it loops forever
+        var requested by rememberSaveable { mutableStateOf(false) }
         DisposableEffect(
             key1 = lifecycleOwner,
             effect = {
                 val observer =
                     LifecycleEventObserver { _, event ->
-                        if (event == Lifecycle.Event.ON_RESUME) {
+                        if (event == Lifecycle.Event.ON_RESUME &&
+                            !requested &&
+                            !permissionsState.allPermissionsGranted
+                        ) {
+                            requested = true
                             permissionsState.launchMultiplePermissionRequest()
                         }
                     }