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);
-            }
-        }
-    };
 }