Merge "Disable apps that require an account on a limited user" into jb-mr2-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 498f712..af02ae5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4464,6 +4464,8 @@
     <string name="app_restrictions_custom_label">Set application limits</string>
     <!-- Summary for app entries that are controlled by another entry [CHAR LIMIT=none] -->
     <string name="user_restrictions_controlled_by">Controlled by <xliff:g id="app">%1$s</xliff:g></string>
+    <!-- Summary for apps that aren't supported in limited users [CHAR LIMIT=none] -->
+    <string name="app_not_supported_in_limited">This app is not supported in limited users</string>
 
     <!-- Restrictions title for configuring wifi and mobile [CHAR LIMIT=35] -->
     <string name="restriction_wifi_config_title">Wi\u2011Fi and Mobile</string>
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index 5e2868e..4e6e5de 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -32,6 +32,9 @@
 import android.content.pm.UserInfo;
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
@@ -135,17 +138,35 @@
         boolean panelOpen;
         private boolean immutable;
         List<Preference> childPreferences = new ArrayList<Preference>();
+        private SelectableAppInfo appInfo;
+        private final ColorFilter grayscaleFilter;
 
         AppRestrictionsPreference(Context context, OnClickListener listener) {
             super(context);
             setLayoutResource(R.layout.preference_app_restrictions);
             this.listener = listener;
+
+            ColorMatrix colorMatrix = new ColorMatrix();
+            colorMatrix.setSaturation(0f);
+            float[] matrix = colorMatrix.getArray();
+            matrix[18] = 0.5f;
+            grayscaleFilter = new ColorMatrixColorFilter(colorMatrix);
         }
 
         private void setSettingsEnabled(boolean enable) {
             hasSettings = enable;
         }
 
+        @Override
+        public void setChecked(boolean checked) {
+            if (checked) {
+                getIcon().setColorFilter(null);
+            } else {
+                getIcon().setColorFilter(grayscaleFilter);
+            }
+            super.setChecked(checked);
+        }
+
         void setRestrictions(ArrayList<RestrictionEntry> restrictions) {
             this.restrictions = restrictions;
         }
@@ -158,6 +179,10 @@
             return immutable;
         }
 
+        void setSelectableAppInfo(SelectableAppInfo appInfo) {
+            this.appInfo = appInfo;
+        }
+
         RestrictionEntry getRestriction(String key) {
             if (restrictions == null) return null;
             for (RestrictionEntry entry : restrictions) {
@@ -256,7 +281,11 @@
     public void onPause() {
         super.onPause();
         if (mAppListChanged) {
-            updateUserAppList();
+            new Thread() {
+                public void run() {
+                    updateUserAppList();
+                }
+            }.start();
         }
     }
 
@@ -388,6 +417,7 @@
                 AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
                 final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
                 p.setIcon(app.icon);
+                p.setChecked(false);
                 p.setTitle(app.activityName);
                 if (app.masterEntry != null) {
                     p.setSummary(getActivity().getString(R.string.user_restrictions_controlled_by,
@@ -415,6 +445,11 @@
                 } else if (!mNewUser && appInfoListHasPackage(userApps, packageName)) {
                     p.setChecked(true);
                 }
+                if (pi.requiredAccountType != null && pi.restrictedAccountType == null) {
+                    p.setChecked(false);
+                    p.setImmutable(true);
+                    p.setSummary(R.string.app_not_supported_in_limited);
+                }
                 if (app.masterEntry != null) {
                     p.setImmutable(true);
                     p.setChecked(mSelectedPackages.get(packageName));
@@ -425,6 +460,7 @@
                 } else {
                     p.setOrder(MAX_APP_RESTRICTIONS * (i + 2));
                 }
+                p.setSelectableAppInfo(app);
                 mSelectedPackages.put(packageName, p.isChecked());
                 mAppListChanged = true;
                 i++;