Add support for auto-adding tiles
hotspot, color inversion, data saver, and work profiles should add
themselves when they first become applicable.
Also refactor the availability flow a little bit.
Change-Id: Iaed89059540a98fefd4d26ce69edc0dde987b992
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
index a94973c..053a98a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
@@ -16,40 +16,25 @@
package com.android.systemui.qs.tiles;
-import android.app.ActivityManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.UserInfo;
-import android.os.UserHandle;
-import android.os.UserManager;
-
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.qs.QSTile;
-
-import java.util.LinkedList;
-import java.util.List;
+import com.android.systemui.statusbar.phone.ManagedProfileController;
/** Quick settings tile: Work profile on/off */
-public class WorkModeTile extends QSTile<QSTile.BooleanState> {
+public class WorkModeTile extends QSTile<QSTile.BooleanState> implements
+ ManagedProfileController.Callback {
private final AnimationIcon mEnable =
new AnimationIcon(R.drawable.ic_signal_workmode_enable_animation);
private final AnimationIcon mDisable =
new AnimationIcon(R.drawable.ic_signal_workmode_disable_animation);
- private boolean mListening;
-
- private UserManager mUserManager;
- private List<UserInfo> mProfiles;
+ private final ManagedProfileController mProfileController;
public WorkModeTile(Host host) {
super(host);
- mUserManager = UserManager.get(mContext);
- mProfiles = new LinkedList<UserInfo>();
- reloadManagedProfiles(UserHandle.USER_CURRENT);
+ mProfileController = host.getManagedProfileController();
}
@Override
@@ -58,58 +43,41 @@
}
@Override
+ public void setListening(boolean listening) {
+ if (listening) {
+ mProfileController.addCallback(this);
+ } else {
+ mProfileController.removeCallback(this);
+ }
+ }
+
+ @Override
public void handleClick() {
MetricsLogger.action(mContext, getMetricsCategory(), !mState.value);
- setWorkModeEnabled(!mState.value);
+ mProfileController.setWorkModeEnabled(!mState.value);
}
- private void reloadManagedProfiles(int userHandle) {
- synchronized (mProfiles) {
- mProfiles.clear();
-
- if (userHandle == UserHandle.USER_CURRENT) {
- userHandle = ActivityManager.getCurrentUser();
- }
- for (UserInfo ui : mUserManager.getEnabledProfiles(userHandle)) {
- if (ui.isManagedProfile()) {
- mProfiles.add(ui);
- }
- }
- }
+ @Override
+ public boolean isAvailable() {
+ return mProfileController.hasActiveProfile();
}
- private boolean hasActiveProfile() {
- synchronized (mProfiles) {
- return mProfiles.size() > 0;
- }
+ @Override
+ public void onManagedProfileChanged() {
+ refreshState(mProfileController.isWorkModeEnabled());
}
- private boolean isWorkModeEnabled() {
- synchronized (mProfiles) {
- for (UserInfo ui : mProfiles) {
- if (ui.isQuietModeEnabled()) {
- return false;
- }
- }
- return true;
- }
- }
-
- private void refreshQuietModeState(boolean backgroundRefresh) {
- refreshState(isWorkModeEnabled());
+ @Override
+ public void onManagedProfileRemoved() {
+ mHost.removeTile(getTileSpec());
}
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
- if (!hasActiveProfile()) {
- mHost.removeTile(getTileSpec());
- return;
- }
-
if (arg instanceof Boolean) {
state.value = (Boolean) arg;
} else {
- state.value = isWorkModeEnabled();
+ state.value = mProfileController.isWorkModeEnabled();
}
state.label = mContext.getString(R.string.quick_settings_work_mode_label);
@@ -137,64 +105,4 @@
return mContext.getString(R.string.accessibility_quick_settings_work_mode_changed_off);
}
}
-
- @Override
- public void setListening(boolean listening) {
- if (mListening == listening) {
- return;
- }
- mListening = listening;
- if (listening) {
- reloadManagedProfiles(UserHandle.USER_CURRENT);
-
- final IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_USER_SWITCHED);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED);
- mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null);
- } else {
- mContext.unregisterReceiver(mReceiver);
- }
- }
-
- private void setWorkModeEnabled(boolean enabled) {
- synchronized (mProfiles) {
- for (UserInfo ui : mProfiles) {
- mUserManager.setQuietModeEnabled(ui.id, !enabled);
- }
- }
- }
-
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- final int targetUser;
- final boolean isBackgroundRefresh;
- switch (action) {
- case Intent.ACTION_USER_SWITCHED:
- targetUser = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
- UserHandle.USER_CURRENT);
- isBackgroundRefresh = true;
- break;
- case Intent.ACTION_MANAGED_PROFILE_ADDED:
- case Intent.ACTION_MANAGED_PROFILE_REMOVED:
- targetUser = UserHandle.USER_CURRENT;
- isBackgroundRefresh = true;
- break;
- case Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED:
- targetUser = UserHandle.USER_CURRENT;
- isBackgroundRefresh = false;
- break;
- default:
- targetUser = UserHandle.USER_NULL;
- isBackgroundRefresh = false;
- }
- if (targetUser != UserHandle.USER_NULL) {
- reloadManagedProfiles(targetUser);
- refreshQuietModeState(isBackgroundRefresh);
- }
- }
- };
}