summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java110
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java131
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java7
7 files changed, 173 insertions, 135 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
index c4986cc4ac89..40967ede057e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
@@ -195,10 +195,10 @@ public class QSFooterView extends FrameLayout {
mExpandClickListener = onClickListener;
}
- void setExpanded(boolean expanded, boolean isTunerEnabled) {
+ void setExpanded(boolean expanded, boolean isTunerEnabled, boolean multiUserEnabled) {
if (mExpanded == expanded) return;
mExpanded = expanded;
- updateEverything(isTunerEnabled);
+ updateEverything(isTunerEnabled, multiUserEnabled);
}
/** */
@@ -251,16 +251,16 @@ public class QSFooterView extends FrameLayout {
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND);
}
- void disable(int state2, boolean isTunerEnabled) {
+ void disable(int state2, boolean isTunerEnabled, boolean multiUserEnabled) {
final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
if (disabled == mQsDisabled) return;
mQsDisabled = disabled;
- updateEverything(isTunerEnabled);
+ updateEverything(isTunerEnabled, multiUserEnabled);
}
- void updateEverything(boolean isTunerEnabled) {
+ void updateEverything(boolean isTunerEnabled, boolean multiUserEnabled) {
post(() -> {
- updateVisibilities(isTunerEnabled);
+ updateVisibilities(isTunerEnabled, multiUserEnabled);
updateClickabilities();
setClickable(false);
});
@@ -273,18 +273,19 @@ public class QSFooterView extends FrameLayout {
mBuildText.setLongClickable(mBuildText.getVisibility() == View.VISIBLE);
}
- private void updateVisibilities(boolean isTunerEnabled) {
+ private void updateVisibilities(boolean isTunerEnabled, boolean multiUserEnabled) {
mSettingsContainer.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
mTunerIcon.setVisibility(isTunerEnabled ? View.VISIBLE : View.INVISIBLE);
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
- mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.GONE);
+ mMultiUserSwitch.setVisibility(
+ showUserSwitcher(multiUserEnabled) ? View.VISIBLE : View.GONE);
mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
mBuildText.setVisibility(mExpanded && mShouldShowBuildText ? View.VISIBLE : View.INVISIBLE);
}
- private boolean showUserSwitcher() {
- return mExpanded && mMultiUserSwitch.isMultiUserEnabled();
+ private boolean showUserSwitcher(boolean multiUserEnabled) {
+ return mExpanded && multiUserEnabled;
}
void onUserInfoChanged(Drawable picture, boolean isGuestUser) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
index 74ae3a698998..1fa926009861 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java
@@ -38,7 +38,7 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.MultiUserSwitch;
+import com.android.systemui.statusbar.phone.MultiUserSwitchController;
import com.android.systemui.statusbar.phone.SettingsButton;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.UserInfoController;
@@ -60,16 +60,15 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
private final DeviceProvisionedController mDeviceProvisionedController;
private final UserTracker mUserTracker;
private final QSPanelController mQsPanelController;
- private final QSDetailDisplayer mQsDetailDisplayer;
private final QuickQSPanelController mQuickQSPanelController;
private final TunerService mTunerService;
private final MetricsLogger mMetricsLogger;
private final FalsingManager mFalsingManager;
+ private final MultiUserSwitchController mMultiUserSwitchController;
private final SettingsButton mSettingsButton;
private final View mSettingsButtonContainer;
private final TextView mBuildText;
private final View mEdit;
- private final MultiUserSwitch mMultiUserSwitch;
private final PageIndicator mPageIndicator;
private final View mPowerMenuLite;
private final boolean mShowPMLiteButton;
@@ -135,7 +134,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
QSFooterViewController(QSFooterView view, UserManager userManager,
UserInfoController userInfoController, ActivityStarter activityStarter,
DeviceProvisionedController deviceProvisionedController, UserTracker userTracker,
- QSPanelController qsPanelController, QSDetailDisplayer qsDetailDisplayer,
+ QSPanelController qsPanelController,
+ MultiUserSwitchController multiUserSwitchController,
QuickQSPanelController quickQSPanelController,
TunerService tunerService, MetricsLogger metricsLogger, FalsingManager falsingManager,
@Named(PM_LITE_ENABLED) boolean showPMLiteButton,
@@ -147,17 +147,16 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
mDeviceProvisionedController = deviceProvisionedController;
mUserTracker = userTracker;
mQsPanelController = qsPanelController;
- mQsDetailDisplayer = qsDetailDisplayer;
mQuickQSPanelController = quickQSPanelController;
mTunerService = tunerService;
mMetricsLogger = metricsLogger;
mFalsingManager = falsingManager;
+ mMultiUserSwitchController = multiUserSwitchController;
mSettingsButton = mView.findViewById(R.id.settings_button);
mSettingsButtonContainer = mView.findViewById(R.id.settings_button_container);
mBuildText = mView.findViewById(R.id.build);
mEdit = mView.findViewById(android.R.id.edit);
- mMultiUserSwitch = mView.findViewById(R.id.multi_user_switch);
mPageIndicator = mView.findViewById(R.id.footer_page_indicator);
mPowerMenuLite = mView.findViewById(R.id.pm_lite);
mShowPMLiteButton = showPMLiteButton;
@@ -165,6 +164,12 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
}
@Override
+ protected void onInit() {
+ super.onInit();
+ mMultiUserSwitchController.init();
+ }
+
+ @Override
protected void onViewAttached() {
if (mShowPMLiteButton) {
mPowerMenuLite.setVisibility(View.VISIBLE);
@@ -199,9 +204,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
mQsPanelController.showEdit(view));
});
- mMultiUserSwitch.setQSDetailDisplayer(mQsDetailDisplayer);
mQsPanelController.setFooterPageIndicator(mPageIndicator);
- mView.updateEverything(isTunerEnabled());
+ mView.updateEverything(isTunerEnabled(), mMultiUserSwitchController.isMultiUserEnabled());
}
@Override
@@ -217,10 +221,10 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
@Override
public void setExpanded(boolean expanded) {
mExpanded = expanded;
- mView.setExpanded(expanded, isTunerEnabled());
+ mView.setExpanded(
+ expanded, isTunerEnabled(), mMultiUserSwitchController.isMultiUserEnabled());
}
-
@Override
public int getHeight() {
return mView.getHeight();
@@ -258,7 +262,7 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
@Override
public void disable(int state1, int state2, boolean animate) {
- mView.disable(state2, isTunerEnabled());
+ mView.disable(state2, isTunerEnabled(), mMultiUserSwitchController.isMultiUserEnabled());
}
private void startSettingsActivity() {
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 3a5adce51d0d..b0a9c2541b17 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java
@@ -34,6 +34,7 @@ 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;
@@ -74,6 +75,12 @@ public interface QSFragmentModule {
/** */
@Provides
+ static MultiUserSwitch providesMultiUserSWitch(QSFooterView qsFooterView) {
+ return qsFooterView.findViewById(R.id.multi_user_switch);
+ }
+
+ /** */
+ @Provides
static QSPanel provideQSPanel(@RootView View view) {
return view.findViewById(R.id.quick_settings_panel);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
index 16f36b7b6b7e..5168533cd2b7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
@@ -16,127 +16,25 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.DejankUtils.whitelistIpcs;
-
import android.content.Context;
-import android.os.UserManager;
import android.text.TextUtils;
import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Button;
import android.widget.FrameLayout;
-import com.android.systemui.Dependency;
-import com.android.systemui.Prefs;
-import com.android.systemui.Prefs.Key;
import com.android.systemui.R;
-import com.android.systemui.plugins.qs.DetailAdapter;
-import com.android.systemui.qs.QSDetailDisplayer;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
/**
* Container for image of the multi user switcher (tappable).
*/
-public class MultiUserSwitch extends FrameLayout implements View.OnClickListener {
-
- protected QSDetailDisplayer mQSDetailDisplayer;
- private UserSwitcherController.BaseUserAdapter mUserListener;
-
- final UserManager mUserManager;
-
-
- protected UserSwitcherController mUserSwitcherController;
-
+public class MultiUserSwitch extends FrameLayout {
public MultiUserSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
- mUserManager = UserManager.get(getContext());
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- setOnClickListener(this);
- refreshContentDescription();
- }
-
- /** */
- public void setQSDetailDisplayer(QSDetailDisplayer detailDisplayer) {
- mQSDetailDisplayer = detailDisplayer;
- setUserSwitcherController(Dependency.get(UserSwitcherController.class));
- }
-
- public boolean hasMultipleUsers() {
- if (mUserListener == null) {
- return false;
- }
- return mUserListener.getUserCount() != 0
- && Prefs.getBoolean(getContext(), Key.SEEN_MULTI_USER, false);
- }
-
- public void setUserSwitcherController(UserSwitcherController userSwitcherController) {
- mUserSwitcherController = userSwitcherController;
- registerListener();
- refreshContentDescription();
- }
-
- public boolean isMultiUserEnabled() {
- // TODO(b/138661450) Move IPC calls to background
- return whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled(
- mContext.getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user)));
}
- private void registerListener() {
- if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) {
-
- final UserSwitcherController controller = mUserSwitcherController;
- if (controller != null) {
- mUserListener = new UserSwitcherController.BaseUserAdapter(controller) {
- @Override
- public void notifyDataSetChanged() {
- refreshContentDescription();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- return null;
- }
- };
- refreshContentDescription();
- }
- }
- }
-
- @Override
- public void onClick(View v) {
- if (mQSDetailDisplayer != null && mUserSwitcherController != null) {
- View center = getChildCount() > 0 ? getChildAt(0) : this;
-
- int[] tmpInt = new int[2];
- center.getLocationInWindow(tmpInt);
- tmpInt[0] += center.getWidth() / 2;
- tmpInt[1] += center.getHeight() / 2;
-
- mQSDetailDisplayer.showDetailAdapter(getUserDetailAdapter(), tmpInt[0], tmpInt[1]);
- }
- }
-
- @Override
- public void setClickable(boolean clickable) {
- super.setClickable(clickable);
- refreshContentDescription();
- }
-
- private void refreshContentDescription() {
- String currentUser = null;
- // TODO(b/138661450)
- if (whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled())
- && mUserSwitcherController != null) {
- currentUser = mUserSwitcherController.getCurrentUserName(mContext);
- }
-
+ void refreshContentDescription(String currentUser) {
String text = null;
if (!TextUtils.isEmpty(currentUser)) {
@@ -166,8 +64,4 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener
public boolean hasOverlappingRendering() {
return false;
}
-
- protected DetailAdapter getUserDetailAdapter() {
- return mUserSwitcherController.mUserDetailAdapter;
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
new file mode 100644
index 000000000000..f27c7d28df44
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitchController.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2021 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.statusbar.phone;
+
+import static com.android.systemui.DejankUtils.whitelistIpcs;
+
+import android.os.UserManager;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.plugins.qs.DetailAdapter;
+import com.android.systemui.qs.QSDetailDisplayer;
+import com.android.systemui.qs.dagger.QSScope;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.util.ViewController;
+
+import javax.inject.Inject;
+
+/** View Controller for {@link MultiUserSwitch}. */
+@QSScope
+public class MultiUserSwitchController extends ViewController<MultiUserSwitch> {
+ private final UserManager mUserManager;
+ private final UserSwitcherController mUserSwitcherController;
+ private final QSDetailDisplayer mQsDetailDisplayer;
+ private final FalsingManager mFalsingManager;
+
+ private UserSwitcherController.BaseUserAdapter mUserListener;
+
+ private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
+ return;
+ }
+
+ View center = mView.getChildCount() > 0 ? mView.getChildAt(0) : mView;
+
+ int[] tmpInt = new int[2];
+ center.getLocationInWindow(tmpInt);
+ tmpInt[0] += center.getWidth() / 2;
+ tmpInt[1] += center.getHeight() / 2;
+
+ mQsDetailDisplayer.showDetailAdapter(getUserDetailAdapter(), tmpInt[0], tmpInt[1]);
+ }
+ };
+
+ @Inject
+ public MultiUserSwitchController(MultiUserSwitch view, UserManager userManager,
+ UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer,
+ FalsingManager falsingManager) {
+ super(view);
+ mUserManager = userManager;
+ mUserSwitcherController = userSwitcherController;
+ mQsDetailDisplayer = qsDetailDisplayer;
+ mFalsingManager = falsingManager;
+ }
+
+ @Override
+ protected void onInit() {
+ registerListener();
+ mView.refreshContentDescription(getCurrentUser());
+ }
+
+ @Override
+ protected void onViewAttached() {
+ mView.setOnClickListener(mOnClickListener);
+ }
+
+ @Override
+ protected void onViewDetached() {
+ mView.setOnClickListener(null);
+ }
+
+ protected DetailAdapter getUserDetailAdapter() {
+ return mUserSwitcherController.mUserDetailAdapter;
+ }
+
+ private void registerListener() {
+ if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) {
+
+ final UserSwitcherController controller = mUserSwitcherController;
+ if (controller != null) {
+ mUserListener = new UserSwitcherController.BaseUserAdapter(controller) {
+ @Override
+ public void notifyDataSetChanged() {
+ mView.refreshContentDescription(getCurrentUser());
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ return null;
+ }
+ };
+ mView.refreshContentDescription(getCurrentUser());
+ }
+ }
+ }
+
+ private String getCurrentUser() {
+ // TODO(b/138661450)
+ if (whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled())) {
+ return mUserSwitcherController.getCurrentUserName();
+ }
+
+ return null;
+ }
+
+ /** Returns true if view should be made visible. */
+ public boolean isMultiUserEnabled() {
+ // TODO(b/138661450) Move IPC calls to background
+ return whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled(
+ getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user)));
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 83558cbf089f..1a9b9bfda1ad 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -577,11 +577,13 @@ public class UserSwitcherController implements Dumpable {
pw.println("mSimpleUserSwitcher=" + mSimpleUserSwitcher);
}
- public String getCurrentUserName(Context context) {
+ /** Returns the name of the current user of the phone. */
+ public String getCurrentUserName() {
if (mUsers.isEmpty()) return null;
UserRecord item = mUsers.get(0);
if (item == null || item.info == null) return null;
- if (item.isGuest) return context.getString(com.android.settingslib.R.string.guest_nickname);
+ if (item.isGuest) return mContext.getString(
+ com.android.settingslib.R.string.guest_nickname);
return item.info.name;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
index 21fec913f88c..d35597f799ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterViewControllerTest.java
@@ -42,7 +42,7 @@ import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.globalactions.GlobalActionsDialogLite;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.statusbar.phone.MultiUserSwitch;
+import com.android.systemui.statusbar.phone.MultiUserSwitchController;
import com.android.systemui.statusbar.phone.SettingsButton;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.UserInfoController;
@@ -90,7 +90,7 @@ public class QSFooterViewControllerTest extends LeakCheckedTest {
@Mock
private View mEdit;
@Mock
- private MultiUserSwitch mMultiUserSwitch;
+ private MultiUserSwitchController mMultiUserSwitchController;
@Mock
private View mPowerMenuLiteView;
@Mock
@@ -116,12 +116,11 @@ public class QSFooterViewControllerTest extends LeakCheckedTest {
when(mView.findViewById(R.id.settings_button)).thenReturn(mSettingsButton);
when(mView.findViewById(R.id.build)).thenReturn(mBuildText);
when(mView.findViewById(android.R.id.edit)).thenReturn(mEdit);
- when(mView.findViewById(R.id.multi_user_switch)).thenReturn(mMultiUserSwitch);
when(mView.findViewById(R.id.pm_lite)).thenReturn(mPowerMenuLiteView);
mController = new QSFooterViewController(mView, mUserManager, mUserInfoController,
mActivityStarter, mDeviceProvisionedController, mUserTracker, mQSPanelController,
- new QSDetailDisplayer(), mQuickQSPanelController, mFakeTunerService,
+ mMultiUserSwitchController, mQuickQSPanelController, mFakeTunerService,
mMetricsLogger, new FalsingManagerFake(), false, mGlobalActionsDialog);
mController.init();