Don't let the user delete their default launcher.

Change-Id: Idabfeef5732ad9a0920007b79621189c721a046a
Fixes: 63154615
Test: StorageManager robotest
diff --git a/robotests/src/com/android/storagemanager/deletionhelper/AppsAsyncLoaderTest.java b/robotests/src/com/android/storagemanager/deletionhelper/AppsAsyncLoaderTest.java
index aa13932..8aa9cd0 100644
--- a/robotests/src/com/android/storagemanager/deletionhelper/AppsAsyncLoaderTest.java
+++ b/robotests/src/com/android/storagemanager/deletionhelper/AppsAsyncLoaderTest.java
@@ -18,6 +18,7 @@
 
 import android.app.usage.UsageStats;
 import android.app.usage.UsageStatsManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -61,6 +62,7 @@
     private static final String PACKAGE_NAME = "package.mcpackageface";
     public static final String PACKAGE_CLEARABLE = "package.clearable";
     public static final String PACKAGE_TOO_NEW_TO_DELETE = "package.tooNewToDelete";
+    public static final String PACKAGE_DEFAULT_LAUNCHER = "package.launcherface";
 
     @Mock private UsageStatsManager mUsageStatsManager;
     @Mock private StorageStatsSource mStorageStatsSource;
@@ -89,6 +91,8 @@
         // Set up the loader to return our fake list of apps.
         mInfo = new ArrayList<>();
         when(mPackageManager.getInstalledApplicationsAsUser(anyInt(), anyInt())).thenReturn(mInfo);
+        when(mPackageManager.getHomeActivities(any(List.class)))
+                .thenReturn(new ComponentName(PACKAGE_DEFAULT_LAUNCHER, ""));
 
         AppsAsyncLoader.FILTER_USAGE_STATS.init();
 
@@ -334,6 +338,22 @@
                 .isEqualTo(secondary);
     }
 
+    @Test
+    public void test_defaultLauncherDisallowedFromDeletion() {
+        mLoader.mFilter = AppsAsyncLoader.FILTER_USAGE_STATS;
+        mLoader.mFilter.init();
+        AppsAsyncLoader.PackageInfo defaultLauncher =
+                createPackage(
+                        PACKAGE_DEFAULT_LAUNCHER,
+                        TimeUnit.DAYS.toMillis(800),
+                        TimeUnit.DAYS.toMillis(800));
+        registerLastUse(PACKAGE_DEFAULT_LAUNCHER, TimeUnit.DAYS.toMillis(800));
+        registerApp(defaultLauncher, 0, TimeUnit.DAYS.toMillis(800));
+        List<AppsAsyncLoader.PackageInfo> infos = mLoader.loadInBackground();
+
+        assertThat(containsPackage(infos, PACKAGE_DEFAULT_LAUNCHER)).isFalse();
+    }
+
     private AppsAsyncLoader.PackageInfo createPackage(
             String packageName, long lastUse, long installTime) {
         AppsAsyncLoader.PackageInfo app =
diff --git a/src/com/android/storagemanager/deletionhelper/AppsAsyncLoader.java b/src/com/android/storagemanager/deletionhelper/AppsAsyncLoader.java
index e70b413..578a869 100644
--- a/src/com/android/storagemanager/deletionhelper/AppsAsyncLoader.java
+++ b/src/com/android/storagemanager/deletionhelper/AppsAsyncLoader.java
@@ -18,9 +18,11 @@
 
 import android.app.usage.UsageStats;
 import android.app.usage.UsageStatsManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
 import android.os.SystemProperties;
 import android.os.UserHandle;
@@ -144,7 +146,7 @@
                             .setLabel(mPackageManager.loadLabel(app))
                             .build();
             seenUid.add(app.uid);
-            if (mFilter.filterApp(extraInfo)) {
+            if (mFilter.filterApp(extraInfo) && !isDefaultLauncher(mPackageManager, extraInfo)) {
                 stats.add(extraInfo);
             }
         }
@@ -203,6 +205,24 @@
     @Override
     protected void onDiscardResult(List<PackageInfo> result) {}
 
+    private static boolean isDefaultLauncher(
+            PackageManagerWrapper packageManager, PackageInfo info) {
+        if (packageManager == null) {
+            return false;
+        }
+
+        final List<ResolveInfo> homeActivities = new ArrayList<>();
+        ComponentName defaultActivity = packageManager.getHomeActivities(homeActivities);
+        if (defaultActivity != null) {
+            String packageName = defaultActivity.getPackageName();
+            return packageName == null
+                    ? false
+                    : defaultActivity.getPackageName().equals(info.packageName);
+        }
+
+        return false;
+    }
+
     public static class Builder {
         private Context mContext;
         private int mUid;
diff --git a/src/com/android/storagemanager/deletionhelper/DeletionHelperSettings.java b/src/com/android/storagemanager/deletionhelper/DeletionHelperSettings.java
index 7185caa..fca2380 100644
--- a/src/com/android/storagemanager/deletionhelper/DeletionHelperSettings.java
+++ b/src/com/android/storagemanager/deletionhelper/DeletionHelperSettings.java
@@ -236,7 +236,7 @@
 
     @Override
     public void onFreeableChanged(int numItems, long bytesFreeable) {
-        if (bytesFreeable > 0 || allTypesEmpty()) {
+        if (numItems > 0 || bytesFreeable > 0 || allTypesEmpty()) {
             mLoadingController.onCategoryLoad();
         }