From 2533e67ae77af0bd67c47d9bddeb8c104419a1a9 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Wed, 11 Jun 2025 14:38:19 +0200 Subject: [PATCH 01/14] Migrate to snapshot 13623196 (alpha05) --- gradle/libs.versions.toml | 3 +++ settings.gradle.kts | 2 +- xr/build.gradle.kts | 14 +++++++--- .../java/com/example/xr/arcore/Anchors.kt | 8 +++--- .../main/java/com/example/xr/arcore/Hands.kt | 16 ++++++----- .../main/java/com/example/xr/arcore/Planes.kt | 8 +++--- .../java/com/example/xr/compose/Orbiter.kt | 21 ++++++++------- .../example/xr/compose/SpatialCapabilities.kt | 1 + .../example/xr/compose/SpatialElevation.kt | 2 +- .../xr/compose/SpatialExternalSurface.kt | 3 +++ .../com/example/xr/compose/SpatialLayout.kt | 1 + .../com/example/xr/compose/SpatialPanel.kt | 2 ++ .../java/com/example/xr/compose/SpatialRow.kt | 1 + .../java/com/example/xr/compose/Subspace.kt | 1 + .../main/java/com/example/xr/compose/Views.kt | 6 +++-- .../java/com/example/xr/compose/Volume.kt | 3 +++ .../com/example/xr/misc/ModeTransition.kt | 1 + .../java/com/example/xr/runtime/Session.kt | 2 ++ .../java/com/example/xr/scenecore/Entities.kt | 27 ++++++++++--------- .../com/example/xr/scenecore/Environments.kt | 13 ++++++--- .../com/example/xr/scenecore/GltfEntity.kt | 5 +++- .../com/example/xr/scenecore/SpatialAudio.kt | 3 +++ .../xr/scenecore/SpatialCapabilities.kt | 1 + .../com/example/xr/scenecore/SpatialVideo.kt | 4 +++ 24 files changed, 103 insertions(+), 45 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f7e2b5470..da1d176d8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -71,6 +71,9 @@ targetSdk = "35" tiles = "1.5.0" tracing = "1.3.0" validatorPush = "1.0.0-alpha03" +androidx-xr-arcore = "1.0.0-SNAPSHOT" +androidx-xr-scenecore = "1.0.0-SNAPSHOT" +androidx-xr-compose = "1.0.0-SNAPSHOT" version-catalog-update = "1.0.0" wear = "1.3.0" wearComposeFoundation = "1.5.0-beta04" diff --git a/settings.gradle.kts b/settings.gradle.kts index eb485975e..bf0bcf0b7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = System.getenv("COMPOSE_SNAPSHOT_ID") +val snapshotVersion : String? = "13623196" pluginManagement { repositories { diff --git a/xr/build.gradle.kts b/xr/build.gradle.kts index 74ad5bfe9..5c886df08 100644 --- a/xr/build.gradle.kts +++ b/xr/build.gradle.kts @@ -28,9 +28,17 @@ android { } dependencies { - implementation(libs.androidx.xr.arcore) - implementation(libs.androidx.xr.scenecore) - implementation(libs.androidx.xr.compose) + implementation(libs.androidx.xr.arcore) { + exclude(module = "impress") + } + implementation(libs.androidx.xr.scenecore) { + exclude(module = "impress") + } + implementation(libs.androidx.xr.compose) { + exclude(module = "impress") + } + + implementation("com.google.ar:impress:0.0.3") implementation(libs.androidx.activity.ktx) implementation(libs.guava) diff --git a/xr/src/main/java/com/example/xr/arcore/Anchors.kt b/xr/src/main/java/com/example/xr/arcore/Anchors.kt index cb4992095..a104e2ab1 100644 --- a/xr/src/main/java/com/example/xr/arcore/Anchors.kt +++ b/xr/src/main/java/com/example/xr/arcore/Anchors.kt @@ -29,11 +29,10 @@ import androidx.xr.scenecore.AnchorEntity import androidx.xr.scenecore.Entity import androidx.xr.scenecore.scene -@Suppress("RestrictedApi") // b/416288516 - session.config and session.configure() are incorrectly restricted fun configureAnchoring(session: Session) { // [START androidxr_arcore_anchoring_configure] val newConfig = session.config.copy( - anchorPersistence = Config.AnchorPersistenceMode.Enabled, + anchorPersistence = Config.AnchorPersistenceMode.LOCAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> @@ -41,6 +40,8 @@ fun configureAnchoring(session: Session) { is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) + else -> + TODO(/* A different unhandled exception was thrown. */) } // [END androidxr_arcore_anchoring_configure] } @@ -65,6 +66,7 @@ private fun createAnchorAtTrackable(trackable: Trackable<*>) { // [END androidxr_arcore_anchor_create_trackable] } +@Suppress("RestrictedApi") // b/422174724 private fun attachEntityToAnchor( session: Session, entity: Entity, @@ -72,7 +74,7 @@ private fun attachEntityToAnchor( ) { // [START androidxr_arcore_entity_tracks_anchor] AnchorEntity.create(session, anchor).apply { - setParent(session.scene.activitySpace) + parent = session.scene.activitySpace addChild(entity) } // [END androidxr_arcore_entity_tracks_anchor] diff --git a/xr/src/main/java/com/example/xr/arcore/Hands.kt b/xr/src/main/java/com/example/xr/arcore/Hands.kt index 13346b202..3b68b50de 100644 --- a/xr/src/main/java/com/example/xr/arcore/Hands.kt +++ b/xr/src/main/java/com/example/xr/arcore/Hands.kt @@ -35,11 +35,10 @@ import androidx.xr.scenecore.scene import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch -@Suppress("RestrictedApi") // b/416288516 - session.config and session.configure() are incorrectly restricted fun ComponentActivity.configureSession(session: Session) { // [START androidxr_arcore_hand_configure] val newConfig = session.config.copy( - handTracking = Config.HandTrackingMode.Enabled + handTracking = Config.HandTrackingMode.BOTH ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> @@ -47,6 +46,8 @@ fun ComponentActivity.configureSession(session: Session) { is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) + else -> + TODO(/* A different unhandled exception was thrown. */) } // [END androidxr_arcore_hand_configure] } @@ -71,13 +72,14 @@ fun ComponentActivity.collectHands(session: Session) { fun secondaryHandDetection(activity: Activity, session: Session) { fun detectGesture(handState: Flow) {} // [START androidxr_arcore_hand_handedness] - val handedness = Hand.getHandedness(activity.contentResolver) - val secondaryHand = if (handedness == Hand.Handedness.LEFT) Hand.right(session) else Hand.left(session) + val handedness = Hand.getPrimaryHandSide(activity.contentResolver) + val secondaryHand = if (handedness == Hand.HandSide.LEFT) Hand.right(session) else Hand.left(session) val handState = secondaryHand?.state ?: return detectGesture(handState) // [END androidxr_arcore_hand_handedness] } +@Suppress("RestrictedApi") // b/416066566 fun ComponentActivity.renderPlanetAtHandPalm(leftHandState: Hand.State) { val session: Session = null!! val palmEntity: GltfModelEntity = null!! @@ -86,7 +88,7 @@ fun ComponentActivity.renderPlanetAtHandPalm(leftHandState: Hand.State) { // the down direction points in the same direction as the palm val angle = Vector3.angleBetween(palmPose.rotation * Vector3.Down, Vector3.Up) - palmEntity.setHidden(angle > Math.toRadians(40.0)) + palmEntity.setEnabled(angle > Math.toRadians(40.0)) val transformedPose = session.scene.perceptionSpace.transformPoseTo( @@ -98,6 +100,7 @@ fun ComponentActivity.renderPlanetAtHandPalm(leftHandState: Hand.State) { // [END androidxr_arcore_hand_entityAtHandPalm] } +@Suppress("RestrictedApi") // b/416066566 fun ComponentActivity.renderPlanetAtFingerTip(rightHandState: Hand.State) { val session: Session = null!! val indexFingerEntity: GltfModelEntity = null!! @@ -107,7 +110,7 @@ fun ComponentActivity.renderPlanetAtFingerTip(rightHandState: Hand.State) { // the forward direction points towards the finger tip. val angle = Vector3.angleBetween(tipPose.rotation * Vector3.Forward, Vector3.Up) - indexFingerEntity.setHidden(angle > Math.toRadians(40.0)) + indexFingerEntity.setEnabled(angle > Math.toRadians(40.0)) val transformedPose = session.scene.perceptionSpace.transformPoseTo( @@ -120,6 +123,7 @@ fun ComponentActivity.renderPlanetAtFingerTip(rightHandState: Hand.State) { // [END androidxr_arcore_hand_entityAtIndexFingerTip] } +@Suppress("RestrictedApi") // b/416066566 private fun detectPinch(session: Session, handState: Hand.State): Boolean { // [START androidxr_arcore_hand_pinch_gesture] val thumbTip = handState.handJoints[HandJointType.THUMB_TIP] ?: return false diff --git a/xr/src/main/java/com/example/xr/arcore/Planes.kt b/xr/src/main/java/com/example/xr/arcore/Planes.kt index fd5e02c11..2eda1147d 100644 --- a/xr/src/main/java/com/example/xr/arcore/Planes.kt +++ b/xr/src/main/java/com/example/xr/arcore/Planes.kt @@ -26,11 +26,10 @@ import androidx.xr.runtime.math.Pose import androidx.xr.runtime.math.Ray import androidx.xr.scenecore.scene -@Suppress("RestrictedApi") // b/416288516 - session.config and session.configure() are incorrectly restricted fun configurePlaneTracking(session: Session) { // [START androidxr_arcore_planetracking_configure] val newConfig = session.config.copy( - planeTracking = Config.PlaneTrackingMode.HorizontalAndVertical, + planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> @@ -38,6 +37,8 @@ fun configurePlaneTracking(session: Session) { is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) + else -> + TODO(/* A different unhandled exception was thrown. */) } // [END androidxr_arcore_planetracking_configure] } @@ -50,6 +51,7 @@ private suspend fun subscribePlanes(session: Session) { // [END androidxr_arcore_planes_subscribe] } +@Suppress("RestrictedApi") // b/416066566 private fun hitTestTable(session: Session) { val pose = session.scene.spatialUser.head?.transformPoseTo(Pose(), session.scene.perceptionSpace) ?: return val ray = Ray(pose.translation, pose.forward) @@ -58,7 +60,7 @@ private fun hitTestTable(session: Session) { // When interested in the first Table hit: val tableHit = results.firstOrNull { val trackable = it.trackable - trackable is Plane && trackable.state.value.label == Plane.Label.Table + trackable is Plane && trackable.state.value.label == Plane.Label.TABLE } // [END androidxr_arcore_hitTest] } diff --git a/xr/src/main/java/com/example/xr/compose/Orbiter.kt b/xr/src/main/java/com/example/xr/compose/Orbiter.kt index 364709c83..e8420610b 100644 --- a/xr/src/main/java/com/example/xr/compose/Orbiter.kt +++ b/xr/src/main/java/com/example/xr/compose/Orbiter.kt @@ -25,8 +25,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CornerSize -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Surface +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -36,9 +36,9 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.xr.compose.spatial.EdgeOffset +import androidx.xr.compose.spatial.ContentEdge import androidx.xr.compose.spatial.Orbiter -import androidx.xr.compose.spatial.OrbiterEdge +import androidx.xr.compose.spatial.OrbiterOffsetType import androidx.xr.compose.spatial.Subspace import androidx.xr.compose.subspace.SpatialPanel import androidx.xr.compose.subspace.SpatialRow @@ -50,6 +50,7 @@ import androidx.xr.compose.subspace.layout.resizable import androidx.xr.compose.subspace.layout.width import com.example.xr.R +@Suppress("RestrictedApi") // b/416066566 @Composable private fun OrbiterExampleSubspace() { // [START androidxr_compose_OrbiterExampleSubspace] @@ -72,7 +73,7 @@ private fun OrbiterExampleSubspace() { @Composable fun OrbiterExample() { Orbiter( - position = OrbiterEdge.Bottom, + position = ContentEdge.Bottom, offset = 96.dp, alignment = Alignment.CenterHorizontally ) { @@ -97,18 +98,20 @@ fun OrbiterExample() { // [END androidxr_compose_OrbiterExample] @Composable +@Suppress("RestrictedApi") // b/416066566 fun OrbiterAnchoringExample() { // [START androidxr_compose_OrbiterAnchoringExample] Subspace { SpatialRow { Orbiter( - position = OrbiterEdge.Top, - offset = EdgeOffset.inner(8.dp), + position = ContentEdge.Top, + offset = 8.dp, + offsetType = OrbiterOffsetType.InnerEdge, shape = SpatialRoundedCornerShape(size = CornerSize(50)) ) { Text( "Hello World!", - style = MaterialTheme.typography.h2, + style = MaterialTheme.typography.titleMedium, modifier = Modifier .background(Color.White) .padding(16.dp) @@ -150,7 +153,7 @@ private fun Ui2DToOribiter() { // New XR differentiated approach Orbiter( - position = OrbiterEdge.Start, + position = ContentEdge.Start, offset = dimensionResource(R.dimen.start_orbiter_padding), alignment = Alignment.Top ) { diff --git a/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt b/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt index b3af88c13..b5ab74ca1 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt @@ -45,6 +45,7 @@ private fun SpatialCapabilitiesCheck() { // [END androidxr_compose_checkSpatialCapabilities] } +@Suppress("RestrictedApi") // b/416066566 @Composable private fun checkSpatialUiEnabled() { // [START androidxr_compose_checkSpatialUiEnabled] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialElevation.kt b/xr/src/main/java/com/example/xr/compose/SpatialElevation.kt index 3ab8f3f54..68fedfe3f 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialElevation.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialElevation.kt @@ -27,7 +27,7 @@ private fun ComposableThatShouldElevateInXr() {} private fun SpatialElevationExample() { // [START androidxr_compose_spatialelevation] // Elevate an otherwise 2D Composable (signified here by ComposableThatShouldElevateInXr). - SpatialElevation(spatialElevationLevel = SpatialElevationLevel.Level4) { + SpatialElevation(elevation = SpatialElevationLevel.Level4) { ComposableThatShouldElevateInXr() } // [END androidxr_compose_spatialelevation] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt index 1736bc909..58798226f 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt @@ -19,6 +19,7 @@ package com.example.xr.compose import android.content.ContentResolver import android.net.Uri import androidx.compose.runtime.Composable +import androidx.compose.runtime.ExperimentalComposeApi import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp @@ -32,6 +33,8 @@ import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width // [START androidxr_compose_SpatialExternalSurfaceStereo] +@OptIn(ExperimentalComposeApi::class) +@Suppress("RestrictedApi") // b/416066566 @Composable fun SpatialExternalSurfaceContent() { val context = LocalContext.current diff --git a/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt b/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt index b0099b00a..b68871e9e 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt @@ -36,6 +36,7 @@ import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width +@Suppress("RestrictedApi") // b/416066566 @Composable private fun SpatialLayoutExampleSubspace() { // [START androidxr_compose_SpatialLayoutExampleSubspace] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt b/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt index c3a3a58ef..ee5f2009e 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt @@ -36,6 +36,7 @@ import androidx.xr.compose.subspace.layout.movable import androidx.xr.compose.subspace.layout.resizable import androidx.xr.compose.subspace.layout.width +@Suppress("RestrictedApi") // b/416066566 @Composable private fun SpatialPanelExample() { // [START androidxr_compose_SpatialPanel] @@ -75,6 +76,7 @@ fun SpatialPanelContent() { @Composable private fun AppContent() {} +@Suppress("RestrictedApi") // b/416066566 @Composable private fun ContentInSpatialPanel() { // [START androidxr_compose_SpatialPanelAppContent] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialRow.kt b/xr/src/main/java/com/example/xr/compose/SpatialRow.kt index d138411ac..8280dcf3d 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialRow.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialRow.kt @@ -24,6 +24,7 @@ import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width +@Suppress("RestrictedApi") // b/416066566 @Composable private fun SpatialRowExample() { // [START androidxr_compose_SpatialRowExample] diff --git a/xr/src/main/java/com/example/xr/compose/Subspace.kt b/xr/src/main/java/com/example/xr/compose/Subspace.kt index 2cbbe1021..6c6a799a2 100644 --- a/xr/src/main/java/com/example/xr/compose/Subspace.kt +++ b/xr/src/main/java/com/example/xr/compose/Subspace.kt @@ -26,6 +26,7 @@ import androidx.xr.compose.spatial.ApplicationSubspace import androidx.xr.compose.spatial.Subspace import androidx.xr.compose.subspace.SpatialPanel +@Suppress("RestrictedApi") // b/416066566 private class SubspaceActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/xr/src/main/java/com/example/xr/compose/Views.kt b/xr/src/main/java/com/example/xr/compose/Views.kt index 4fc693828..75fc2a8bb 100644 --- a/xr/src/main/java/com/example/xr/compose/Views.kt +++ b/xr/src/main/java/com/example/xr/compose/Views.kt @@ -35,13 +35,14 @@ import androidx.xr.compose.subspace.layout.depth import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width import androidx.xr.runtime.Session +import androidx.xr.runtime.math.IntSize2d import androidx.xr.scenecore.PanelEntity -import androidx.xr.scenecore.PixelDimensions import com.example.xr.R private class MyCustomView(context: Context) : View(context) private class ActivityWithSubspaceContent : ComponentActivity() { + @Suppress("RestrictedApi") // b/416066566 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // [START androidxr_compose_ActivityWithSubspaceContent] @@ -56,6 +57,7 @@ private class ActivityWithSubspaceContent : ComponentActivity() { } } +@Suppress("RestrictedApi") // b/416066566 private class FragmentWithComposeView() : Fragment() { // [START androidxr_compose_FragmentWithComposeView] override fun onCreateView( @@ -86,7 +88,7 @@ fun ComponentActivity.PanelEntityWithView(xrSession: Session) { val panelEntity = PanelEntity.create( session = xrSession, view = panelContent, - pixelDimensions = PixelDimensions(500, 500), + pixelDimensions = IntSize2d(500, 500), name = "panel entity" ) // [END androidxr_compose_PanelEntityWithView] diff --git a/xr/src/main/java/com/example/xr/compose/Volume.kt b/xr/src/main/java/com/example/xr/compose/Volume.kt index 83073c224..cfc51d06e 100644 --- a/xr/src/main/java/com/example/xr/compose/Volume.kt +++ b/xr/src/main/java/com/example/xr/compose/Volume.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.xr.compose.platform.LocalSession import androidx.xr.compose.spatial.Subspace +import androidx.xr.compose.subspace.ExperimentalSubspaceVolumeApi import androidx.xr.compose.subspace.SpatialPanel import androidx.xr.compose.subspace.Volume import androidx.xr.compose.subspace.layout.SubspaceModifier @@ -38,6 +39,7 @@ import androidx.xr.compose.subspace.layout.scale import androidx.xr.compose.subspace.layout.width import kotlinx.coroutines.launch +@Suppress("RestrictedApi") // b/416066566 @Composable private fun VolumeExample() { // [START androidxr_compose_Volume] @@ -62,6 +64,7 @@ private fun VolumeExample() { } // [START androidxr_compose_ObjectInAVolume] +@OptIn(ExperimentalSubspaceVolumeApi::class) @Composable fun ObjectInAVolume(show3DObject: Boolean) { // [START_EXCLUDE silent] diff --git a/xr/src/main/java/com/example/xr/misc/ModeTransition.kt b/xr/src/main/java/com/example/xr/misc/ModeTransition.kt index dca0ddbfb..9c0a47e90 100644 --- a/xr/src/main/java/com/example/xr/misc/ModeTransition.kt +++ b/xr/src/main/java/com/example/xr/misc/ModeTransition.kt @@ -30,6 +30,7 @@ fun modeTransitionCompose() { // [END androidxr_misc_modeTransitionCompose] } +@Suppress("RestrictedApi") // b/416066566 fun modeTransitionScenecore(xrSession: Session) { // [START androidxr_misc_modeTransitionScenecore] xrSession.scene.spatialEnvironment.requestHomeSpaceMode() diff --git a/xr/src/main/java/com/example/xr/runtime/Session.kt b/xr/src/main/java/com/example/xr/runtime/Session.kt index f2fd85a2a..07f2fae3e 100644 --- a/xr/src/main/java/com/example/xr/runtime/Session.kt +++ b/xr/src/main/java/com/example/xr/runtime/Session.kt @@ -41,6 +41,8 @@ fun Activity.createSession() { } is SessionCreatePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) + else -> + TODO(/* A different unhandled exception was thrown. */) } // [END androidxr_session_create] } diff --git a/xr/src/main/java/com/example/xr/scenecore/Entities.kt b/xr/src/main/java/com/example/xr/scenecore/Entities.kt index d4c723604..c5489bd6b 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Entities.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Entities.kt @@ -17,17 +17,17 @@ package com.example.xr.scenecore import androidx.xr.runtime.Session +import androidx.xr.runtime.math.FloatSize3d import androidx.xr.runtime.math.Pose import androidx.xr.runtime.math.Quaternion import androidx.xr.runtime.math.Vector3 import androidx.xr.scenecore.AnchorPlacement -import androidx.xr.scenecore.Dimensions import androidx.xr.scenecore.Entity import androidx.xr.scenecore.InputEvent import androidx.xr.scenecore.InteractableComponent import androidx.xr.scenecore.MovableComponent -import androidx.xr.scenecore.PlaneSemantic -import androidx.xr.scenecore.PlaneType +import androidx.xr.scenecore.PlaneOrientation +import androidx.xr.scenecore.PlaneSemanticType import androidx.xr.scenecore.ResizableComponent import androidx.xr.scenecore.ResizeListener import androidx.xr.scenecore.SurfaceEntity @@ -45,11 +45,11 @@ private fun setPoseExample(entity: Entity) { // [END androidxr_scenecore_entity_setPoseExample] } -private fun hideEntity(entity: Entity) { - // [START androidxr_scenecore_entity_hideEntity] - // Hide the entity - entity.setHidden(true) - // [END androidxr_scenecore_entity_hideEntity] +private fun disableEntity(entity: Entity) { + // [START androidxr_scenecore_entity_setEnabled] + // Disable the entity. + entity.setEnabled(false) + // [END androidxr_scenecore_entity_setEnabled] } private fun entitySetScale(entity: Entity) { @@ -59,11 +59,12 @@ private fun entitySetScale(entity: Entity) { // [END androidxr_scenecore_entity_entitySetScale] } +@Suppress("RestrictedApi") // b/416066566 private fun moveableComponentExample(session: Session, entity: Entity) { // [START androidxr_scenecore_moveableComponentExample] val anchorPlacement = AnchorPlacement.createForPlanes( - planeTypeFilter = setOf(PlaneSemantic.FLOOR, PlaneSemantic.TABLE), - planeSemanticFilter = setOf(PlaneType.VERTICAL) + planeTypeFilter = setOf(PlaneOrientation.VERTICAL), + planeSemanticFilter = setOf(PlaneSemanticType.FLOOR, PlaneSemanticType.TABLE) ) val movableComponent = MovableComponent.create( @@ -76,16 +77,17 @@ private fun moveableComponentExample(session: Session, entity: Entity) { // [END androidxr_scenecore_moveableComponentExample] } +@Suppress("RestrictedApi") // b/416066566 private fun resizableComponentExample(session: Session, entity: Entity, executor: Executor) { // [START androidxr_scenecore_resizableComponentExample] val resizableComponent = ResizableComponent.create(session) - resizableComponent.minimumSize = Dimensions(177f, 100f, 1f) + resizableComponent.minimumSize = FloatSize3d(177f, 100f, 1f) resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio resizableComponent.addResizeListener( executor, object : ResizeListener { - override fun onResizeEnd(entity: Entity, finalSize: Dimensions) { + override fun onResizeEnd(entity: Entity, finalSize: FloatSize3d) { // update the size in the component resizableComponent.size = finalSize @@ -100,6 +102,7 @@ private fun resizableComponentExample(session: Session, entity: Entity, executor // [END androidxr_scenecore_resizableComponentExample] } +@Suppress("RestrictedApi") // b/416066566 private fun interactableComponentExample(session: Session, entity: Entity) { // [START androidxr_scenecore_interactableComponentExample] val executor = Executors.newSingleThreadExecutor() diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index 35f753569..aff3bdaec 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -16,27 +16,30 @@ package com.example.xr.scenecore +import android.content.Context import androidx.xr.runtime.Session import androidx.xr.scenecore.ExrImage import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.SpatialEnvironment import androidx.xr.scenecore.scene +import java.nio.file.Paths import kotlinx.coroutines.guava.await private class Environments(val session: Session) { - suspend fun loadEnvironmentGeometry() { + suspend fun loadEnvironmentGeometry(context: Context) { // [START androidxr_scenecore_environment_loadEnvironmentGeometry] - val environmentGeometryFuture = GltfModel.create(session, "DayGeometry.glb") + val environmentGeometryFuture = GltfModel.createAsync(session, Paths.get("DayGeometry.glb")) val environmentGeometry = environmentGeometryFuture.await() // [END androidxr_scenecore_environment_loadEnvironmentGeometry] } - fun loadEnvironmentSkybox() { + suspend fun loadEnvironmentSkybox() { // [START androidxr_scenecore_environment_loadEnvironmentSkybox] - val lightingForSkybox = ExrImage.create(session, "BlueSkyboxLighting.zip") + val lightingForSkybox = ExrImage.createFromZipAsync(session, Paths.get("BlueSkyboxLighting.zip")).await() // [END androidxr_scenecore_environment_loadEnvironmentSkybox] } + @Suppress("RestrictedApi") // b/416066566 fun setEnvironmentPreference(environmentGeometry: GltfModel, lightingForSkybox: ExrImage) { // [START androidxr_scenecore_environment_setEnvironmentPreference] val spatialEnvironmentPreference = @@ -53,6 +56,7 @@ private class Environments(val session: Session) { // [END androidxr_scenecore_environment_setEnvironmentPreference] } + @Suppress("RestrictedApi") // b/416066566 fun setPassthroughOpacityPreference() { // [START androidxr_scenecore_environment_setPassthroughOpacityPreference] val preferenceResult = session.scene.spatialEnvironment.setPassthroughOpacityPreference(1.0f) @@ -70,6 +74,7 @@ private class Environments(val session: Session) { // [END androidxr_scenecore_environment_setPassthroughOpacityPreference] } + @Suppress("RestrictedApi") // b/416066566 fun getCurrentPassthroughOpacity() { // [START androidxr_scenecore_environment_getCurrentPassthroughOpacity] val currentPassthroughOpacity = session.scene.spatialEnvironment.getCurrentPassthroughOpacity() diff --git a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt index c7181e2f3..b26bb9f12 100644 --- a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt +++ b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt @@ -25,14 +25,16 @@ import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.GltfModelEntity import androidx.xr.scenecore.SpatialCapabilities import androidx.xr.scenecore.scene +import java.nio.file.Paths import kotlinx.coroutines.guava.await private suspend fun loadGltfFile(session: Session) { // [START androidxr_scenecore_gltfmodel_create] - val gltfModel = GltfModel.create(session, "models/saturn_rings.glb").await() + val gltfModel = GltfModel.createAsync(session, Paths.get("models", "saturn_rings.glb")).await() // [END androidxr_scenecore_gltfmodel_create] } +@Suppress("RestrictedApi") // b/416066566 private fun createModelEntity(session: Session, gltfModel: GltfModel) { // [START androidxr_scenecore_gltfmodelentity_create] if (session.scene.spatialCapabilities @@ -43,6 +45,7 @@ private fun createModelEntity(session: Session, gltfModel: GltfModel) { // [END androidxr_scenecore_gltfmodelentity_create] } +@Suppress("RestrictedApi") // b/416066566 private fun animateEntity(gltfEntity: GltfModelEntity) { // [START androidxr_scenecore_gltfmodelentity_animation] gltfEntity.startAnimation(loop = true, animationName = "Walk") diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt index 1d1eac1ae..d33022eb0 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt @@ -32,6 +32,7 @@ import androidx.xr.scenecore.SpatialSoundPool import androidx.xr.scenecore.SpatializerConstants import androidx.xr.scenecore.scene +@Suppress("RestrictedApi") // b/416066566 private fun playSpatialAudioAtEntity(session: Session, appContext: Context, entity: Entity) { // [START androidxr_scenecore_playSpatialAudio] // Check spatial capabilities before using spatial audio @@ -78,6 +79,7 @@ private fun playSpatialAudioAtEntity(session: Session, appContext: Context, enti // [END androidxr_scenecore_playSpatialAudio] } +@Suppress("RestrictedApi") // b/416066566 private fun playSpatialAudioAtEntitySurround(session: Session, appContext: Context) { // [START androidxr_scenecore_playSpatialAudioSurround] // Check spatial capabilities before using spatial audio @@ -113,6 +115,7 @@ private fun playSpatialAudioAtEntitySurround(session: Session, appContext: Conte // [END androidxr_scenecore_playSpatialAudioSurround] } +@Suppress("RestrictedApi") // b/416066566 private fun playSpatialAudioAtEntityAmbionics(session: Session, appContext: Context) { // [START androidxr_scenecore_playSpatialAudioAmbionics] // Check spatial capabilities before using spatial audio diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt index fcfcdf5a8..f7127d128 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt @@ -20,6 +20,7 @@ import androidx.xr.runtime.Session import androidx.xr.scenecore.SpatialCapabilities import androidx.xr.scenecore.scene +@Suppress("RestrictedApi") // b/416066566 fun checkMultipleCapabilities(xrSession: Session) { // [START androidxr_compose_checkMultipleCapabilities] // Example 1: check if enabling passthrough mode is allowed diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt index 460d35db2..bf960cfec 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt @@ -27,6 +27,7 @@ import androidx.xr.runtime.math.Vector3 import androidx.xr.scenecore.SurfaceEntity import androidx.xr.scenecore.scene +@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreate(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreate] val stereoSurfaceEntity = SurfaceEntity.create( @@ -49,6 +50,7 @@ private fun ComponentActivity.surfaceEntityCreate(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreate] } +@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateSbs(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateSbs] // Set up the surface for playing a 180° video on a hemisphere. @@ -66,6 +68,7 @@ private fun ComponentActivity.surfaceEntityCreateSbs(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreateSbs] } +@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateTb(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateTb] // Set up the surface for playing a 360° video on a sphere. @@ -83,6 +86,7 @@ private fun ComponentActivity.surfaceEntityCreateTb(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreateTb] } +@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateMVHEVC(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateMVHEVC] // Create the SurfaceEntity with the StereoMode corresponding to the MV-HEVC content From 47821b33dcb173b44f19edd929a2ad4e776ccc23 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Wed, 18 Jun 2025 17:12:51 +0200 Subject: [PATCH 02/14] Update to snapshot 13663278 --- settings.gradle.kts | 2 +- .../com/example/xr/misc/ModeTransition.kt | 2 +- .../java/com/example/xr/runtime/Session.kt | 19 +------------------ .../com/example/xr/scenecore/Environments.kt | 2 +- .../com/example/xr/scenecore/GltfEntity.kt | 2 +- 5 files changed, 5 insertions(+), 22 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index bf0bcf0b7..1ab82e051 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = "13623196" +val snapshotVersion : String? = "13663278" pluginManagement { repositories { diff --git a/xr/src/main/java/com/example/xr/misc/ModeTransition.kt b/xr/src/main/java/com/example/xr/misc/ModeTransition.kt index 9c0a47e90..bc97400d6 100644 --- a/xr/src/main/java/com/example/xr/misc/ModeTransition.kt +++ b/xr/src/main/java/com/example/xr/misc/ModeTransition.kt @@ -33,6 +33,6 @@ fun modeTransitionCompose() { @Suppress("RestrictedApi") // b/416066566 fun modeTransitionScenecore(xrSession: Session) { // [START androidxr_misc_modeTransitionScenecore] - xrSession.scene.spatialEnvironment.requestHomeSpaceMode() + xrSession.scene.requestHomeSpaceMode() // [END androidxr_misc_modeTransitionScenecore] } diff --git a/xr/src/main/java/com/example/xr/runtime/Session.kt b/xr/src/main/java/com/example/xr/runtime/Session.kt index 07f2fae3e..7d1ac6511 100644 --- a/xr/src/main/java/com/example/xr/runtime/Session.kt +++ b/xr/src/main/java/com/example/xr/runtime/Session.kt @@ -22,8 +22,6 @@ import androidx.xr.compose.platform.LocalSession import androidx.xr.runtime.Session import androidx.xr.runtime.SessionCreatePermissionsNotGranted import androidx.xr.runtime.SessionCreateSuccess -import androidx.xr.runtime.SessionResumePermissionsNotGranted -import androidx.xr.runtime.SessionResumeSuccess // [START androidxr_localsession] @Composable @@ -45,19 +43,4 @@ fun Activity.createSession() { TODO(/* A different unhandled exception was thrown. */) } // [END androidxr_session_create] -} - -fun sessionResume(session: Session) { - // [START androidxr_session_resume] - when (val result = session.resume()) { - is SessionResumeSuccess -> { - // Session has been created successfully. - // Attach any successful handlers here. - } - - is SessionResumePermissionsNotGranted -> { - // Request permissions in `result.permissions`. - } - } - // [END androidxr_session_resume] -} +} \ No newline at end of file diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index aff3bdaec..1b00ba751 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -22,8 +22,8 @@ import androidx.xr.scenecore.ExrImage import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.SpatialEnvironment import androidx.xr.scenecore.scene -import java.nio.file.Paths import kotlinx.coroutines.guava.await +import java.nio.file.Paths private class Environments(val session: Session) { suspend fun loadEnvironmentGeometry(context: Context) { diff --git a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt index b26bb9f12..6aff8588b 100644 --- a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt +++ b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt @@ -25,8 +25,8 @@ import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.GltfModelEntity import androidx.xr.scenecore.SpatialCapabilities import androidx.xr.scenecore.scene -import java.nio.file.Paths import kotlinx.coroutines.guava.await +import java.nio.file.Paths private suspend fun loadGltfFile(session: Session) { // [START androidxr_scenecore_gltfmodel_create] From d33a5e0858e42d4cdd1b604795ff8b814a3cbdbf Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Mon, 23 Jun 2025 15:02:03 +0200 Subject: [PATCH 03/14] Update to snapshot 13681046 --- settings.gradle.kts | 2 +- .../com/example/xr/scenecore/Environments.kt | 28 ++++++++++--------- .../xr/scenecore/SpatialCapabilities.kt | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 1ab82e051..9ad626832 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = "13663278" +val snapshotVersion : String? = "13681046" pluginManagement { repositories { diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index 1b00ba751..dece33eac 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -44,32 +44,34 @@ private class Environments(val session: Session) { // [START androidxr_scenecore_environment_setEnvironmentPreference] val spatialEnvironmentPreference = SpatialEnvironment.SpatialEnvironmentPreference(lightingForSkybox, environmentGeometry) - val preferenceResult = - session.scene.spatialEnvironment.setSpatialEnvironmentPreference(spatialEnvironmentPreference) - if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangeApplied()) { + session.scene.spatialEnvironment.preferredSpatialEnvironment = spatialEnvironmentPreference + if (session.scene.spatialEnvironment.isPreferredSpatialEnvironmentActive) { // The environment was successfully updated and is now visible, and any listeners // specified using addOnSpatialEnvironmentChangedListener will be notified. - } else if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangePending()) { - // The environment is in the process of being updated. Once visible, any listeners - // specified using addOnSpatialEnvironmentChangedListener will be notified. - } + } else { + // The passthrough opacity preference was successfully set, but not + // immediately visible. The passthrough opacity change will be applied + // when the activity has the SPATIAL_CAPABILITY_APP_ENVIRONMENT capability. + // Then, any listeners specified using addOnSpatialEnvironmentChangedListener + // will be notified. + } // [END androidxr_scenecore_environment_setEnvironmentPreference] } @Suppress("RestrictedApi") // b/416066566 fun setPassthroughOpacityPreference() { // [START androidxr_scenecore_environment_setPassthroughOpacityPreference] - val preferenceResult = session.scene.spatialEnvironment.setPassthroughOpacityPreference(1.0f) - if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangeApplied()) { + session.scene.spatialEnvironment.preferredPassthroughOpacity = 1.0f + if (session.scene.spatialEnvironment.currentPassthroughOpacity == 1.0f) { // The passthrough opacity request succeeded and should be visible now, and any listeners - // specified using addOnPassthroughOpacityChangedListener will be notified - } else if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangePending()) { + // specified using addOnPassthroughOpacityChangedListener will be notified. + } else { // The passthrough opacity preference was successfully set, but not // immediately visible. The passthrough opacity change will be applied // when the activity has the // SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL capability. // Then, any listeners specified using addOnPassthroughOpacityChangedListener - // will be notified + // will be notified. } // [END androidxr_scenecore_environment_setPassthroughOpacityPreference] } @@ -77,7 +79,7 @@ private class Environments(val session: Session) { @Suppress("RestrictedApi") // b/416066566 fun getCurrentPassthroughOpacity() { // [START androidxr_scenecore_environment_getCurrentPassthroughOpacity] - val currentPassthroughOpacity = session.scene.spatialEnvironment.getCurrentPassthroughOpacity() + val currentPassthroughOpacity = session.scene.spatialEnvironment.currentPassthroughOpacity // [END androidxr_scenecore_environment_getCurrentPassthroughOpacity] } } diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt index f7127d128..c830274e8 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt @@ -28,7 +28,7 @@ fun checkMultipleCapabilities(xrSession: Session) { SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL ) ) { - xrSession.scene.spatialEnvironment.setPassthroughOpacityPreference(0f) + xrSession.scene.spatialEnvironment.preferredPassthroughOpacity = 1f } // Example 2: multiple capability flags can be checked simultaneously: if (xrSession.scene.spatialCapabilities.hasCapability( From 743739b27ef2d922575ab2db74e91e92be3fff76 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Wed, 25 Jun 2025 12:58:37 +0200 Subject: [PATCH 04/14] Update to snapshot 13693757 --- settings.gradle.kts | 2 +- xr/src/main/java/com/example/xr/scenecore/Environments.kt | 3 +-- xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 9ad626832..0c037c61e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = "13681046" +val snapshotVersion : String? = "13693757" pluginManagement { repositories { diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index dece33eac..d47e4879d 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -28,8 +28,7 @@ import java.nio.file.Paths private class Environments(val session: Session) { suspend fun loadEnvironmentGeometry(context: Context) { // [START androidxr_scenecore_environment_loadEnvironmentGeometry] - val environmentGeometryFuture = GltfModel.createAsync(session, Paths.get("DayGeometry.glb")) - val environmentGeometry = environmentGeometryFuture.await() + val environmentGeometry = GltfModel.create(session, Paths.get("DayGeometry.glb")) // [END androidxr_scenecore_environment_loadEnvironmentGeometry] } diff --git a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt index 6aff8588b..900aef7bc 100644 --- a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt +++ b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt @@ -30,7 +30,7 @@ import java.nio.file.Paths private suspend fun loadGltfFile(session: Session) { // [START androidxr_scenecore_gltfmodel_create] - val gltfModel = GltfModel.createAsync(session, Paths.get("models", "saturn_rings.glb")).await() + val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb")) // [END androidxr_scenecore_gltfmodel_create] } From fe8a25323915bf9c485fb1ef9bfe9f0237588205 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Wed, 25 Jun 2025 13:00:20 +0200 Subject: [PATCH 05/14] Remove guava dependency --- xr/build.gradle.kts | 2 -- xr/src/main/java/com/example/xr/scenecore/Environments.kt | 3 +-- xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/xr/build.gradle.kts b/xr/build.gradle.kts index 5c886df08..884f49e9c 100644 --- a/xr/build.gradle.kts +++ b/xr/build.gradle.kts @@ -41,8 +41,6 @@ dependencies { implementation("com.google.ar:impress:0.0.3") implementation(libs.androidx.activity.ktx) - implementation(libs.guava) - implementation(libs.kotlinx.coroutines.guava) implementation(libs.androidx.media3.exoplayer) diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index d47e4879d..d3d2577b2 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -22,7 +22,6 @@ import androidx.xr.scenecore.ExrImage import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.SpatialEnvironment import androidx.xr.scenecore.scene -import kotlinx.coroutines.guava.await import java.nio.file.Paths private class Environments(val session: Session) { @@ -34,7 +33,7 @@ private class Environments(val session: Session) { suspend fun loadEnvironmentSkybox() { // [START androidxr_scenecore_environment_loadEnvironmentSkybox] - val lightingForSkybox = ExrImage.createFromZipAsync(session, Paths.get("BlueSkyboxLighting.zip")).await() + val lightingForSkybox = ExrImage.createFromZip(session, Paths.get("BlueSkyboxLighting.zip")) // [END androidxr_scenecore_environment_loadEnvironmentSkybox] } diff --git a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt index 900aef7bc..2cce055ba 100644 --- a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt +++ b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt @@ -25,7 +25,6 @@ import androidx.xr.scenecore.GltfModel import androidx.xr.scenecore.GltfModelEntity import androidx.xr.scenecore.SpatialCapabilities import androidx.xr.scenecore.scene -import kotlinx.coroutines.guava.await import java.nio.file.Paths private suspend fun loadGltfFile(session: Session) { From 469feb69b5bc8fd731e0405951e8dd88354eb9b0 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Wed, 25 Jun 2025 13:00:48 +0200 Subject: [PATCH 06/14] Spotless apply --- xr/src/main/java/com/example/xr/runtime/Session.kt | 2 +- xr/src/main/java/com/example/xr/scenecore/Environments.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xr/src/main/java/com/example/xr/runtime/Session.kt b/xr/src/main/java/com/example/xr/runtime/Session.kt index 7d1ac6511..34be7c873 100644 --- a/xr/src/main/java/com/example/xr/runtime/Session.kt +++ b/xr/src/main/java/com/example/xr/runtime/Session.kt @@ -43,4 +43,4 @@ fun Activity.createSession() { TODO(/* A different unhandled exception was thrown. */) } // [END androidxr_session_create] -} \ No newline at end of file +} diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index d3d2577b2..b34a4e0c7 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -52,7 +52,7 @@ private class Environments(val session: Session) { // when the activity has the SPATIAL_CAPABILITY_APP_ENVIRONMENT capability. // Then, any listeners specified using addOnSpatialEnvironmentChangedListener // will be notified. - } + } // [END androidxr_scenecore_environment_setEnvironmentPreference] } From 23273081221b42e9158dfc90fb21c38989fc05b8 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Mon, 7 Jul 2025 15:28:57 +0200 Subject: [PATCH 07/14] Update to snapshot 13740187 --- settings.gradle.kts | 2 +- .../java/com/example/xr/scenecore/Entities.kt | 75 ------------------- .../xr/scenecore/InteractableComponent.kt | 42 +++++++++++ .../example/xr/scenecore/MovableComponent.kt | 48 ++++++++++++ .../xr/scenecore/ResizableComponent.kt | 49 ++++++++++++ .../com/example/xr/scenecore/SpatialAudio.kt | 9 +++ 6 files changed, 149 insertions(+), 76 deletions(-) create mode 100644 xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt create mode 100644 xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt create mode 100644 xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index 0c037c61e..ff01ec946 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = "13693757" +val snapshotVersion : String? = "13740187" pluginManagement { repositories { diff --git a/xr/src/main/java/com/example/xr/scenecore/Entities.kt b/xr/src/main/java/com/example/xr/scenecore/Entities.kt index c5489bd6b..cf16f266e 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Entities.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Entities.kt @@ -16,23 +16,10 @@ package com.example.xr.scenecore -import androidx.xr.runtime.Session -import androidx.xr.runtime.math.FloatSize3d import androidx.xr.runtime.math.Pose import androidx.xr.runtime.math.Quaternion import androidx.xr.runtime.math.Vector3 -import androidx.xr.scenecore.AnchorPlacement import androidx.xr.scenecore.Entity -import androidx.xr.scenecore.InputEvent -import androidx.xr.scenecore.InteractableComponent -import androidx.xr.scenecore.MovableComponent -import androidx.xr.scenecore.PlaneOrientation -import androidx.xr.scenecore.PlaneSemanticType -import androidx.xr.scenecore.ResizableComponent -import androidx.xr.scenecore.ResizeListener -import androidx.xr.scenecore.SurfaceEntity -import java.util.concurrent.Executor -import java.util.concurrent.Executors private fun setPoseExample(entity: Entity) { // [START androidxr_scenecore_entity_setPoseExample] @@ -58,65 +45,3 @@ private fun entitySetScale(entity: Entity) { entity.setScale(2f) // [END androidxr_scenecore_entity_entitySetScale] } - -@Suppress("RestrictedApi") // b/416066566 -private fun moveableComponentExample(session: Session, entity: Entity) { - // [START androidxr_scenecore_moveableComponentExample] - val anchorPlacement = AnchorPlacement.createForPlanes( - planeTypeFilter = setOf(PlaneOrientation.VERTICAL), - planeSemanticFilter = setOf(PlaneSemanticType.FLOOR, PlaneSemanticType.TABLE) - ) - - val movableComponent = MovableComponent.create( - session = session, - systemMovable = false, - scaleInZ = false, - anchorPlacement = setOf(anchorPlacement) - ) - entity.addComponent(movableComponent) - // [END androidxr_scenecore_moveableComponentExample] -} - -@Suppress("RestrictedApi") // b/416066566 -private fun resizableComponentExample(session: Session, entity: Entity, executor: Executor) { - // [START androidxr_scenecore_resizableComponentExample] - val resizableComponent = ResizableComponent.create(session) - resizableComponent.minimumSize = FloatSize3d(177f, 100f, 1f) - resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio - - resizableComponent.addResizeListener( - executor, - object : ResizeListener { - override fun onResizeEnd(entity: Entity, finalSize: FloatSize3d) { - - // update the size in the component - resizableComponent.size = finalSize - - // update the Entity to reflect the new size - (entity as SurfaceEntity).canvasShape = SurfaceEntity.CanvasShape.Quad(finalSize.width, finalSize.height) - } - }, - ) - - entity.addComponent(resizableComponent) - // [END androidxr_scenecore_resizableComponentExample] -} - -@Suppress("RestrictedApi") // b/416066566 -private fun interactableComponentExample(session: Session, entity: Entity) { - // [START androidxr_scenecore_interactableComponentExample] - val executor = Executors.newSingleThreadExecutor() - val interactableComponent = InteractableComponent.create(session, executor) { - // when the user disengages with the entity with their hands - if (it.source == InputEvent.SOURCE_HANDS && it.action == InputEvent.ACTION_UP) { - // increase size with right hand and decrease with left - if (it.pointerType == InputEvent.POINTER_TYPE_RIGHT) { - entity.setScale(1.5f) - } else if (it.pointerType == InputEvent.POINTER_TYPE_LEFT) { - entity.setScale(0.5f) - } - } - } - entity.addComponent(interactableComponent) - // [END androidxr_scenecore_interactableComponentExample] -} diff --git a/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt new file mode 100644 index 000000000..fde4d0eaf --- /dev/null +++ b/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt @@ -0,0 +1,42 @@ +/* + * 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.scenecore + +import androidx.xr.runtime.Session +import androidx.xr.scenecore.Entity +import androidx.xr.scenecore.InputEvent +import androidx.xr.scenecore.InteractableComponent +import java.util.concurrent.Executors + +@Suppress("RestrictedApi") // b/416066566 +private fun interactableComponentExample(session: Session, entity: Entity) { + // [START androidxr_scenecore_interactableComponentExample] + val executor = Executors.newSingleThreadExecutor() + val interactableComponent = InteractableComponent.create(session, executor) { + // when the user disengages with the entity with their hands + if (it.source == InputEvent.Source.SOURCE_HANDS && it.action == InputEvent.Action.ACTION_UP) { + // increase size with right hand and decrease with left + if (it.pointerType == InputEvent.Pointer.POINTER_TYPE_RIGHT) { + entity.setScale(1.5f) + } else if (it.pointerType == InputEvent.Pointer.POINTER_TYPE_LEFT) { + entity.setScale(0.5f) + } + } + } + entity.addComponent(interactableComponent) + // [END androidxr_scenecore_interactableComponentExample] +} diff --git a/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt new file mode 100644 index 000000000..1e275ff0c --- /dev/null +++ b/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt @@ -0,0 +1,48 @@ +/* + * 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.scenecore + +import androidx.xr.runtime.Session +import androidx.xr.scenecore.AnchorPlacement +import androidx.xr.scenecore.Entity +import androidx.xr.scenecore.MovableComponent +import androidx.xr.scenecore.PlaneOrientation +import androidx.xr.scenecore.PlaneSemanticType + +@Suppress("RestrictedApi") // b/416066566 +private fun createSystemMovable(session: Session, entity: Entity) { + // [START androidxr_scenecore_movableComponent_createSystemMovable] + val movableComponent = MovableComponent.createSystemMovable(session) + entity.addComponent(movableComponent) + // [END androidxr_scenecore_movableComponent_createSystemMovable] +} + +@Suppress("RestrictedApi") // b/416066566 +private fun movableComponentAnchorExample(session: Session, entity: Entity) { + // [START androidxr_scenecore_movableComponent_anchorable] + val anchorPlacement = AnchorPlacement.createForPlanes( + anchorablePlaneOrientations = setOf(PlaneOrientation.VERTICAL), + anchorablePlaneSemanticTypes = setOf(PlaneSemanticType.FLOOR, PlaneSemanticType.TABLE) + ) + + val movableComponent = MovableComponent.createAnchorable( + session = session, + anchorPlacement = setOf(anchorPlacement) + ) + entity.addComponent(movableComponent) + // [END androidxr_scenecore_movableComponent_anchorable] +} diff --git a/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt new file mode 100644 index 000000000..6dbb62720 --- /dev/null +++ b/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt @@ -0,0 +1,49 @@ +/* + * 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.scenecore + +import androidx.xr.runtime.Session +import androidx.xr.runtime.math.FloatSize3d +import androidx.xr.scenecore.Entity +import androidx.xr.scenecore.ResizableComponent +import androidx.xr.scenecore.ResizeListener +import androidx.xr.scenecore.SurfaceEntity +import java.util.concurrent.Executor + +@Suppress("RestrictedApi") // b/416066566 +private fun resizableComponentExample(session: Session, entity: Entity, executor: Executor) { + // [START androidxr_scenecore_resizableComponentExample] + val resizableComponent = ResizableComponent.create(session) + resizableComponent.minimumSize = FloatSize3d(177f, 100f, 1f) + resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio + + resizableComponent.addResizeListener( + executor, + object : ResizeListener { + override fun onResizeEnd(entity: Entity, finalSize: FloatSize3d) { + // update the size in the component + resizableComponent.size = finalSize + + // update the Entity to reflect the new size + (entity as SurfaceEntity).canvasShape = SurfaceEntity.CanvasShape.Quad(finalSize.width, finalSize.height) + } + }, + ) + + entity.addComponent(resizableComponent) + // [END androidxr_scenecore_resizableComponentExample] +} diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt index d33022eb0..ffa436012 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt @@ -20,6 +20,7 @@ import android.content.Context import android.media.AudioAttributes import android.media.AudioAttributes.CONTENT_TYPE_SONIFICATION import android.media.AudioAttributes.USAGE_ASSISTANCE_SONIFICATION +import android.media.MediaCodecList import android.media.MediaPlayer import android.media.SoundPool import androidx.xr.runtime.Session @@ -152,3 +153,11 @@ private fun playSpatialAudioAtEntityAmbionics(session: Session, appContext: Cont } // [END androidxr_scenecore_playSpatialAudioAmbionics] } + +private fun detectSupport() { + // [START androidxr_scenecore_dolby_detect_support] + val codecInfos = MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos + fun supportsEac3SDecoding() = codecInfos.any { !it.isEncoder && it.supportedTypes.any { it == "audio/aec3" } } + fun supportsAc4Decoding() = codecInfos.any { !it.isEncoder && it.supportedTypes.any { it == "audio/ac4" } } + // [END androidxr_scenecore_dolby_detect_support] +} From 8c1455e17daf6438d0ff1b6cbb3b23f6770f6a7c Mon Sep 17 00:00:00 2001 From: azeppenfeld Date: Fri, 18 Jul 2025 10:20:40 -0700 Subject: [PATCH 08/14] Add snippets for xr DRM --- .../xr/compose/SpatialExternalSurface.kt | 46 +++++++++++++++++++ .../com/example/xr/scenecore/SpatialVideo.kt | 41 +++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt index 58798226f..3b90aed4a 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt @@ -23,11 +23,13 @@ import androidx.compose.runtime.ExperimentalComposeApi import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer import androidx.xr.compose.spatial.Subspace import androidx.xr.compose.subspace.SpatialExternalSurface import androidx.xr.compose.subspace.StereoMode +import androidx.xr.compose.subspace.SurfaceProtection import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width @@ -72,3 +74,47 @@ fun SpatialExternalSurfaceContent() { } } // [END androidxr_compose_SpatialExternalSurfaceStereo] + +// [START androidxr_compose_SpatialExternalSurfaceDRM] +@OptIn(ExperimentalComposeApi::class) +@Suppress("RestrictedApi") // b/416066566 +@Composable +fun DrmSpatialVideoPlayer() { + val context = LocalContext.current + Subspace { + SpatialExternalSurface( + modifier = SubspaceModifier + .width(1200.dp) + .height(676.dp), + stereoMode = StereoMode.SideBySide, + surfaceProtection = SurfaceProtection.Protected + ) { + val exoPlayer = remember { ExoPlayer.Builder(context).build() } + + // Define the URI for your DRM-protected content and license server. + val videoUri = "https://your-content-provider.com/video.mpd" + val drmLicenseUrl = "https://your-license-server.com/license" + + // Build a MediaItem with the necessary DRM configuration. + val mediaItem = MediaItem.Builder() + .setUri(videoUri) + .setDrmConfiguration( + MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(drmLicenseUrl) + .build() + ) + .build() + + onSurfaceCreated { surface -> + // The created surface is secure and can be used by the player. + exoPlayer.setVideoSurface(surface) + exoPlayer.setMediaItem(mediaItem) + exoPlayer.prepare() + exoPlayer.play() + } + + onSurfaceDestroyed { exoPlayer.release() } + } + } +} +// [END androidxr_compose_SpatialExternalSurfaceDRM] \ No newline at end of file diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt index bf960cfec..590c000e8 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt @@ -19,6 +19,7 @@ package com.example.xr.scenecore import android.content.ContentResolver import android.net.Uri import androidx.activity.ComponentActivity +import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer import androidx.xr.runtime.Session @@ -109,3 +110,43 @@ private fun ComponentActivity.surfaceEntityCreateMVHEVC(xrSession: Session) { exoPlayer.play() // [END androidxr_scenecore_surfaceEntityCreateMVHEVC] } + +@Suppress("RestrictedApi") // b/416066566 +private fun ComponentActivity.surfaceEntityCreateDRM(xrSession: Session) { + // [START androidxr_scenecore_surfaceEntityCreateDRM] + // Create a SurfaceEntity with DRM content + + // Define the URI for your DRM-protected content and license server. + val videoUri = "https://your-content-provider.com/video.mpd" + val drmLicenseUrl = "https://your-license-server.com/license" + + // Create the SurfaceEntity with the PROTECTED content security level. + val protectedSurfaceEntity = SurfaceEntity.create( + session = xrSession, + stereoMode = SurfaceEntity.StereoMode.SIDE_BY_SIDE, + pose = Pose(Vector3(0.0f, 0.0f, -1.5f)), + canvasShape = SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f), + contentSecurityLevel = SurfaceEntity.ContentSecurityLevel.PROTECTED + ) + + // Build a MediaItem with the necessary DRM configuration. + val mediaItem = MediaItem.Builder() + .setUri(videoUri) + .setDrmConfiguration( + MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) + .setLicenseUri(drmLicenseUrl) + .build() + ) + .build() + + // Initialize ExoPlayer and set the protected surface. + val exoPlayer = ExoPlayer.Builder(this).build() + exoPlayer.setVideoSurface(protectedSurfaceEntity.getSurface()) + + // Set the media item and start playback. + exoPlayer.setMediaItem(mediaItem) + exoPlayer.prepare() + exoPlayer.play() + + // [END androidxr_scenecore_surfaceEntityCreateDRM] +} From 42f9dda2111a6a7a286e82dba1afd1735a8a1c24 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Mon, 21 Jul 2025 15:55:33 +0200 Subject: [PATCH 09/14] Update to snapshot 13790637 --- settings.gradle.kts | 2 +- .../java/com/example/xr/arcore/Anchors.kt | 3 -- .../main/java/com/example/xr/arcore/Hands.kt | 3 -- .../main/java/com/example/xr/arcore/Planes.kt | 3 -- .../xr/compose/SpatialExternalSurface.kt | 2 +- .../java/com/example/xr/runtime/Session.kt | 7 ++-- .../xr/scenecore/ResizableComponent.kt | 33 ++++++++----------- 7 files changed, 18 insertions(+), 35 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index ff01ec946..374e658ea 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = "13740187" +val snapshotVersion : String? = "13790637" pluginManagement { repositories { diff --git a/xr/src/main/java/com/example/xr/arcore/Anchors.kt b/xr/src/main/java/com/example/xr/arcore/Anchors.kt index a104e2ab1..33b4305bf 100644 --- a/xr/src/main/java/com/example/xr/arcore/Anchors.kt +++ b/xr/src/main/java/com/example/xr/arcore/Anchors.kt @@ -22,7 +22,6 @@ import androidx.xr.arcore.Trackable import androidx.xr.runtime.Config import androidx.xr.runtime.Session import androidx.xr.runtime.SessionConfigureConfigurationNotSupported -import androidx.xr.runtime.SessionConfigurePermissionsNotGranted import androidx.xr.runtime.SessionConfigureSuccess import androidx.xr.runtime.math.Pose import androidx.xr.scenecore.AnchorEntity @@ -37,8 +36,6 @@ fun configureAnchoring(session: Session) { when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) - is SessionConfigurePermissionsNotGranted -> - TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) diff --git a/xr/src/main/java/com/example/xr/arcore/Hands.kt b/xr/src/main/java/com/example/xr/arcore/Hands.kt index 3b68b50de..ace28d563 100644 --- a/xr/src/main/java/com/example/xr/arcore/Hands.kt +++ b/xr/src/main/java/com/example/xr/arcore/Hands.kt @@ -24,7 +24,6 @@ import androidx.xr.runtime.Config import androidx.xr.runtime.HandJointType import androidx.xr.runtime.Session import androidx.xr.runtime.SessionConfigureConfigurationNotSupported -import androidx.xr.runtime.SessionConfigurePermissionsNotGranted import androidx.xr.runtime.SessionConfigureSuccess import androidx.xr.runtime.math.Pose import androidx.xr.runtime.math.Quaternion @@ -43,8 +42,6 @@ fun ComponentActivity.configureSession(session: Session) { when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) - is SessionConfigurePermissionsNotGranted -> - TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) diff --git a/xr/src/main/java/com/example/xr/arcore/Planes.kt b/xr/src/main/java/com/example/xr/arcore/Planes.kt index 2eda1147d..f19a9065c 100644 --- a/xr/src/main/java/com/example/xr/arcore/Planes.kt +++ b/xr/src/main/java/com/example/xr/arcore/Planes.kt @@ -20,7 +20,6 @@ import androidx.xr.arcore.Plane import androidx.xr.runtime.Config import androidx.xr.runtime.Session import androidx.xr.runtime.SessionConfigureConfigurationNotSupported -import androidx.xr.runtime.SessionConfigurePermissionsNotGranted import androidx.xr.runtime.SessionConfigureSuccess import androidx.xr.runtime.math.Pose import androidx.xr.runtime.math.Ray @@ -34,8 +33,6 @@ fun configurePlaneTracking(session: Session) { when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) - is SessionConfigurePermissionsNotGranted -> - TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) diff --git a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt index 3b90aed4a..4744f12f0 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt @@ -117,4 +117,4 @@ fun DrmSpatialVideoPlayer() { } } } -// [END androidxr_compose_SpatialExternalSurfaceDRM] \ No newline at end of file +// [END androidxr_compose_SpatialExternalSurfaceDRM] diff --git a/xr/src/main/java/com/example/xr/runtime/Session.kt b/xr/src/main/java/com/example/xr/runtime/Session.kt index 34be7c873..2a9f84ff1 100644 --- a/xr/src/main/java/com/example/xr/runtime/Session.kt +++ b/xr/src/main/java/com/example/xr/runtime/Session.kt @@ -16,11 +16,10 @@ package com.example.xr.runtime -import android.app.Activity +import androidx.activity.ComponentActivity import androidx.compose.runtime.Composable import androidx.xr.compose.platform.LocalSession import androidx.xr.runtime.Session -import androidx.xr.runtime.SessionCreatePermissionsNotGranted import androidx.xr.runtime.SessionCreateSuccess // [START androidxr_localsession] @@ -30,15 +29,13 @@ fun ComposableUsingSession() { } // [END androidxr_localsession] -fun Activity.createSession() { +fun ComponentActivity.createSession() { // [START androidxr_session_create] when (val result = Session.create(this)) { is SessionCreateSuccess -> { val xrSession = result.session // ... } - is SessionCreatePermissionsNotGranted -> - TODO(/* The required permissions in result.permissions have not been granted. */) else -> TODO(/* A different unhandled exception was thrown. */) } diff --git a/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt index 6dbb62720..f1ab6e1f4 100644 --- a/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt +++ b/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt @@ -18,32 +18,27 @@ package com.example.xr.scenecore import androidx.xr.runtime.Session import androidx.xr.runtime.math.FloatSize3d -import androidx.xr.scenecore.Entity import androidx.xr.scenecore.ResizableComponent -import androidx.xr.scenecore.ResizeListener +import androidx.xr.scenecore.ResizeEvent import androidx.xr.scenecore.SurfaceEntity import java.util.concurrent.Executor @Suppress("RestrictedApi") // b/416066566 -private fun resizableComponentExample(session: Session, entity: Entity, executor: Executor) { +private fun resizableComponentExample( + session: Session, + surfaceEntity: SurfaceEntity, + executor: Executor +) { // [START androidxr_scenecore_resizableComponentExample] - val resizableComponent = ResizableComponent.create(session) - resizableComponent.minimumSize = FloatSize3d(177f, 100f, 1f) + val resizableComponent = ResizableComponent.create(session) { event -> + if (event.resizeState == ResizeEvent.ResizeState.RESIZE_STATE_END) { + // update the Entity to reflect the new size + surfaceEntity.canvasShape = SurfaceEntity.CanvasShape.Quad(event.newSize.width, event.newSize.height) + } + } + resizableComponent.minimumEntitySize = FloatSize3d(177f, 100f, 1f) resizableComponent.fixedAspectRatio = 16f / 9f // Specify a 16:9 aspect ratio - resizableComponent.addResizeListener( - executor, - object : ResizeListener { - override fun onResizeEnd(entity: Entity, finalSize: FloatSize3d) { - // update the size in the component - resizableComponent.size = finalSize - - // update the Entity to reflect the new size - (entity as SurfaceEntity).canvasShape = SurfaceEntity.CanvasShape.Quad(finalSize.width, finalSize.height) - } - }, - ) - - entity.addComponent(resizableComponent) + surfaceEntity.addComponent(resizableComponent) // [END androidxr_scenecore_resizableComponentExample] } From adda27d48f9ecf49594525b52fe525d088f66b90 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Tue, 22 Jul 2025 12:53:03 +0200 Subject: [PATCH 10/14] Manual unrestrict on 13790637. --- xr/build.gradle.kts | 3 +++ xr/src/main/java/com/example/xr/arcore/Anchors.kt | 1 - xr/src/main/java/com/example/xr/arcore/Hands.kt | 3 --- xr/src/main/java/com/example/xr/arcore/Planes.kt | 1 - xr/src/main/java/com/example/xr/compose/Orbiter.kt | 2 -- .../main/java/com/example/xr/compose/SpatialCapabilities.kt | 1 - .../java/com/example/xr/compose/SpatialExternalSurface.kt | 2 -- xr/src/main/java/com/example/xr/compose/SpatialLayout.kt | 1 - xr/src/main/java/com/example/xr/compose/SpatialPanel.kt | 2 -- xr/src/main/java/com/example/xr/compose/SpatialRow.kt | 1 - xr/src/main/java/com/example/xr/compose/Subspace.kt | 1 - xr/src/main/java/com/example/xr/compose/Views.kt | 2 -- xr/src/main/java/com/example/xr/compose/Volume.kt | 1 - xr/src/main/java/com/example/xr/misc/ModeTransition.kt | 1 - xr/src/main/java/com/example/xr/scenecore/Environments.kt | 3 --- xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt | 2 -- .../java/com/example/xr/scenecore/InteractableComponent.kt | 1 - .../main/java/com/example/xr/scenecore/MovableComponent.kt | 2 -- .../main/java/com/example/xr/scenecore/ResizableComponent.kt | 1 - xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt | 3 --- .../java/com/example/xr/scenecore/SpatialCapabilities.kt | 1 - xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt | 5 ----- 22 files changed, 3 insertions(+), 37 deletions(-) diff --git a/xr/build.gradle.kts b/xr/build.gradle.kts index 884f49e9c..96edf5c1e 100644 --- a/xr/build.gradle.kts +++ b/xr/build.gradle.kts @@ -25,6 +25,9 @@ android { buildFeatures { compose = true } + lint { + disable += "RestrictedApi" + } } dependencies { diff --git a/xr/src/main/java/com/example/xr/arcore/Anchors.kt b/xr/src/main/java/com/example/xr/arcore/Anchors.kt index 33b4305bf..56c7cb8d7 100644 --- a/xr/src/main/java/com/example/xr/arcore/Anchors.kt +++ b/xr/src/main/java/com/example/xr/arcore/Anchors.kt @@ -63,7 +63,6 @@ private fun createAnchorAtTrackable(trackable: Trackable<*>) { // [END androidxr_arcore_anchor_create_trackable] } -@Suppress("RestrictedApi") // b/422174724 private fun attachEntityToAnchor( session: Session, entity: Entity, diff --git a/xr/src/main/java/com/example/xr/arcore/Hands.kt b/xr/src/main/java/com/example/xr/arcore/Hands.kt index ace28d563..1507bed7c 100644 --- a/xr/src/main/java/com/example/xr/arcore/Hands.kt +++ b/xr/src/main/java/com/example/xr/arcore/Hands.kt @@ -76,7 +76,6 @@ fun secondaryHandDetection(activity: Activity, session: Session) { // [END androidxr_arcore_hand_handedness] } -@Suppress("RestrictedApi") // b/416066566 fun ComponentActivity.renderPlanetAtHandPalm(leftHandState: Hand.State) { val session: Session = null!! val palmEntity: GltfModelEntity = null!! @@ -97,7 +96,6 @@ fun ComponentActivity.renderPlanetAtHandPalm(leftHandState: Hand.State) { // [END androidxr_arcore_hand_entityAtHandPalm] } -@Suppress("RestrictedApi") // b/416066566 fun ComponentActivity.renderPlanetAtFingerTip(rightHandState: Hand.State) { val session: Session = null!! val indexFingerEntity: GltfModelEntity = null!! @@ -120,7 +118,6 @@ fun ComponentActivity.renderPlanetAtFingerTip(rightHandState: Hand.State) { // [END androidxr_arcore_hand_entityAtIndexFingerTip] } -@Suppress("RestrictedApi") // b/416066566 private fun detectPinch(session: Session, handState: Hand.State): Boolean { // [START androidxr_arcore_hand_pinch_gesture] val thumbTip = handState.handJoints[HandJointType.THUMB_TIP] ?: return false diff --git a/xr/src/main/java/com/example/xr/arcore/Planes.kt b/xr/src/main/java/com/example/xr/arcore/Planes.kt index f19a9065c..b5017dcb7 100644 --- a/xr/src/main/java/com/example/xr/arcore/Planes.kt +++ b/xr/src/main/java/com/example/xr/arcore/Planes.kt @@ -48,7 +48,6 @@ private suspend fun subscribePlanes(session: Session) { // [END androidxr_arcore_planes_subscribe] } -@Suppress("RestrictedApi") // b/416066566 private fun hitTestTable(session: Session) { val pose = session.scene.spatialUser.head?.transformPoseTo(Pose(), session.scene.perceptionSpace) ?: return val ray = Ray(pose.translation, pose.forward) diff --git a/xr/src/main/java/com/example/xr/compose/Orbiter.kt b/xr/src/main/java/com/example/xr/compose/Orbiter.kt index e8420610b..f01c4cd1f 100644 --- a/xr/src/main/java/com/example/xr/compose/Orbiter.kt +++ b/xr/src/main/java/com/example/xr/compose/Orbiter.kt @@ -50,7 +50,6 @@ import androidx.xr.compose.subspace.layout.resizable import androidx.xr.compose.subspace.layout.width import com.example.xr.R -@Suppress("RestrictedApi") // b/416066566 @Composable private fun OrbiterExampleSubspace() { // [START androidxr_compose_OrbiterExampleSubspace] @@ -98,7 +97,6 @@ fun OrbiterExample() { // [END androidxr_compose_OrbiterExample] @Composable -@Suppress("RestrictedApi") // b/416066566 fun OrbiterAnchoringExample() { // [START androidxr_compose_OrbiterAnchoringExample] Subspace { diff --git a/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt b/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt index b5ab74ca1..b3af88c13 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialCapabilities.kt @@ -45,7 +45,6 @@ private fun SpatialCapabilitiesCheck() { // [END androidxr_compose_checkSpatialCapabilities] } -@Suppress("RestrictedApi") // b/416066566 @Composable private fun checkSpatialUiEnabled() { // [START androidxr_compose_checkSpatialUiEnabled] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt index 4744f12f0..c42730758 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt @@ -36,7 +36,6 @@ import androidx.xr.compose.subspace.layout.width // [START androidxr_compose_SpatialExternalSurfaceStereo] @OptIn(ExperimentalComposeApi::class) -@Suppress("RestrictedApi") // b/416066566 @Composable fun SpatialExternalSurfaceContent() { val context = LocalContext.current @@ -77,7 +76,6 @@ fun SpatialExternalSurfaceContent() { // [START androidxr_compose_SpatialExternalSurfaceDRM] @OptIn(ExperimentalComposeApi::class) -@Suppress("RestrictedApi") // b/416066566 @Composable fun DrmSpatialVideoPlayer() { val context = LocalContext.current diff --git a/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt b/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt index b68871e9e..b0099b00a 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialLayout.kt @@ -36,7 +36,6 @@ import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width -@Suppress("RestrictedApi") // b/416066566 @Composable private fun SpatialLayoutExampleSubspace() { // [START androidxr_compose_SpatialLayoutExampleSubspace] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt b/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt index ee5f2009e..c3a3a58ef 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialPanel.kt @@ -36,7 +36,6 @@ import androidx.xr.compose.subspace.layout.movable import androidx.xr.compose.subspace.layout.resizable import androidx.xr.compose.subspace.layout.width -@Suppress("RestrictedApi") // b/416066566 @Composable private fun SpatialPanelExample() { // [START androidxr_compose_SpatialPanel] @@ -76,7 +75,6 @@ fun SpatialPanelContent() { @Composable private fun AppContent() {} -@Suppress("RestrictedApi") // b/416066566 @Composable private fun ContentInSpatialPanel() { // [START androidxr_compose_SpatialPanelAppContent] diff --git a/xr/src/main/java/com/example/xr/compose/SpatialRow.kt b/xr/src/main/java/com/example/xr/compose/SpatialRow.kt index 8280dcf3d..d138411ac 100644 --- a/xr/src/main/java/com/example/xr/compose/SpatialRow.kt +++ b/xr/src/main/java/com/example/xr/compose/SpatialRow.kt @@ -24,7 +24,6 @@ import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.height import androidx.xr.compose.subspace.layout.width -@Suppress("RestrictedApi") // b/416066566 @Composable private fun SpatialRowExample() { // [START androidxr_compose_SpatialRowExample] diff --git a/xr/src/main/java/com/example/xr/compose/Subspace.kt b/xr/src/main/java/com/example/xr/compose/Subspace.kt index 6c6a799a2..2cbbe1021 100644 --- a/xr/src/main/java/com/example/xr/compose/Subspace.kt +++ b/xr/src/main/java/com/example/xr/compose/Subspace.kt @@ -26,7 +26,6 @@ import androidx.xr.compose.spatial.ApplicationSubspace import androidx.xr.compose.spatial.Subspace import androidx.xr.compose.subspace.SpatialPanel -@Suppress("RestrictedApi") // b/416066566 private class SubspaceActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/xr/src/main/java/com/example/xr/compose/Views.kt b/xr/src/main/java/com/example/xr/compose/Views.kt index 75fc2a8bb..b567b2f09 100644 --- a/xr/src/main/java/com/example/xr/compose/Views.kt +++ b/xr/src/main/java/com/example/xr/compose/Views.kt @@ -42,7 +42,6 @@ import com.example.xr.R private class MyCustomView(context: Context) : View(context) private class ActivityWithSubspaceContent : ComponentActivity() { - @Suppress("RestrictedApi") // b/416066566 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // [START androidxr_compose_ActivityWithSubspaceContent] @@ -57,7 +56,6 @@ private class ActivityWithSubspaceContent : ComponentActivity() { } } -@Suppress("RestrictedApi") // b/416066566 private class FragmentWithComposeView() : Fragment() { // [START androidxr_compose_FragmentWithComposeView] override fun onCreateView( diff --git a/xr/src/main/java/com/example/xr/compose/Volume.kt b/xr/src/main/java/com/example/xr/compose/Volume.kt index cfc51d06e..cce37ca83 100644 --- a/xr/src/main/java/com/example/xr/compose/Volume.kt +++ b/xr/src/main/java/com/example/xr/compose/Volume.kt @@ -39,7 +39,6 @@ import androidx.xr.compose.subspace.layout.scale import androidx.xr.compose.subspace.layout.width import kotlinx.coroutines.launch -@Suppress("RestrictedApi") // b/416066566 @Composable private fun VolumeExample() { // [START androidxr_compose_Volume] diff --git a/xr/src/main/java/com/example/xr/misc/ModeTransition.kt b/xr/src/main/java/com/example/xr/misc/ModeTransition.kt index bc97400d6..ea13d5868 100644 --- a/xr/src/main/java/com/example/xr/misc/ModeTransition.kt +++ b/xr/src/main/java/com/example/xr/misc/ModeTransition.kt @@ -30,7 +30,6 @@ fun modeTransitionCompose() { // [END androidxr_misc_modeTransitionCompose] } -@Suppress("RestrictedApi") // b/416066566 fun modeTransitionScenecore(xrSession: Session) { // [START androidxr_misc_modeTransitionScenecore] xrSession.scene.requestHomeSpaceMode() diff --git a/xr/src/main/java/com/example/xr/scenecore/Environments.kt b/xr/src/main/java/com/example/xr/scenecore/Environments.kt index b34a4e0c7..5ed80d36f 100644 --- a/xr/src/main/java/com/example/xr/scenecore/Environments.kt +++ b/xr/src/main/java/com/example/xr/scenecore/Environments.kt @@ -37,7 +37,6 @@ private class Environments(val session: Session) { // [END androidxr_scenecore_environment_loadEnvironmentSkybox] } - @Suppress("RestrictedApi") // b/416066566 fun setEnvironmentPreference(environmentGeometry: GltfModel, lightingForSkybox: ExrImage) { // [START androidxr_scenecore_environment_setEnvironmentPreference] val spatialEnvironmentPreference = @@ -56,7 +55,6 @@ private class Environments(val session: Session) { // [END androidxr_scenecore_environment_setEnvironmentPreference] } - @Suppress("RestrictedApi") // b/416066566 fun setPassthroughOpacityPreference() { // [START androidxr_scenecore_environment_setPassthroughOpacityPreference] session.scene.spatialEnvironment.preferredPassthroughOpacity = 1.0f @@ -74,7 +72,6 @@ private class Environments(val session: Session) { // [END androidxr_scenecore_environment_setPassthroughOpacityPreference] } - @Suppress("RestrictedApi") // b/416066566 fun getCurrentPassthroughOpacity() { // [START androidxr_scenecore_environment_getCurrentPassthroughOpacity] val currentPassthroughOpacity = session.scene.spatialEnvironment.currentPassthroughOpacity diff --git a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt index 2cce055ba..997436ddf 100644 --- a/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt +++ b/xr/src/main/java/com/example/xr/scenecore/GltfEntity.kt @@ -33,7 +33,6 @@ private suspend fun loadGltfFile(session: Session) { // [END androidxr_scenecore_gltfmodel_create] } -@Suppress("RestrictedApi") // b/416066566 private fun createModelEntity(session: Session, gltfModel: GltfModel) { // [START androidxr_scenecore_gltfmodelentity_create] if (session.scene.spatialCapabilities @@ -44,7 +43,6 @@ private fun createModelEntity(session: Session, gltfModel: GltfModel) { // [END androidxr_scenecore_gltfmodelentity_create] } -@Suppress("RestrictedApi") // b/416066566 private fun animateEntity(gltfEntity: GltfModelEntity) { // [START androidxr_scenecore_gltfmodelentity_animation] gltfEntity.startAnimation(loop = true, animationName = "Walk") diff --git a/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt index fde4d0eaf..a712d0dfe 100644 --- a/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt +++ b/xr/src/main/java/com/example/xr/scenecore/InteractableComponent.kt @@ -22,7 +22,6 @@ import androidx.xr.scenecore.InputEvent import androidx.xr.scenecore.InteractableComponent import java.util.concurrent.Executors -@Suppress("RestrictedApi") // b/416066566 private fun interactableComponentExample(session: Session, entity: Entity) { // [START androidxr_scenecore_interactableComponentExample] val executor = Executors.newSingleThreadExecutor() diff --git a/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt index 1e275ff0c..3c254e433 100644 --- a/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt +++ b/xr/src/main/java/com/example/xr/scenecore/MovableComponent.kt @@ -23,7 +23,6 @@ import androidx.xr.scenecore.MovableComponent import androidx.xr.scenecore.PlaneOrientation import androidx.xr.scenecore.PlaneSemanticType -@Suppress("RestrictedApi") // b/416066566 private fun createSystemMovable(session: Session, entity: Entity) { // [START androidxr_scenecore_movableComponent_createSystemMovable] val movableComponent = MovableComponent.createSystemMovable(session) @@ -31,7 +30,6 @@ private fun createSystemMovable(session: Session, entity: Entity) { // [END androidxr_scenecore_movableComponent_createSystemMovable] } -@Suppress("RestrictedApi") // b/416066566 private fun movableComponentAnchorExample(session: Session, entity: Entity) { // [START androidxr_scenecore_movableComponent_anchorable] val anchorPlacement = AnchorPlacement.createForPlanes( diff --git a/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt b/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt index f1ab6e1f4..28b70027d 100644 --- a/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt +++ b/xr/src/main/java/com/example/xr/scenecore/ResizableComponent.kt @@ -23,7 +23,6 @@ import androidx.xr.scenecore.ResizeEvent import androidx.xr.scenecore.SurfaceEntity import java.util.concurrent.Executor -@Suppress("RestrictedApi") // b/416066566 private fun resizableComponentExample( session: Session, surfaceEntity: SurfaceEntity, diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt index ffa436012..ea5684cd5 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt @@ -33,7 +33,6 @@ import androidx.xr.scenecore.SpatialSoundPool import androidx.xr.scenecore.SpatializerConstants import androidx.xr.scenecore.scene -@Suppress("RestrictedApi") // b/416066566 private fun playSpatialAudioAtEntity(session: Session, appContext: Context, entity: Entity) { // [START androidxr_scenecore_playSpatialAudio] // Check spatial capabilities before using spatial audio @@ -80,7 +79,6 @@ private fun playSpatialAudioAtEntity(session: Session, appContext: Context, enti // [END androidxr_scenecore_playSpatialAudio] } -@Suppress("RestrictedApi") // b/416066566 private fun playSpatialAudioAtEntitySurround(session: Session, appContext: Context) { // [START androidxr_scenecore_playSpatialAudioSurround] // Check spatial capabilities before using spatial audio @@ -116,7 +114,6 @@ private fun playSpatialAudioAtEntitySurround(session: Session, appContext: Conte // [END androidxr_scenecore_playSpatialAudioSurround] } -@Suppress("RestrictedApi") // b/416066566 private fun playSpatialAudioAtEntityAmbionics(session: Session, appContext: Context) { // [START androidxr_scenecore_playSpatialAudioAmbionics] // Check spatial capabilities before using spatial audio diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt index c830274e8..7fb784080 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialCapabilities.kt @@ -20,7 +20,6 @@ import androidx.xr.runtime.Session import androidx.xr.scenecore.SpatialCapabilities import androidx.xr.scenecore.scene -@Suppress("RestrictedApi") // b/416066566 fun checkMultipleCapabilities(xrSession: Session) { // [START androidxr_compose_checkMultipleCapabilities] // Example 1: check if enabling passthrough mode is allowed diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt index 590c000e8..6e18c2778 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt @@ -28,7 +28,6 @@ import androidx.xr.runtime.math.Vector3 import androidx.xr.scenecore.SurfaceEntity import androidx.xr.scenecore.scene -@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreate(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreate] val stereoSurfaceEntity = SurfaceEntity.create( @@ -51,7 +50,6 @@ private fun ComponentActivity.surfaceEntityCreate(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreate] } -@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateSbs(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateSbs] // Set up the surface for playing a 180° video on a hemisphere. @@ -69,7 +67,6 @@ private fun ComponentActivity.surfaceEntityCreateSbs(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreateSbs] } -@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateTb(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateTb] // Set up the surface for playing a 360° video on a sphere. @@ -87,7 +84,6 @@ private fun ComponentActivity.surfaceEntityCreateTb(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreateTb] } -@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateMVHEVC(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateMVHEVC] // Create the SurfaceEntity with the StereoMode corresponding to the MV-HEVC content @@ -111,7 +107,6 @@ private fun ComponentActivity.surfaceEntityCreateMVHEVC(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreateMVHEVC] } -@Suppress("RestrictedApi") // b/416066566 private fun ComponentActivity.surfaceEntityCreateDRM(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreateDRM] // Create a SurfaceEntity with DRM content From 4665db03afa8e8c1dff8a26f53c1d9858c8d40af Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Tue, 22 Jul 2025 14:17:41 +0200 Subject: [PATCH 11/14] Use ExoPlayer to detect compatibility --- .../com/example/xr/scenecore/SpatialAudio.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt index ea5684cd5..b68e67713 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialAudio.kt @@ -20,9 +20,12 @@ import android.content.Context import android.media.AudioAttributes import android.media.AudioAttributes.CONTENT_TYPE_SONIFICATION import android.media.AudioAttributes.USAGE_ASSISTANCE_SONIFICATION -import android.media.MediaCodecList import android.media.MediaPlayer import android.media.SoundPool +import androidx.annotation.OptIn +import androidx.media3.common.C +import androidx.media3.common.util.UnstableApi +import androidx.media3.exoplayer.audio.AudioCapabilities import androidx.xr.runtime.Session import androidx.xr.scenecore.Entity import androidx.xr.scenecore.PointSourceParams @@ -151,10 +154,18 @@ private fun playSpatialAudioAtEntityAmbionics(session: Session, appContext: Cont // [END androidxr_scenecore_playSpatialAudioAmbionics] } -private fun detectSupport() { +@OptIn(UnstableApi::class) +private fun detectSupport(context: Context) { // [START androidxr_scenecore_dolby_detect_support] - val codecInfos = MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos - fun supportsEac3SDecoding() = codecInfos.any { !it.isEncoder && it.supportedTypes.any { it == "audio/aec3" } } - fun supportsAc4Decoding() = codecInfos.any { !it.isEncoder && it.supportedTypes.any { it == "audio/ac4" } } + val audioCapabilities = AudioCapabilities.getCapabilities(context, androidx.media3.common.AudioAttributes.DEFAULT, null) + if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) { + // Device supports playback of the Dolby Digital media format. + } + if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) { + // Device supports playback of the Dolby Digital Plus media format. + } + if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) { + // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format. + } // [END androidxr_scenecore_dolby_detect_support] } From bac964543dd60175d10fb8cc2a34d25ecf37f7d3 Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Tue, 22 Jul 2025 15:23:10 +0200 Subject: [PATCH 12/14] Fix duplicated libs in toml --- gradle/libs.versions.toml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index da1d176d8..35b846c44 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,12 +28,9 @@ androidx-test-junit = "1.2.1" androidx-window = "1.5.0-alpha02" androidx-window-core = "1.5.0-alpha02" androidx-window-java = "1.5.0-alpha02" -# @keep -androidx-xr = "1.0.0-alpha03" -# @keep -androidx-xr-arcore = "1.0.0-alpha04" -androidx-xr-compose = "1.0.0-alpha04" -androidx-xr-scenecore = "1.0.0-alpha04" +androidx-xr-arcore = "1.0.0-SNAPSHOT" +androidx-xr-scenecore = "1.0.0-SNAPSHOT" +androidx-xr-compose = "1.0.0-SNAPSHOT" androidxHiltNavigationCompose = "1.2.0" appcompat = "1.7.1" coil = "2.7.0" @@ -71,9 +68,6 @@ targetSdk = "35" tiles = "1.5.0" tracing = "1.3.0" validatorPush = "1.0.0-alpha03" -androidx-xr-arcore = "1.0.0-SNAPSHOT" -androidx-xr-scenecore = "1.0.0-SNAPSHOT" -androidx-xr-compose = "1.0.0-SNAPSHOT" version-catalog-update = "1.0.0" wear = "1.3.0" wearComposeFoundation = "1.5.0-beta04" From 7eb7eb5078ecca4c681f0145c6d68d69119c58b4 Mon Sep 17 00:00:00 2001 From: azeppenfeld Date: Mon, 28 Jul 2025 15:15:49 -0700 Subject: [PATCH 13/14] Add snippets for HDR and Material improvements --- .../com/example/xr/scenecore/SpatialVideo.kt | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt index 6e18c2778..ec733bb61 100644 --- a/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt +++ b/xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt @@ -19,6 +19,7 @@ package com.example.xr.scenecore import android.content.ContentResolver import android.net.Uri import androidx.activity.ComponentActivity +import androidx.lifecycle.lifecycleScope import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer @@ -26,7 +27,11 @@ import androidx.xr.runtime.Session import androidx.xr.runtime.math.Pose import androidx.xr.runtime.math.Vector3 import androidx.xr.scenecore.SurfaceEntity +import androidx.xr.scenecore.Texture +import androidx.xr.scenecore.TextureSampler import androidx.xr.scenecore.scene +import java.nio.file.Paths +import kotlinx.coroutines.launch private fun ComponentActivity.surfaceEntityCreate(xrSession: Session) { // [START androidxr_scenecore_surfaceEntityCreate] @@ -145,3 +150,78 @@ private fun ComponentActivity.surfaceEntityCreateDRM(xrSession: Session) { // [END androidxr_scenecore_surfaceEntityCreateDRM] } + +private fun ComponentActivity.surfaceEntityHDR(xrSession: Session) { + // [START androidxr_scenecore_surfaceEntityHDR] + // Define the color properties for your HDR video. These values should be specific + // to your content. + val hdrMetadata = SurfaceEntity.ContentColorMetadata( + colorSpace = SurfaceEntity.ContentColorMetadata.ColorSpace.BT2020, + colorTransfer = SurfaceEntity.ContentColorMetadata.ColorTransfer.ST2084, // PQ + colorRange = SurfaceEntity.ContentColorMetadata.ColorRange.LIMITED, + maxCLL = 1000 // Example: 1000 nits + ) + + // Create a SurfaceEntity, passing the HDR metadata at creation time. + val hdrSurfaceEntity = SurfaceEntity.create( + session = xrSession, + stereoMode = SurfaceEntity.StereoMode.MONO, + pose = Pose(Vector3(0.0f, 0.0f, -1.5f)), + canvasShape = SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f), + contentColorMetadata = hdrMetadata + ) + + // Initialize ExoPlayer and set the surface. + val exoPlayer = ExoPlayer.Builder(this).build() + exoPlayer.setVideoSurface(hdrSurfaceEntity.getSurface()) + + // Define the URI for your HDR content. + val videoUri = "https://your-content-provider.com/hdr_video.mp4" + val mediaItem = MediaItem.fromUri(videoUri) + + // Set the media item and start playback. + exoPlayer.setMediaItem(mediaItem) + exoPlayer.prepare() + exoPlayer.play() + // [END androidxr_scenecore_surfaceEntityHDR] +} + +private fun surfaceEntityEdgeFeathering(xrSession: Session) { + // [START androidxr_scenecore_surfaceEntityEdgeFeathering] + // Create a SurfaceEntity. + val surfaceEntity = SurfaceEntity.create( + session = xrSession, + pose = Pose(Vector3(0.0f, 0.0f, -1.5f)) + ) + + // Feather the edges of the surface. + surfaceEntity.edgeFeather = + SurfaceEntity.EdgeFeatheringParams.SmoothFeather(0.1f, 0.1f) + // [END androidxr_scenecore_surfaceEntityEdgeFeathering] +} + +private fun surfaceEntityAlphaMasking(xrSession: Session, activity: ComponentActivity) { + // [START androidxr_scenecore_surfaceEntityAlphaMasking] + // Create a SurfaceEntity. + val surfaceEntity = SurfaceEntity.create( + session = xrSession, + pose = Pose(Vector3(0.0f, 0.0f, -1.5f)) + ) + + // Load the texture in a coroutine scope. + activity.lifecycleScope.launch { + val alphaMaskTexture = + Texture.create( + xrSession, + Paths.get("textures", "alpha_mask.png"), + TextureSampler.create() + ) + + // Apply the alpha mask. + surfaceEntity.primaryAlphaMaskTexture = alphaMaskTexture + + // To remove the mask, set the property to null. + surfaceEntity.primaryAlphaMaskTexture = null + } + // [END androidxr_scenecore_surfaceEntityAlphaMasking] +} From cdb39fc8a99e10d3f8a66fb71a81112c7b16d1cc Mon Sep 17 00:00:00 2001 From: Dereck Bridie Date: Wed, 30 Jul 2025 21:48:58 +0200 Subject: [PATCH 14/14] Update to public alpha05 --- gradle/libs.versions.toml | 6 +++--- settings.gradle.kts | 2 +- xr/build.gradle.kts | 14 +++----------- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 35b846c44..351974d06 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,9 +28,9 @@ androidx-test-junit = "1.2.1" androidx-window = "1.5.0-alpha02" androidx-window-core = "1.5.0-alpha02" androidx-window-java = "1.5.0-alpha02" -androidx-xr-arcore = "1.0.0-SNAPSHOT" -androidx-xr-scenecore = "1.0.0-SNAPSHOT" -androidx-xr-compose = "1.0.0-SNAPSHOT" +androidx-xr-arcore = "1.0.0-alpha05" +androidx-xr-scenecore = "1.0.0-alpha05" +androidx-xr-compose = "1.0.0-alpha05" androidxHiltNavigationCompose = "1.2.0" appcompat = "1.7.1" coil = "2.7.0" diff --git a/settings.gradle.kts b/settings.gradle.kts index 374e658ea..eb485975e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -val snapshotVersion : String? = "13790637" +val snapshotVersion : String? = System.getenv("COMPOSE_SNAPSHOT_ID") pluginManagement { repositories { diff --git a/xr/build.gradle.kts b/xr/build.gradle.kts index 96edf5c1e..138383c8d 100644 --- a/xr/build.gradle.kts +++ b/xr/build.gradle.kts @@ -31,17 +31,9 @@ android { } dependencies { - implementation(libs.androidx.xr.arcore) { - exclude(module = "impress") - } - implementation(libs.androidx.xr.scenecore) { - exclude(module = "impress") - } - implementation(libs.androidx.xr.compose) { - exclude(module = "impress") - } - - implementation("com.google.ar:impress:0.0.3") + implementation(libs.androidx.xr.arcore) + implementation(libs.androidx.xr.scenecore) + implementation(libs.androidx.xr.compose) implementation(libs.androidx.activity.ktx)