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

Commit c92d8d32 authored by andrewxu's avatar andrewxu
Browse files

[Flexiglass] Use the BC25 styled tiles in the single shade

Bug: 420960164
Flag: com.android.systemui.scene_container
Test: com.android.systemui.qs.ui.composable.ShadeSceneTest
Change-Id: Ieccd1121ca80668cdb661ff04fd30b89aa6962dd
parent 02b4b661
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ import com.android.systemui.notifications.ui.composable.NotificationScrollingSta
import com.android.systemui.notifications.ui.composable.NotificationStackCutoffGuideline
import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility
import com.android.systemui.qs.ui.composable.BrightnessMirror
import com.android.systemui.qs.panels.ui.compose.QuickQuickSettings
import com.android.systemui.qs.ui.composable.QuickSettings
import com.android.systemui.qs.ui.composable.QuickSettings.SharedValues.MediaLandscapeTopOffset
import com.android.systemui.res.R
@@ -331,13 +332,19 @@ private fun ContentScope.SingleShade(
                Box(
                    Modifier.element(QuickSettings.Elements.QuickQuickSettings)
                        .layoutId(SingleShadeMeasurePolicy.LayoutId.QuickSettings)
                        .padding(horizontal = shadeHorizontalPadding)
                        .padding(
                            horizontal =
                                shadeHorizontalPadding +
                                        dimensionResource(id = R.dimen.qs_horizontal_margin)
                        )
                ) {
                    QuickSettings(
                        viewModel.qsSceneAdapter,
                        { viewModel.qsSceneAdapter.qqsHeight },
                        isSplitShade = false,
                        squishiness = { tileSquishiness },
                    val qqsViewModel = rememberViewModel(traceName = "shade_scene_qqs") {
                        viewModel.quickQuickSettingsViewModel.create()
                    }
                    QuickQuickSettings(
                        qqsViewModel,
                        listening = { true },
                        modifier = Modifier.sysuiResTag("quick_qs_panel")
                    )
                }

+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
import com.android.systemui.qs.FooterActionsController
import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
import com.android.systemui.qs.panels.ui.viewmodel.QuickQuickSettingsViewModel
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.model.Scenes
@@ -51,6 +52,7 @@ class ShadeSceneContentViewModel
@AssistedInject
constructor(
    val qsSceneAdapter: QSSceneAdapter,
    val quickQuickSettingsViewModel: QuickQuickSettingsViewModel.Factory,
    val shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory,
    val brightnessMirrorViewModelFactory: BrightnessMirrorViewModel.Factory,
    val mediaCarouselInteractor: MediaCarouselInteractor,
+124 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.shade.ui.composable

import android.testing.TestableLooper
import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.Saver
import androidx.compose.ui.Modifier
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.TestContentScope
import com.android.compose.theme.PlatformTheme
import com.android.systemui.SysuiTestCase
import com.android.systemui.compose.modifiers.resIdToTestTag
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.jank.interactionJankMonitor
import com.android.systemui.kosmos.testScope
import com.android.systemui.media.controls.ui.controller.mediaCarouselController
import com.android.systemui.media.controls.ui.view.qqsMediaHost
import com.android.systemui.media.controls.ui.view.qsMediaHost
import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.scene.session.shared.SessionStorage
import com.android.systemui.scene.session.ui.composable.SaveableSession
import com.android.systemui.scene.session.ui.composable.Session
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.enableSingleShade
import com.android.systemui.shade.ui.viewmodel.shadeSceneContentViewModelFactory
import com.android.systemui.shade.ui.viewmodel.shadeUserAcionsViewModelFactory
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModelFactory
import com.android.systemui.testKosmos
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock

@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
@EnableSceneContainer
class ShadeSceneTest : SysuiTestCase() {
    @get:Rule
    val composeTestRule = createComposeRule()

    private val kosmos = testKosmos()

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    @Ignore("http://b/425670368")
    fun testSingleShadeHierarchy() =
        with(kosmos) {
            testScope.runTest {
                val shadeSession = object : SaveableSession, Session by Session(SessionStorage()) {
                    @Composable
                    override fun <T : Any> rememberSaveableSession(
                        vararg inputs: Any?,
                        saver: Saver<T, out Any>,
                        key: String?,
                        init: () -> T
                    ): T = rememberSession(key, inputs = inputs, init = init)
                }

                usingMediaInComposeFragment = true

                enableSingleShade()
                runCurrent()

                val scene = ShadeScene(
                    shadeSession = shadeSession,
                    notificationStackScrollView = {
                        mock(NotificationScrollView::class.java)
                    },
                    actionsViewModelFactory = shadeUserAcionsViewModelFactory,
                    contentViewModelFactory = shadeSceneContentViewModelFactory,
                    notificationsPlaceholderViewModelFactory = notificationsPlaceholderViewModelFactory,
                    mediaCarouselController = mediaCarouselController,
                    qqsMediaHost = qqsMediaHost,
                    qsMediaHost = qsMediaHost,
                    jankMonitor = interactionJankMonitor,
                )

                // Set the single shade content.
                composeTestRule.setContent {
                    PlatformTheme {
                        with(scene) {
                            TestContentScope(currentScene = Scenes.Shade) { Content(Modifier) }
                        }
                    }
                }

                currentTilesInteractor.setTiles(listOf(TileSpec.create("small")))
                runCurrent()
                composeTestRule.waitForIdle()

                // Verify that the qs small tile exists.
                composeTestRule.onNodeWithTag(resIdToTestTag("qs_tile_small")).assertExists()

                coroutineContext.cancelChildren()
            }
        }
}
+10 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarouselInteractor
import com.android.systemui.qs.footerActionsController
import com.android.systemui.qs.footerActionsViewModelFactory
import com.android.systemui.qs.panels.ui.viewmodel.quickQuickSettingsViewModelFactory
import com.android.systemui.qs.ui.adapter.qsSceneAdapter
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModelFactory
@@ -32,6 +33,7 @@ import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor
val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture {
    ShadeSceneContentViewModel(
        shadeHeaderViewModelFactory = shadeHeaderViewModelFactory,
        quickQuickSettingsViewModel = quickQuickSettingsViewModelFactory,
        qsSceneAdapter = qsSceneAdapter,
        brightnessMirrorViewModelFactory = brightnessMirrorViewModelFactory,
        mediaCarouselInteractor = mediaCarouselInteractor,
@@ -44,3 +46,11 @@ val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture {
        sceneInteractor = sceneInteractor,
    )
}

val Kosmos.shadeSceneContentViewModelFactory : ShadeSceneContentViewModel.Factory by Fixture {
    object : ShadeSceneContentViewModel.Factory {
        override fun create(): ShadeSceneContentViewModel {
            return shadeSceneContentViewModel
        }
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -29,3 +29,11 @@ val Kosmos.shadeUserActionsViewModel: ShadeUserActionsViewModel by Fixture {
        sceneBackInteractor = sceneBackInteractor,
    )
}

val Kosmos.shadeUserAcionsViewModelFactory : ShadeUserActionsViewModel.Factory by Fixture {
    object : ShadeUserActionsViewModel.Factory {
        override fun create(): ShadeUserActionsViewModel {
            return shadeUserActionsViewModel
        }
    }
}
+13 −13

File changed.

Contains only whitespace changes.

Loading