diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2fc22bf79d919..e328d64dd0d66 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -7569,6 +7569,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService callback); } + @Nullable + String getDefaultBrowser(@UserIdInt int userId) { + return mDefaultAppProvider.getDefaultBrowser(userId); + } + void setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) { mDefaultAppProvider.setDefaultBrowser(packageName, async, userId); } diff --git a/services/core/java/com/android/server/pm/PreferredActivityHelper.java b/services/core/java/com/android/server/pm/PreferredActivityHelper.java index 214a8b80b35d1..9ff83929a609e 100644 --- a/services/core/java/com/android/server/pm/PreferredActivityHelper.java +++ b/services/core/java/com/android/server/pm/PreferredActivityHelper.java @@ -557,9 +557,8 @@ final class PreferredActivityHelper { serializer.startDocument(null, true); serializer.startTag(null, TAG_DEFAULT_APPS); - synchronized (mPm.mLock) { - mPm.mSettings.writeDefaultAppsLPr(serializer, userId); - } + final String defaultBrowser = mPm.getDefaultBrowser(userId); + Settings.writeDefaultApps(serializer, defaultBrowser); serializer.endTag(null, TAG_DEFAULT_APPS); serializer.endDocument(); @@ -584,12 +583,7 @@ final class PreferredActivityHelper { parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name()); restoreFromXml(parser, userId, TAG_DEFAULT_APPS, (parser1, userId1) -> { - final String defaultBrowser; - synchronized (mPm.mLock) { - mPm.mSettings.readDefaultAppsLPw(parser1, userId1); - defaultBrowser = mPm.mSettings.removeDefaultBrowserPackageNameLPw( - userId1); - } + final String defaultBrowser = Settings.readDefaultApps(parser1); if (defaultBrowser != null) { mPm.setDefaultBrowser(defaultBrowser, false, userId1); } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 532ae718c0304..5811f11b20c5b 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1688,6 +1688,19 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile void readDefaultAppsLPw(XmlPullParser parser, int userId) throws XmlPullParserException, IOException { + String defaultBrowser = readDefaultApps(parser); + if (defaultBrowser != null) { + mDefaultBrowserApp.put(userId, defaultBrowser); + } + } + + /** + * @return the package name for the default browser app, or {@code null} if none. + */ + @Nullable + static String readDefaultApps(@NonNull XmlPullParser parser) + throws XmlPullParserException, IOException { + String defaultBrowser = null; int outerDepth = parser.getDepth(); int type; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -1697,8 +1710,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile } String tagName = parser.getName(); if (tagName.equals(TAG_DEFAULT_BROWSER)) { - String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); - mDefaultBrowserApp.put(userId, packageName); + defaultBrowser = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); } else if (tagName.equals(TAG_DEFAULT_DIALER)) { // Ignored. } else { @@ -1708,6 +1720,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile XmlUtils.skipCurrentTag(parser); } } + return defaultBrowser; } void readBlockUninstallPackagesLPw(TypedXmlPullParser parser, int userId) @@ -2087,8 +2100,13 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile void writeDefaultAppsLPr(XmlSerializer serializer, int userId) throws IllegalArgumentException, IllegalStateException, IOException { - serializer.startTag(null, TAG_DEFAULT_APPS); String defaultBrowser = mDefaultBrowserApp.get(userId); + writeDefaultApps(serializer, defaultBrowser); + } + + static void writeDefaultApps(@NonNull XmlSerializer serializer, @Nullable String defaultBrowser) + throws IllegalArgumentException, IllegalStateException, IOException { + serializer.startTag(null, TAG_DEFAULT_APPS); if (!TextUtils.isEmpty(defaultBrowser)) { serializer.startTag(null, TAG_DEFAULT_BROWSER); serializer.attribute(null, ATTR_PACKAGE_NAME, defaultBrowser);