From da80779603355f051c1bfa0a1e56e4117ee2454d Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Thu, 25 Sep 2025 17:18:18 +0200 Subject: [PATCH 1/3] Fix MainPanelWorkaround to work on dispose order instead of on a loop --- .../androidify/xr/MainPanelWorkaround.kt | 17 ++++++++--------- .../androidify/creation/xr/EditScreenSpatial.kt | 2 +- .../creation/xr/LoadingScreenSpatial.kt | 2 +- .../androidify/home/xr/AboutScreenSpatial.kt | 2 +- .../androidify/home/xr/HomeScreenSpatial.kt | 2 +- .../results/xr/ResultsScreenSpatial.kt | 3 +-- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt b/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt index 265cec34..eca5723c 100644 --- a/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt +++ b/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt @@ -16,25 +16,24 @@ package com.android.developers.androidify.xr import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.DisposableEffect import androidx.xr.compose.platform.LocalSession import androidx.xr.scenecore.scene -import kotlinx.coroutines.delay /* - * A composable that attempts to continually hide the mainPanel. + * A composable that hides the mainPanel when it is disposed. When placed outside of an (Application)Subspace, + * this composable will be disposed after the Subspace, hiding the mainPanelEntity again. * - * This is a temporary workaround for b/440325404, that causes the mainPanelEntity when an + * This is a temporary workaround for b/440325404, that causes the mainPanelEntity to appear when an * ApplicationSubspace transitions out of the composition due to a race condition when transitioning * the two hierarchies. */ @Composable fun MainPanelWorkaround() { - val session = LocalSession.current - LaunchedEffect(null) { - while (true) { - delay(100L) - session?.scene?.mainPanelEntity?.setEnabled(false) + val session = LocalSession.current ?: return + DisposableEffect(Unit) { + onDispose { + session.scene.mainPanelEntity.setEnabled(false) } } } diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt index ad347484..6eaa5be9 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt @@ -75,8 +75,8 @@ fun EditScreenSpatial( onDropCallback: (Uri) -> Unit = {}, ) { DisableSharedTransition { + MainPanelWorkaround() SquiggleBackgroundSubspace(minimumHeight = 600.dp) { - MainPanelWorkaround() SpatialColumn(SubspaceModifier.fillMaxWidth()) { SpatialPanel( SubspaceModifier.offset(z = 10.dp) diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/LoadingScreenSpatial.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/LoadingScreenSpatial.kt index c0c9c239..9b315282 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/LoadingScreenSpatial.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/LoadingScreenSpatial.kt @@ -52,12 +52,12 @@ private const val squiggleSafeContentHeight = 0.6f fun LoadingScreenSpatial( onCancelPress: () -> Unit, ) { + MainPanelWorkaround() BackgroundSubspace( aspectRatio = 1.4f, minimumHeight = 500.dp, drawable = CreationR.drawable.squiggle_light, ) { - MainPanelWorkaround() Orbiter( position = ContentEdge.Top, offsetType = OrbiterOffsetType.OuterEdge, diff --git a/feature/home/src/main/java/com/android/developers/androidify/home/xr/AboutScreenSpatial.kt b/feature/home/src/main/java/com/android/developers/androidify/home/xr/AboutScreenSpatial.kt index f49c8117..759bb33d 100644 --- a/feature/home/src/main/java/com/android/developers/androidify/home/xr/AboutScreenSpatial.kt +++ b/feature/home/src/main/java/com/android/developers/androidify/home/xr/AboutScreenSpatial.kt @@ -33,8 +33,8 @@ import com.android.developers.androidify.xr.SquiggleBackgroundSubspace @Composable fun AboutScreenSpatial(onBackPressed: () -> Unit, bottomButtons: @Composable () -> Unit) { + MainPanelWorkaround() SquiggleBackgroundSubspace(500.dp) { - MainPanelWorkaround() SpatialPanel { Orbiter( ContentEdge.Top, diff --git a/feature/home/src/main/java/com/android/developers/androidify/home/xr/HomeScreenSpatial.kt b/feature/home/src/main/java/com/android/developers/androidify/home/xr/HomeScreenSpatial.kt index 03024019..06106d21 100644 --- a/feature/home/src/main/java/com/android/developers/androidify/home/xr/HomeScreenSpatial.kt +++ b/feature/home/src/main/java/com/android/developers/androidify/home/xr/HomeScreenSpatial.kt @@ -69,8 +69,8 @@ fun HomeScreenContentsSpatial( onAboutClicked: () -> Unit, ) { DisableSharedTransition { + MainPanelWorkaround() SquiggleBackgroundSubspace(minimumHeight = 600.dp) { - MainPanelWorkaround() Orbiter( position = ContentEdge.Top, offsetType = OrbiterOffsetType.OuterEdge, diff --git a/feature/results/src/main/java/com/android/developers/androidify/results/xr/ResultsScreenSpatial.kt b/feature/results/src/main/java/com/android/developers/androidify/results/xr/ResultsScreenSpatial.kt index cf3f9cf5..d5ffccd5 100644 --- a/feature/results/src/main/java/com/android/developers/androidify/results/xr/ResultsScreenSpatial.kt +++ b/feature/results/src/main/java/com/android/developers/androidify/results/xr/ResultsScreenSpatial.kt @@ -59,9 +59,8 @@ fun ResultsScreenSpatial( ) { var offsetPose by remember { mutableStateOf(Pose()) } DisableSharedTransition { + MainPanelWorkaround() Subspace { - MainPanelWorkaround() - SpatialPanel( SubspaceModifier .offset(z = 5.dp) From 0ec8d451005776b48861675b5fdf83a63461199d Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Thu, 25 Sep 2025 17:22:13 +0200 Subject: [PATCH 2/3] Add uses-feature android.software.xr.api.spatial --- app/src/main/AndroidManifest.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9880f60b..e8809a11 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,9 @@ android:name="android.hardware.camera" android:required="true" /> + + + From 5270b44c48846018db713491df7d2050aa9c3b05 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Fri, 26 Sep 2025 11:18:12 +0200 Subject: [PATCH 3/3] Update core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../com/android/developers/androidify/xr/MainPanelWorkaround.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt b/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt index eca5723c..dcf4da30 100644 --- a/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt +++ b/core/xr/src/main/java/com/android/developers/androidify/xr/MainPanelWorkaround.kt @@ -31,7 +31,7 @@ import androidx.xr.scenecore.scene @Composable fun MainPanelWorkaround() { val session = LocalSession.current ?: return - DisposableEffect(Unit) { + DisposableEffect(session) { onDispose { session.scene.mainPanelEntity.setEnabled(false) }