diff options
| author | 2023-11-01 18:14:01 +0000 | |
|---|---|---|
| committer | 2023-11-01 18:14:01 +0000 | |
| commit | 417b2d77b05fe0f59e7c0a569141828d362bd33f (patch) | |
| tree | b71e8a5c77f3c5babdf9cb7eb0ebb0e962dd6396 | |
| parent | 0be58372bdbd3d30c53c345f5c42dfc95250b585 (diff) | |
| parent | d05a7f447b0f53218ca116b1a8febbcc7005cfc1 (diff) | |
Merge "Replace ShadeQsExpansionListener with Flows" into main
26 files changed, 239 insertions, 126 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java index f77f98956cbf..a79a654aedc2 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollector.java @@ -75,5 +75,8 @@ public interface FalsingCollector { /** Indicates an a11y action was made. */ void onA11yAction(); + + /** Initialize the class. */ + void init(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java index 0dfaf0f4318d..d6b9a119e31c 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorFake.java @@ -23,6 +23,10 @@ import javax.inject.Inject; /** */ public class FalsingCollectorFake implements FalsingCollector { + @Override + public void init() { + } + @Inject public FalsingCollectorFake() { } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java index a6b073da2530..12df96e41b2c 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java @@ -32,13 +32,14 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.shade.ShadeExpansionStateManager; +import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.concurrency.DelayableExecutor; +import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.sensors.ProximitySensor; import com.android.systemui.util.sensors.ThresholdSensor; import com.android.systemui.util.sensors.ThresholdSensorEvent; @@ -65,9 +66,11 @@ class FalsingCollectorImpl implements FalsingCollector { private final ProximitySensor mProximitySensor; private final StatusBarStateController mStatusBarStateController; private final KeyguardStateController mKeyguardStateController; + private final Lazy<ShadeInteractor> mShadeInteractorLazy; private final BatteryController mBatteryController; private final DockManager mDockManager; private final DelayableExecutor mMainExecutor; + private final JavaAdapter mJavaAdapter; private final SystemClock mSystemClock; private final Lazy<SelectedUserInteractor> mUserInteractor; @@ -136,10 +139,11 @@ class FalsingCollectorImpl implements FalsingCollector { ProximitySensor proximitySensor, StatusBarStateController statusBarStateController, KeyguardStateController keyguardStateController, - ShadeExpansionStateManager shadeExpansionStateManager, + Lazy<ShadeInteractor> shadeInteractorLazy, BatteryController batteryController, DockManager dockManager, @Main DelayableExecutor mainExecutor, + JavaAdapter javaAdapter, SystemClock systemClock, Lazy<SelectedUserInteractor> userInteractor) { mFalsingDataProvider = falsingDataProvider; @@ -149,12 +153,17 @@ class FalsingCollectorImpl implements FalsingCollector { mProximitySensor = proximitySensor; mStatusBarStateController = statusBarStateController; mKeyguardStateController = keyguardStateController; + mShadeInteractorLazy = shadeInteractorLazy; mBatteryController = batteryController; mDockManager = dockManager; mMainExecutor = mainExecutor; + mJavaAdapter = javaAdapter; mSystemClock = systemClock; mUserInteractor = userInteractor; + } + @Override + public void init() { mProximitySensor.setTag(PROXIMITY_SENSOR_TAG); mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME); @@ -163,7 +172,10 @@ class FalsingCollectorImpl implements FalsingCollector { mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback); - shadeExpansionStateManager.addQsExpansionListener(this::onQsExpansionChanged); + mJavaAdapter.alwaysCollectFlow( + mShadeInteractorLazy.get().isQsExpanded(), + this::onQsExpansionChanged + ); mBatteryController.addCallback(mBatteryListener); mDockManager.addListener(mDockEventListener); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt index e5b404f30889..c5d8c795853d 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorNoOp.kt @@ -23,6 +23,10 @@ import javax.inject.Inject @SysUISingleton class FalsingCollectorNoOp @Inject constructor() : FalsingCollector { + override fun init() { + logDebug("NOOP: init") + } + override fun onSuccessfulUnlock() { logDebug("NOOP: onSuccessfulUnlock") } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCoreStartable.kt new file mode 100644 index 000000000000..b79538aac3e6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCoreStartable.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2023 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.classifier + +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject + +/** Initializes classes related to falsing. */ +@SysUISingleton +class FalsingCoreStartable @Inject constructor(val falsingCollector: FalsingCollector) : + CoreStartable { + override fun start() { + falsingCollector.init() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java index 2729b7b0a4fd..af467ef1319b 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingModule.java @@ -19,9 +19,9 @@ package com.android.systemui.classifier; import android.content.res.Resources; import android.view.ViewConfiguration; -import com.android.systemui.res.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlags; import com.android.systemui.statusbar.phone.NotificationTapHelper; @@ -37,7 +37,7 @@ import java.util.Set; import javax.inject.Named; /** Dagger Module for Falsing. */ -@Module +@Module(includes = {FalsingStartModule.class}) public interface FalsingModule { String BRIGHT_LINE_GESTURE_CLASSIFERS = "bright_line_gesture_classifiers"; String SINGLE_TAP_TOUCH_SLOP = "falsing_single_tap_touch_slop"; diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingStartModule.kt b/packages/SystemUI/src/com/android/systemui/classifier/FalsingStartModule.kt new file mode 100644 index 000000000000..a9f8f37fffa9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingStartModule.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2023 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.classifier + +import com.android.systemui.CoreStartable +import dagger.Binds +import dagger.Module +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap + +@Module +interface FalsingStartModule { + /** */ + @Binds + @IntoMap + @ClassKey(FalsingCoreStartable::class) + fun bindFalsingCoreStartable(falsingCoreStartable: FalsingCoreStartable?): CoreStartable? +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index cc59f8750b56..dfe6adc49f9a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -1070,7 +1070,6 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mNotificationStackScrollLayoutController.setOnEmptySpaceClickListener( mOnEmptySpaceClickListener); mQsController.init(); - mShadeExpansionStateManager.addQsExpansionListener(this::onQsExpansionChanged); mShadeHeadsUpTracker.addTrackingHeadsUpListener( mNotificationStackScrollLayoutController::setTrackingHeadsUp); if (!mFeatureFlags.isEnabled(Flags.MIGRATE_SPLIT_KEYGUARD_BOTTOM_AREA)) { @@ -4219,7 +4218,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return mShadeExpansionStateManager; } - private void onQsExpansionChanged(boolean expanded) { + void onQsExpansionChanged(boolean expanded) { updateExpandedHeightToMaxHeight(); setStatusAccessibilityImportance(expanded ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java index 04263882d3a8..51148263b6ac 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java @@ -156,7 +156,6 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW KeyguardStateController keyguardStateController, ScreenOffAnimationController screenOffAnimationController, AuthController authController, - ShadeExpansionStateManager shadeExpansionStateManager, Lazy<ShadeInteractor> shadeInteractorLazy, ShadeWindowLogger logger, Lazy<SelectedUserInteractor> userInteractor) { @@ -185,7 +184,6 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW .addCallback(mStateListener, SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER); configurationController.addCallback(this); - shadeExpansionStateManager.addQsExpansionListener(this::onQsExpansionChanged); float desiredPreferredRefreshRate = context.getResources() .getInteger(R.integer.config_keyguardRefreshRate); @@ -303,6 +301,11 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW mShadeInteractorLazy.get().isAnyExpanded(), this::onShadeOrQsExpanded ); + collectFlow( + mWindowRootView, + mShadeInteractorLazy.get().isQsExpanded(), + this::onQsExpansionChanged + ); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt index cc46b23ec75f..866cfb443b0a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt @@ -26,23 +26,27 @@ import androidx.constraintlayout.widget.ConstraintSet.END import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID import androidx.constraintlayout.widget.ConstraintSet.START import androidx.constraintlayout.widget.ConstraintSet.TOP -import com.android.systemui.res.R +import androidx.lifecycle.lifecycleScope import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.fragments.FragmentService +import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.navigationbar.NavigationModeController import com.android.systemui.plugins.qs.QS import com.android.systemui.plugins.qs.QSContainerController import com.android.systemui.recents.OverviewProxyService import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener +import com.android.systemui.res.R +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shared.system.QuickStepContract import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.util.LargeScreenUtils import com.android.systemui.util.ViewController import com.android.systemui.util.concurrency.DelayableExecutor +import kotlinx.coroutines.launch import java.util.function.Consumer import javax.inject.Inject import kotlin.reflect.KMutableProperty0 @@ -56,7 +60,7 @@ class NotificationsQSContainerController @Inject constructor( private val navigationModeController: NavigationModeController, private val overviewProxyService: OverviewProxyService, private val shadeHeaderController: ShadeHeaderController, - private val shadeExpansionStateManager: ShadeExpansionStateManager, + private val shadeInteractor: ShadeInteractor, private val fragmentService: FragmentService, @Main private val delayableExecutor: DelayableExecutor, private val featureFlags: FeatureFlags, @@ -65,7 +69,6 @@ class NotificationsQSContainerController @Inject constructor( private val splitShadeStateController: SplitShadeStateController ) : ViewController<NotificationsQuickSettingsContainer>(view), QSContainerController { - private var qsExpanded = false private var splitShadeEnabled = false private var isQSDetailShowing = false private var isQSCustomizing = false @@ -89,13 +92,6 @@ class NotificationsQSContainerController @Inject constructor( taskbarVisible = visible } } - private val shadeQsExpansionListener: ShadeQsExpansionListener = - ShadeQsExpansionListener { isQsExpanded -> - if (qsExpanded != isQsExpanded) { - qsExpanded = isQsExpanded - mView.invalidate() - } - } // With certain configuration changes (like light/dark changes), the nav bar will disappear // for a bit, causing `bottomStableInsets` to be unstable for some time. Debounce the value @@ -122,6 +118,11 @@ class NotificationsQSContainerController @Inject constructor( } override fun onInit() { + mView.repeatWhenAttached { + lifecycleScope.launch { + shadeInteractor.isQsExpanded.collect{ _ -> mView.invalidate() } + } + } val currentMode: Int = navigationModeController.addListener { mode: Int -> isGestureNavigation = QuickStepContract.isGesturalMode(mode) } @@ -137,7 +138,6 @@ class NotificationsQSContainerController @Inject constructor( public override fun onViewAttached() { updateResources() overviewProxyService.addCallback(taskbarVisibilityListener) - shadeExpansionStateManager.addQsExpansionListener(shadeQsExpansionListener) mView.setInsetsChangedListener(delayedInsetSetter) mView.setQSFragmentAttachedListener { qs: QS -> qs.setContainerController(this) } mView.setConfigurationChangedListener { updateResources() } @@ -146,7 +146,6 @@ class NotificationsQSContainerController @Inject constructor( override fun onViewDetached() { overviewProxyService.removeCallback(taskbarVisibilityListener) - shadeExpansionStateManager.removeQsExpansionListener(shadeQsExpansionListener) mView.removeOnInsetsChangedListener() mView.removeQSFragmentAttachedListener() mView.setConfigurationChangedListener(null) diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index 0ec7a36b5a6d..d73fa1460bd4 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -207,12 +207,6 @@ public class QuickSettingsController implements Dumpable { /** pointerId of the pointer we're currently tracking */ private int mTrackingPointer; - /** - * Indicates that QS is in expanded state which can happen by: - * - single pane shade: expanding shade and then expanding QS - * - split shade: just expanding shade (QS are expanded automatically) - */ - private boolean mExpanded; /** Indicates QS is at its max height */ private boolean mFullyExpanded; /** @@ -594,9 +588,8 @@ public class QuickSettingsController implements Dumpable { return twoFingerDrag || stylusButtonClickDrag || mouseButtonClickDrag; } - public boolean getExpanded() { - return mExpanded; + return mShadeRepository.getLegacyIsQsExpanded().getValue(); } @VisibleForTesting @@ -613,7 +606,7 @@ public class QuickSettingsController implements Dumpable { // close the whole shade with one motion. Also this will be always true when closing // split shade as there QS are always expanded so every collapsing motion is motion from // expanded QS to closed panel - return mExpandImmediate || (mExpanded + return mExpandImmediate || (getExpanded() && !isTracking() && !isExpansionAnimating() && !mExpansionFromOverscroll); } @@ -778,11 +771,11 @@ public class QuickSettingsController implements Dumpable { @VisibleForTesting void setExpanded(boolean expanded) { - boolean changed = mExpanded != expanded; + boolean changed = getExpanded() != expanded; if (changed) { - mExpanded = expanded; + mShadeRepository.setLegacyIsQsExpanded(expanded); updateQsState(); - mShadeExpansionStateManager.onQsExpansionChanged(expanded); + mPanelViewControllerLazy.get().onQsExpansionChanged(expanded); mShadeLog.logQsExpansionChanged("QS Expansion Changed.", expanded, getMinExpansionHeight(), getMaxExpansionHeight(), mStackScrollerOverscrolling, mAnimatorExpand, mAnimating); @@ -846,7 +839,7 @@ public class QuickSettingsController implements Dumpable { /** Called when Shade view layout changed. Updates QS expansion or * starts size change animation if height has changed. */ void handleShadeLayoutChanged(int oldMaxHeight) { - if (mExpanded && mFullyExpanded) { + if (getExpanded() && mFullyExpanded) { mExpansionHeight = mMaxExpansionHeight; if (mExpansionHeightSetToMaxListener != null) { mExpansionHeightSetToMaxListener.onExpansionHeightSetToMax(true); @@ -988,24 +981,24 @@ public class QuickSettingsController implements Dumpable { } void updateQsState() { - boolean qsFullScreen = mExpanded && !mSplitShadeEnabled; + boolean qsFullScreen = getExpanded() && !mSplitShadeEnabled; mNotificationStackScrollLayoutController.setQsFullScreen(qsFullScreen); mNotificationStackScrollLayoutController.setScrollingEnabled( mBarState != KEYGUARD && (!qsFullScreen || mExpansionFromOverscroll)); if (mQsStateUpdateListener != null) { - mQsStateUpdateListener.onQsStateUpdated(mExpanded, mStackScrollerOverscrolling); + mQsStateUpdateListener.onQsStateUpdated(getExpanded(), mStackScrollerOverscrolling); } if (mQs == null) return; - mQs.setExpanded(mExpanded); + mQs.setExpanded(getExpanded()); } /** update expanded state of QS */ public void updateExpansion() { if (mQs == null) return; final float squishiness; - if ((mExpandImmediate || mExpanded) && !mSplitShadeEnabled) { + if ((mExpandImmediate || getExpanded()) && !mSplitShadeEnabled) { squishiness = 1; } else if (mTransitioningToFullShadeProgress > 0.0f) { squishiness = mLockscreenShadeTransitionController.getQsSquishTransitionFraction(); @@ -1125,7 +1118,7 @@ public class QuickSettingsController implements Dumpable { mMediaHierarchyManager.setCollapsingShadeFromQS(mExpandedWhenExpandingStarted /* We also start expanding when flinging closed Qs. Let's exclude that */ && !mAnimating); - if (mExpanded) { + if (getExpanded()) { onExpansionStarted(); } // Since there are QS tiles in the header now, we need to make sure we start listening @@ -1234,7 +1227,7 @@ public class QuickSettingsController implements Dumpable { Math.min(top / (float) mScrimCornerRadius, 1f)); float bottomRadius = mSplitShadeEnabled ? screenCornerRadius : 0; - if (!mExpanded) { + if (!getExpanded()) { bottomRadius = calculateBottomCornerRadius(bottomRadius); } mScrimController.setNotificationBottomRadius(bottomRadius); @@ -1547,7 +1540,7 @@ public class QuickSettingsController implements Dumpable { @VisibleForTesting void onHeightChanged() { mMaxExpansionHeight = isQsFragmentCreated() ? mQs.getDesiredHeight() : 0; - if (mExpanded && mFullyExpanded) { + if (getExpanded() && mFullyExpanded) { mExpansionHeight = mMaxExpansionHeight; if (mExpansionHeightSetToMaxListener != null) { mExpansionHeightSetToMaxListener.onExpansionHeightSetToMax(true); @@ -2083,7 +2076,7 @@ public class QuickSettingsController implements Dumpable { ipw.print("mTrackingPointer="); ipw.println(mTrackingPointer); ipw.print("mExpanded="); - ipw.println(mExpanded); + ipw.println(getExpanded()); ipw.print("mFullyExpanded="); ipw.println(mFullyExpanded); ipw.print("mExpandImmediate="); diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt index 949398969d67..fca98f580702 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt @@ -36,15 +36,12 @@ import javax.inject.Inject class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents { private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>() - private val qsExpansionListeners = CopyOnWriteArrayList<ShadeQsExpansionListener>() private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>() private val shadeStateEventsListeners = CopyOnWriteArrayList<ShadeStateEventsListener>() @PanelState private var state: Int = STATE_CLOSED @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f private var expanded: Boolean = false - private var qsExpanded: Boolean = false - private var qsExpansionFraction = 0f private var tracking: Boolean = false private var dragDownPxAmount: Float = 0f @@ -64,15 +61,6 @@ class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents { expansionListeners.remove(listener) } - fun addQsExpansionListener(listener: ShadeQsExpansionListener) { - qsExpansionListeners.add(listener) - listener.onQsExpansionChanged(qsExpanded) - } - - fun removeQsExpansionListener(listener: ShadeQsExpansionListener) { - qsExpansionListeners.remove(listener) - } - /** Adds a listener that will be notified when the panel state has changed. */ fun addStateListener(listener: ShadeStateListener) { stateListeners.add(listener) @@ -153,14 +141,6 @@ class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents { expansionListeners.forEach { it.onPanelExpansionChanged(expansionChangeEvent) } } - /** Called when the quick settings expansion changes to fully expanded or collapsed. */ - fun onQsExpansionChanged(qsExpanded: Boolean) { - this.qsExpanded = qsExpanded - - debugLog("qsExpanded=$qsExpanded") - qsExpansionListeners.forEach { it.onQsExpansionChanged(qsExpanded) } - } - /** Updates the panel state if necessary. */ fun updateState(@PanelState state: Int) { debugLog( diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt index 024c8e32a441..e2e4556f59f7 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt @@ -83,6 +83,17 @@ interface ShadeRepository { val legacyExpandedOrAwaitingInputTransfer: StateFlow<Boolean> /** + * QuickSettingsController.mExpanded as a flow. Indicates that QS is in expanded state: + * - single pane shade: expanding shade and then expanding QS + * - split shade: just expanding shade (QS are expanded automatically) + */ + @Deprecated("Use ShadeInteractor instead") val legacyIsQsExpanded: StateFlow<Boolean> + + /** Sets whether QS is expanded. */ + @Deprecated("Use ShadeInteractor instead") + fun setLegacyIsQsExpanded(legacyIsQsExpanded: Boolean) + + /** * Sets whether the expansion fraction is greater than zero or NPVC is about to accept an input * transfer from the status bar, home screen, or trackpad. */ @@ -175,6 +186,15 @@ constructor(shadeExpansionStateManager: ShadeExpansionStateManager) : ShadeRepos override val legacyExpandedOrAwaitingInputTransfer: StateFlow<Boolean> = _legacyExpandedOrAwaitingInputTransfer.asStateFlow() + private val _legacyIsQsExpanded = MutableStateFlow(false) + @Deprecated("Use ShadeInteractor instead") + override val legacyIsQsExpanded: StateFlow<Boolean> = _legacyIsQsExpanded.asStateFlow() + + @Deprecated("Use ShadeInteractor instead") + override fun setLegacyIsQsExpanded(legacyIsQsExpanded: Boolean) { + _legacyIsQsExpanded.value = legacyIsQsExpanded + } + @Deprecated("Use ShadeInteractor instead") override fun setLegacyExpandedOrAwaitingInputTransfer( legacyExpandedOrAwaitingInputTransfer: Boolean diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt index f043c717f923..a4c4503a6550 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt @@ -121,16 +121,37 @@ constructor( /** * The amount [0-1] QS has been opened. Normal shade with notifications (QQS) visible will - * report 0f. + * report 0f. If split shade is enabled, value matches shadeExpansion. */ val qsExpansion: StateFlow<Float> = if (sceneContainerFlags.isEnabled()) { - sceneBasedExpansion(sceneInteractorProvider.get(), SceneKey.QuickSettings) + val qsExp = sceneBasedExpansion(sceneInteractorProvider.get(), SceneKey.QuickSettings) + combine(isSplitShadeEnabled, shadeExpansion, qsExp) { + isSplitShadeEnabled, + shadeExp, + qsExp -> + if (isSplitShadeEnabled) { + shadeExp + } else { + qsExp + } + } .stateIn(scope, SharingStarted.Eagerly, 0f) } else { repository.qsExpansion } + /** Whether Quick Settings is expanded a non-zero amount. */ + val isQsExpanded: StateFlow<Boolean> = + if (sceneContainerFlags.isEnabled()) { + qsExpansion + .map { it > 0 } + .distinctUntilChanged() + .stateIn(scope, SharingStarted.Eagerly, false) + } else { + repository.legacyIsQsExpanded + } + /** The amount [0-1] either QS or the shade has been opened. */ val anyExpansion: StateFlow<Float> = combine(shadeExpansion, qsExpansion) { shadeExp, qsExp -> maxOf(shadeExp, qsExp) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 4ea70264b152..e19fcd05e9a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -32,17 +32,15 @@ import com.android.app.animation.Interpolators import com.android.systemui.Dumpable import com.android.systemui.Gefingerpoken import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN -import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.res.R -import com.android.systemui.shade.ShadeExpansionStateManager +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView -import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController @@ -64,13 +62,11 @@ constructor( private val wakeUpCoordinator: NotificationWakeUpCoordinator, private val bypassController: KeyguardBypassController, private val headsUpManager: HeadsUpManager, - private val roundnessManager: NotificationRoundnessManager, configurationController: ConfigurationController, private val statusBarStateController: StatusBarStateController, private val falsingManager: FalsingManager, - shadeExpansionStateManager: ShadeExpansionStateManager, + private val shadeInteractor: ShadeInteractor, private val lockscreenShadeTransitionController: LockscreenShadeTransitionController, - private val falsingCollector: FalsingCollector, dumpManager: DumpManager ) : Gefingerpoken, Dumpable { companion object { @@ -115,7 +111,6 @@ constructor( private val isFalseTouch: Boolean get() = falsingManager.isFalseTouch(NOTIFICATION_DRAG_DOWN) - var qsExpanded: Boolean = false var pulseExpandAbortListener: Runnable? = null var bouncerShowing: Boolean = false @@ -127,12 +122,6 @@ constructor( } }) - shadeExpansionStateManager.addQsExpansionListener { isQsExpanded -> - if (qsExpanded != isQsExpanded) { - qsExpanded = isQsExpanded - } - } - mPowerManager = context.getSystemService(PowerManager::class.java) dumpManager.registerDumpable(this) } @@ -148,7 +137,8 @@ constructor( } private fun canHandleMotionEvent(): Boolean { - return wakeUpCoordinator.canShowPulsingHuns && !qsExpanded && !bouncerShowing + return wakeUpCoordinator.canShowPulsingHuns && !shadeInteractor.isQsExpanded.value && + !bouncerShowing } private fun startExpansion(event: MotionEvent): Boolean { @@ -379,7 +369,6 @@ constructor( it.println("isExpanding: $isExpanding") it.println("leavingLockscreen: $leavingLockscreen") it.println("mPulsing: $mPulsing") - it.println("qsExpanded: $qsExpanded") it.println("bouncerShowing: $bouncerShowing") } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 5af7cfc212d5..a36d36c3827b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.events -import androidx.core.animation.Animator import android.annotation.UiThread import android.graphics.Point import android.graphics.Rect @@ -24,13 +23,15 @@ import android.util.Log import android.view.Gravity import android.view.View import android.widget.FrameLayout -import com.android.internal.annotations.GuardedBy -import com.android.systemui.res.R +import androidx.core.animation.Animator import com.android.app.animation.Interpolators +import com.android.internal.annotations.GuardedBy import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.shade.ShadeExpansionStateManager +import com.android.systemui.res.R +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.StatusBarState.SHADE import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener @@ -43,6 +44,8 @@ import com.android.systemui.util.leak.RotationUtils.ROTATION_NONE import com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE import com.android.systemui.util.leak.RotationUtils.ROTATION_UPSIDE_DOWN import com.android.systemui.util.leak.RotationUtils.Rotation +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import java.util.concurrent.Executor import javax.inject.Inject @@ -64,11 +67,12 @@ import javax.inject.Inject @SysUISingleton open class PrivacyDotViewController @Inject constructor( @Main private val mainExecutor: Executor, + @Application scope: CoroutineScope, private val stateController: StatusBarStateController, private val configurationController: ConfigurationController, private val contentInsetsProvider: StatusBarContentInsetsProvider, private val animationScheduler: SystemStatusAnimationScheduler, - shadeExpansionStateManager: ShadeExpansionStateManager + shadeInteractor: ShadeInteractor? ) { private lateinit var tl: View private lateinit var tr: View @@ -135,10 +139,12 @@ open class PrivacyDotViewController @Inject constructor( } }) - shadeExpansionStateManager.addQsExpansionListener { isQsExpanded -> - dlog("setQsExpanded $isQsExpanded") - synchronized(lock) { - nextViewState = nextViewState.copy(qsExpanded = isQsExpanded) + scope.launch { + shadeInteractor?.isQsExpanded?.collect { isQsExpanded -> + dlog("setQsExpanded $isQsExpanded") + synchronized(lock) { + nextViewState = nextViewState.copy(qsExpanded = isQsExpanded) + } } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java index 80fe9e762832..fcb18f52086d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; import android.view.MotionEvent; import androidx.test.filters.SmallTest; @@ -35,13 +36,14 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerFake; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.shade.ShadeExpansionStateManager; +import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.sensors.ProximitySensor; import com.android.systemui.util.sensors.ThresholdSensor; import com.android.systemui.util.time.FakeSystemClock; @@ -54,8 +56,11 @@ import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import kotlinx.coroutines.flow.StateFlowKt; + @SmallTest @RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) public class FalsingCollectorImplTest extends SysuiTestCase { private FalsingCollectorImpl mFalsingCollector; @@ -73,7 +78,9 @@ public class FalsingCollectorImplTest extends SysuiTestCase { @Mock private KeyguardStateController mKeyguardStateController; @Mock - private ShadeExpansionStateManager mShadeExpansionStateManager; + private ShadeInteractor mShadeInteractor; + @Mock + private JavaAdapter mJavaAdapter; @Mock private BatteryController mBatteryController; @Mock @@ -88,12 +95,16 @@ public class FalsingCollectorImplTest extends SysuiTestCase { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); when(mKeyguardStateController.isShowing()).thenReturn(true); + when(mShadeInteractor.isQsExpanded()).thenReturn(StateFlowKt.MutableStateFlow(false)); mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager, mKeyguardUpdateMonitor, mHistoryTracker, mProximitySensor, - mStatusBarStateController, mKeyguardStateController, mShadeExpansionStateManager, - mBatteryController, - mDockManager, mFakeExecutor, mFakeSystemClock, () -> mSelectedUserInteractor); + mStatusBarStateController, mKeyguardStateController, + () -> mShadeInteractor, mBatteryController, + mDockManager, mFakeExecutor, + mJavaAdapter, mFakeSystemClock, () -> mSelectedUserInteractor + ); + mFalsingCollector.init(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 2b280c05ba1b..814a317a72f8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -253,7 +253,6 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mKeyguardStateController, mScreenOffAnimationController, mAuthController, - mShadeExpansionStateManager, () -> mShadeInteractor, mShadeWindowLogger, () -> mSelectedUserInteractor); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index 2ce4b04b037a..446a0b8116a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -99,7 +99,6 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteracto import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; -import com.android.systemui.keyguard.ui.view.KeyguardRootView; import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel; import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingLockscreenHostedTransitionViewModel; import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel; @@ -148,7 +147,6 @@ import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; -import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator; @@ -335,7 +333,6 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { @Mock protected KeyguardFaceAuthInteractor mKeyguardFaceAuthInteractor; @Mock private JavaAdapter mJavaAdapter; @Mock private CastController mCastController; - @Mock private KeyguardRootView mKeyguardRootView; @Mock private SharedNotificationContainerInteractor mSharedNotificationContainerInteractor; @Mock private KeyguardClockPositionAlgorithm mKeyguardClockPositionAlgorithm; @@ -575,14 +572,13 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { PulseExpansionHandler expansionHandler = new PulseExpansionHandler( mContext, coordinator, - mKeyguardBypassController, mHeadsUpManager, - mock(NotificationRoundnessManager.class), + mKeyguardBypassController, + mHeadsUpManager, mConfigurationController, mStatusBarStateController, mFalsingManager, - mShadeExpansionStateManager, + mShadeInteractor, mLockscreenShadeTransitionController, - new FalsingCollectorFake(), mDumpManager); when(mKeyguardStatusViewComponentFactory.build(any(), any())) .thenReturn(mKeyguardStatusViewComponent); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java index 4ba850c570c4..8e0cf7d7f695 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java @@ -254,7 +254,6 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { mKeyguardStateController, mScreenOffAnimationController, mAuthController, - mShadeExpansionStateManager, () -> mShadeInteractor, mShadeWindowLogger, () -> mSelectedUserInteractor) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerLegacyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerLegacyTest.kt index e70dbc7f4fda..778cfa67cad7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerLegacyTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerLegacyTest.kt @@ -18,7 +18,6 @@ package com.android.systemui.shade import android.testing.AndroidTestingRunner import android.testing.TestableLooper -import android.testing.TestableResources import android.view.View import android.view.ViewGroup import android.view.WindowInsets @@ -27,7 +26,6 @@ import androidx.annotation.IdRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags @@ -38,6 +36,8 @@ import com.android.systemui.navigationbar.NavigationModeController.ModeChangedLi import com.android.systemui.plugins.qs.QS import com.android.systemui.recents.OverviewProxyService import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener +import com.android.systemui.res.R +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController import com.android.systemui.util.concurrency.FakeExecutor @@ -46,6 +46,7 @@ import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import java.util.function.Consumer +import kotlinx.coroutines.flow.MutableStateFlow import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -66,7 +67,7 @@ import org.mockito.MockitoAnnotations /** Uses Flags.MIGRATE_NSSL set to false. If all goes well, this set of tests will be deleted. */ @RunWith(AndroidTestingRunner::class) -@TestableLooper.RunWithLooper +@TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest class NotificationsQSContainerControllerLegacyTest : SysuiTestCase() { @@ -74,7 +75,7 @@ class NotificationsQSContainerControllerLegacyTest : SysuiTestCase() { @Mock lateinit var navigationModeController: NavigationModeController @Mock lateinit var overviewProxyService: OverviewProxyService @Mock lateinit var shadeHeaderController: ShadeHeaderController - @Mock lateinit var shadeExpansionStateManager: ShadeExpansionStateManager + @Mock lateinit var shadeInteractor: ShadeInteractor @Mock lateinit var fragmentService: FragmentService @Mock lateinit var fragmentHostManager: FragmentHostManager @Mock @@ -88,7 +89,6 @@ class NotificationsQSContainerControllerLegacyTest : SysuiTestCase() { lateinit var underTest: NotificationsQSContainerController - private lateinit var fakeResources: TestableResources private lateinit var featureFlags: FakeFeatureFlags private lateinit var navigationModeCallback: ModeChangedListener private lateinit var taskbarVisibilityCallback: OverviewProxyListener @@ -111,6 +111,7 @@ class NotificationsQSContainerControllerLegacyTest : SysuiTestCase() { whenever(view.resources).thenReturn(mContext.resources) whenever(fragmentService.getFragmentHostManager(any())).thenReturn(fragmentHostManager) + whenever(shadeInteractor.isQsExpanded).thenReturn(MutableStateFlow(false)) underTest = NotificationsQSContainerController( @@ -118,7 +119,7 @@ class NotificationsQSContainerControllerLegacyTest : SysuiTestCase() { navigationModeController, overviewProxyService, shadeHeaderController, - shadeExpansionStateManager, + shadeInteractor, fragmentService, delayableExecutor, featureFlags, @@ -475,7 +476,7 @@ class NotificationsQSContainerControllerLegacyTest : SysuiTestCase() { navigationModeController, overviewProxyService, shadeHeaderController, - shadeExpansionStateManager, + shadeInteractor, fragmentService, delayableExecutor, featureFlags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerTest.kt index ac8c924fe689..23420037e233 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationsQSContainerControllerTest.kt @@ -18,7 +18,6 @@ package com.android.systemui.shade import android.testing.AndroidTestingRunner import android.testing.TestableLooper -import android.testing.TestableResources import android.view.View import android.view.ViewGroup import android.view.WindowInsets @@ -27,7 +26,6 @@ import androidx.annotation.IdRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags @@ -38,6 +36,8 @@ import com.android.systemui.navigationbar.NavigationModeController.ModeChangedLi import com.android.systemui.plugins.qs.QS import com.android.systemui.recents.OverviewProxyService import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener +import com.android.systemui.res.R +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController import com.android.systemui.util.concurrency.FakeExecutor @@ -46,6 +46,7 @@ import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import java.util.function.Consumer +import kotlinx.coroutines.flow.MutableStateFlow import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -65,7 +66,7 @@ import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) -@TestableLooper.RunWithLooper +@TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest class NotificationsQSContainerControllerTest : SysuiTestCase() { @@ -73,7 +74,7 @@ class NotificationsQSContainerControllerTest : SysuiTestCase() { @Mock lateinit var navigationModeController: NavigationModeController @Mock lateinit var overviewProxyService: OverviewProxyService @Mock lateinit var shadeHeaderController: ShadeHeaderController - @Mock lateinit var shadeExpansionStateManager: ShadeExpansionStateManager + @Mock lateinit var shadeInteractor: ShadeInteractor @Mock lateinit var fragmentService: FragmentService @Mock lateinit var fragmentHostManager: FragmentHostManager @Mock @@ -87,7 +88,6 @@ class NotificationsQSContainerControllerTest : SysuiTestCase() { lateinit var underTest: NotificationsQSContainerController - private lateinit var fakeResources: TestableResources private lateinit var featureFlags: FakeFeatureFlags private lateinit var navigationModeCallback: ModeChangedListener private lateinit var taskbarVisibilityCallback: OverviewProxyListener @@ -111,13 +111,15 @@ class NotificationsQSContainerControllerTest : SysuiTestCase() { whenever(fragmentService.getFragmentHostManager(any())).thenReturn(fragmentHostManager) + whenever(shadeInteractor.isQsExpanded).thenReturn(MutableStateFlow(false)) + underTest = NotificationsQSContainerController( view, navigationModeController, overviewProxyService, shadeHeaderController, - shadeExpansionStateManager, + shadeInteractor, fragmentService, delayableExecutor, featureFlags, @@ -458,7 +460,7 @@ class NotificationsQSContainerControllerTest : SysuiTestCase() { navigationModeController, overviewProxyService, shadeHeaderController, - shadeExpansionStateManager, + shadeInteractor, fragmentService, delayableExecutor, featureFlags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt index 6eeafefd0ac1..e920687753fd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt @@ -189,4 +189,13 @@ class ShadeRepositoryImplTest : SysuiTestCase() { underTest.setUdfpsTransitionToFullShadeProgress(1f) assertThat(underTest.udfpsTransitionToFullShadeProgress.value).isEqualTo(1f) } + + @Test + fun updateLegacyIsQsExpanded() = + testScope.runTest { + assertThat(underTest.legacyIsQsExpanded.value).isEqualTo(false) + + underTest.setLegacyIsQsExpanded(true) + assertThat(underTest.legacyIsQsExpanded.value).isEqualTo(true) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/PulseExpansionHandlerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/PulseExpansionHandlerTest.kt index 20e5c43cba19..49e5c456e645 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/PulseExpansionHandlerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/PulseExpansionHandlerTest.kt @@ -21,18 +21,17 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.shade.ShadeExpansionStateManager +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.row.ExpandableView -import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.HeadsUpManager import com.android.systemui.util.mockito.mock +import kotlinx.coroutines.flow.MutableStateFlow import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -53,19 +52,18 @@ class PulseExpansionHandlerTest : SysuiTestCase() { private val wakeUpCoordinator: NotificationWakeUpCoordinator = mock() private val bypassController: KeyguardBypassController = mock() private val headsUpManager: HeadsUpManager = mock() - private val roundnessManager: NotificationRoundnessManager = mock() private val configurationController: ConfigurationController = mock() private val statusBarStateController: StatusBarStateController = mock() private val falsingManager: FalsingManager = mock() - private val shadeExpansionStateManager: ShadeExpansionStateManager = mock() + private val shadeInteractor: ShadeInteractor = mock() private val lockscreenShadeTransitionController: LockscreenShadeTransitionController = mock() - private val falsingCollector: FalsingCollector = mock() private val dumpManager: DumpManager = mock() private val expandableView: ExpandableView = mock() @Before fun setUp() { whenever(expandableView.collapsedHeight).thenReturn(collapsedHeight) + whenever(shadeInteractor.isQsExpanded).thenReturn(MutableStateFlow(false)) pulseExpansionHandler = PulseExpansionHandler( @@ -73,13 +71,11 @@ class PulseExpansionHandlerTest : SysuiTestCase() { wakeUpCoordinator, bypassController, headsUpManager, - roundnessManager, configurationController, statusBarStateController, falsingManager, - shadeExpansionStateManager, + shadeInteractor, lockscreenShadeTransitionController, - falsingCollector, dumpManager ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index ec808c796d46..41e78bbc9265 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -476,7 +476,6 @@ public class BubblesTest extends SysuiTestCase { mKeyguardStateController, mScreenOffAnimationController, mAuthController, - mShadeExpansionStateManager, () -> mShadeInteractor, mShadeWindowLogger, () -> mSelectedUserInteractor diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt index 3c49c58580cc..800593fe61a1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt @@ -56,6 +56,14 @@ class FakeShadeRepository @Inject constructor() : ShadeRepository { @Deprecated("Use ShadeInteractor instead") override val legacyExpandedOrAwaitingInputTransfer = _legacyExpandedOrAwaitingInputTransfer + private val _legacyIsQsExpanded = MutableStateFlow(false) + @Deprecated("Use ShadeInteractor instead") override val legacyIsQsExpanded = _legacyIsQsExpanded + + @Deprecated("Use ShadeInteractor instead") + override fun setLegacyIsQsExpanded(legacyIsQsExpanded: Boolean) { + _legacyIsQsExpanded.value = legacyIsQsExpanded + } + @Deprecated("Use ShadeInteractor instead") override fun setLegacyExpandedOrAwaitingInputTransfer( legacyExpandedOrAwaitingInputTransfer: Boolean |