Add user selectable Default Browser feature - part 6

- if a default Browser is not defined and if a Browser App
is selected into the disambiguation dialog, then make it as
the default Browser
- clear default Browser saved data (package name) when
the default Browser App is removed

See bug #20144393

Change-Id: Ia8621d7a61ec2cb60deded9d70f75f1e1d88d123
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 20486643..2e80896 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -743,29 +743,37 @@
                     if (r.match > bestMatch) bestMatch = r.match;
                 }
                 if (alwaysCheck) {
-                    PackageManager pm = getPackageManager();
+                    final int userId = getUserId();
+                    final PackageManager pm = getPackageManager();
 
                     // Set the preferred Activity
                     pm.addPreferredActivity(filter, bestMatch, set, intent.getComponent());
 
-                    // Update Domain Verification status
-                    int userId = getUserId();
-                    ComponentName cn = intent.getComponent();
-                    String packageName = cn.getPackageName();
-                    String dataScheme = (data != null) ? data.getScheme() : null;
+                    if (ri.handleAllWebDataURI) {
+                        // Set default Browser if needed
+                        final String packageName = pm.getDefaultBrowserPackageName(userId);
+                        if (TextUtils.isEmpty(packageName)) {
+                            pm.setDefaultBrowserPackageName(ri.activityInfo.packageName, userId);
+                        }
+                    } else {
+                        // Update Domain Verification status
+                        ComponentName cn = intent.getComponent();
+                        String packageName = cn.getPackageName();
+                        String dataScheme = (data != null) ? data.getScheme() : null;
 
-                    boolean isHttpOrHttps = (dataScheme != null) &&
-                            (dataScheme.equals(IntentFilter.SCHEME_HTTP) ||
-                            dataScheme.equals(IntentFilter.SCHEME_HTTPS));
+                        boolean isHttpOrHttps = (dataScheme != null) &&
+                                (dataScheme.equals(IntentFilter.SCHEME_HTTP) ||
+                                        dataScheme.equals(IntentFilter.SCHEME_HTTPS));
 
-                    boolean isViewAction = (action != null) && action.equals(Intent.ACTION_VIEW);
-                    boolean hasCategoryBrowsable = (categories != null) &&
-                            categories.contains(Intent.CATEGORY_BROWSABLE);
+                        boolean isViewAction = (action != null) && action.equals(Intent.ACTION_VIEW);
+                        boolean hasCategoryBrowsable = (categories != null) &&
+                                categories.contains(Intent.CATEGORY_BROWSABLE);
 
-                    if (isHttpOrHttps && isViewAction && hasCategoryBrowsable) {
-                        pm.updateIntentVerificationStatus(packageName,
-                                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
-                                userId);
+                        if (isHttpOrHttps && isViewAction && hasCategoryBrowsable) {
+                            pm.updateIntentVerificationStatus(packageName,
+                                    PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
+                                    userId);
+                        }
                     }
                 } else {
                     try {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index a120c1f..dd5f7d4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -9101,7 +9101,9 @@
         synchronized (mPackages) {
             result = mSettings.updateIntentFilterVerificationStatusLPw(packageName, status, userId);
         }
-        scheduleWritePackageRestrictionsLocked(userId);
+        if (result) {
+            scheduleWritePackageRestrictionsLocked(userId);
+        }
         return result;
     }
 
@@ -9138,9 +9140,11 @@
     public boolean setDefaultBrowserPackageName(String packageName, int userId) {
         synchronized (mPackages) {
             boolean result = mSettings.setDefaultBrowserPackageNameLPr(packageName, userId);
-            result |= updateIntentVerificationStatus(packageName,
-                    PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
-                    UserHandle.myUserId());
+            if (packageName != null) {
+                result |= updateIntentVerificationStatus(packageName,
+                        PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
+                        UserHandle.myUserId());
+            }
             return result;
         }
     }
@@ -11854,6 +11858,7 @@
             if (deletedPs != null) {
                 if ((flags&PackageManager.DELETE_KEEP_DATA) == 0) {
                     clearIntentFilterVerificationsLPw(deletedPs.name, UserHandle.USER_ALL);
+                    clearDefaultBrowserIfNeeded(packageName);
                     if (outInfo != null) {
                         mSettings.mKeySetManagerService.removeAppKeySetDataLPw(packageName);
                         outInfo.removedAppId = mSettings.removePackageLPw(packageName);
@@ -12388,7 +12393,7 @@
                     succeded = deleteApplicationCacheFilesLI(packageName, userId);
                 }
                 clearExternalStorageDataSync(packageName, userId, false);
-                if(observer != null) {
+                if (observer != null) {
                     try {
                         observer.onRemoveCompleted(packageName, succeded);
                     } catch (RemoteException e) {
@@ -12757,6 +12762,17 @@
         }
     }
 
+
+    void clearDefaultBrowserIfNeeded(String packageName) {
+        for (int oneUserId : sUserManager.getUserIds()) {
+            String defaultBrowserPackageName = getDefaultBrowserPackageName(oneUserId);
+            if (TextUtils.isEmpty(defaultBrowserPackageName)) continue;
+            if (packageName.equals(defaultBrowserPackageName)) {
+                setDefaultBrowserPackageName(null, oneUserId);
+            }
+        }
+    }
+
     @Override
     public void resetPreferredActivities(int userId) {
         /* TODO: Actually use userId. Why is it being passed in? */