# Jetpack SceneCore

[User Guide](https://developer.android.com/develop/devices/xr/jetpack-xr-sdk) [Code Sample](https://github.com/android/xr-samples) Build and manipulate the Android XR scene graph with 3D content.

| Latest Update | Stable Release | Release Candidate | Beta Release | Alpha Release |
|---|---|---|---|---|
| October 21, 2026 | [1.0.0](https://developer.android.com/jetpack/androidx/releases/xr-scenecore#1.0.0) | - | - | [1.1.0-alpha01](https://developer.android.com/jetpack/androidx/releases/xr-scenecore#1.1.0-alpha01) |

## Declaring dependencies

To add a dependency on XR SceneCore, you must add the Google Maven repository to your
project. Read [Google's Maven repository](https://developer.android.com/studio/build/dependencies#google-maven)
for more information.

Add the dependencies for the artifacts you need in the `build.gradle` file for
your app or module:

### Groovy

```groovy
dependencies {
    implementation "androidx.xr.scenecore:scenecore:1.1.0-alpha01"

    // Use to write unit tests
    testImplementation "androidx.xr.scenecore:scenecore-testing:1.1.0-alpha01"
}
```

### Kotlin

```kotlin
dependencies {
    implementation("androidx.xr.scenecore:scenecore:1.1.0-alpha01")

    // Use to write unit tests
    testImplementation("androidx.xr.scenecore:scenecore-testing:1.1.0-alpha01")
}
```

For more information about dependencies, see [Add build dependencies](https://developer.android.com/studio/build/dependencies).

## Feedback

Your feedback helps make Jetpack better. Let us know if you discover new issues or have
ideas for improving this library. Please take a look at the
[existing issues](https://issuetracker.google.com/issues?q=componentid:1689664+status:open)
in this library before you create a new one. You can add your vote to an existing issue by
clicking the star button.

[Create a new issue](https://issuetracker.google.com/issues/new?component=1689664&template=2070825)

See the [Issue Tracker documentation](https://developers.google.com/issue-tracker)
for more information.

## Version 1.1

### Version 1.1.0-alpha01

October 21, 2026

`androidx.xr.scenecore:scenecore-*:1.1.0-alpha01` is released. Version 1.1.0-alpha01 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/2e3660870c84fabc0f4ecdc2f7b87a6f853d7bf1..ce49d38c7de14d2f1413048a53d7e4444827a50b/xr/scenecore).

**API Changes**

- Added dynamic mesh update APIs (`MeshBuffer.createDynamic`, `MeshBuffer.updateVertexData`, `MeshBuffer.updateIndexData`, and a dynamic `CustomMesh.BuilderFromMeshData` constructor) to support updating vertex and index data at runtime. ([Ia1ecb](https://android-review.googlesource.com/#/q/Ia1ecb1249f027027e0b368d7dfae5e766efa1ab2))
- Added `VertexLayout.getBufferIndex` helper methods to easily retrieve the buffer index for a given `VertexAttribute` or `VertexBufferLayout`. ([I1a9e3](https://android-review.googlesource.com/#/q/I1a9e3469c962c312cf3fd76d08cea4fb5649080c))
- Made `CustomMesh.bounds` a var so the bounding box can be updated dynamically at runtime. ([Ib0397](https://android-review.googlesource.com/#/q/Ib039756f5a72755e0666b6d0b3ba214789bb6d41))
- Promoted `glTF` animation APIs (`GltfAnimation`, `GltfModelEntity`.`getAnimations`, and `GltfModelEntity`.`stopAllAnimations`) to public/stable while keeping `GltfAnimation`.loop setter as experimental, and `GltfAnimationStartOptions` and start(options) as experimental and deprecated. ([Iacdae](https://android-review.googlesource.com/#/q/Iacdae16c189a40bff1847267e890843e525763b7))
- Added `stopAllAnimations()` to `GltfModelEntity`, made `GltfAnimation.start()` parameterless, added `loop` and `speed` properties to `GltfAnimation`, and deprecated `GltfAnimationStartOptions`, `start(options)`, and `seekTo(Duration)`. ([I53105](https://android-review.googlesource.com/#/q/I53105f2964347537cf92af8af6801b2e76d5b932))
- Updated `GltfModelEntity` APIs to document `IllegalStateException` (specifically `Entity.DisposedException`) when called on disposed entities. [I65a76f](https://android-review.googlesource.com/q/I65a76f656486607d5761013903b7e1be867c7ecb)

**Bug Fixes**

- `androidx.lifecycle:lifecycle-runtime` dependency was updated to 2.10.0. This version is required for bundled lifecycle runtime lint checks to run with AGP version 9.5.0-alpha04 or later. ([I99bfd](https://android-review.googlesource.com/#/q/I99bfdb355ffd7f1083dbdac4167b1f5577740116), [b/556807521](https://issuetracker.google.com/issues/556807521))
- Improve kdocs related to `AudioOutputProvider` to highlight that it should not be re-used with multiple `ExoPlayer` instances ([I6b18e](https://android-review.googlesource.com/#/q/I6b18e9f742d74a26cfbd6ce6acae3b9669113364))
- Removed unnecessary dependencies on `impress` from various XR modules. [I84636c](https://android-review.googlesource.com/q/I84636c1f5643a4e1aca2367943e74515bfaf46bd)

## Version 1.0

### Version 1.0.0

October 21, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0` is released. Version 1.0.0 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/e2e2729abc59df52d40af80a8bbfe010c02455c6..9b00eff832fffc1d21c92cc05e2dc7fc9fad5072/xr/scenecore).

**Major features of 1.0.0:**

- Jetpack XR SceneCore is now stable! SceneCore lets you place and arrange 3D content, defined by entities, relative to each other and your environment. With SceneCore, you can create, place, and manipulate 2D panels and 3D models in virtual and mixed-reality scenes; specify spatial environments and spatial audio sources; and anchor virtual content to the real world.
- For more information, see our [Overview Page](https://developer.android.com/develop/xr/jetpack-xr-sdk#jetpack-scenecore) and [API Reference](https://developer.android.com/reference/kotlin/androidx/xr/scenecore).

### Version 1.0.0-rc02

October 07, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-rc02` is released. Version 1.0.0-rc02 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/6fb59a3b2759476e6992ff0fc2fbb10c833eeeea..2e3660870c84fabc0f4ecdc2f7b87a6f853d7bf1/xr/scenecore).

**Bug Fixes**

- Fixed a potential memory leak by removing the `perceptionRuntimeCache` in `SessionExt` and refactored it to retrieve the `PerceptionRuntime` directly from the `Session` instance. ([Ie35b1](https://android-review.googlesource.com/q/Ie35b122d001f45198b5f9fed88b53fa6345b03c3))
- Fixed a potential context leak by using `applicationContext` for `OpenXR` native handles to ensure the native runtime does not hold references to an `Activity` context. ([Ie35b1](https://android-review.googlesource.com/q/Ie35b122d001f45198b5f9fed88b53fa6345b03c3))
- Fixed race conditions in `XrInstanceManager` by introducing proper synchronization and initialization locking. ([Ie35b1](https://android-review.googlesource.com/q/Ie35b122d001f45198b5f9fed88b53fa6345b03c3))
- Fixed `ReferenceCleaner` to support de-registration of cleaning actions and ensured `Entity` cleanup actions are run explicitly during `dispose()`, preventing duplicate execution upon garbage collection. ([Ie35b1](https://android-review.googlesource.com/q/Ie35b122d001f45198b5f9fed88b53fa6345b03c3))
- Fixed a memory leak in `Scene` by removing the `sceneCache` in `SessionExt` and refactoring `Scene` to fetch the instance directly from `sessionConnectors`. ([Ie35b1](https://android-review.googlesource.com/q/Ie35b122d001f45198b5f9fed88b53fa6345b03c3))

### Version 1.0.0-rc01

September 09, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-rc01` is released. Version 1.0.0-rc01 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/5e16bb06cf26d3e2a2d555059216c43831826f57..6fb59a3b2759476e6992ff0fc2fbb10c833eeeea/xr/scenecore).

**API Changes**

- Added `xr:scenecore:scenecore-openxr` library. ([Ic49f2](https://android-review.googlesource.com/#/q/Ic49f2c1d02530dabaea20bfc08bd621b0b877444))
- Removed several deprecated APIs ahead of the 1.0.0 stable release.

**Bug Fixes**

- Resolved a memory leak bug where the Activity reference could be retained by the system when the Activity is destroyed. ([I6dcd7](https://android-review.googlesource.com/#/q/I6dcd7c427eae4b21390d9d8cda168247d12a1c5b))

**Behavior Changes**

- Removed logcat output from SceneCore. ([I10c3c](https://android-review.googlesource.com/#/q/I10c3c70e84aab07c754eefb6db36b6bbaea1cd70))

### Version 1.0.0-beta02

August 12, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-beta02` is released. Version 1.0.0-beta02 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/e3bbb4aa3f4ca7e3eee99b35365971fa699c8a69..5e16bb06cf26d3e2a2d555059216c43831826f57/xr/scenecore).

**Bug fixes**

- `toMoveEvent()` will return `null` if the parent entity has been garbage collected. ([Ia7a1b](https://android-review.googlesource.com/#/q/Ia7a1bf73146b410e247c98c1301e9700d9cb988a))

### Version 1.0.0-beta01

July 15, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-beta01` is released. Version 1.0.0-beta01 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/fc052f5a502bd14589b077e9b2ac185512f8cf5f..488730ed565c7b9ac4839ff66aa93313d1e662e6/xr/scenecore).

**API Changes**

- `GltfAnimation` and `SpatialGltfModelAnimation` APIs have been marked as experimental. Some properties were turned into getters. ([I8d689](https://android-review.googlesource.com/#/q/I8d689ae01daec91cf15291fa37dcf279bb5555c7), [b/524771027](https://issuetracker.google.com/issues/524771027))
- Removed the public `MovableComponent.createTrackingMovable` factory method. ([I00912](https://android-review.googlesource.com/#/q/I00912cf98f347c26d764e04df2d44cf507c55625), [b/477169015](https://issuetracker.google.com/issues/477169015))
- Converted Session.create to a suspend function. ([I5d27f](https://android-review.googlesource.com/#/q/I5d27fd6399fc5fe35f28ddf9c0c488a12eb23115))
- `ActivitySpace` and `AnchorSpace` now extend a common `SpaceEntity` class which contains common behavior for entities whose positions are controlled by the system ([I506ec](https://android-review.googlesource.com/#/q/I506ecb36b6d73440b9f44845812e8b042fb6e270), [b/513619219](https://issuetracker.google.com/issues/513619219))
- Updated `AnchorEntity` to be called `AnchorSpace` ([Ifa95e](https://android-review.googlesource.com/#/q/Ifa95ebf5c1da2b4413723835db4c0e5f9a2e52fb), [b/513619219](https://issuetracker.google.com/issues/513619219))
- Provides public test API `SoundEffectPoolComponentTester`. ([I87df7](https://android-review.googlesource.com/#/q/I87df71d5e551cc1dd93b7c8ca87280d36e3b9bfd), [b/498104417](https://issuetracker.google.com/issues/498104417))
- Added an optional `cornerRadius` parameter to the `SurfaceEntity.Shape.Quad` constructor and made the `cornerRadius` property public. Developers can now specify a corner radius when creating a Quad shape to render `SurfaceEntity` canvases with rounded corners, and query the radius of existing Quads. ([Ia7809](https://android-review.googlesource.com/#/q/Ia78090bcf03c94d84f60c0cbdf51c8bd3f5368fe), [b/474681085](https://issuetracker.google.com/issues/474681085))
- Provides public test API `SpatialAudioTrackBuilderTester`, `SpatialAudioTrackTester` and `SceneCoreTestRule.getTester` overloads. ([I378c6](https://android-review.googlesource.com/#/q/I378c6953233b2400ada20260442c7a866c6c205d), [b/496333938](https://issuetracker.google.com/issues/496333938))
- Add specialized overrides of `toString()` for a number of ARCore types. These types are intended to provide additional information to developers for debugging purposes and are not intended to be used in production or shipped applications.

### Version 1.0.0-alpha16

June 17, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha16` is released. Version 1.0.0-alpha16 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/581011b7bddfd705223b2db47dc1abde16055506..fc052f5a502bd14589b077e9b2ac185512f8cf5f/xr/scenecore).

**API Changes**

- Added overloads for `addVertexData`, `setIndexData`, and `addSubset` to `CustomMesh.BuilderFromMeshData` and `CustomMesh.BuilderFromMeshBuffer`. These overloads allow developers to pass raw data and parameters directly (e.g., `ByteBuffer`, `offset`, `size`, `topology`, `indexOffset`, `indexCount`) without needing to wrap them in intermediary objects like `ByteBufferRegion` or `MeshSubset`. ([I84d5c](https://android-review.googlesource.com/#/q/I84d5cb5d04daacbb6d97f98ad99e70ea4c24d94d))
- `Scene.requestFullSpaceMode()` and `Scene.requestHomeSpaceMode()` have been renamed to `requestFullSpace()` and `requestHomeSpace()`, respectively. Other methods and documentation referring to "Home Space Mode" and "Full Space Mode" have been similarly updated. ([I45751](https://android-review.googlesource.com/#/q/I457519e36cf4dcfc2f839c522eaefe1cccaf8922))
- Provides public test API `PanelEntityTester` and `MainPanelEntityTester` ([I961e4](https://android-review.googlesource.com/#/q/I961e4f650fe916d6aca259d7ac567d735cefb44f))
- Adding `pointSourceParams` property to `SoundEffectPoolComponent` ([I4a750](https://android-review.googlesource.com/#/q/I4a750ee3f920f6562b7e5710b3f8849d48b0b1cb))
- Provides public test API `MovableComponentTester` ([I0c972](https://android-review.googlesource.com/#/q/I0c97202e5d9691ed7b72268015b530ff5041eb88))
- Provides public test API `PointerCaptureComponentTester` ([Ic0d4f](https://android-review.googlesource.com/#/q/Ic0d4f0c5240679ff1cf5edf915b9e253e06108e1))
- Provides public test API `ActivityPanelEntityTester` ([I837c4](https://android-review.googlesource.com/#/q/I837c4f5edcc673946734bcf56d32c6acbe5aea95))
- Provides public test API `ResizableComponentTester` ([I0a3a4](https://android-review.googlesource.com/#/q/I0a3a4af9ec6c5edcd544faeb33ede40ef990550d))
- Provides public test API `BoundsComponentTester.` ([Iefd53](https://android-review.googlesource.com/#/q/Iefd53522cdc82019d20965f52e3154fb2608acb3))
- Provides public test API `SpatialMediaPlayerTester` ([Ia3e09](https://android-review.googlesource.com/#/q/Ia3e0998962fbd316b85643fca44afaf9d36daf33))
- Provides public test API `SpatialEnvironmentTester` ([Icf60f](https://android-review.googlesource.com/#/q/Icf60f62baca225034f63b00665d13c0b620aee71))
- Provides public test API `GltfModelTester` and `SceneCoreTestRule.getGltfModelTester`. ([I33fcb](https://android-review.googlesource.com/#/q/I33fcbeec53f319846b82453b188c14d814c3622b))
- Provides public test API `InteractableComponentTester`. ([Ia7096](https://android-review.googlesource.com/#/q/Ia70961c70e4e228a11d1288f4faf38b9a6faa9a6))
- Provides public test API `SurfaceEntityTester`. ([Ic0740](https://android-review.googlesource.com/#/q/Ic0740e9e4a32530877e4d40de97d8290db83a4ba))
- Provides public test API `GltfModelEntityTester`, `TestGltfModelNode` and `TestGltfAnimation`. ([I72c4d](https://android-review.googlesource.com/#/q/I72c4d5243a2d8acfe4d8aaaa287b0bd909c195a6))
- Provides public test API `SceneTester` and `SceneCoreTestRule.sceneTester`. ([Ib4ec5](https://android-review.googlesource.com/#/q/Ib4ec524143a66b573076b8216194c39fabadad69))
- Provides public test API `PerceptionSpaceTester` and `SceneCoreTestRule.perceptionSpaceTester`. ([Icf739](https://android-review.googlesource.com/#/q/Icf7398cd3dc3377fa3257ed9e1f7c8e43c26a42c))
- Provides public test API `MeshEntityTester`. ([I63801](https://android-review.googlesource.com/#/q/I63801080fc0da6267c105b057dac7e0d5338d221))
- Provides public test API `ImageBasedLightingAssetTester` and `SceneCoreTestRule.getTester` overloads. ([I57ec4](https://android-review.googlesource.com/#/q/I57ec4d727a1221af62d3c156fe439c30af731206))
- Provides public test API `TextureTester` ([Ia865b](https://android-review.googlesource.com/#/q/Ia865b483a42abcbe2307a4c581cc89acb5e89c6c))
- Provides public test API `PositionalAudioComponentTester` ([Icd96e](https://android-review.googlesource.com/#/q/Icd96e67c7e7b12cd0d269785e648061dfcb48e98))
- Provides public test API `SpatialSoundPoolTester` ([Ia3531](https://android-review.googlesource.com/#/q/Ia3531a40c1d34be1fcbde1a08ed7784defa9a5b3))
- Provides public test API `SoundEffectPoolTester` ([If349a](https://android-review.googlesource.com/#/q/If349a4ddba15773c6ee9fbf639253fb243c714c4))
- Provides public test API `ActivitySpaceTester` and `SceneCoreTestRule.activitySpaceTester`. ([I2d5c2](https://android-review.googlesource.com/#/q/I2d5c2da89432a33177e92c456b521c33e7f096ed))
- Provides public test API `SpatialWindowTester` ([I41837](https://android-review.googlesource.com/#/q/I41837933243b373fca425091d1470cddda05f25b))
- Provides public test API `AnchorEntityTester` ([I68404](https://android-review.googlesource.com/#/q/I68404e27d534414c54c06c2c963ceae24a06cd03))
- Provides the public test API interface `SceneCoreTestRule`. ([Ic72d3](https://android-review.googlesource.com/#/q/Ic72d3d535ba618c725716e41f476ee9588c241b9))
- Added `PixelDensity` class and exposed it via `Scene#virtualPixelDensity` to provide a hardware-based pixel-per-meter ratio for accurate physical dimension mapping in `ActivitySpace`. ([I0e3ac](https://android-review.googlesource.com/#/q/I0e3ac02d66f74d1096a5cfdd0a29003829501ea1))
- Added public APIs for creating and rendering Custom Meshes. ([I7ad2f](https://android-review.googlesource.com/#/q/I7ad2fc781c8cb50c16a553f78d795295c518860d))
- The `VertexLayout` API has been updated to use a list of `VertexBufferLayout`s, where each `VertexBufferLayout` describes the attributes within a single vertex buffer. This allows for more flexible vertex data arrangements, including interleaved attributes with custom strides and offsets. ([Ic426b](https://android-review.googlesource.com/#/q/Ic426ba50be6a06997c52ba6d4274770048ddfaeb))
- Provides `MovableComponent.createTrackingMovable` to transform an ARCore Trackable to a pose relative to Activity Space. ([I12249](https://android-review.googlesource.com/#/q/I122491aae36dcb415247da6bcb7076ef62461405))
- The default value for the parent in `Entity.create` has been updated to null. ([Ic3145](https://android-review.googlesource.com/#/q/Ic3145a464ed7b422179ed5d54e1715e28620571f))
- `Entity` was updated to be a class instead of an interface and is now the base class for all Entity types. As part of this change `BaseEntity` was removed. ([I7fbc9](https://android-review.googlesource.com/#/q/I7fbc96497e6318e6bc8fdc16f2c242f28e60733e))
- `GltfModel`, `ExrImage`, and `ImageBasedLightingAsset` now implement `AutoCloseable` to allow for idiomatic resource management using Kotlin's `use` block. ([I1ac79](https://android-review.googlesource.com/#/q/I1ac79656d8b710bd46cbb30bf115cd10fa584f22))
- Introduced the `ImageBasedLightingAsset` class to replace `ExrImage` for defining spatial environment lighting. `ExrImage` has been deprecated and removed from the public API. `SpatialEnvironmentPreference` has been updated to use `ImageBasedLightingAsset`. ([I6c92a](https://android-review.googlesource.com/#/q/I6c92a9fde5425069eb8e769a00d477decd47a046))
- Renamed the `skybox` parameter in `SpatialEnvironment` to `imageBasedLightingAsset` to better reflect its purpose, and clarified that visual skybox textures should be included in the geometry parameter. ([I24d4a](https://android-review.googlesource.com/#/q/I24d4aba70303dff0742f955e9df6f2e2917f0ab0))
- Spatial entities now use a stable device density for pixel-to-meter calculations on Spatial API levels 1 and 2, ensuring consistent sizing regardless of system display density changes. ([I37051](https://android-review.googlesource.com/#/q/I37051988437749eaaf89306389d6ed915749e6ba))

### Version 1.0.0-alpha15

May 19, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha15` is released. Version 1.0.0-alpha15 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/c335dd6f34a8575245fc6d8139e95871bea35e9f..581011b7bddfd705223b2db47dc1abde16055506/xr/scenecore).

**API Changes**

- `Entity.dispose()` is now removed as public API. Instead of calling `dispose()` on Entity instances, apps can make instances cleanable by setting the `parent` to `null` and by clearing any strong references to those instances. ([I396c9](https://android-review.googlesource.com/#/q/I396c9b9d0472b1ff1a07336c830ecd9cab958e71))
- `SoundEffectPool`'s `set/clearOnLoadCompleteListener` methods have been deleted. Use `add/removeLoadCompleteListener` instead. ([Iae78d](https://android-review.googlesource.com/#/q/Iae78df658401d7bd908efeb59894066c8f602769))
- Scene's `set/clearSpatialVisibilityChangedListener` was replaced with `add/removeSpatialVisibilityChangedListener`. ([I67dff](https://android-review.googlesource.com/#/q/I67dff8728c2ddd127a8f091337f23c3a794573a2))
- All SceneCore `add/removeOnFooListener` methods have been renamed `add/removeFooListener`, removing `On` from the name. ([Ibe50b](https://android-review.googlesource.com/#/q/Ibe50bf749270afbbd2af1f902ec4efe2c6c223d6))
- `AnchorEntity.setOnOriginChangedListener` and `AnchorEntity.setOnStateChangedListener` methods have been replaced with `add/removeFooListener` methods, to support multiple simultaneous Listeners. ([I13749](https://android-review.googlesource.com/#/q/I137494e69eb9d575c440f0aab4227ebef28416c2))
- Renamed `AnchorEntity.State.TIMEDOUT` to `State.TIMED_OUT`. ([Id2b8d](https://android-review.googlesource.com/#/q/Id2b8d573def3211846827259e598f40b04762b3c))
- The Component API has been refactored for improved safety and extensibility. `Component` is now an abstract class. The `onAttach()` and `onDetach()` methods are now `protected` to prevent direct calls. Please use `Entity.addComponent()` and `Entity.removeComponent()` to manage component lifecycles. ([Id04e8](https://android-review.googlesource.com/#/q/Id04e8b9863eb027b18118616609ab1928350f81f))
- SceneCore's `PlaneSemanticType` `PlaneOrientation` constants have been migrated from Ints to custom types. Their `ANY` constants will be removed, clients should explicitly enumerate all desired constants instead, or use the new `.ALL` immutable Set constants. The `AnchorEntity` factory method now accepts a Set of these types, instead of a single value. ([Ib1033](https://android-review.googlesource.com/#/q/Ib10339399d6255907dad0ed135c20f245c967c48))
- Added support for skeletal animation (skinning) to the experimental Custom Mesh API. Developers can now animate custom meshes by specifying a `boneCount` when creating a `MeshEntity` and updating the animation in real-time using `MeshEntity.setBoneTransforms()`. ([Id8ba2](https://android-review.googlesource.com/#/q/Id8ba2c7e9a6f817535d7664fdfece2d254dd9438), [b/496692490](https://issuetracker.google.com/issues/496692490))
- Introduced the experimental `CustomMesh` API. Developers can now programmatically create and render 3D geometry in their scenes using `CustomMesh`, `MeshBuffer`, and `MeshEntity`. ([I94617](https://android-review.googlesource.com/#/q/I946174656bae1f0cbc72078aa04263e2c726d4c5))
- Removed `androidx.xr.scenecore.SpatializerConstants.SourceType.SOURCE_TYPE_SOUND_FIELD`. Use `SourceType.SOUND_FIELD` instead. ([Ia68b9](https://android-review.googlesource.com/#/q/Ia68b9e4e0b3a5bddb8cd30e180e672ca1ac40de9))
- Adding spatial audio components: `PositionalAudioComponent`, `SoundEffectPoolComponent` and `SoundFieldAudioComponent` ([Ieda89](https://android-review.googlesource.com/#/q/Ieda8940773fed0362142f7137592f31e6b18d66e))
- `AnchorEntity.getAnchor` was replaced with `AnchorEntity.anchor` and will now return an `Anchor` when the `AnchorEntity` was created from an ARCore `Anchor` ([I5c7c8](https://android-review.googlesource.com/#/q/I5c7c8c9457e4590d4652dd0199c079fa24b3066f))
- The default value for the `parent` parameter in the `ActivityPanelEntity`, `GltfModelEntity`, `GroupEntity`, `PanelEntity`, and `SurfaceEntity` factory methods has been changed from `ActivitySpace` to `null`. To attach an entity to the scene graph and render it visible, developers must now explicitly set its parent during instantiation or via `Entity.parent = ...` ([Ie7cc1](https://android-review.googlesource.com/#/q/Ie7cc180a57771230d2cf2362c1b891fa18fb8103))

**Bug Fixes**

- `SceneCore` now automatically reclaims `Entity` instances when they become phantom reachable, removing the need for developers to explicitly invoke `dispose()` to free resources. To ensure an \[Entity\] instance is properly reclaimed, developers should:
  - Detach it from the scene graph by setting its `parent` to `null`.
  - Relinquish all strong references to the instance in their code.
  - Note on Special Entity Types: For entities that cannot be parented (such as `AnchorEntity`), developers must maintain a strong reference while the instance is in use. If all references are released, these instances will become phantom reachable and will be automatically reclaimed. ([I83fe4](https://android-review.googlesource.com/#/q/I83fe4ff089e4d324c0a1fb20527a7d3e11127b86))
- Narrowed Proguard keep rules for all `SceneCore` libraries. ([I98447](https://android-review.googlesource.com/#/q/I9844789d80bcbe0465712a48db271654912b305f))

**Known Issues**

- Attaching a `PositionalAudioComponent` to an `Entity` with an inactive `ExoPlayer` instance will cause a crash. Do not call `setPointSourceParams` or attach/detach the spatial audio components while ExoPlayer is stopped. This will be fixed in the next release.

### Version 1.0.0-alpha14

May 06, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha14` is released. Version 1.0.0-alpha14 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/0731bcada85ff22cf1ddd54167e83f02bbd022be..c335dd6f34a8575245fc6d8139e95871bea35e9f/xr/scenecore).

**API Changes**

- `TrackingState` and `VpsAvailabilityResult` have moved to the `androidx.xr.arcore package`, and the types in `androidx.xr.runtime` are now deprecated. ([Ic7930](https://android-review.googlesource.com/#/q/Ic79303427f1301f722efb7f624033f9f11b49544), [b/480462213](https://issuetracker.google.com/issues/480462213))
- Renamed `Plane.Type` to `PlaneType`. ([I8c90c](https://android-review.googlesource.com/#/q/I8c90cccb087dd6bf0d5342d39db5e6eca210e572), [b/482675376](https://issuetracker.google.com/issues/482675376))
- Renamed `Plane.Label` to `PlaneLabel`. ([Ic6b67](https://android-review.googlesource.com/#/q/Ic6b67074e9a22f44cd2ec30dad0c5f17fc9631af), [b/482675376](https://issuetracker.google.com/issues/482675376))
- `androidx.xr.runtime.FieldOfView` has been deprecated. Use `androidx.xr.runtime.math.FieldOfView` instead. ([Ia01a0](https://android-review.googlesource.com/#/q/Ia01a0ac228dc4a93c1bb2979b26d4f400be4fe99), [b/480233045](https://issuetracker.google.com/issues/480233045))
- `Matrix4.pose` has been renamed to `Matrix4.toPose()`. The pose property is now deprecated. ([I329b4](https://android-review.googlesource.com/#/q/I329b4d05fc0757359864a2762f76422d2154c37e), [b/493383490](https://issuetracker.google.com/issues/493383490))
- Renamed `HandJointType` enum values. ([Ifbc83](https://android-review.googlesource.com/#/q/Ifbc83b1141960fc83d32a08e6b8a65c7091ce612), [b/482670596](https://issuetracker.google.com/issues/482670596))
- Expose `Component.onAttach` and `onDetach` as public API to allow custom `Component` implementations. ([I0ca1f](https://android-review.googlesource.com/#/q/I0ca1f8d0f5e50616339d2f73143c1dc6521cf724))
- Adding spatial audio components ([I39ddd](https://android-review.googlesource.com/#/q/I39dddfdcb6c55e5d5e760381bed283636ec2df0f), [b/489421980](https://issuetracker.google.com/issues/489421980), [b/436642086](https://issuetracker.google.com/issues/436642086), [b/436642499](https://issuetracker.google.com/issues/436642499))
- Remove Entity from `PointSourceParams`. Instead the Entity will be used directly with `SpatialAudioTrack`, `SpatialSoundPool`, and `SpatialMediaPlayer` ([Ib3685](https://android-review.googlesource.com/#/q/Ib3685c5b2dc0afb0e99e9cdfe02b23ae712e25f7), [b/489421980](https://issuetracker.google.com/issues/489421980), [b/436634048](https://issuetracker.google.com/issues/436634048))
- Renamed `DeviceTrackingMode.LAST_KNOWN` to `SPATIAL_LAST_KNOWN` (with a deprecated fallback), added `INERTIAL_LAST_KNOWN` for 3DoF tracking, and added `TRACKING_DEGRADED` to `TrackingState`. ([Ie661c](https://android-review.googlesource.com/#/q/Ie661cfd441521987dcebd7e1fd1e7cfc3ef5ab9d), [b/445466590](https://issuetracker.google.com/issues/445466590))
- Deprecated `GroupEntity`. To have an Entity with only the base Entity functionality, call `Entity.create` which will return and Entity interface. ([I4c450](https://android-review.googlesource.com/#/q/I4c45068d0b8f9a15a2b2ce29bc3523cf93463446), [b/473867483](https://issuetracker.google.com/issues/473867483))
- Added `XrLog` API. Set `XrLog.isEnabled` to `true` to enable logging in JetpackXR, and use `XrLog.Level` to set the log level. ([I76a1f](https://android-review.googlesource.com/#/q/I76a1f066b96ab6f07016d57c7e8e83518cb67de6), [b/463460895](https://issuetracker.google.com/issues/463460895), [b/487378441](https://issuetracker.google.com/issues/487378441))

**Bug Fixes**

- `Scene.keyEntity` now defaults to `mainPanelEntity`. ([I6a3ef](https://android-review.googlesource.com/#/q/I6a3ef4236bb5645462b089531ca6292653ddfffc))

### Version 1.0.0-alpha13

March 25, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha13` is released. Version 1.0.0-alpha13 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/bf48d1095789789d9d62bfd42bb4f8c9a335ecea..0731bcada85ff22cf1ddd54167e83f02bbd022be/xr/scenecore).

**API Changes**

- Removed `unscaledGravityAlignedActivitySpace` flag from `Session.create`. `ActivitySpace` is always unscaled and gravity-aligned now. ([If6f11](https://android-review.googlesource.com/#/q/If6f11877880f649ecf7a4844db3e809064cc10fb), [b/458173423](https://issuetracker.google.com/issues/458173423))
- Removed deprecated `setMaterialOverride` and `clearMaterialOverride` functions from `GltfModelEntity` which are now called on the individual `GltfModelNode`. ([I2e5d2](https://android-review.googlesource.com/#/q/I2e5d2dd560845113bf20b2b0d339e602b062123c))
- Added `transformPixelCoordinatesToLocalPosition` and `transformNormalizedCoordinatesToLocalPosition` to `PanelEntity` and removed equivalent experimental methods that used to return poses instead of `Vector3` positions. ([Ib6960](https://android-review.googlesource.com/#/q/Ib6960082962b970caabf9e8fca1bee7c9e0909a2), [b/460123106](https://issuetracker.google.com/issues/460123106), [b/458333591](https://issuetracker.google.com/issues/458333591))
- Added `GltfAnimation` APIs for controlling glTF animations in `SceneCore`. ([I2c172](https://android-review.googlesource.com/#/q/I2c172cc173fb9f65376ff3116f00f8dea8990b68), [b/466065486](https://issuetracker.google.com/issues/466065486), [b/465819070](https://issuetracker.google.com/issues/465819070), [b/465818617](https://issuetracker.google.com/issues/465818617))
- Renamed `ScenePose.activitySpacePose` to `ScenePose.poseInActivitySpace` ([I8f175](https://android-review.googlesource.com/#/q/I8f17516589bbd7630c2b93d3a2a04e06a5b1cf72), [b/427822261](https://issuetracker.google.com/issues/427822261))
- Added Scenecore Projected Runtime Implementation ([I9c4ab](https://android-review.googlesource.com/#/q/I9c4ab3407e40ccdc04699381e58366d64c188cb8), [b/476440158](https://issuetracker.google.com/issues/476440158))
- When resizing the main panel entity, it may reposition itself to the `ActivitySpace` origin. There is no workaround other than manually or programmatically repositioning the panel back to its original location. This bug will be fixed in a future release. ([b/489427007](https://issuetracker.google.com/issues/489427007)).
- In some cases, the affordance for `MovableComponent` may not appear for `SurfaceEntity` and other non-Panel entity types. Explicitly setting `MovableComponent.size` will cause the affordance to appear. This bug will be fixed in a future release ([b/490983469](https://issuetracker.google.com/issues/490983469)).

### Version 1.0.0-alpha12

February 25, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha12` is released. Version 1.0.0-alpha12 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/858c4795b789900a14f261bc90ed7e375af2b9be..bf48d1095789789d9d62bfd42bb4f8c9a335ecea/xr/scenecore).

**Known Issues**

- Anchored entities may snap from their anchored position to the activity space origin after several seconds.
- Apps might crash when creating `SurfaceEntity` instances. This issue is resolved in `androidx.xr.scenecore:scenecore-*:1.0.0-alpha13` and subsequent releases. Affected apps should update to the latest versions.

**API Changes**

- `ActivitySpace.addOnSpaceUpdatedListener` and `ActivitySpace.removeOnSpaceUpdatedListener` have been renamed to `addOnOriginChangedListener` and `removeOnOriginChangedListener`. `AnchorEntity.setOnSpaceUpdatedListener` has been renamed to `setOnOriginChangedListener`. ([I5d8fb](https://android-review.googlesource.com/#/q/I5d8fb8dc2994f2241c03c9adab17dfa56c11eb6f))
- Added public name property to `FakeEntity` and made view public on `FakePanelEntity`. ([Ifa1f9](https://android-review.googlesource.com/#/q/Ifa1f9ed8b3116c2baba71cec85659d944feb42e8))

**Bug Fixes**

- Fixed pixel density calculations on newer system images ([I57d04](https://android-review.googlesource.com/#/q/I57d043ac72367c8765502991141c42389bf9e9d9))

### Version 1.0.0-alpha11

January 28, 2026

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha11` is released. Version 1.0.0-alpha11 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/bac172b1818f60ee3cd443ab6ae6596338aa5215..858c4795b789900a14f261bc90ed7e375af2b9be/xr/scenecore).

**API Changes**

- Renames `PerceivedResolutionResult.InvalidCameraView` to `PerceivedResolutionResult.InvalidRenderViewpoint` as the `getPerceivedResolution` APIs now rely on ARCore's `RenderViewpoint` API instead of `CameraViewScenePose`. This name better reflects the new implementation. ([I8c967](https://android-review.googlesource.com/#/q/I8c967b7b3091f445716aae2d7ca552a0ae4bdb9b), [b/446989745](https://issuetracker.google.com/issues/446989745), [b/419311998](https://issuetracker.google.com/issues/419311998))
- The `PanelEntity`/`SurfaceEntity.getPerceivedResolution` methods now take a `RenderViewpoint` provided by the developer as an argument. Before, the runtime arbitrarily chose the `RenderViewpoint` used in the perceived resolution calculation. ([I8c967](https://android-review.googlesource.com/#/q/I8c967b7b3091f445716aae2d7ca552a0ae4bdb9b), [b/446989745](https://issuetracker.google.com/issues/446989745), [b/419311998](https://issuetracker.google.com/issues/419311998))
- Removed `SpatialUser`, `ScenePose.Head`, and `ScenePose.CameraView`. The functionality of these APIs is covered by the `ArDevice` and `RenderViewpoint` APIs within ARCore for Jetpack XR. To obtain a `ScenePose` corresponding to the user's head or left or right eye, developers can use `PerceptionSpace.getScenePoseFromPerceptionPose` with the appropriate pose obtained using ARCore APIs. ([I2f69c](https://android-review.googlesource.com/#/q/I2f69c3d74f123f64efe2c7c9d41826a2f0f1ae28), [b/446989745](https://issuetracker.google.com/issues/446989745))

### Version 1.0.0-alpha10

December 03, 2025

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha10` is released. Version 1.0.0-alpha10 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/2f33cda7973a5fca1f200764ce1adaf32540a7d5..bac172b1818f60ee3cd443ab6ae6596338aa5215/xr/scenecore).

**API Changes**

- Added `transformPixelCoordinatesToPose` and `transformNormalizedCoordinatesToPose` to `PanelEntity` ([I462b3](https://android-review.googlesource.com/#/q/I462b308e11becbc5718ed81c797dc92a795f6c27))
- Added a helper class, Utils, to `SceneCore` Runtime based on logic in `SceneCore` ([I570b9](https://android-review.googlesource.com/#/q/I570b92336e3f96438ffefe02c4780480761dece8))

**Bug Fixes**

- Fixed a potential crash that can occur when Session is destroyed and a `SpatialModeChangeEvent` is received ([If44e8](https://android-review.googlesource.com/#/q/If44e858108a5f29f69a10cd17bce551abfebbb02))
- Fixed a bug which could cause an `IllegalStateException` to be thrown when leaving or re-entering an Activity. ([Ibff1c](https://android-review.googlesource.com/#/q/Ibff1cf591f2917f3f20340f063b8fb69e9b35da2))

### Version 1.0.0-alpha09

November 19, 2025

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha09` is released. Version 1.0.0-alpha09 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/fcb8595c5d66b0a2d43ae985efed1ff14fa92da1..2f33cda7973a5fca1f200764ce1adaf32540a7d5/xr/scenecore).

**New Features**

- Adds an API for retrieving a `ScenePose` that represents the composition of the perception space origin pose and a pose with respect to the perception space origin. ([I5b50a](https://android-review.googlesource.com/#/q/I5b50a282fee4e643bbb07487317ea749d216c808))
- Added `getGravityAlignedPose` function. The gravity aligned pose ignores the Pitch and Roll of rotation. ([I5ae21](https://android-review.googlesource.com/#/q/I5ae218eabe7a2c946bddd297f483f5fa2fd07052))
- `AnchorEntity.State` constant types have been changed from Ints to State subtypes. ([Ib0c49](https://android-review.googlesource.com/#/q/Ib0c49642c322348f40ff7205f857d6032a8853bd))
- Added `getChildren()` to Entity interface. Updated `MainPanelEntity` lifecycle. ([Ia69d6](https://android-review.googlesource.com/#/q/Ia69d6c7e5cdb7b8fd269f4dddf72cdbc67b34ad5))

**API Changes**

- `PointerCaptureComponent.PointerCaptureState` constant types have been changed from Ints to `PointerCaptureState` subtypes. ([Ic888a](https://android-review.googlesource.com/#/q/Ic888a3cf67a7be6fa749b8acfb4156c2d34a49c2))
- `Scene.spatialCapabilities` is now of type `Set<SpatialCapability>` instead of an Int field. The `SpatialCapability` constants have been renamed. ([I9c109](https://android-review.googlesource.com/#/q/I9c1096e70b530c0d7564117d2cccc0c538d4c2cf))
- `SurfaceEntity` constant types have been renamed and changed from Ints to `SurfaceEntity` subtypes. ([I419ed](https://android-review.googlesource.com/#/q/I419edfac64e41f071e9b01a68b416ad0e06f2424))
- `SpatializerConstant` constant types have been renamed and changed from Ints to `SpatializerConstant` subtypes. ([Ia0e18](https://android-review.googlesource.com/#/q/Ia0e184fb23b78420e11fd9048e7ec7082c08c34c))
- `TextureSampler` constant types have been renamed and changed from Ints to `TextureSampler` subtypes. ([I44078](https://android-review.googlesource.com/#/q/I440787f30a0c7af2a1bf5bf6a3be8eba97a04a83))
- `SpatialVisibility` constant types have been changed from Ints to `SpatialVisibility` subtypes. ([I70739](https://android-review.googlesource.com/#/q/I70739cc1437f3840ee1321c25ebb1d73926fe781))
- `ResizeEvent.ResizeState` constant types have been renamed and changed from Ints to `ResizeState` subtypes. ([I384d5](https://android-review.googlesource.com/#/q/I384d5e31c6fb29725ec34fbfed8b36e0233708d1))
- `InputEvent` constant types have been renamed and changed from Ints to inherit from their respective enclosing type. ([I82817](https://android-review.googlesource.com/#/q/I828174001ffe242ca57c2e4ad857c6e7a7af2f32))
- `GltfModelEntity.AnimationState` constant types have been changed from Ints to `AnimationState` subtypes. ([I24f4e](https://android-review.googlesource.com/#/q/I24f4e5751e77c08b434d3063c385f37e82ad0997))
- `AlphaMode` constant types have been renamed and changed from Ints to `AlphaMode` subtypes. ([I27b56](https://android-review.googlesource.com/#/q/I27b56553658d06d40f00115b32cc60e44f88367c))
- `Space` constant types have been changed from Ints to Space subtypes. ([I9255b](https://android-review.googlesource.com/#/q/I9255bff50a69a154dd58b7304552daa70512b7fc))
- `ScenePose.hitTest` and related methods now return `null` if no intersection was found, instead of a `HitTestResult` with a null `hitPosition`. `HitTestResult.hitPosition` is no longer nullable. ([I1400a](https://android-review.googlesource.com/#/q/I1400a3daaac70ec50f99a11d5548038474f45de6))
- Changed references of `ActivityPose` to `ScenePose`. ([I7fe43](https://android-review.googlesource.com/#/q/I7fe43b72793a4597abd2bc5913d3a4bae368c451))

### Version 1.0.0-alpha08

October 22, 2025

`androidx.xr.scenecore:scenecore-*:1.0.0-alpha08` is released. Version 1.0.0-alpha08 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/9dcef8caadcc3ef1c1eb670d1da2553621a5017b..fcb8595c5d66b0a2d43ae985efed1ff14fa92da1/xr/scenecore).

**API Changes**

- Renamed `ActivityPanelEntity.moveActivity` to `transferActivity` ([I273c5](https://android-review.googlesource.com/#/q/I273c5a971621a72949a04a6d64a0cc787bf73c29), [b/430332856](https://issuetracker.google.com/issues/430332856))

**Bug Fixes**

- `:xr:scenecore:scenecore-spatial-rendering` and `:xr:scenecore:scenecore-spatial-core` added as implementation dependency of `:xr:scenecore:scenecore` ([I6ab65](https://android-review.googlesource.com/#/q/I6ab6593c092fcfbd1e8f0f4cc4bb7398fd75ec6a), [b/447000520](https://issuetracker.google.com/issues/447000520))
- Exception is thrown if `session.scene` is accessed after session destruction. ([I77e6f](https://android-review.googlesource.com/#/q/I77e6fb4a6e96073baa481f34127741af0640bd06))

### Version 1.0.0-alpha07

September 24, 2025

`androidx.xr.scenecore:scenecore:1.0.0-alpha07`, `androidx.xr.scenecore:scenecore-guava:1.0.0-alpha07`, and `androidx.xr.scenecore:scenecore-testing:1.0.0-alpha07` are released. Version 1.0.0-alpha07 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/a54f47329f5dd47722a43b92814d5c7278a434ce..9dcef8caadcc3ef1c1eb670d1da2553621a5017b/xr/scenecore).

**API Changes**

- Renamed `fixedAspectRatio` to `isFixedAspectRatioEnabled` and made it a boolean property ([I5c4e8](https://android-review.googlesource.com/#/q/I5c4e8c1026afdccc8f6b40eb2f595261febaf71c), [b/440588971](https://issuetracker.google.com/issues/440588971))
- `Scenecore` Fakes are now located in `xr:scenecore:scenecore-testing` module. ([Idd951](https://android-review.googlesource.com/#/q/Idd951597c65a2104ba1e02e1a388abfafec15664))
- Renamed `shouldAutoHideContent` to `isAutoHideContentWhileResizingEnabled` and `shouldAlwaysShowOverlay` to `isAlwaysShowOverlayEnabled` ([I97c36](https://android-review.googlesource.com/#/q/I97c36d70477b1606e5962c077e332d1ca9080396), [b/432335421](https://issuetracker.google.com/issues/432335421))
- Updated `SceneCore` `TextureSampler` constants for readability, for example `TextureSampler.MinFilter.LINEAR` is now `TextureSampler.MIN_FILTER_LINEAR` ([Ib159c](https://android-review.googlesource.com/#/q/Ib159cfad20d3da673016475afa4b9dc4ae3b2905))
- Scene's `setKeyEntity` setter has been merged into the `keyEntity` variable. Setting the `keyEntity` to an unmovable Entity such as `AnchorEntity` will throw an `IllegalArgumentException` instead of returning a boolean false. ([I62080](https://android-review.googlesource.com/#/q/I620806e7d64aad4c03a6727ea3a7d9b171572025), [b/428721695](https://issuetracker.google.com/issues/428721695), [b/422215745](https://issuetracker.google.com/issues/422215745))
- Scene's `SpatialModeChangeListener` variable was replaced with `setSpatialModeChangedListener`. It takes in a `Consumer<SpatialModeChangeEvent>` instead of a `SpatialModeChangedListener`. `setSpatialModeChangedListener` can now optionally take in an Executor. ([I62080](https://android-review.googlesource.com/#/q/I620806e7d64aad4c03a6727ea3a7d9b171572025), [b/428721695](https://issuetracker.google.com/issues/428721695), [b/422215745](https://issuetracker.google.com/issues/422215745))
- Removed the `bundle` parameter from `ActivityPanelEntity.startActivity` ([I64344](https://android-review.googlesource.com/#/q/I64344057bfa3097a232dc3b5d0ae005b436c17bf), [b/430332856](https://issuetracker.google.com/issues/430332856), [b/430333040](https://issuetracker.google.com/issues/430333040))
- Renamed `SpatializerConstants.SOURCE_TYPE_BYPASS` to `SpatializerConstants.SOURCE_TYPE_DEFAULT`. ([Ifc7fe](https://android-review.googlesource.com/#/q/Ifc7fed07b28f5177d711184711f524b42cd4c14e), [b/422215565](https://issuetracker.google.com/issues/422215565))
- Added `SpatialSoundPool.PLAY_FAILED` constant. ([Ifc7fe](https://android-review.googlesource.com/#/q/Ifc7fed07b28f5177d711184711f524b42cd4c14e), [b/422215565](https://issuetracker.google.com/issues/422215565))
- Added default arguments to `SpatialSoundPool.play` methods. ([Ifc7fe](https://android-review.googlesource.com/#/q/Ifc7fed07b28f5177d711184711f524b42cd4c14e), [b/422215565](https://issuetracker.google.com/issues/422215565))
- Removed return value of setters in `SpatialAudioTrackBuilder`. ([Ifc7fe](https://android-review.googlesource.com/#/q/Ifc7fed07b28f5177d711184711f524b42cd4c14e), [b/422215565](https://issuetracker.google.com/issues/422215565))
- SurfaceEntity changes
  - `SurfaceEntity.CanvasShape` renamed `Shape`
  - `SurfaceEntity.CanvasShape.Vr180Hemisphere` renamed `Hemisphere`
  - `SurfaceEntity.CanvasShape.Vr360Sphere` renamed `Sphere`
  - `SurfaceEntity.EdgeFeatheringParams.SmoothFeather` renamed `RectangleFeather`
  - `SurfaceEntity.EdgeFeathingParams.SolidEdge` renamed `NoFeathering`
  - `SurfaceEntity.ContentSecurityLevel` renamed `SurfaceProtection`
  - `SurfaceEntity.ContentSecurityLevel.{values}` added a `SURFACE_PROTECTION_` prefix.
  - `SurfaceEntity.SuperSampling.{$values}` added a `SUPER_SAMPLING_` prefix
  - `SurfaceEntity.StereoMode.{values}` added a `STEREO_MODE_` prefix
  - `SurfaceEntity.ContentColorMetadata.maxCLL` renamed `maxContentLightLevel` ([I7eb5f](https://android-review.googlesource.com/#/q/I7eb5fa6e22e7e8e9514293b66de30d4c6bc545b0), [b/422216050](https://issuetracker.google.com/issues/422216050), [b/427529950](https://issuetracker.google.com/issues/427529950))
- Renamed `launchActivity` to `startActivity` ([I7db90](https://android-review.googlesource.com/#/q/I7db907769a5e26f9cb5346ba63f63afb0a0ea31d), [b/430332856](https://issuetracker.google.com/issues/430332856))
- Removed `Scene.activitySpaceRoot`. Use `Scene.activitySpace` instead. ([I05ee8](https://android-review.googlesource.com/#/q/I05ee8971d2208203b660045aca43453e2bf8249b), [b/378706624](https://issuetracker.google.com/issues/378706624), [b/422215745](https://issuetracker.google.com/issues/422215745))
- `configureBundleForFullSpaceModeLaunch` and `configureBundleForFullSpaceModeLaunchWithEnvironmentInherited` renamed to `createBundleForFullSpaceModeLaunch` and `createBundleForFullSpaceModeLaunchWithEnvironmentInherited` respectively, and moved to LaunchUtils.kt file as top-level methods and take Session as first param ([I64a2c](https://android-review.googlesource.com/#/q/I64a2c9cf37fa14a1c46a99592e00fd9b25c1373b), [b/437186050](https://issuetracker.google.com/issues/437186050))
- `GroupEntity` factory now returns `GroupEntity` type instead of Entity. ([I66042](https://android-review.googlesource.com/#/q/I660420712026424ec806f39477ff0ddec284a6d3))

**Bug Fixes**

- Throw an `IllegalStateException` when an entity instance is used after dispose. ([I90990](https://android-review.googlesource.com/#/q/I90990152de00b78c2d9f36efafe347cac1f1dccc), [b/427314036](https://issuetracker.google.com/issues/427314036), [b/432063442](https://issuetracker.google.com/issues/432063442))

### Version 1.0.0-alpha06

August 13, 2025

`androidx.xr.scenecore:scenecore:1.0.0-alpha06`, `androidx.xr.scenecore:scenecore-guava:1.0.0-alpha06`, and `androidx.xr.scenecore:scenecore-testing:1.0.0-alpha06` are released. Version 1.0.0-alpha06 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/eef55ce7cd8e6d0ab2f3574d87e36e97239347d2..a54f47329f5dd47722a43b92814d5c7278a434ce/xr/scenecore).

**API Changes**

- Unrestrict `SceneCore`'s `BaseEntity` and `BaseScenePose` APIs ([88c0ff6](https://android.googlesource.com/platform/frameworks/support/+/88c0ff656e00a7fd47f8b622e4d036eeb3bdc792))

### Version 1.0.0-alpha05

July 30, 2025

`androidx.xr.scenecore:scenecore-guava:1.0.0-alpha05`, `androidx.xr.scenecore:scenecore-testing:1.0.0-alpha05`, and `androidx.xr.scenecore:scenecore:1.0.0-alpha05` are released. Version 1.0.0-alpha05 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/b6c541571b9fb5471f965fc52612cb280713e5e4..e2ada2fb2bdda489dea67a9220554f31e20a5e5f/xr/scenecore).

**New Features**

- Perceived Resolution API added to Panel Entities and `SurfaceEntities`. ([I118f6](https://android-review.googlesource.com/#/q/I118f66e03081de2547292744407b2d6783ebf5a9))
- `PerceivedResolution` Callback methods added to Scene.kt to monitor the perceived resolution of the main panel of the activity in HSM. ([I58084](https://android-review.googlesource.com/#/q/I58084ac28e6de85fa1fe7f44d2742bf6187c55f5))
- `SurfaceEntity` - Support added for Application to request super sampling at creation time. This allows applications to use super sampling filter for anti-aliasing. ([I06913](https://android-review.googlesource.com/#/q/I069135e2d6ec04d2fb20d777d0c919259a0758c7))
- Added `recommendedContentBoxInFullSpace` property to `ActivitySpace`. It returns a recommended box for content to be placed in when in Full Space Mode. ([I4cd6f](https://android-review.googlesource.com/#/q/I4cd6f2d54fdb4fd62866a971f528b878fa0a08b3))
- Provided overloaded constructor for movable modifier which allows anchoring. ([Ic0c70](https://android-review.googlesource.com/#/q/Ic0c70e86c0be734b7f8bdda14f5501a4a57cd5e4))

**API Changes**

Extensive API changes were made to `SceneCore` for this release. Several classes have been renamed and/or moved to different modules, and most getter/setter methods have been replaced with Kotlin properties. While we anticipate future breaking API changes until our first Beta release, they will not be as disruptive or numerous.

- Renamed and/or moved the following classes \& interfaces: `androidx.xr.scenecore.PixelDimensions` to `androidx.xr.runtime.math.IntSize2d`; `androidx.xr.scenecore.Dimensions` to `androidx.xr.runtime.math.FloatSize3d`; `androidx.xr.scenecore.ActivityPose` to `ScenePose`, `androidx.xr.scenecore.ContentlessEntity` to `GroupEntity`, `androidx.xr.scenecore.PlaneType` to `PlaneOrientation`; `androidx.xr.scenecore.PlaneSemantic` to `PlaneSemanticType`. ([Ifd405](https://android-review.googlesource.com/#/q/Ifd40559bd3ffaccfc1782c81af39be1c5e7922a1))([I3b622](https://android-review.googlesource.com/#/q/I3b6220239765cdaa502184d4598c8048fea6570d)) ([If534d](https://android-review.googlesource.com/#/q/If534da0c7d818a518c3559b6037e92fb01f6fac5))
- A number of setters for `Scene`'s properties have been made private; they were not intended to be mutated by `SceneCore` clients: `activitySpace`, `activitySpaceRoot`, `mainPanelEntity`, `perceptionSpace`, `spatialCapabilities`, `spatialEnvironment`, and `spatialUser`. ([I2f506](https://android-review.googlesource.com/#/q/I2f506c72a5c699547b8fa2b1096b5c63ac115d2b))
- In Entity: Changed the following to properties: `get/setParent()`, `setContentDescription`; Deprecated `Entity.is/setHidden()`, use `Entity.is/setEnabled` instead. ([Ibc4c6](https://android-review.googlesource.com/#/q/Ibc4c642ebd8b84e4fbe06f0d4afbbc62aaf77f10))
- Removed the `androidx.xr.scenecore.BasePanelEntity` class, use `PanelEntity` directly instead. Replaced getters and setters for `PanelEntity` with properties. Changed `PanelEntity.size` property from `Float3dSize` to `Float2dSize`. Remmoved the deprecated method `androidx.xr.scenecore.PanelEntity.getPixelDimensions`, use `getSizeInPixels` instead. ([Icc174](https://android-review.googlesource.com/#/q/Icc17414612735c9ca955b2aba63c96ff9ba382fc))
- Replaced `androidx.xr.scenecore.OnSpaceUpdatedListener` with `Runnable`. ([I19308](https://android-review.googlesource.com/#/q/I19308b238f4f4799416e0c155dde5cdabfecb3cf))
- Replaced `SpatialUser.getCameraViews()` with a property. ([Ib0cc5](https://android-review.googlesource.com/#/q/Ib0cc54a3f72b1057702d6c4819f526246d88eae2)) For `ExrImage` and `GltfModel:` Changed `create` methods to be suspend functions; modified create parameters to accept a `Uri` or `Path` instead of a `String`. ([Id8883](https://android-review.googlesource.com/#/q/Id888320395bf66f267293e54b0cc388ed83c1a50)) ([I0d247](https://android-review.googlesource.com/#/q/I0d247e3db918e0a95f067745e76bf755986b91c0)), ([I25706](https://android-review.googlesource.com/#/q/I25706f1b2e278e814c02a35bba606b8790801a08))
- Moved `SpatialEnvironment.requestFullSpaceMode` and `SpatialEnvironment.requestHomeSpaceMode` to Scene, for example use `session.scene.requestFullSpaceMode()` instead of `session.scene.spatialEnvironment.requestFullSpaceMode()`. `addOnPassthroughOpacityChangedListener` and `addOnSpatialEnvironmentChangedListener` now have overrides that accept optional Executors. ([I12fe0](https://android-review.googlesource.com/#/q/I12fe0c5472eb5971be7bf733988abc1013209309)) ([I6b21e](https://android-review.googlesource.com/#/q/I6b21e7098f0d7061c84704ed56977bbfac45ccfc))
- Removed the following deprecated `SpatialEnvironment` methods: `togglePassthrough`, `setPassthrough`, `setPassthroughOpacity`, `getPassthroughMode`, `getPassthroughOpacity`, `setSkybox`, and `setGeometry`. Also removed deprecated class `SpatialEnvironment.PassthroughMode` ([I927bd](https://android-review.googlesource.com/#/q/I927bd71a2926f233b89fceca8881641695015846)) ([I927bd](https://android-review.googlesource.com/#/q/I927bd71a2926f233b89fceca8881641695015846)) ([I927bd](https://android-review.googlesource.com/#/q/I927bd71a2926f233b89fceca8881641695015846))
- Replaced the following `SpatialEnvironment` getters and setters with Kotlin properties: `getCurrentPassthroughOpacity()`, `get/setPassthroughOpacityPreference()`, `get/setSpatialEnvironmentPreference()`, `isSpatialEnvironmentPreferenceActive()` ([I33a7b](https://android-review.googlesource.com/#/q/I33a7bd2ae3a900f14d862f265d298ab794b4afa2)) ([Ie06e2](https://android-review.googlesource.com/#/q/Ie06e2988ca2f2c4404cf99a38e07fe2e74048895)) ([Ie06e2](https://android-review.googlesource.com/#/q/Ie06e2988ca2f2c4404cf99a38e07fe2e74048895))
- `SpatialEnvironmentPreference.preferredPassthroughOpacity` type changed from `Float?` to `Float`. It no longer accepts null values. Instead, `SpatialEnvironment.NO_PASSTHROUGH_OPACITY_PREFERENCE` is used to signal that there's no opacity preference. ([I40107](https://android-review.googlesource.com/#/q/I40107611d1a838254580238feae914a1847afe73))
- Updated the `windowBoundsPx` parameter to `pixelDimensions` and its type from Rect to `IntSize2d` in the create method. ([I1926e](https://android-review.googlesource.com/#/q/I1926ef679cbb7f8e480f92f9ddd9c7d135a06a6b))
- `SpatialEnvironment` constructor is now internal ([I75a51](https://android-review.googlesource.com/#/q/I75a510c2032f7733db31593c580c37cacb13f3ad))
- Replaced class `SpatialPointerIconNone` and `SpatialPointerIconCircle` classes with companion objects `SpatialPointerIcon.NONE` and `SpatialPointerIcon.CIRCLE` ([I416d2](https://android-review.googlesource.com/#/q/I416d2cc4b60558a78774e06221c243e3d77cf70f))
- `SpatialPointerIcon` in `SpatialPointerComponent` is no longer nullable. Use `SpatialPointerIcon.DEFAULT` instead of null to indicate that the system default pointer icon should be used. ([I416d2](https://android-review.googlesource.com/#/q/I416d2cc4b60558a78774e06221c243e3d77cf70f))
- Replaced `androidx.xr.scenecore.AnchorEntity.getState()` with a read-only property. Renamed parameters on the `AnchorEntity.create()` method for clarity. In `AnchorEntity`'s methods for setting and adding listeners, the listener has been moved to the final argument to enabled trailing lambdas. Replaced `androidx.xr.scenecore.OnStateChangedListener` for `AnchorEntity` with `Consumer<AnchorEntity.State>`. ([I472e0](https://android-review.googlesource.com/#/q/I472e007c99b6c2601442eff8c8e2b268551809a4))
- `GltfModelEntity.getAnimationState()` is now a property. ([I10b29](https://android-review.googlesource.com/#/q/I10b2955f5b1d26a11792e097125d2a66b262db62))
- Replaced `ActivitySpace.getBounds()` with a property. Renamed `ActivitySpace.addBoundsChangedListener` to `ActivitySpace.addOnBoundsChangedListener`. Replaced `ActivitySpace.setOnSpaceUpdatedListener` with add/remove methods. ([I4c956](https://android-review.googlesource.com/#/q/I4c956982487c947284de1574e0880b08e9b78917))
- For `AnchorPlacement: planeTypeFilter` was renamed to `anchorablePlaneOrientations`, `planeSemanticFilter` was renamed to `anchorablePlaneSemanticTypes`. Add a `MovableComponent` to an `AnchorEntity` or `ActivitySpace` will return false, `MoveListener` was renamed to `EntityMoveListener shouldDisposeParentAnchor` was renamed to `disposeParentOnReAnchor systemMovable` was removed from the `create` function in favor of `creeateCustomMovable`, `createSystemMovable` and `createAnchorable` ([If11c4](https://android-review.googlesource.com/#/q/If11c49d4cec222d13d29caac0cf0bf25305738b2))
- Removed `SurfaceEntity.featherRadiusX/Y` and adds an `EdgeFeatheringParams` class concept. ([Ic78fc](https://android-review.googlesource.com/#/q/Ic78fcebcf3d8e27ebc3972dda56e6211563371e8))
- `PanelEntity.enablePanelDepthTest()` method replaced with `panelClippingConfig` property. Set `Scene.panelClippingConfig = PanelClippingConfig(isDepthTestEnabled = true)` to enable depth-testing or set it to `PanelClippingConfig(isDepthTestEnabled = false)` to disable it. ([I0cbe0](https://android-review.googlesource.com/#/q/I0cbe0d959f3efedd353f453049e55a3c21ffb0c6))
- `Scene.mainPanelEntity` is now of type `MainPanelEntity` instead of `PanelEntity` ([I7125a](https://android-review.googlesource.com/#/q/I7125a7d8ce44551062adf54a9d770ad894bf9c15))
- Renamed Scene's `setFullSpaceMode` method to `configureBundleForFullSpaceModeLaunch` and `setFullSpaceModeWithEnvironmentInherited` method to `configureBundleForFullSpaceModeLaunchWithEnvironmentInherited`. ([I0cbe0](https://android-review.googlesource.com/#/q/I0cbe0d959f3efedd353f453049e55a3c21ffb0c6)) ([I0cbe0](https://android-review.googlesource.com/#/q/I0cbe0d959f3efedd353f453049e55a3c21ffb0c6))
- Renamed `SpatialVisibility`'s UNKNOWN, OUTSIDE_FOV, PARTIALLY_WITHIN_FOV, and WITHIN_FOV values to SPATIAL_VISIBILITY_UNKNOWN, SPATIAL_VISIBILITY_OUTSIDE_FIELD_OF_VIEW, SPATIAL_VISIBILITY_PARTIALLY_WITHIN_FIELD_OF_VIEW, and SPATIAL_VISIBILITY_WITHIN_FIELD_OF_VIEW, respectively ([Ie7e8c](https://android-review.googlesource.com/#/q/Ie7e8c3ee87d976d51f6091eb981cb97ec771502f))
- `SpatialVisibility` class replaced with public object with const Int values. `setSpatialVisibilityChangedListener` now accepts a `Consumer<Int>` instead of `Consumer<SpatialVisibility>` ([Ie7e8c](https://android-review.googlesource.com/#/q/Ie7e8c3ee87d976d51f6091eb981cb97ec771502f))
- `PointerCaptureComponent` constants renamed and moved to `PointerCaptureComponent.PointerCaptureState` object ([I9c7ac](https://android-review.googlesource.com/#/q/I9c7ac29494cec93bbf9793dba863cd5c900b0611))
- Replaced `PointerCaptureComponents' StateListener` with `Consumer<Int>`. ([I9c7ac](https://android-review.googlesource.com/#/q/I9c7ac29494cec93bbf9793dba863cd5c900b0611))
- Replaced `InputEventListener` with `Consumer<InputEvent>` ([I9c7ac](https://android-review.googlesource.com/#/q/I9c7ac29494cec93bbf9793dba863cd5c900b0611))
- `setPreferredAspectRatio` moved from Scene class to `SpatialWindow` object and takes in Session as first parameter. ([I7b717](https://android-review.googlesource.com/#/q/I7b7176ad279ee1088112bcc07af189bf1ba2c3fe))
- `Entity.setHidden()` replaced by `Entity.setEnabled()` and `Entity.isHidden()` replaced by `Entity.isEnabled()`. `setHidden(false)` is equal to `setEnabled(true)` and `isHidden() == !isEnabled()`. ([Icf0de](https://android-review.googlesource.com/#/q/Icf0dee494643388021214c9567e2a98f04d0017a))
- `Entity.contentDescription` type changed from String to `CharSequence`. ([Ie59be](https://android-review.googlesource.com/#/q/Ie59be94d2f2c1c2f2d7277b22bf2d72c6029580d))
- `Session.create` and `Session.configure` now throw `SecurityException` when sufficient permissions have not been granted instead of returning `SessionCreatePermissionsNotGranted` or `SessionConfigurePermissionsNotGranted`. ([I7c488](https://android-review.googlesource.com/#/q/I7c48826f858c9934949093ed8b52446153967761))
- `ResizableComponent.create` now requires a `Consumer<ResizeEvent> ResizeEventListener` was replaced with `Consumer<ResizeEvent> ResizableComponent.size` was renamed to `ResizableComponent.affordanceSize ResizableComponent.minimumSize` was renamed to `ResizableComponent.minimumEntitySize ResizableComponent.maximumSize` was renamed to `ResizableComponent.maximumEntitySize`, `ResizableComponent.autoHideContent` was renamed to `ResizableComponent.shouldAutoHideContent` `ResizableComponent.forceShowResizeOverlay` was renamed to `ResizableComponent.shouldAlwaysShowOverlay` ([I97a2d](https://android-review.googlesource.com/#/q/I97a2d78f4b386e602120d967609a485ab9fede91))
- Reduced `minSDK` to 24 for `androidx.xr.scenecore` and `androidx.xr.compose`. XR packages still require API 34 at runtime. ([I17224](https://android-review.googlesource.com/#/q/I172248f53672e708d8486452ed5742e116aab538))
- Removed `RequiresApi(34)` restriction on all Jetpack XR packages. This restriction was redundant as Jetpack XR is currently only available on devices with API level 34+. ([Iae0f8](https://android-review.googlesource.com/#/q/Iae0f8f1c0de1d62609ed0dcad6cf2731756054dd))
- The main `SceneCore` artifact (`xr:scenecore:scenecore`) will only contain Kotlin-style async APIs. Java developers can depend on the `xr:scenecore:scenecore-guava` library to access compatible APIs. ([If221b](https://android-review.googlesource.com/#/q/If221be3c3d771aea9b8aa74682df6db753d3c593))
- Projects released with Kotlin 2.0 require KGP 2.0.0 or newer to be consumed ([Idb6b5](https://android-review.googlesource.com/#/q/Idb6b5d6ae1625ab870ffe74f9790ffabc82a63b4))
- This library now uses [JSpecify nullness annotations](https://jspecify.dev/), which are type-use. Kotlin developers should use the following compiler argument to enforce correct usage: `-Xjspecify-annotations=strict` (this is the default starting with version 2.1.0 of the Kotlin compiler) ([Ia8420](https://android-review.googlesource.com/#/q/Ia84200c477b50c79761005fffb0d44c001009cca))
- All async methods that return `ListenableFuture` have been replaced with Kotlin suspend functions. Java developers that wish to use `ListenableFuture`-based async methods instead Kotlin suspend functions must now use extension functions in `:xr:scenecore-scenecore-guava`. For example, `GuavaExrImage` contains the Guava-equivalent ExrImage async functions, `GuavaScenePose` contains the Guava-equivalent `ScenePose` async functions, `GuavaGltfModel` contains the `Guava-equivalent GltfModel` async functions, etc. ([If7283](https://android-review.googlesource.com/#/q/If7283b35cdeb52c067a31082302d32dddca2d35b)) ([I0af60](https://android-review.googlesource.com/#/q/I0af609e44a3aaa6122ebf8c8ca2783c121cce094)) ([If7283](https://android-review.googlesource.com/#/q/If7283b35cdeb52c067a31082302d32dddca2d35b)) ([Ia8515](https://android-review.googlesource.com/#/q/Ia851535bdb3259a8866f974c1af3dfbbda1bdfc7)) ([I4efdf](https://android-review.googlesource.com/#/q/I4efdf84b03d46e4be47811764833ea9903e1c8cb)) ([I54bbf](https://android-review.googlesource.com/#/q/I54bbf9c1d6bc5a8154ae418ef2b93c5a415b333e)) ([I3467a](https://android-review.googlesource.com/#/q/I3467ab8105a43de68af4697d86aa1d9c44829d7d)) ([I82a33](https://android-review.googlesource.com/#/q/I82a33360f97954726b29bcc94aff961c7860bfcf))

**Bug Fixes**

- Updated Jetpack XR Scenecore `ProGuard` rule to prevent `AbstractMethodError` for minified clients. ([I91a01](https://android-review.googlesource.com/#/q/I91a01dd6f1545db37c95c59ee8691f51ed665ce0))
- Additional fixes to support Proguard minification for Jetpack XR `SceneCore` ([I4f47e](https://android-review.googlesource.com/#/q/I4f47e46ecb26a1909d2e4622810a5f85b9b06958))
- Fixed a bug where an `InteractableComponent` may cause a crash if the `hitPosition` on the HitInfo of the `InputEvent` may crash if the `hitPosition` returned from the system was null ([I7a695](https://android-review.googlesource.com/#/q/I7a695367377503e87fa072dd3d6d6828bcce2fa0))
- Config \*Mode vals have been renamed to reflect their behavior. ([I6d247](https://android-review.googlesource.com/#/q/I6d24772f4456d4a2409adbaf6162fabb4f5756ef))
- Fixed issues with FOV and `HitTest` in `SceneCore` TestApp. ([I2c51e](https://android-review.googlesource.com/#/q/I2c51ed7b9b46f5759eb23e773d64a04c86f2f6f9))
- Fixed bug in `SpatialCapabilities.hasCapability()` where it would return true if any of the capabilities passed in with a bitwise OR was true instead of only returning true if they were all true. ([I2cd40](https://android-review.googlesource.com/#/q/I2cd40dfc08eb53874fd96fd19cf1bc6e19dbb253))
- `SurfaceEntity.StereoMode.TOP_BOTTOM` updated to have the top map to the left eye and the bottom map to the right eye. ([I4ae68](https://android-review.googlesource.com/#/q/I4ae685be894a6368c20a2bf624113040b8301af1))

### Version 1.0.0-alpha04

May 7, 2025

`androidx.xr.scenecore:scenecore:1.0.0-alpha04` and `androidx.xr.scenecore:scenecore-testing:1.0.0-alpha04` are released. Version 1.0.0-alpha04 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/043342a8810f3356110a0afce48c662e841c428f..b6c541571b9fb5471f965fc52612cb280713e5e4/xr/scenecore).

> [!NOTE]
> **Note:** You'll need Android Emulator version 35.6.7 or later to use this version of the library.

**New Features**

- Backhandling will now work on panel entities without embedded activities. For backhandling to work you need to specify `android:enableOnBackInvokedCallback= "true"` in the android manifest.
- `StereoSurfaceEntity` now supports MV-HEVC playback through two new `StereoMode` values: MULTIVIEW_LEFT_PRIMARY and MULTIVIEW_RIGHT_PRIMARY.
- `PanelEntity.setSize` and `PanelEntity.getSize` now return sizes in parent space.
- `Entity.setPose`, `Entity.getPose`, `Entity.setScale`, `Entity.getScale`, `Entity.setAlpha` and `Entity.getAlpha` now take a new param `relativeTo`, which allows get/set values relative to different spaces. The supported values are Parent, Activity and Real World spaces, and the default value for this param is Parent.
- Spatial Visibility Callback extension methods added to `SessionExt.kt` to monitor when the scene content moves inside or outside the user's field of view.
- `setPointSourceParams` has been added to `SpatialAudioTrack`, allowing the params to be updated after the track has been built.
- Added a new class, Scene, with references to `Scenecore` APIs. Scene will be accessible as an extension property of Session. Functions inside of `SessionExt` have been moved to Scene so imports will be need to be adjusted; for example, `SessionExt.getScene(session)`.`addSpatialCapababilitiesChangedListener` versus `SessionExt.addSpatialCapabilitiesChangedListener`.
- `ActivityPose.hitTestAsync` was added, enabling a `hitTest` against virtual content.
- Added new Component type `SpatialPointerComponent`, allowing clients to specify the icon rendered for the pointer, or to disable the icon. This Component can currently be attached to `PanelEntity` instances only.
- Introducing new `PanelEntity` factory, which takes panel dimensions in either meters or pixels. Older `PanelEntity` factory taking two Dimension type params for panel removed.

**API Changes**

- Removed `RequiresApi(34)` restriction on all Jetpack XR packages. This restriction was redundant as Jetpack XR is currently only available on devices with API level 34+. ([Iae0f8](https://android-review.googlesource.com/#/q/Iae0f8f1c0de1d62609ed0dcad6cf2731756054dd))
- Projects released with Kotlin 2.0 require KGP 2.0.0 or newer to be consumed ([Idb6b5](https://android-review.googlesource.com/#/q/Idb6b5d6ae1625ab870ffe74f9790ffabc82a63b4))
- `PermissionHelper` class has been removed.
- `PanelEntity.getPixelDensity` is deprecated.
- `PanelEntity.setPixelDimensions` and `PanelEntity.getPixelDimension` are removed, replaced by `setSizeInPixels` and `getSizeInPixels`.
- `Entity.getActivitySpaceAlpha` removed. Can be replaced with `Entity.getAlpha(Space.Activity)`.
- `Entity.getWorldSpaceScale` removed. Can be replaced with `Entity.getScale(Space.REAL\_WORLD)`.
- The Session class in `SceneCore` has been deleted in favor of the Session in XR Runtime.
- `StereoSurfaceEntity` has been renamed to `SurfaceEntity`.
- `Entity.setSize` and `Entity.getSize` are removed, and the same methods were added to `PanelEntity`.
- `PointSourceAttributes` has been renamed to `PointSourceParams`.
- `SpatializerConstants.SOURCE\_TYPE\_BYPASS` has been renamed to `SpatializerConstants.SOURCE\_TYPE\_DEFAULT`.
- `PointSourceParams` entity has been modified from public to internal access.
- `AnchorEntity.create` now requires `PlaneTrackingMode` to be configured in `Session.configure()`.
- `SpatialUser` APIs now require `HeadTrackingMode` to be configured in `Session.configure()`.
- When `ResizableComponent` is not attached, it will give INFO-level log instead of ERROR-level log.
- Fov class is now a regular Kotlin class.
- Split `Entity.kt` to place each concrete entity type into its own file.
- When creating a new `PanelEntity`, most Views will be reparented to a `FrameLayout`. This facilitates the use of `LayoutInspector` with Spatial Panels.
- The currently used `XrExtensions` instance is now registered with the platform, in a best effort way, to help with app debugging.

**Bug Fixes**

- A fix was added to prevent a crash that could occur when a `PanelEntity` with `MovableComponent` and `AnchorPlacement` was moved
- Fixed an issue where `ResizableComponent` was providing stale sizes in `onResizeStart` callback.
- Fixed crash when `JxrPlatformAdapterAxr`'s `dispose()` was called multiple times.

### Version 1.0.0-alpha03

February 26, 2025

`androidx.xr.scenecore:scenecore:1.0.0-alpha03` and `androidx.xr.scenecore:scenecore-testing:1.0.0-alpha03` are released. Version 1.0.0-alpha03 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/a96c4899cab90642c7b1d722dc1f3b45f56e7b82..043342a8810f3356110a0afce48c662e841c428f/xr/scenecore).

**New Features**

- Proguard minification is now supported for Jetpack XR code

**Bug Fixes**

- Additional fixes to support Proguard minification for Jetpack XR SceneCore ([I4f47e](https://android-review.googlesource.com/#/q/I4f47e46ecb26a1909d2e4622810a5f85b9b06958))
- Updated Jetpack XR Scenecore `ProGuard` rule to prevent `AbstractMethodError` for minified clients. ([I91a01](https://android-review.googlesource.com/#/q/I91a01dd6f1545db37c95c59ee8691f51ed665ce0))

### Version 1.0.0-alpha02

February 12, 2025

`androidx.xr.scenecore:scenecore:1.0.0-alpha02` and `androidx.xr.scenecore:scenecore-testing:1.0.0-alpha02` are released. Version 1.0.0-alpha02 contains [these commits](https://android.googlesource.com/platform/frameworks/support/+log/e2e2729abc59df52d40af80a8bbfe010c02455c6..a96c4899cab90642c7b1d722dc1f3b45f56e7b82/xr/scenecore).

**Upcoming breaking change affecting apps built before 1.0.0-alpha02**

- Factory methods have been moved from the `Session` class to a companion method on each respective type:
  - `Session.createActivityPanelEntity(Dimensions, String, Activity, Pose)` has been deleted and replaced with `ActivityPanelEntity.create(Session, Dimensions, String, Pose)`
  - `Session.createAnchorEntity(Anchor)` has been deleted and replaced with `AnchorEntity.create(Session, Anchor)`
  - `Session.createAnchorEntity(Dimensions, Int, Int, Duration)` has been deleted and replaced with `AnchorEntity.create(Session, Dimensions, Int, Int, Duration)`
  - `Session.createEntity(String, Pose)` has been deleted and replaced with `ContentlessEntity.create(Session, String, Pose)`
  - `Session.createExrImageResource(String)` has been deleted and replaced with `ExrImage.create(Session, String)`
  - `Session.createGltfEntity(GltfModel, Pose)` has been deleted and replaced with `GltfModelEntity.create(Session, GltfModel, Pose)`
  - `Session.createGltfModelResource(String)` has been deleted and replaced with `GltfModel.create(Session, String)`
  - `Session.createInteractableComponent(Executor, InputEventListener)` has been deleted and replaced with `InteractableComponent.create(Session, Executor, InputEventListener)`
  - `Session.createMovableComponent(Boolean, Boolean, Set<AnchorPlacement>, Boolean)` has been deleted and replaced with `MovableComponent.create(Session, Boolean, Boolean, Set<AnchorPlacement>, Boolean)`
  - `Session.createPanelEntity(View, Dimensions, Dimensions, String, Pose)` has been deleted and replaced with `PanelEntity.create(Session, View, Dimensions, Dimensions, String, Pose)`
  - `Session.createResizableComponent(Dimensions, Dimensions)` has been deleted and replaced with `ResizableComponent.create(Session, Dimensions, Dimensions)`
  - `Session.createStereoSurfaceEntity(Int, Dimensions, Pose)` has been deleted and replaced with `StereoSurface.create(Session, Int, Dimensions, Pose)`
- The following deprecated methods were removed:
  - `Session.canEmbedActivityPanel(Activity)` has been deleted. Use `getSpatialCapabilities.hasCapabilility(SPATIAL_CAPABILITY_EMBED_ACTIVITY)` instead.
  - `Session.hasSpatialCapability(Int)` has been deleted. It has been replaced in favor of using `getSpatialCapabilities().hasCapability()` as a more compartmentalized way to check for the presence of spatial capabilities since `getSpatialCapabilities()` returns a `SpatialCapabilities` object.
  - `Session.requestFullSpaceMode()` has been deleted and replaced with `SpatialEnvironment.requestFullSpaceMode()`
  - `Session.requestHomeSpaceMode()` has been deleted and replaced with `SpatialEnvironment.requestHomeSpaceMode()`
- `Session.setFullSpaceMode(Bundle)` and `Session.setFullSpaceModeWithEnvironmentInherited(Bundle)` have been moved to extension functions. Developer files will need to add the new imports for access:
  - `import androidx.xr.scenecore.setFullSpaceMode`
  - `import androidx.xr.scenecore.setFullSpaceModeWithEnvironmentInherited`
- `Session.setPreferredAspectRatio(Activity, Float)` has been moved to an extension function. Developer files will need to add the new import for access:
  - `import androidx.xr.scenecore.setPreferredAspectRatio`
- `Session.getEntitiesOfType(Class<out T>)` and `Session.getEntityForRtEntity(RtEntity)` have been moved to extension functions. Developer files will need to add the new imports for access:
  - `import androidx.xr.scenecore.getEntitiesOfType`
  - `import androidx.xr.scenecore.getEntityForRtEntity`
- `Session.unpersistAnchor(Anchor)` has been deleted
- `Session.createPersistedAnchorEntity(UUID)` has been deleted

**Known issues**

- `PanelEntity.setCornerRadius()` and `ActivityPanelEntity.setCornerRadius()` may not take effect until the panel is next moved, this can be mitigated by moving the panel to its current position
- When `BoundsChanged` is called on the `ActivitySpace`, some `ActivityPose`s may not have been correctly updated. It will be updated on the following `OnSpaceUpdated` call on the `ActivitySpace`

**Breaking \& behavioral changes**

- `PanelEntity` and `ActivityPanelEntity` will have a default corner radius of 32dp or smaller if the panel has a width or height smaller than 32dp

**New APIs and capabilities**

- Introduces `StereoSurface.CanvasShape`, which allows for the creation of `Spherical` and `Hemispherical` canvases for rendering immersive media.
- `StereoSurfaceEntity.create()` now accepts a `CanvasShape` parameter. (This parameter is currently ignored, but will be used in a future release)
- `StereoSurfaceEntity.create()` no longer takes a `Dimensions` parameter. Applications should control the size of the canvas through setting the `CanvasShape`
- `StereoSurfaceEntity` has a `CanvasShape` member which can be set dynamically.
- `StereoSurfaceEntity.dimensions` is now a read-only property; applications should set the `CanvasShape` to change dimensions.
- `StereoSurfaceEntity` now allows the `StereoMode` to be re-set after construction.

**Other changes**

- Reduced compile-time minSDK to 24. All Jetpack XR APIs continue to require API 34 at runtime.
- `SceneCore`'s Session factory (`Session.create`) no longer launches an intent to acquire the `SCENE_UNDERSTANDING` permission. Instead, the client application must explicitly request the permissions from the user, before attempting to create the anchors. Anchor creation will fail if the permission is not granted by the user.

**Bug fixes**

- `getActivitySpacePose()` has been fixed to account for the `ActivitySpace` scale by returning translation values in scaled meters rather than always returning non-scaled meters. `transformPoseTo` now also uses the right units to compute coordinate changes when the `ActivitySpace` is involved in the source or destination.
- The skybox will now be set to an all-black skybox whenever a null skybox preference is passed using `setSpatialEnvironmentPreference(new SpatialEnvironmentPreference(null, geom))`. To revert to the system default skybox and geometry, use `setSpatialEnvironmentPreference(null).`

### Version 1.0.0-alpha01

December 12, 2024

`androidx.xr.scenecore:scenecore-* 1.0.0-alpha01` is released.

**Features of Initial Release**
Initial developer release of Jetpack SceneCore, a 3D scene graph library for creating and manipulating immersive scenes and environments. This library allows you to place and arrange 3D models and content panels relative to each other and your virtual or real-world environments.

- [SpatialEnvironment](https://developer.android.com/design/ui/xr/guides/environments): Create fully immersive experiences with a skybox image and/or 3D model geometry as the backdrop for your XR scene of your environment. Or enable passthrough, so your virtual scene can integrate with the user's real-world environment.
- [PanelEntity](https://developer.android.com/reference/kotlin/androidx/xr/scenecore/PanelEntity): Add 2D content to your 3D scenes by embedding standard Android layouts and Activities into spatialized panels that can float or be anchored to real-world surfaces.
- [GltfModelEntity](https://developer.android.com/reference/kotlin/androidx/xr/scenecore/GltfModelEntity): Place, animate, and interact with 3D models in your scene. SceneCore supports the glTF file format for ease of integration with existing models.
- [SpatialAudio](https://developer.android.com/develop/xr/jetpack-xr-sdk/add-spatial-audio): Add ambient and point audio sources into your 3D scene for fully immersive, spatialized sound.
- [StereoSurfaceEntity](https://developer.android.com/reference/kotlin/androidx/xr/scenecore/StereoSurfaceEntity): SceneCore supports left/right eye routing of content rendered onto an Android Surface. This can be used to render stereoscopic content in a side-by-side or top-bottom format, such as stereo photos, 3D video, or other dynamically rendered UIs. Applications should use MediaPlayer or ExoPlayer for video decoding.
- Component System: SceneCore offers a robust and flexible component system for adding capabilities to your XR content, including affordances for users to move, resize, and interact with models and panels.
- [Anchor](https://developer.android.com/reference/kotlin/androidx/xr/arcore/Anchor): With passthrough enabled, you can attach panels and models to actual surfaces, giving users seamless integration of virtual content in their real-world environment.
- User Pose: Access the user's location in the virtual scene, to orient your content around the user's position.
- [SpatialCapabilities](https://developer.android.com/reference/kotlin/androidx/xr/scenecore/SpatialCapabilities): Build fully adaptive apps that take advantage of spatialized capabilities when available, such as 3D positioning of UI content. Not only that, but your app can monitor for changes to capabilities while the app is executing, to modify the experience based on how the user is using their Android XR device.

**Known Issues**

- Currently a minSDK of 30 is required to use Jetpack SceneCore. As a workaround add the following manifest entry `<uses-sdk tools:overrideLibrary="androidx.xr.scenecore, androidx.xr.compose"/>` to be able to build and run with a minSDK of 23.
- Session can become invalid in various situations that automatically recreate the Activity, including resizing a main panel, connecting peripherals, and changing between light and dark mode. If you encounter session invalidation issues, workarounds include making you main panel non-resizable, using a dynamic panel entity, [disabling activity recreation](https://developer.android.com/guide/topics/resources/runtime-changes#restrict-activity) for specific config changes or disabling light/dark mode theme changes.
- Movable and Resizable components are not supported on GltfEntity.
- Entity.getSize() is not supported on GltfEntity.
- Jetpack XR apps required to request `android.permission.SCENE_UNDERSTANDING` permission in AndroidManifest.
- Creating a session is only supported on an Android XR device. At this time, if you create a Session and try to use it on a non Android XR device, you'll get a RuntimeException.
- Setting the skybox to null via \`SpatialEnvironment.setSpatialEnvironmentPreference() does not result in a solid black skybox as documented. It may result in the system default skybox or no change to the current skybox.
- SceneCore clients should add `implementation("com.google.guava:listenablefuture-1.0")` to their Gradle configuration for their app's dependencies. In a future release, scenecore will include this library as an `api` dependency so clients will not need to explicitly declare it.
- SceneCore erroneously includes `com.google.guava:guava-31.1-android` and `com.google.protobuf:protobuf-javalite` as transitive dependencies. If this results in duplicate class errors in your build, these two dependencies can be safely excluded.
- If your app uses SceneCore and enables ProGuard, it will crash when you create a Session. As a workaround, disable ProGuard. See [this
  guide](https://developer.android.com/build/shrink-code) for more information on how to enable ProGuard.