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
This commit is contained in:
Michal Brzezinski
2021-09-09 11:23:24 +01:00
parent e35b54239e
commit 057defb090
5 changed files with 51 additions and 16 deletions

View File

@@ -36,7 +36,7 @@ class FooterActionsControllerBuilder @Inject constructor(
private val activityStarter: ActivityStarter, private val activityStarter: ActivityStarter,
private val userManager: UserManager, private val userManager: UserManager,
private val userInfoController: UserInfoController, private val userInfoController: UserInfoController,
private val multiUserSwitchController: MultiUserSwitchController, private val multiUserSwitchControllerFactory: MultiUserSwitchController.Factory,
private val deviceProvisionedController: DeviceProvisionedController, private val deviceProvisionedController: DeviceProvisionedController,
private val falsingManager: FalsingManager, private val falsingManager: FalsingManager,
private val metricsLogger: MetricsLogger, private val metricsLogger: MetricsLogger,
@@ -60,8 +60,8 @@ class FooterActionsControllerBuilder @Inject constructor(
fun build(): FooterActionsController { fun build(): FooterActionsController {
return FooterActionsController(view, qsPanelController, activityStarter, userManager, return FooterActionsController(view, qsPanelController, activityStarter, userManager,
userInfoController, multiUserSwitchController, deviceProvisionedController, userInfoController, multiUserSwitchControllerFactory.create(view),
falsingManager, metricsLogger, tunerService, globalActionsDialog, uiEventLogger, deviceProvisionedController, falsingManager, metricsLogger, tunerService,
showPMLiteButton, buttonsVisibleState) globalActionsDialog, uiEventLogger, showPMLiteButton, buttonsVisibleState)
} }
} }

View File

@@ -42,6 +42,7 @@ import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.brightness.BrightnessController; import com.android.systemui.settings.brightness.BrightnessController;
import com.android.systemui.settings.brightness.BrightnessMirrorHandler; import com.android.systemui.settings.brightness.BrightnessMirrorHandler;
import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService;
@@ -60,6 +61,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
private final QSCustomizerController mQsCustomizerController; private final QSCustomizerController mQsCustomizerController;
private final QSTileRevealController.Factory mQsTileRevealControllerFactory; private final QSTileRevealController.Factory mQsTileRevealControllerFactory;
private final FalsingManager mFalsingManager; private final FalsingManager mFalsingManager;
private final CommandQueue mCommandQueue;
private final BrightnessController mBrightnessController; private final BrightnessController mBrightnessController;
private final BrightnessSlider mBrightnessSlider; private final BrightnessSlider mBrightnessSlider;
private final BrightnessMirrorHandler mBrightnessMirrorHandler; private final BrightnessMirrorHandler mBrightnessMirrorHandler;
@@ -97,7 +99,8 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
QSTileRevealController.Factory qsTileRevealControllerFactory, QSTileRevealController.Factory qsTileRevealControllerFactory,
DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory,
BrightnessSlider.Factory brightnessSliderFactory, FalsingManager falsingManager) { BrightnessSlider.Factory brightnessSliderFactory, FalsingManager falsingManager,
CommandQueue commandQueue) {
super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost,
metricsLogger, uiEventLogger, qsLogger, dumpManager); metricsLogger, uiEventLogger, qsLogger, dumpManager);
mQsSecurityFooter = qsSecurityFooter; mQsSecurityFooter = qsSecurityFooter;
@@ -105,6 +108,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
mQsCustomizerController = qsCustomizerController; mQsCustomizerController = qsCustomizerController;
mQsTileRevealControllerFactory = qsTileRevealControllerFactory; mQsTileRevealControllerFactory = qsTileRevealControllerFactory;
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mCommandQueue = commandQueue;
mQsSecurityFooter.setHostEnvironment(qstileHost); mQsSecurityFooter.setHostEnvironment(qstileHost);
mBrightnessSlider = brightnessSliderFactory.create(getContext(), mView); mBrightnessSlider = brightnessSliderFactory.create(getContext(), mView);
@@ -274,6 +278,14 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
/** */ /** */
public void showDetailAdapter(DetailAdapter detailAdapter, int x, int y) { 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}); mView.showDetailAdapter(true, detailAdapter, new int[]{x, y});
} }

View File

@@ -39,7 +39,6 @@ import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.QuickQSPanel;
import com.android.systemui.qs.QuickStatusBarHeader; import com.android.systemui.qs.QuickStatusBarHeader;
import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.statusbar.phone.MultiUserSwitch;
import javax.inject.Named; import javax.inject.Named;
@@ -80,12 +79,6 @@ public interface QSFragmentModule {
return qsFragment.getView(); return qsFragment.getView();
} }
/** */
@Provides
static MultiUserSwitch providesMultiUserSWitch(QSFooterView qsFooterView) {
return qsFooterView.findViewById(R.id.multi_user_switch);
}
/** */ /** */
@Provides @Provides
static QSPanel provideQSPanel(@RootView View view) { static QSPanel provideQSPanel(@RootView View view) {

View File

@@ -26,6 +26,7 @@ import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.qs.FooterActionsView;
import com.android.systemui.qs.QSDetailDisplayer; import com.android.systemui.qs.QSDetailDisplayer;
import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.user.UserSwitchDialogController; import com.android.systemui.qs.user.UserSwitchDialogController;
@@ -35,7 +36,6 @@ import com.android.systemui.util.ViewController;
import javax.inject.Inject; import javax.inject.Inject;
/** View Controller for {@link MultiUserSwitch}. */ /** View Controller for {@link MultiUserSwitch}. */
@QSScope
public class MultiUserSwitchController extends ViewController<MultiUserSwitch> { public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
private final UserManager mUserManager; private final UserManager mUserManager;
private final UserSwitcherController mUserSwitcherController; private final UserSwitcherController mUserSwitcherController;
@@ -68,8 +68,35 @@ public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
} }
}; };
@Inject @QSScope
public MultiUserSwitchController(MultiUserSwitch view, UserManager userManager, 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, UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer,
FalsingManager falsingManager, UserSwitchDialogController userSwitchDialogController, FalsingManager falsingManager, UserSwitchDialogController userSwitchDialogController,
FeatureFlags featureFlags) { FeatureFlags featureFlags) {

View File

@@ -42,6 +42,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.settings.brightness.BrightnessController; import com.android.systemui.settings.brightness.BrightnessController;
import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.settings.brightness.ToggleSlider; import com.android.systemui.settings.brightness.ToggleSlider;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.animation.DisappearParameters; import com.android.systemui.util.animation.DisappearParameters;
@@ -94,6 +95,8 @@ public class QSPanelControllerTest extends SysuiTestCase {
QSTileView mQSTileView; QSTileView mQSTileView;
@Mock @Mock
PagedTileLayout mPagedTileLayout; PagedTileLayout mPagedTileLayout;
@Mock
CommandQueue mCommandQueue;
FalsingManagerFake mFalsingManager = new FalsingManagerFake(); FalsingManagerFake mFalsingManager = new FalsingManagerFake();
private QSPanelController mController; private QSPanelController mController;
@@ -121,7 +124,7 @@ public class QSPanelControllerTest extends SysuiTestCase {
mQSTileHost, mQSCustomizerController, true, mMediaHost, mQSTileHost, mQSCustomizerController, true, mMediaHost,
mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger, mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger,
mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory, mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory,
mFalsingManager mFalsingManager, mCommandQueue
); );
mController.init(); mController.init();