From e8c29c4a90a81469070d2b91d68461ee592fe94b Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Mon, 22 Dec 2025 15:22:37 -0800 Subject: [PATCH 1/7] add in projected snippets for AI glasses: glasses activity, launching a glasses activity --- gradle/libs.versions.toml | 4 + xr/build.gradle.kts | 4 +- .../xr/projected/GlassesMainActivity.kt | 68 +++++++++++++ .../example/xr/projected/PhoneMainActivity.kt | 95 +++++++++++++++++++ 4 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt create mode 100644 xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e4b6c63c0..1e07ac4ae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -98,6 +98,8 @@ wearToolingPreview = "1.0.0" webkit = "1.14.0" wearPhoneInteractions = "1.1.0" wearRemoteInteractions = "1.1.0" +glimmer = "1.0.0-alpha03" +projected = "1.0.0-alpha03" [libraries] accompanist-adaptive = "com.google.accompanist:accompanist-adaptive:0.37.3" @@ -241,6 +243,8 @@ wear-compose-material = { module = "androidx.wear.compose:compose-material", ver wear-compose-material3 = { module = "androidx.wear.compose:compose-material3", version.ref = "wearComposeMaterial3" } androidx-wear-phone-interactions = { group = "androidx.wear", name = "wear-phone-interactions", version.ref = "wearPhoneInteractions" } androidx-wear-remote-interactions = { group = "androidx.wear", name = "wear-remote-interactions", version.ref = "wearRemoteInteractions" } +androidx-glimmer = { group = "androidx.xr.glimmer", name = "glimmer", version.ref = "glimmer" } +androidx-projected = { group = "androidx.xr.projected", name = "projected", version.ref = "projected" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } diff --git a/xr/build.gradle.kts b/xr/build.gradle.kts index 690fc9563..65ec078a1 100644 --- a/xr/build.gradle.kts +++ b/xr/build.gradle.kts @@ -40,6 +40,8 @@ dependencies { implementation(libs.androidx.activity.ktx) implementation(libs.androidx.media3.exoplayer) + implementation(libs.androidx.glimmer) + implementation(libs.androidx.projected) val composeBom = platform(libs.androidx.compose.bom) implementation(composeBom) @@ -68,4 +70,4 @@ dependencies { implementation(libs.androidx.activity.compose) implementation(libs.androidx.appcompat) -} \ No newline at end of file +} diff --git a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt new file mode 100644 index 000000000..32f21806e --- /dev/null +++ b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt @@ -0,0 +1,68 @@ +package com.example.xr.projected + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.xr.glimmer.Button +import androidx.xr.glimmer.Card +import androidx.xr.glimmer.GlimmerTheme +import androidx.xr.glimmer.Text +import androidx.xr.glimmer.surface + +// [START androidxr_projected_ai_glasses_activity] +class GlassesMainActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + GlimmerTheme { + HomeScreen(onClose = { + finish() + }) + } + } + } + + override fun onStart() { + super.onStart() + // Do things to make the user aware that this activity is active (for + // example, play audio frequently), when the display is off. + } + + override fun onStop() { + super.onStop() + // Stop all the data source access. + } + +} +// [END androidxr_projected_ai_glasses_activity] + +// [START androidxr_projected_ai_glasses_activity_homescreen] +@Composable +fun HomeScreen(modifier: Modifier = Modifier, onClose: () -> Unit) { + Box( + modifier = modifier + .surface(focusable = false).fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Card( + title = { Text("Android XR") }, + action = { + Button(onClick = { + onClose() + }) { + Text("Close") + } + } + ) { + Text("Hello, AI Glasses!") + } + } +} +// [END androidxr_projected_ai_glasses_activity_homescreen] diff --git a/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt b/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt new file mode 100644 index 000000000..5bf4f3313 --- /dev/null +++ b/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt @@ -0,0 +1,95 @@ +package com.example.xr.projected + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.xr.projected.ProjectedContext +import androidx.xr.projected.experimental.ExperimentalProjectedApi + +class MainActivity : ComponentActivity() { + @RequiresApi(Build.VERSION_CODES.BAKLAVA) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + MaterialTheme { + ConnectionScreen() + } + } + } +} + +@RequiresApi(Build.VERSION_CODES.BAKLAVA) +@OptIn(ExperimentalProjectedApi::class) +@Composable +fun ConnectionScreen() { + val context = LocalContext.current + Scaffold { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = "Hello AI Glasses", + style = MaterialTheme.typography.titleLarge + ) + Spacer(modifier = Modifier.height(32.dp)) + val scope = rememberCoroutineScope() + val isGlassesConnected by ProjectedContext.isProjectedDeviceConnected( + context, + scope.coroutineContext + ).collectAsStateWithLifecycle(initialValue = false) + Button( + onClick = { + // [START androidxr_projected_start_glasses_activity] + + val options = ProjectedContext.createProjectedActivityOptions(context) + val intent = Intent(context, GlassesMainActivity::class.java) + context.startActivity(intent, options.toBundle()) + + // [END androidxr_projected_start_glasses_activity] + }, + colors = ButtonDefaults.buttonColors( + containerColor = if (isGlassesConnected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error + ), + enabled = isGlassesConnected + ) { + Text( + text = "Launch", + style = MaterialTheme.typography.headlineMedium + ) + } + Spacer(modifier = Modifier.height(32.dp)) + Text( + text = "Status: " + if (isGlassesConnected) "Connected" else "Disconnected", + style = MaterialTheme.typography.titleMedium + ) + } + } +} From 35967d9fd721907f96b7478ad28961a4f6c17b4e Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Mon, 22 Dec 2025 15:27:46 -0800 Subject: [PATCH 2/7] apply spotless checks --- .../example/xr/projected/GlassesMainActivity.kt | 16 ++++++++++++++++ .../example/xr/projected/PhoneMainActivity.kt | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt index 32f21806e..b41f626d4 100644 --- a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt +++ b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.xr.projected import android.os.Bundle diff --git a/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt b/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt index 5bf4f3313..9a4ad374d 100644 --- a/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt +++ b/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.xr.projected import android.content.Intent From e99549383ec4604bd2bafbb0b6d4e3a41c0f3334 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Tue, 23 Dec 2025 10:52:45 -0800 Subject: [PATCH 3/7] add activities into the manfiest file and add in a LifecycleObserver --- gradle/libs.versions.toml | 4 +-- xr/src/main/AndroidManifest.xml | 21 ++++++++++++- .../xr/projected/GlassesLifecycleObserver.kt | 31 +++++++++++++++++++ .../xr/projected/GlassesMainActivity.kt | 16 +++------- .../example/xr/projected/PhoneMainActivity.kt | 2 +- 5 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1e07ac4ae..d24a17321 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -98,7 +98,7 @@ wearToolingPreview = "1.0.0" webkit = "1.14.0" wearPhoneInteractions = "1.1.0" wearRemoteInteractions = "1.1.0" -glimmer = "1.0.0-alpha03" +xrGlimmer = "1.0.0-alpha03" projected = "1.0.0-alpha03" [libraries] @@ -243,7 +243,7 @@ wear-compose-material = { module = "androidx.wear.compose:compose-material", ver wear-compose-material3 = { module = "androidx.wear.compose:compose-material3", version.ref = "wearComposeMaterial3" } androidx-wear-phone-interactions = { group = "androidx.wear", name = "wear-phone-interactions", version.ref = "wearPhoneInteractions" } androidx-wear-remote-interactions = { group = "androidx.wear", name = "wear-remote-interactions", version.ref = "wearRemoteInteractions" } -androidx-glimmer = { group = "androidx.xr.glimmer", name = "glimmer", version.ref = "glimmer" } +androidx-glimmer = { group = "androidx.xr.glimmer", name = "glimmer", version.ref = "xrGlimmer" } androidx-projected = { group = "androidx.xr.projected", name = "projected", version.ref = "projected" } [plugins] diff --git a/xr/src/main/AndroidManifest.xml b/xr/src/main/AndroidManifest.xml index bc726787c..24389a941 100644 --- a/xr/src/main/AndroidManifest.xml +++ b/xr/src/main/AndroidManifest.xml @@ -19,6 +19,25 @@ + tools:ignore="MissingApplicationIcon"> + + + + + + + + diff --git a/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt b/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt new file mode 100644 index 000000000..596613957 --- /dev/null +++ b/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.xr.projected + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner + +class GlassesLifecycleObserver : DefaultLifecycleObserver { + override fun onStart(owner: LifecycleOwner) { + // Do things to make the user aware that this activity is active (for + // example, play audio frequently), when the display is off. + } + + override fun onStop(owner: LifecycleOwner) { + // Stop all the data source access. + } +} diff --git a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt index b41f626d4..8a56d98a5 100644 --- a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt +++ b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt @@ -36,6 +36,8 @@ class GlassesMainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + lifecycle.addObserver(GlassesLifecycleObserver()) + setContent { GlimmerTheme { HomeScreen(onClose = { @@ -45,17 +47,6 @@ class GlassesMainActivity : ComponentActivity() { } } - override fun onStart() { - super.onStart() - // Do things to make the user aware that this activity is active (for - // example, play audio frequently), when the display is off. - } - - override fun onStop() { - super.onStop() - // Stop all the data source access. - } - } // [END androidxr_projected_ai_glasses_activity] @@ -64,7 +55,8 @@ class GlassesMainActivity : ComponentActivity() { fun HomeScreen(modifier: Modifier = Modifier, onClose: () -> Unit) { Box( modifier = modifier - .surface(focusable = false).fillMaxSize(), + .surface(focusable = false) + .fillMaxSize(), contentAlignment = Alignment.Center ) { Card( diff --git a/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt b/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt index 9a4ad374d..4534f3047 100644 --- a/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt +++ b/xr/src/main/java/com/example/xr/projected/PhoneMainActivity.kt @@ -45,7 +45,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.xr.projected.ProjectedContext import androidx.xr.projected.experimental.ExperimentalProjectedApi -class MainActivity : ComponentActivity() { +class PhoneMainActivity : ComponentActivity() { @RequiresApi(Build.VERSION_CODES.BAKLAVA) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 160ebffde8322d7f404027686ba9c0902add7950 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Tue, 23 Dec 2025 13:52:59 -0800 Subject: [PATCH 4/7] add in the ProjectedDisplayController snippets --- .../xr/projected/GlassesLifecycleObserver.kt | 27 ++++++++-- .../xr/projected/GlassesMainActivity.kt | 53 ++++++++++++++++--- 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt b/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt index 596613957..4ea97fa2c 100644 --- a/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt +++ b/xr/src/main/java/com/example/xr/projected/GlassesLifecycleObserver.kt @@ -16,16 +16,35 @@ package com.example.xr.projected +import android.content.Context +import androidx.core.content.ContextCompat import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner +import androidx.xr.projected.ProjectedDisplayController +import androidx.xr.projected.ProjectedDisplayController.PresentationMode +import androidx.xr.projected.experimental.ExperimentalProjectedApi +import java.util.function.Consumer + +@OptIn(ExperimentalProjectedApi::class) +class GlassesLifecycleObserver( + private val context: Context, + private val controller: ProjectedDisplayController, + private val onVisualsChanged: (Boolean) -> Unit +) : DefaultLifecycleObserver { + + private val executor = ContextCompat.getMainExecutor(context) + + private val visualStateListener = Consumer { flags -> + val visualsOn = flags.hasPresentationMode(PresentationMode.VISUALS_ON) + onVisualsChanged(visualsOn) + } -class GlassesLifecycleObserver : DefaultLifecycleObserver { override fun onStart(owner: LifecycleOwner) { - // Do things to make the user aware that this activity is active (for - // example, play audio frequently), when the display is off. + controller.addPresentationModeChangedListener(executor, visualStateListener) } override fun onStop(owner: LifecycleOwner) { - // Stop all the data source access. + // unregister to stop consuming values and prevent memory leaks. + controller.removePresentationModeChangedListener(visualStateListener) } } diff --git a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt index 8a56d98a5..6bb2bc991 100644 --- a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt +++ b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -22,37 +22,71 @@ import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope import androidx.xr.glimmer.Button import androidx.xr.glimmer.Card import androidx.xr.glimmer.GlimmerTheme import androidx.xr.glimmer.Text import androidx.xr.glimmer.surface +import androidx.xr.projected.ProjectedDisplayController +import androidx.xr.projected.experimental.ExperimentalProjectedApi +import kotlinx.coroutines.launch // [START androidxr_projected_ai_glasses_activity] +@OptIn(ExperimentalProjectedApi::class) class GlassesMainActivity : ComponentActivity() { + private var projectedDisplayController: ProjectedDisplayController? = null + private var areVisualsOn by mutableStateOf(true) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - lifecycle.addObserver(GlassesLifecycleObserver()) + lifecycleScope.launch { + // initialize the controller + val controller = ProjectedDisplayController.create(this@GlassesMainActivity) + projectedDisplayController = controller + + // attach the observer to manage registration based on Activity visibility + val observer = GlassesLifecycleObserver( + context = this@GlassesMainActivity, + controller = controller, + onVisualsChanged = { visualsOn -> + areVisualsOn = visualsOn + } + ) + lifecycle.addObserver(observer) + } setContent { GlimmerTheme { - HomeScreen(onClose = { - finish() - }) + HomeScreen( + visualsOn = areVisualsOn, + onClose = { finish() } + ) } } } + override fun onDestroy() { + super.onDestroy() + projectedDisplayController?.close() + } } // [END androidxr_projected_ai_glasses_activity] // [START androidxr_projected_ai_glasses_activity_homescreen] @Composable -fun HomeScreen(modifier: Modifier = Modifier, onClose: () -> Unit) { +fun HomeScreen( + visualsOn: Boolean, + modifier: Modifier = Modifier, + onClose: () -> Unit +) { Box( modifier = modifier .surface(focusable = false) @@ -69,7 +103,12 @@ fun HomeScreen(modifier: Modifier = Modifier, onClose: () -> Unit) { } } ) { - Text("Hello, AI Glasses!") + // UI dynamically updates based on the observer's state + if (visualsOn) { + Text("Hello, AI Glasses!") + } else { + Text("Display is off. Audio guidance active.") + } } } } From 3edddf4f3be9eaf73ad167a3fb330f0fbcf4b0b6 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Tue, 23 Dec 2025 13:53:56 -0800 Subject: [PATCH 5/7] apply spotless checks --- .../main/java/com/example/xr/projected/GlassesMainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt index 6bb2bc991..954666e0d 100644 --- a/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt +++ b/xr/src/main/java/com/example/xr/projected/GlassesMainActivity.kt @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, From 7ab3b5694c91220ee7aa12f9c307a3ce75e5cf25 Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Tue, 23 Dec 2025 14:57:58 -0800 Subject: [PATCH 6/7] change to xrProjected in libs.versions.toml file --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d24a17321..75ed8c7c1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -99,7 +99,7 @@ webkit = "1.14.0" wearPhoneInteractions = "1.1.0" wearRemoteInteractions = "1.1.0" xrGlimmer = "1.0.0-alpha03" -projected = "1.0.0-alpha03" +xrProjected = "1.0.0-alpha03" [libraries] accompanist-adaptive = "com.google.accompanist:accompanist-adaptive:0.37.3" @@ -244,7 +244,7 @@ wear-compose-material3 = { module = "androidx.wear.compose:compose-material3", v androidx-wear-phone-interactions = { group = "androidx.wear", name = "wear-phone-interactions", version.ref = "wearPhoneInteractions" } androidx-wear-remote-interactions = { group = "androidx.wear", name = "wear-remote-interactions", version.ref = "wearRemoteInteractions" } androidx-glimmer = { group = "androidx.xr.glimmer", name = "glimmer", version.ref = "xrGlimmer" } -androidx-projected = { group = "androidx.xr.projected", name = "projected", version.ref = "projected" } +androidx-projected = { group = "androidx.xr.projected", name = "projected", version.ref = "xrProjected" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } From a55ef05b57183b39402c8da91905a242e1733bce Mon Sep 17 00:00:00 2001 From: Tram Bui Date: Tue, 23 Dec 2025 14:58:32 -0800 Subject: [PATCH 7/7] remove region tags in manfiest file --- xr/src/main/AndroidManifest.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/xr/src/main/AndroidManifest.xml b/xr/src/main/AndroidManifest.xml index 24389a941..883cceaec 100644 --- a/xr/src/main/AndroidManifest.xml +++ b/xr/src/main/AndroidManifest.xml @@ -20,7 +20,6 @@ -