From 3453e081e0a94bbb0b8c1d58ce4ccdbf2e53639e Mon Sep 17 00:00:00 2001 From: Fabrice Di Meglio Date: Mon, 11 May 2015 17:46:23 -0700 Subject: [PATCH] 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 --- .../internal/app/ResolverActivity.java | 40 +++++++++++-------- .../server/pm/PackageManagerService.java | 26 +++++++++--- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 2048664320008..2e80896190e8d 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -743,29 +743,37 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic 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 a120c1f7958cc..dd5f7d415810c 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 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { result = mSettings.updateIntentFilterVerificationStatusLPw(packageName, status, userId); } - scheduleWritePackageRestrictionsLocked(userId); + if (result) { + scheduleWritePackageRestrictionsLocked(userId); + } return result; } @@ -9138,9 +9140,11 @@ public class PackageManagerService extends IPackageManager.Stub { 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 @@ public class PackageManagerService extends IPackageManager.Stub { 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 @@ public class PackageManagerService extends IPackageManager.Stub { 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 @@ public class PackageManagerService extends IPackageManager.Stub { } } + + 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? */