# ProjectedTestRule

Artifact: [androidx.xr.projected:projected-testing](https://developer.android.com/jetpack/androidx/releases/xr-projected) [View Source](https://cs.android.com/search?q=file:androidx/xr/projected/testing/ProjectedTestRule.kt+class:androidx.xr.projected.testing.ProjectedTestRule) Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

*** ** * ** ***


```
@RequiresApi(value = 34)
@ExperimentalProjectedApi
class ProjectedTestRule : TestRule
```

<br />

*** ** * ** ***

Test rule for the Projected clients.

This rule sets up a virtual device and a virtual display using `VirtualDeviceManager` before each test method and ensures they are properly torn down afterward. This allows testing of components that interact with Projected devices.

Usage:

```kotlin
@RunWith(AndroidJUnit4::class)
class MyProjectedFeatureTest {

    @get:Rule val projectedTestRule = ProjectedTestRule()

    private val context: ContextWrapper = ApplicationProvider.getApplicationContext()

    @Test
    fun testFeatureWithProjectedDevice() {
        // A Projected device is automatically created before this test.
        assertThat(ProjectedContext.createProjectedDeviceContext(context)).isNotNull()
    }

    @Test
    fun testFeatureWithoutProjectedDevice() {
        // Manually disconnect the device for this specific test.
        projectedTestRule.isDeviceConnected = false
        // Test behavior when no projected device is connected.
        assertThrows(IllegalStateException::class.java) {
            assertThat(ProjectedContext.createProjectedDeviceContext(context)).isNull()
        }
    }
}
```

The Projected device is connected by default at the start of each test. The connection state can be controlled via the `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#isDeviceConnected()` property.

## Summary

| ### Public constructors |
|---|
| `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#ProjectedTestRule()()` |

| ### Public functions |
|---|---|
| `open https://junit.org/junit4/javadoc/latest/org/junit/runners/model/Statement.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#apply(org.junit.runners.model.Statement,org.junit.runner.Description)(base: https://junit.org/junit4/javadoc/latest/org/junit/runners/model/Statement.html?, description: https://junit.org/junit4/javadoc/latest/org/junit/runner/Description.html?)` |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#launchTestProjectedDeviceActivity(kotlin.Function1)(block: (https://developer.android.com/reference/android/app/Activity.html) -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html)` Launches a test `https://developer.android.com/reference/android/app/Activity.html` on the Projected device. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#sendProjectedInputEvent(androidx.xr.projected.ProjectedInputEvent.ProjectedInputAction)( projectedInputAction: https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedInputEvent.ProjectedInputAction )` Emits a with the given `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedInputEvent.ProjectedInputAction` to `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedActivityCompat#projectedInputEvents()`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#setBatteryState(androidx.xr.projected.BatteryState)(batteryState: https://developer.android.com/reference/kotlin/androidx/xr/projected/BatteryState)` Updates battery state to the one provided. |

| ### Public properties |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://developer.android.com/reference/android/media/AudioDeviceInfo.html>` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#audioDevices()` This property can be used to control the Projected audio devices, as returned by `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDeviceController#audioDevices()`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-set/index.html<https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDeviceController.Capability>` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#capabilities()` This property can be used to control the Projected device capabilities. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#isDeviceConnected()` This property can be used to control whether the device is connected or not. |
| `https://developer.android.com/reference/kotlin/androidx/lifecycle/Lifecycle.State` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#lifecycleState()` This property can be used to control the lifecycle state of the Projected device. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-set/index.html<https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController.PresentationMode>` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#presentationModeFlags()` This property can be used to control the `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController.PresentationMode` flags. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#projectedLayoutParamFlags()` Returns the currently set Projected layout param flags, reflecting the state after calls to `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController#addLayoutParamsFlags(kotlin.Int)` and `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController#removeLayoutParamsFlags(kotlin.Int)`. |
| `https://developer.android.com/reference/android/app/PendingIntent.html?` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#registeredInputReceiver()` Retrieves the `https://developer.android.com/reference/android/app/PendingIntent.html` most recently registered by the application as the input receiver, or null if none is registered. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/xr/projected/testing/ProjectedTestRule#shouldThrowIllegalStateExceptionWhenCreatingControllers()` Controls whether `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedActivityCompat#create(android.content.Context)` or `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDeviceController#create(android.content.Context)` throw an `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-state-exception/index.html` when called. |

## Public constructors

### ProjectedTestRule

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
ProjectedTestRule()
```

## Public functions

### apply

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
open fun apply(base: Statement?, description: Description?): Statement
```

### launchTestProjectedDeviceActivity

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
fun launchTestProjectedDeviceActivity(block: (Activity) -> Unit): Unit
```

Launches a test `https://developer.android.com/reference/android/app/Activity.html` on the Projected device.

| Parameters |
|---|---|
| `block: (https://developer.android.com/reference/android/app/Activity.html) -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | The block to execute on the test activity. |

### sendProjectedInputEvent

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
fun sendProjectedInputEvent(
    projectedInputAction: ProjectedInputEvent.ProjectedInputAction
): Unit
```

Emits a with the given `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedInputEvent.ProjectedInputAction` to `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedActivityCompat#projectedInputEvents()`.

### setBatteryState

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
fun setBatteryState(batteryState: BatteryState): Unit
```

Updates battery state to the one provided. Calling this function notifies listeners registered using the ProjectedDeviceController.addBatteryStateChangedListener() API.

## Public properties

### audioDevices

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
var audioDevices: List<AudioDeviceInfo>
```

This property can be used to control the Projected audio devices, as returned by `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDeviceController#audioDevices()`. By default, the list of audio devices includes a single input and a single output audio device.

### capabilities

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
var capabilities: Set<ProjectedDeviceController.Capability>
```

This property can be used to control the Projected device capabilities. By default, the set of capabilities includes the `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDeviceController.Capability#CAPABILITY_VISUAL_UI()`.

### isDeviceConnected

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
var isDeviceConnected: Boolean
```

This property can be used to control whether the device is connected or not. By default, the device is disconnected.

### lifecycleState

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
var lifecycleState: Lifecycle.State
```

This property can be used to control the lifecycle state of the Projected device. By default, the Projected device is in the `https://developer.android.com/reference/kotlin/androidx/lifecycle/Lifecycle.State#INITIALIZED` state.

### presentationModeFlags

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
var presentationModeFlags: Set<ProjectedDisplayController.PresentationMode>
```

This property can be used to control the `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController.PresentationMode` flags. By default, all the presentation mode flags are set.

### projectedLayoutParamFlags

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
val projectedLayoutParamFlags: Int
```

Returns the currently set Projected layout param flags, reflecting the state after calls to `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController#addLayoutParamsFlags(kotlin.Int)` and `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDisplayController#removeLayoutParamsFlags(kotlin.Int)`.

Value is either `0` or

- `128`

<br />

### registeredInputReceiver

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
val registeredInputReceiver: PendingIntent?
```

Retrieves the `https://developer.android.com/reference/android/app/PendingIntent.html` most recently registered by the application as the input receiver, or null if none is registered.

Reflects the current state resulting from calls to `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedActivityCompat#setActivityAsInputReceiver(android.app.PendingIntent)` and `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedActivityCompat#clearActivityAsInputReceiver()`.

### shouldThrowIllegalStateExceptionWhenCreatingControllers

Added in [1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/xr-projected#1.0.0-alpha14)

```
var shouldThrowIllegalStateExceptionWhenCreatingControllers: Boolean
```

Controls whether `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedActivityCompat#create(android.content.Context)` or `https://developer.android.com/reference/kotlin/androidx/xr/projected/ProjectedDeviceController#create(android.content.Context)` throw an `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-illegal-state-exception/index.html` when called. By default, the exception is not being thrown.