From 057defb0901a050e061d4baf469c48aaff607676 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Thu, 9 Sep 2021 11:23:24 +0100 Subject: [PATCH] Making multiuser button work in collapsed QS in split shade The issue was caused by MultiUserSwitchController always having reference and acting upon multiuser button in expanded QS - that's a different button than collapsed QS. That reference was provided by dagger and while this issue could be fixed in dagger, that would require providing separate multiuser button and separate MultiUserSwitchController. That would require adding qualifier like @Named in multiple places (both providers and receivers) so seems like too much boilerplate (or opportunity for separate module?) and I went with adding factory for MultiUserSwitchController. Another issue is MultiUserSwitchController opening multiuser detail always in expanded QS - collapsed QS currently doesn't support opening detail view. Looks like that requires non-trivial code changes, so for now I did it in a hacky way - forcing panel to expand and only then showing multiuser detail (as seen in QSPanelController). I think this hacky way is better than having non-functioning button. Fixes: 196805122 Test: enable multiuser support -> expand split shade (but not expand QS) -> click on multiuser button -> multiuser panel should open within QS Change-Id: I76c9bb77c870b8a1a4e25221c63821786057d7f2 --- .../qs/FooterActionsControllerBuilder.kt | 8 ++--- .../systemui/qs/QSPanelController.java | 14 +++++++- .../systemui/qs/dagger/QSFragmentModule.java | 7 ---- .../phone/MultiUserSwitchController.java | 33 +++++++++++++++++-- .../systemui/qs/QSPanelControllerTest.java | 5 ++- 5 files changed, 51 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsControllerBuilder.kt b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsControllerBuilder.kt index fcfa72a82acb6..f6c89a9c66a2f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsControllerBuilder.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsControllerBuilder.kt @@ -36,7 +36,7 @@ class FooterActionsControllerBuilder @Inject constructor( private val activityStarter: ActivityStarter, private val userManager: UserManager, private val userInfoController: UserInfoController, - private val multiUserSwitchController: MultiUserSwitchController, + private val multiUserSwitchControllerFactory: MultiUserSwitchController.Factory, private val deviceProvisionedController: DeviceProvisionedController, private val falsingManager: FalsingManager, private val metricsLogger: MetricsLogger, @@ -60,8 +60,8 @@ class FooterActionsControllerBuilder @Inject constructor( fun build(): FooterActionsController { return FooterActionsController(view, qsPanelController, activityStarter, userManager, - userInfoController, multiUserSwitchController, deviceProvisionedController, - falsingManager, metricsLogger, tunerService, globalActionsDialog, uiEventLogger, - showPMLiteButton, buttonsVisibleState) + userInfoController, multiUserSwitchControllerFactory.create(view), + deviceProvisionedController, falsingManager, metricsLogger, tunerService, + globalActionsDialog, uiEventLogger, showPMLiteButton, buttonsVisibleState) } } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 6e09f22fba631..90254270f3c6c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -42,6 +42,7 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.settings.brightness.BrightnessController; import com.android.systemui.settings.brightness.BrightnessMirrorHandler; import com.android.systemui.settings.brightness.BrightnessSlider; +import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.tuner.TunerService; @@ -60,6 +61,7 @@ public class QSPanelController extends QSPanelControllerBase { private final QSCustomizerController mQsCustomizerController; private final QSTileRevealController.Factory mQsTileRevealControllerFactory; private final FalsingManager mFalsingManager; + private final CommandQueue mCommandQueue; private final BrightnessController mBrightnessController; private final BrightnessSlider mBrightnessSlider; private final BrightnessMirrorHandler mBrightnessMirrorHandler; @@ -97,7 +99,8 @@ public class QSPanelController extends QSPanelControllerBase { QSTileRevealController.Factory qsTileRevealControllerFactory, DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, - BrightnessSlider.Factory brightnessSliderFactory, FalsingManager falsingManager) { + BrightnessSlider.Factory brightnessSliderFactory, FalsingManager falsingManager, + CommandQueue commandQueue) { super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); mQsSecurityFooter = qsSecurityFooter; @@ -105,6 +108,7 @@ public class QSPanelController extends QSPanelControllerBase { mQsCustomizerController = qsCustomizerController; mQsTileRevealControllerFactory = qsTileRevealControllerFactory; mFalsingManager = falsingManager; + mCommandQueue = commandQueue; mQsSecurityFooter.setHostEnvironment(qstileHost); mBrightnessSlider = brightnessSliderFactory.create(getContext(), mView); @@ -274,6 +278,14 @@ public class QSPanelController extends QSPanelControllerBase { /** */ public void showDetailAdapter(DetailAdapter detailAdapter, int x, int y) { + // TODO(b/199296365) + // Workaround for opening detail from QQS, when there might not be enough space to + // display e.g. in case of multiuser detail from split shade. Currently showing detail works + // only for QS (mView below) and that's why expanding panel (thus showing QS instead of QQS) + // makes it displayed correctly. + if (!isExpanded()) { + mCommandQueue.animateExpandSettingsPanel(null); + } mView.showDetailAdapter(true, detailAdapter, new int[]{x, y}); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java index 386769cd399e4..b11420afa529a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java @@ -39,7 +39,6 @@ import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.QuickStatusBarHeader; import com.android.systemui.qs.customize.QSCustomizer; -import com.android.systemui.statusbar.phone.MultiUserSwitch; import javax.inject.Named; @@ -80,12 +79,6 @@ public interface QSFragmentModule { return qsFragment.getView(); } - /** */ - @Provides - static MultiUserSwitch providesMultiUserSWitch(QSFooterView qsFooterView) { - return qsFooterView.findViewById(R.id.multi_user_switch); - } - /** */ @Provides static QSPanel provideQSPanel(@RootView View view) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java index 2cacf92123d2b..d69b31fc84aaf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java @@ -26,6 +26,7 @@ import com.android.systemui.R; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; +import com.android.systemui.qs.FooterActionsView; import com.android.systemui.qs.QSDetailDisplayer; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.user.UserSwitchDialogController; @@ -35,7 +36,6 @@ import com.android.systemui.util.ViewController; import javax.inject.Inject; /** View Controller for {@link MultiUserSwitch}. */ -@QSScope public class MultiUserSwitchController extends ViewController { private final UserManager mUserManager; private final UserSwitcherController mUserSwitcherController; @@ -68,8 +68,35 @@ public class MultiUserSwitchController extends ViewController { } }; - @Inject - public MultiUserSwitchController(MultiUserSwitch view, UserManager userManager, + @QSScope + public static class Factory { + private final UserManager mUserManager; + private final UserSwitcherController mUserSwitcherController; + private final QSDetailDisplayer mQsDetailDisplayer; + private final FalsingManager mFalsingManager; + private final UserSwitchDialogController mUserSwitchDialogController; + private final FeatureFlags mFeatureFlags; + + @Inject + public Factory(UserManager userManager, UserSwitcherController userSwitcherController, + QSDetailDisplayer qsDetailDisplayer, FalsingManager falsingManager, + UserSwitchDialogController userSwitchDialogController, FeatureFlags featureFlags) { + mUserManager = userManager; + mUserSwitcherController = userSwitcherController; + mQsDetailDisplayer = qsDetailDisplayer; + mFalsingManager = falsingManager; + mUserSwitchDialogController = userSwitchDialogController; + mFeatureFlags = featureFlags; + } + + public MultiUserSwitchController create(FooterActionsView view) { + return new MultiUserSwitchController(view.findViewById(R.id.multi_user_switch), + mUserManager, mUserSwitcherController, mQsDetailDisplayer, + mFalsingManager, mUserSwitchDialogController, mFeatureFlags); + } + } + + private MultiUserSwitchController(MultiUserSwitch view, UserManager userManager, UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer, FalsingManager falsingManager, UserSwitchDialogController userSwitchDialogController, FeatureFlags featureFlags) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java index 1a87975f0e4d7..a21f4887038c4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -42,6 +42,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.settings.brightness.BrightnessController; import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.settings.brightness.ToggleSlider; +import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.animation.DisappearParameters; @@ -94,6 +95,8 @@ public class QSPanelControllerTest extends SysuiTestCase { QSTileView mQSTileView; @Mock PagedTileLayout mPagedTileLayout; + @Mock + CommandQueue mCommandQueue; FalsingManagerFake mFalsingManager = new FalsingManagerFake(); private QSPanelController mController; @@ -121,7 +124,7 @@ public class QSPanelControllerTest extends SysuiTestCase { mQSTileHost, mQSCustomizerController, true, mMediaHost, mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger, mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory, - mFalsingManager + mFalsingManager, mCommandQueue ); mController.init();