Loading packages/SystemUI/compose/features/src/com/android/systemui/compose/modifiers/SysuiTestTag.kt +11 −3 Original line number Diff line number Diff line Loading @@ -25,12 +25,20 @@ import androidx.compose.ui.semantics.testTagsAsResourceId /** * Set a test tag on this node so that it is associated with [resId]. This node will then be * accessible by integration tests using `sysuiResSelector(resId)`. * * Important: This modifier will work only when contained under a [sysUiResTagContainer]. * * @see sysUiResTagContainer */ @Stable fun Modifier.sysuiResTag(resId: String): Modifier { // TODO(b/372412931): Only compose the semantics modifier once, at the root of the SystemUI // window. return this.then(TestTagAsResourceIdModifier).testTag("com.android.systemui:id/$resId") return this.testTag("com.android.systemui:id/$resId") } /** Mark this node as a container that contains one or more [sysuiResTag] descendants. */ @Stable fun Modifier.sysUiResTagContainer(): Modifier { return this.then(TestTagAsResourceIdModifier) } private val TestTagAsResourceIdModifier = Modifier.semantics { testTagsAsResourceId = true } packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt +2 −2 Original line number Diff line number Diff line Loading @@ -204,7 +204,7 @@ fun SceneContainer( Box( modifier = Modifier.fillMaxSize().pointerInput(Unit) { modifier.fillMaxSize().pointerInput(Unit) { awaitEachGesture { awaitFirstDown(false) viewModel.onSceneContainerUserInputStarted() Loading @@ -219,7 +219,7 @@ fun SceneContainer( SceneTransitionLayout( state = state, modifier = modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(), swipeSourceDetector = viewModel.swipeSourceDetector, ) { sceneByKey.forEach { (sceneKey, scene) -> Loading packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt +9 −1 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import android.view.ViewGroup import androidx.activity.OnBackPressedDispatcher import androidx.activity.OnBackPressedDispatcherOwner import androidx.activity.setViewTreeOnBackPressedDispatcherOwner import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.lifecycle.Lifecycle import com.android.app.tracing.coroutines.launchTraced as launch Loading @@ -12,6 +13,7 @@ import com.android.systemui.bouncer.ui.BouncerDialogFactory import com.android.systemui.bouncer.ui.composable.BouncerContainer import com.android.systemui.bouncer.ui.viewmodel.BouncerContainerViewModel import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel import com.android.systemui.compose.modifiers.sysUiResTagContainer import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.lifecycle.WindowLifecycleState import com.android.systemui.lifecycle.repeatWhenAttached Loading Loading @@ -81,7 +83,13 @@ object ComposeBouncerViewBinder { view.addView( ComposeView(view.context).apply { setContent { BouncerContainer(viewModelFactory, dialogFactory) } setContent { BouncerContainer( viewModelFactory, dialogFactory, Modifier.sysUiResTagContainer(), ) } } ) awaitCancellation() Loading packages/SystemUI/src/com/android/systemui/bouncer/ui/composable/BouncerContainer.kt +2 −1 Original line number Diff line number Diff line Loading @@ -33,12 +33,13 @@ import com.android.systemui.lifecycle.rememberViewModel fun BouncerContainer( viewModelFactory: BouncerOverlayContentViewModel.Factory, dialogFactory: BouncerDialogFactory, modifier: Modifier = Modifier, ) { PlatformTheme { val backgroundColor = MaterialTheme.colorScheme.surface val bouncerViewModel = rememberViewModel("BouncerContainer") { viewModelFactory.create() } Box { Box(modifier) { Canvas(Modifier.fillMaxSize()) { drawRect(color = backgroundColor) } // Separate the bouncer content into a reusable composable that doesn't have any Loading packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt +11 −1 Original line number Diff line number Diff line Loading @@ -22,12 +22,14 @@ import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.ui.Modifier import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.compose.theme.PlatformTheme import com.android.systemui.compose.modifiers.sysUiResTagContainer import com.android.systemui.people.ui.compose.PeopleScreen import com.android.systemui.people.ui.viewmodel.PeopleViewModel import javax.inject.Inject Loading Loading @@ -62,7 +64,15 @@ constructor(private val viewModelFactory: PeopleViewModel.Factory) : ComponentAc } // Set the content of the activity, using either the View or Compose implementation. setContent { PlatformTheme { PeopleScreen(viewModel, onResult = { finishActivity(it) }) } } setContent { PlatformTheme { PeopleScreen( viewModel, onResult = { finishActivity(it) }, Modifier.sysUiResTagContainer(), ) } } } private fun finishActivity(result: PeopleViewModel.Result) { Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/compose/modifiers/SysuiTestTag.kt +11 −3 Original line number Diff line number Diff line Loading @@ -25,12 +25,20 @@ import androidx.compose.ui.semantics.testTagsAsResourceId /** * Set a test tag on this node so that it is associated with [resId]. This node will then be * accessible by integration tests using `sysuiResSelector(resId)`. * * Important: This modifier will work only when contained under a [sysUiResTagContainer]. * * @see sysUiResTagContainer */ @Stable fun Modifier.sysuiResTag(resId: String): Modifier { // TODO(b/372412931): Only compose the semantics modifier once, at the root of the SystemUI // window. return this.then(TestTagAsResourceIdModifier).testTag("com.android.systemui:id/$resId") return this.testTag("com.android.systemui:id/$resId") } /** Mark this node as a container that contains one or more [sysuiResTag] descendants. */ @Stable fun Modifier.sysUiResTagContainer(): Modifier { return this.then(TestTagAsResourceIdModifier) } private val TestTagAsResourceIdModifier = Modifier.semantics { testTagsAsResourceId = true }
packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt +2 −2 Original line number Diff line number Diff line Loading @@ -204,7 +204,7 @@ fun SceneContainer( Box( modifier = Modifier.fillMaxSize().pointerInput(Unit) { modifier.fillMaxSize().pointerInput(Unit) { awaitEachGesture { awaitFirstDown(false) viewModel.onSceneContainerUserInputStarted() Loading @@ -219,7 +219,7 @@ fun SceneContainer( SceneTransitionLayout( state = state, modifier = modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(), swipeSourceDetector = viewModel.swipeSourceDetector, ) { sceneByKey.forEach { (sceneKey, scene) -> Loading
packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt +9 −1 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import android.view.ViewGroup import androidx.activity.OnBackPressedDispatcher import androidx.activity.OnBackPressedDispatcherOwner import androidx.activity.setViewTreeOnBackPressedDispatcherOwner import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import androidx.lifecycle.Lifecycle import com.android.app.tracing.coroutines.launchTraced as launch Loading @@ -12,6 +13,7 @@ import com.android.systemui.bouncer.ui.BouncerDialogFactory import com.android.systemui.bouncer.ui.composable.BouncerContainer import com.android.systemui.bouncer.ui.viewmodel.BouncerContainerViewModel import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel import com.android.systemui.compose.modifiers.sysUiResTagContainer import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.lifecycle.WindowLifecycleState import com.android.systemui.lifecycle.repeatWhenAttached Loading Loading @@ -81,7 +83,13 @@ object ComposeBouncerViewBinder { view.addView( ComposeView(view.context).apply { setContent { BouncerContainer(viewModelFactory, dialogFactory) } setContent { BouncerContainer( viewModelFactory, dialogFactory, Modifier.sysUiResTagContainer(), ) } } ) awaitCancellation() Loading
packages/SystemUI/src/com/android/systemui/bouncer/ui/composable/BouncerContainer.kt +2 −1 Original line number Diff line number Diff line Loading @@ -33,12 +33,13 @@ import com.android.systemui.lifecycle.rememberViewModel fun BouncerContainer( viewModelFactory: BouncerOverlayContentViewModel.Factory, dialogFactory: BouncerDialogFactory, modifier: Modifier = Modifier, ) { PlatformTheme { val backgroundColor = MaterialTheme.colorScheme.surface val bouncerViewModel = rememberViewModel("BouncerContainer") { viewModelFactory.create() } Box { Box(modifier) { Canvas(Modifier.fillMaxSize()) { drawRect(color = backgroundColor) } // Separate the bouncer content into a reusable composable that doesn't have any Loading
packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt +11 −1 Original line number Diff line number Diff line Loading @@ -22,12 +22,14 @@ import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.ui.Modifier import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.compose.theme.PlatformTheme import com.android.systemui.compose.modifiers.sysUiResTagContainer import com.android.systemui.people.ui.compose.PeopleScreen import com.android.systemui.people.ui.viewmodel.PeopleViewModel import javax.inject.Inject Loading Loading @@ -62,7 +64,15 @@ constructor(private val viewModelFactory: PeopleViewModel.Factory) : ComponentAc } // Set the content of the activity, using either the View or Compose implementation. setContent { PlatformTheme { PeopleScreen(viewModel, onResult = { finishActivity(it) }) } } setContent { PlatformTheme { PeopleScreen( viewModel, onResult = { finishActivity(it) }, Modifier.sysUiResTagContainer(), ) } } } private fun finishActivity(result: PeopleViewModel.Result) { Loading