Grey out suspended applications.

Grey out application shortcuts and all apps entries
for packages that are suspended.

Bug: 22776761
Change-Id: I1b63da1816aca1de52b9f9bee62d1b162d0cdf4d
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 92ef3ea..52d2dca 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -1198,6 +1198,20 @@
         }
     }
 
+    @Override
+    public void onPackagesSuspended(String[] packageNames, UserHandleCompat user) {
+        enqueuePackageUpdated(new PackageUpdatedTask(
+                PackageUpdatedTask.OP_SUSPEND, packageNames,
+                user));
+    }
+
+    @Override
+    public void onPackagesUnsuspended(String[] packageNames, UserHandleCompat user) {
+        enqueuePackageUpdated(new PackageUpdatedTask(
+                PackageUpdatedTask.OP_UNSUSPEND, packageNames,
+                user));
+    }
+
     /**
      * Call from the handler for ACTION_PACKAGE_ADDED, ACTION_PACKAGE_REMOVED and
      * ACTION_PACKAGE_CHANGED.
@@ -1777,6 +1791,11 @@
                                                 restoredRows.add(id);
                                                 restored = false;
                                             }
+                                            boolean isSuspended = launcherApps.isPackageSuspendedForProfile(
+                                                    cn.getPackageName(), user);
+                                            if (isSuspended) {
+                                                disabledState = ShortcutInfo.FLAG_DISABLED_SUSPENDED;
+                                            }
                                         } else if (validPkg) {
                                             intent = null;
                                             if ((promiseType & ShortcutInfo.FLAG_AUTOINTALL_ICON) != 0) {
@@ -2892,6 +2911,8 @@
         public static final int OP_UPDATE = 2;
         public static final int OP_REMOVE = 3; // uninstlled
         public static final int OP_UNAVAILABLE = 4; // external media unmounted
+        public static final int OP_SUSPEND = 5; // package suspended
+        public static final int OP_UNSUSPEND = 6; // package unsuspended
 
 
         public PackageUpdatedTask(int op, String[] packages, UserHandleCompat user) {
@@ -2949,6 +2970,15 @@
                         mApp.getWidgetCache().removePackage(packages[i], mUser);
                     }
                     break;
+                case OP_SUSPEND:
+                case OP_UNSUSPEND:
+                    boolean suspend = mOp == OP_SUSPEND;
+                    for (int i=0; i<N; i++) {
+                        if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.suspendPackage "
+                                + suspend + " " + packages[i]);
+                        mBgAllAppsList.suspendPackage(packages[i], mUser, suspend);
+                    }
+                    break;
             }
 
             ArrayList<AppInfo> added = null;
@@ -3001,7 +3031,7 @@
             }
 
             // Update shortcut infos
-            if (mOp == OP_ADD || mOp == OP_UPDATE) {
+            if (mOp == OP_ADD || mOp == OP_UPDATE || mOp == OP_UNSUSPEND) {
                 final ArrayList<ShortcutInfo> updatedShortcuts = new ArrayList<ShortcutInfo>();
                 final ArrayList<ShortcutInfo> removedShortcuts = new ArrayList<ShortcutInfo>();
                 final ArrayList<LauncherAppWidgetInfo> widgets = new ArrayList<LauncherAppWidgetInfo>();
@@ -3014,6 +3044,11 @@
                             boolean infoUpdated = false;
                             boolean shortcutUpdated = false;
 
+                            if (mOp == OP_UNSUSPEND) {
+                                si.isDisabled &= ~ ShortcutInfo.FLAG_DISABLED_SUSPENDED;
+                                infoUpdated = true;
+                            }
+
                             // Update shortcuts which use iconResource.
                             if ((si.iconResource != null)
                                     && packageSet.contains(si.iconResource.packageName)) {
@@ -3139,7 +3174,7 @@
 
             final ArrayList<String> removedPackageNames =
                     new ArrayList<String>();
-            if (mOp == OP_REMOVE || mOp == OP_UNAVAILABLE) {
+            if (mOp == OP_REMOVE || mOp == OP_UNAVAILABLE || mOp == OP_SUSPEND) {
                 // Mark all packages in the broadcast to be removed
                 removedPackageNames.addAll(Arrays.asList(packages));
             } else if (mOp == OP_UPDATE) {
@@ -3155,6 +3190,8 @@
                 final int removeReason;
                 if (mOp == OP_UNAVAILABLE) {
                     removeReason = ShortcutInfo.FLAG_DISABLED_NOT_AVAILABLE;
+                } else if (mOp == OP_SUSPEND) {
+                    removeReason = ShortcutInfo.FLAG_DISABLED_SUSPENDED;
                 } else {
                     // Remove all the components associated with this package
                     for (String pn : removedPackageNames) {