Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12ccfca8 authored by Jordan Demeulenaere's avatar Jordan Demeulenaere
Browse files

Optimize sysuiResTag

This CL optimizes sysuiResTag so that it does not unnecessarily compose
the semantics modifier setting testTagsAsResourceId to true. Instead,
each Compose root should use the sysUiResTagContainer() once so that its
descendants can be tagged using sysuiResTag().

Bug: 372412931
Test: Ran integration tests in Forrest with this CL
Flag: TEST_ONLY
Change-Id: I55e9c8e967e00a0114bbc9f01bdb922a1b47fc6e
parent 48cbafb9
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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 }
+2 −2
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ fun SceneContainer(

    Box(
        modifier =
            Modifier.fillMaxSize().pointerInput(Unit) {
            modifier.fillMaxSize().pointerInput(Unit) {
                awaitEachGesture {
                    awaitFirstDown(false)
                    viewModel.onSceneContainerUserInputStarted()
@@ -216,7 +216,7 @@ fun SceneContainer(

        SceneTransitionLayout(
            state = state,
            modifier = modifier.fillMaxSize(),
            modifier = Modifier.fillMaxSize(),
            swipeSourceDetector = viewModel.swipeSourceDetector,
        ) {
            sceneByKey.forEach { (sceneKey, scene) ->
+9 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -81,7 +83,13 @@ object ComposeBouncerViewBinder {

                    view.addView(
                        ComposeView(view.context).apply {
                            setContent { BouncerContainer(viewModelFactory, dialogFactory) }
                            setContent {
                                BouncerContainer(
                                    viewModelFactory,
                                    dialogFactory,
                                    Modifier.sysUiResTagContainer(),
                                )
                            }
                        }
                    )
                    awaitCancellation()
+2 −1
Original line number Diff line number Diff line
@@ -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
+11 −1
Original line number Diff line number Diff line
@@ -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
@@ -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