Revert "Block apps instead of uninstalling."

We need to go back to uninstalling applications so that
non-default system applications can be installed by Play.

This reverts commit 2bc39bf7805e36919341b166065980fd909e195e.

Change-Id: I07e7fe67d8794f7f3c49a5ace0c5037b8781a1ed
diff --git a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
index a36a5f9..c481a8f 100644
--- a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
+++ b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
@@ -2,6 +2,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.IPackageDeleteObserver;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -15,6 +16,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Removes all apps with a launcher that are not required.
@@ -63,17 +65,17 @@
             }
         }
 
+        PackageDeleteObserver packageDeleteObserver =
+                    new PackageDeleteObserver(packagesToDelete.size());
         for (String packageName : packagesToDelete) {
             try {
-                mIpm.setApplicationHiddenSettingAsUser(packageName, true, mUserId);
+                mIpm.deletePackageAsUser(packageName, packageDeleteObserver, mUserId,
+                        PackageManager.DELETE_SYSTEM_APP);
             } catch (RemoteException neverThrown) {
                 // Never thrown, as we are making local calls.
                 ProvisionLogger.loge("This should not happen.", neverThrown);
-                mCallback.onError();
             }
         }
-
-        mCallback.onSuccess();
     }
 
     protected Set<String> getRequiredApps() {
@@ -85,6 +87,32 @@
         return requiredApps;
     }
 
+    /**
+     * Runs the next task when all packages have been deleted or shuts down the activity if package
+     * deletion fails.
+     */
+    class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
+        private final AtomicInteger mPackageCount = new AtomicInteger(0);
+
+        public PackageDeleteObserver(int packageCount) {
+            this.mPackageCount.set(packageCount);
+        }
+
+        @Override
+        public void packageDeleted(String packageName, int returnCode) {
+            if (returnCode != PackageManager.DELETE_SUCCEEDED) {
+                ProvisionLogger.logw(
+                        "Could not finish managed profile provisioning: package deletion failed");
+                mCallback.onError();
+            }
+            int currentPackageCount = mPackageCount.decrementAndGet();
+            if (currentPackageCount == 0) {
+                ProvisionLogger.logi("All non-required system apps have been uninstalled.");
+                mCallback.onSuccess();
+            }
+        }
+    }
+
     public abstract static class Callback {
         public abstract void onSuccess();
         public abstract void onError();