summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author burakov <burakov@google.com> 2024-05-31 20:28:27 +0000
committer burakov <burakov@google.com> 2024-06-03 14:36:04 +0000
commit532e378b8fc4dfb01b6be3344e9e020ce2bbd968 (patch)
tree37e96301d540dc768500da92ab6532c52fef5909
parentf6fea76f009e6437a0844b3d3f1e235329b5c19a (diff)
[bc25] Add initial Quick Settings rendering in QuickSettingsShadeScene.
Test: Manually tested by opening and closing the quick settings shade on a foldable device both in a folded and unfolded configuration. Test: Unit tests build and pass. Bug: 344008947 Flag: com.android.systemui.dual_shade Change-Id: If7126eac51f4636616556f231eb2e64b377445d7
-rw-r--r--packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeScene.kt93
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeSceneViewModel.kt10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java8
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt31
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/QuickSettingsShadeSceneViewModelKosmos.kt8
6 files changed, 140 insertions, 22 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeScene.kt
index 4d946bff63ca..7deaddae805d 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeScene.kt
@@ -16,22 +16,38 @@
package com.android.systemui.qs.ui.composable
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.SceneScope
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.ui.composable.LockscreenContent
+import com.android.systemui.qs.panels.ui.compose.EditMode
+import com.android.systemui.qs.panels.ui.compose.TileGrid
import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeSceneViewModel
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import com.android.systemui.shade.ui.composable.OverlayShade
-import com.android.systemui.shade.ui.viewmodel.OverlayShadeViewModel
import dagger.Lazy
import java.util.Optional
import javax.inject.Inject
@@ -41,8 +57,7 @@ import kotlinx.coroutines.flow.StateFlow
class QuickSettingsShadeScene
@Inject
constructor(
- viewModel: QuickSettingsShadeSceneViewModel,
- private val overlayShadeViewModel: OverlayShadeViewModel,
+ private val viewModel: QuickSettingsShadeSceneViewModel,
private val lockscreenContent: Lazy<Optional<LockscreenContent>>,
) : ComposableScene {
@@ -56,21 +71,81 @@ constructor(
modifier: Modifier,
) {
OverlayShade(
- viewModel = overlayShadeViewModel,
- modifier = modifier,
+ viewModel = viewModel.overlayShadeViewModel,
horizontalArrangement = Arrangement.End,
lockscreenContent = lockscreenContent,
+ modifier = modifier,
) {
- Text(
- text = "Quick settings grid",
- modifier = Modifier.padding(QuickSettingsShade.Dimensions.Padding)
- )
+ val isEditing by viewModel.editModeViewModel.isEditing.collectAsStateWithLifecycle()
+
+ // The main Quick Settings grid layout.
+ AnimatedVisibility(
+ visible = !isEditing,
+ enter = QuickSettingsShade.Transitions.QuickSettingsLayoutEnter,
+ exit = QuickSettingsShade.Transitions.QuickSettingsLayoutExit,
+ ) {
+ QuickSettingsLayout(
+ viewModel = viewModel,
+ )
+ }
+
+ // The Quick Settings Editor layout.
+ AnimatedVisibility(
+ visible = isEditing,
+ enter = QuickSettingsShade.Transitions.QuickSettingsEditorEnter,
+ exit = QuickSettingsShade.Transitions.QuickSettingsEditorExit,
+ ) {
+ EditMode(
+ viewModel = viewModel.editModeViewModel,
+ modifier =
+ Modifier.fillMaxWidth().padding(QuickSettingsShade.Dimensions.Padding)
+ )
+ }
+ }
+ }
+}
+
+@Composable
+private fun QuickSettingsLayout(
+ viewModel: QuickSettingsShadeSceneViewModel,
+ modifier: Modifier = Modifier,
+) {
+ Column(
+ verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = modifier.fillMaxWidth().padding(QuickSettingsShade.Dimensions.Padding),
+ ) {
+ BrightnessSliderContainer(
+ viewModel = viewModel.brightnessSliderViewModel,
+ modifier =
+ Modifier.fillMaxWidth()
+ .height(QuickSettingsShade.Dimensions.BrightnessSliderHeight),
+ )
+ TileGrid(
+ viewModel = viewModel.tileGridViewModel,
+ modifier =
+ Modifier.fillMaxWidth().heightIn(max = QuickSettingsShade.Dimensions.GridMaxHeight),
+ )
+ Button(
+ onClick = { viewModel.editModeViewModel.startEditing() },
+ ) {
+ Text("Edit mode")
}
}
}
object QuickSettingsShade {
+
object Dimensions {
val Padding = 16.dp
+ val BrightnessSliderHeight = 64.dp
+ val GridMaxHeight = 400.dp
+ }
+
+ object Transitions {
+ val QuickSettingsLayoutEnter: EnterTransition = fadeIn(tween(500))
+ val QuickSettingsLayoutExit: ExitTransition = fadeOut(tween(500))
+ val QuickSettingsEditorEnter: EnterTransition = fadeIn(tween(500))
+ val QuickSettingsEditorExit: ExitTransition = fadeOut(tween(500))
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 828d6ed6ab89..03c2aa6f4bc4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -108,7 +108,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P
private AutoTileManager mAutoTiles;
private final ArrayList<QSFactory> mQsFactories = new ArrayList<>();
private int mCurrentUser;
- private final ShadeController mShadeController;
+ private final Lazy<ShadeController> mShadeControllerProvider;
private Context mUserContext;
private UserTracker mUserTracker;
private SecureSettings mSecureSettings;
@@ -130,7 +130,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P
PluginManager pluginManager,
TunerService tunerService,
Provider<AutoTileManager> autoTiles,
- ShadeController shadeController,
+ Lazy<ShadeController> shadeControllerProvider,
QSLogger qsLogger,
UserTracker userTracker,
SecureSettings secureSettings,
@@ -149,7 +149,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P
mUserFileManager = userFileManager;
mFeatureFlags = featureFlags;
- mShadeController = shadeController;
+ mShadeControllerProvider = shadeControllerProvider;
if (featureFlags.getTilesEnabled()) {
mQsFactories.add(newQsTileFactoryProvider.get());
@@ -216,17 +216,17 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, P
@Override
public void collapsePanels() {
- mShadeController.postAnimateCollapseShade();
+ mShadeControllerProvider.get().postAnimateCollapseShade();
}
@Override
public void forceCollapsePanels() {
- mShadeController.postAnimateForceCollapseShade();
+ mShadeControllerProvider.get().postAnimateForceCollapseShade();
}
@Override
public void openPanels() {
- mShadeController.postAnimateExpandQs();
+ mShadeControllerProvider.get().postAnimateExpandQs();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeSceneViewModel.kt
index d48d55dd9918..c1a56465064f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeSceneViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeSceneViewModel.kt
@@ -21,8 +21,12 @@ import com.android.compose.animation.scene.SceneKey
import com.android.compose.animation.scene.Swipe
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
+import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
+import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.shade.ui.viewmodel.OverlayShadeViewModel
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -37,7 +41,11 @@ class QuickSettingsShadeSceneViewModel
@Inject
constructor(
@Application private val applicationScope: CoroutineScope,
- overlayShadeViewModel: OverlayShadeViewModel,
+ val overlayShadeViewModel: OverlayShadeViewModel,
+ val brightnessSliderViewModel: BrightnessSliderViewModel,
+ val tileGridViewModel: TileGridViewModel,
+ val editModeViewModel: EditModeViewModel,
+ val qsSceneAdapter: QSSceneAdapter,
) {
val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
overlayShadeViewModel.backgroundScene
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
index 5e14b1a60ddb..73810af6108b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java
@@ -53,7 +53,6 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.Expandable;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.dump.nano.SystemUIProtoDump;
-import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.plugins.qs.QSFactory;
@@ -133,8 +132,6 @@ public class QSTileHostTest extends SysuiTestCase {
private SparseArray<SharedPreferences> mSharedPreferencesByUser;
- private FakeFeatureFlags mFeatureFlags;
-
private QSPipelineFlagsRepository mQSPipelineFlagsRepository;
private FakeExecutor mMainExecutor;
@@ -144,7 +141,6 @@ public class QSTileHostTest extends SysuiTestCase {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mFeatureFlags = new FakeFeatureFlags();
mSetFlagsRule.disableFlags(FLAG_QS_NEW_PIPELINE);
mSetFlagsRule.disableFlags(FLAG_QS_NEW_TILES);
@@ -170,7 +166,7 @@ public class QSTileHostTest extends SysuiTestCase {
saveSetting("");
setUpTileFactory();
mQSTileHost = new TestQSTileHost(mContext, () -> null, mDefaultFactory, mMainExecutor,
- mPluginManager, mTunerService, () -> mAutoTiles, mShadeController,
+ mPluginManager, mTunerService, () -> mAutoTiles, () -> mShadeController,
mQSLogger, mUserTracker, mSecureSettings, mCustomTileStatePersister,
mTileLifecycleManagerFactory, mUserFileManager, mQSPipelineFlagsRepository);
mMainExecutor.runAllReady();
@@ -689,7 +685,7 @@ public class QSTileHostTest extends SysuiTestCase {
QSFactory defaultFactory, Executor mainExecutor,
PluginManager pluginManager, TunerService tunerService,
Provider<AutoTileManager> autoTiles,
- ShadeController shadeController, QSLogger qsLogger,
+ Lazy<ShadeController> shadeController, QSLogger qsLogger,
UserTracker userTracker, SecureSettings secureSettings,
CustomTileStatePersister customTileStatePersister,
TileLifecycleManager.Factory tileLifecycleManagerFactory,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt
new file mode 100644
index 000000000000..d208465bd33d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/brightness/ui/viewmodel/BrightnessSliderViewModelKosmos.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 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.brightness.ui.viewmodel
+
+import com.android.systemui.brightness.domain.interactor.brightnessPolicyEnforcementInteractor
+import com.android.systemui.brightness.domain.interactor.screenBrightnessInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+
+val Kosmos.brightnessSliderViewModel: BrightnessSliderViewModel by
+ Kosmos.Fixture {
+ BrightnessSliderViewModel(
+ screenBrightnessInteractor = screenBrightnessInteractor,
+ brightnessPolicyEnforcementInteractor = brightnessPolicyEnforcementInteractor,
+ applicationScope = applicationCoroutineScope,
+ )
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/QuickSettingsShadeSceneViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/QuickSettingsShadeSceneViewModelKosmos.kt
index 8c5ff1d5d216..c5625e47040a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/QuickSettingsShadeSceneViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/QuickSettingsShadeSceneViewModelKosmos.kt
@@ -16,8 +16,12 @@
package com.android.systemui.shade.ui.viewmodel
+import com.android.systemui.brightness.ui.viewmodel.brightnessSliderViewModel
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.qs.panels.ui.viewmodel.editModeViewModel
+import com.android.systemui.qs.panels.ui.viewmodel.tileGridViewModel
+import com.android.systemui.qs.ui.adapter.qsSceneAdapter
import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeSceneViewModel
val Kosmos.quickSettingsShadeSceneViewModel: QuickSettingsShadeSceneViewModel by
@@ -25,5 +29,9 @@ val Kosmos.quickSettingsShadeSceneViewModel: QuickSettingsShadeSceneViewModel by
QuickSettingsShadeSceneViewModel(
applicationScope = applicationCoroutineScope,
overlayShadeViewModel = overlayShadeViewModel,
+ brightnessSliderViewModel = brightnessSliderViewModel,
+ tileGridViewModel = tileGridViewModel,
+ editModeViewModel = editModeViewModel,
+ qsSceneAdapter = qsSceneAdapter,
)
}