Fix backup and restore for default browser app.
This was broken by ag/6216880 back in Q because it didn't take into
account that writeDefaultAppsLPr() is also used by
getDefaultAppsBackup(), so that it didn't modify
getDefaultAppsBackup() to read the browser role instead when
effectively removing pm/Settings.mDefaultBrowserApp.
This CL fixes the regression in a minimal and backwards-compatible
way. It extracts the XML related code into a static method, and makes
getDefaultAppsBackup() use that static method by passing in the
current default browser obtained from the browser role.
Bug: 271337188
Test: manually perform a restore via cable and verify that the source
device provided its current default browser to backup helper via
locally added log.
Change-Id: I1fde685049e9f3371bbef6956418f9a7eb5ff850
This commit is contained in:
@@ -7408,6 +7408,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
|||||||
callback);
|
callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
String getDefaultBrowser(@UserIdInt int userId) {
|
||||||
|
return mDefaultAppProvider.getDefaultBrowser(userId);
|
||||||
|
}
|
||||||
|
|
||||||
void setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) {
|
void setDefaultBrowser(@Nullable String packageName, boolean async, @UserIdInt int userId) {
|
||||||
mDefaultAppProvider.setDefaultBrowser(packageName, async, userId);
|
mDefaultAppProvider.setDefaultBrowser(packageName, async, userId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -557,9 +557,8 @@ final class PreferredActivityHelper {
|
|||||||
serializer.startDocument(null, true);
|
serializer.startDocument(null, true);
|
||||||
serializer.startTag(null, TAG_DEFAULT_APPS);
|
serializer.startTag(null, TAG_DEFAULT_APPS);
|
||||||
|
|
||||||
synchronized (mPm.mLock) {
|
final String defaultBrowser = mPm.getDefaultBrowser(userId);
|
||||||
mPm.mSettings.writeDefaultAppsLPr(serializer, userId);
|
Settings.writeDefaultApps(serializer, defaultBrowser);
|
||||||
}
|
|
||||||
|
|
||||||
serializer.endTag(null, TAG_DEFAULT_APPS);
|
serializer.endTag(null, TAG_DEFAULT_APPS);
|
||||||
serializer.endDocument();
|
serializer.endDocument();
|
||||||
@@ -584,12 +583,7 @@ final class PreferredActivityHelper {
|
|||||||
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
|
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
|
||||||
restoreFromXml(parser, userId, TAG_DEFAULT_APPS,
|
restoreFromXml(parser, userId, TAG_DEFAULT_APPS,
|
||||||
(parser1, userId1) -> {
|
(parser1, userId1) -> {
|
||||||
final String defaultBrowser;
|
final String defaultBrowser = Settings.readDefaultApps(parser1);
|
||||||
synchronized (mPm.mLock) {
|
|
||||||
mPm.mSettings.readDefaultAppsLPw(parser1, userId1);
|
|
||||||
defaultBrowser = mPm.mSettings.removeDefaultBrowserPackageNameLPw(
|
|
||||||
userId1);
|
|
||||||
}
|
|
||||||
if (defaultBrowser != null) {
|
if (defaultBrowser != null) {
|
||||||
mPm.setDefaultBrowser(defaultBrowser, false, userId1);
|
mPm.setDefaultBrowser(defaultBrowser, false, userId1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1691,6 +1691,19 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
|||||||
|
|
||||||
void readDefaultAppsLPw(XmlPullParser parser, int userId)
|
void readDefaultAppsLPw(XmlPullParser parser, int userId)
|
||||||
throws XmlPullParserException, IOException {
|
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 outerDepth = parser.getDepth();
|
||||||
int type;
|
int type;
|
||||||
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
|
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
|
||||||
@@ -1700,8 +1713,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
|||||||
}
|
}
|
||||||
String tagName = parser.getName();
|
String tagName = parser.getName();
|
||||||
if (tagName.equals(TAG_DEFAULT_BROWSER)) {
|
if (tagName.equals(TAG_DEFAULT_BROWSER)) {
|
||||||
String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
|
defaultBrowser = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
|
||||||
mDefaultBrowserApp.put(userId, packageName);
|
|
||||||
} else if (tagName.equals(TAG_DEFAULT_DIALER)) {
|
} else if (tagName.equals(TAG_DEFAULT_DIALER)) {
|
||||||
// Ignored.
|
// Ignored.
|
||||||
} else {
|
} else {
|
||||||
@@ -1711,6 +1723,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
|||||||
XmlUtils.skipCurrentTag(parser);
|
XmlUtils.skipCurrentTag(parser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return defaultBrowser;
|
||||||
}
|
}
|
||||||
|
|
||||||
void readBlockUninstallPackagesLPw(TypedXmlPullParser parser, int userId)
|
void readBlockUninstallPackagesLPw(TypedXmlPullParser parser, int userId)
|
||||||
@@ -2085,8 +2098,13 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
|||||||
|
|
||||||
void writeDefaultAppsLPr(XmlSerializer serializer, int userId)
|
void writeDefaultAppsLPr(XmlSerializer serializer, int userId)
|
||||||
throws IllegalArgumentException, IllegalStateException, IOException {
|
throws IllegalArgumentException, IllegalStateException, IOException {
|
||||||
serializer.startTag(null, TAG_DEFAULT_APPS);
|
|
||||||
String defaultBrowser = mDefaultBrowserApp.get(userId);
|
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)) {
|
if (!TextUtils.isEmpty(defaultBrowser)) {
|
||||||
serializer.startTag(null, TAG_DEFAULT_BROWSER);
|
serializer.startTag(null, TAG_DEFAULT_BROWSER);
|
||||||
serializer.attribute(null, ATTR_PACKAGE_NAME, defaultBrowser);
|
serializer.attribute(null, ATTR_PACKAGE_NAME, defaultBrowser);
|
||||||
|
|||||||
Reference in New Issue
Block a user