diff options
| author | 2024-09-20 10:03:44 -0400 | |
|---|---|---|
| committer | 2024-10-29 10:45:46 -0400 | |
| commit | 6e424669dd9c8617c9a62e5a158348ba56c4bbf5 (patch) | |
| tree | 1f61ab6a31b42aed290894110dadbff35e01ba44 | |
| parent | 82f6ca9c73bccfac0e9ba8d6fd6cb29ac80f44e2 (diff) | |
Add WallpaperDescription to WallpaperData and persist description
Bug: 347235611
Test: tests added with code
Flag: android.app.live_wallpaper_content_handling
API-Coverage-Bug: 373596341
Change-Id: If35e3ce438dd8acbd1877085d749932ebab6875b
5 files changed, 325 insertions, 62 deletions
diff --git a/core/java/android/app/wallpaper/WallpaperDescription.java b/core/java/android/app/wallpaper/WallpaperDescription.java index e5b2cd3d76a6..dedcb48f3ad7 100644 --- a/core/java/android/app/wallpaper/WallpaperDescription.java +++ b/core/java/android/app/wallpaper/WallpaperDescription.java @@ -25,10 +25,21 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; +import android.text.Html; +import android.text.Spanned; +import android.text.SpannedString; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.modules.utils.TypedXmlPullParser; +import com.android.modules.utils.TypedXmlSerializer; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -48,6 +59,10 @@ import java.util.Objects; */ @FlaggedApi(FLAG_LIVE_WALLPAPER_CONTENT_HANDLING) public final class WallpaperDescription implements Parcelable { + private static final String TAG = "WallpaperDescription"; + private static final String XML_TAG_CONTENT = "content"; + private static final String XML_TAG_DESCRIPTION = "description"; + @Nullable private final ComponentName mComponent; @Nullable private final String mId; @Nullable private final Uri mThumbnail; @@ -134,6 +149,99 @@ public final class WallpaperDescription implements Parcelable { return Objects.hash(mComponent, mId); } + ////// XML storage + + /** @hide */ + public void saveToXml(TypedXmlSerializer out) throws IOException, XmlPullParserException { + if (mComponent != null) { + out.attribute(null, "component", mComponent.flattenToShortString()); + } + if (mId != null) out.attribute(null, "id", mId); + if (mThumbnail != null) out.attribute(null, "thumbnail", mThumbnail.toString()); + if (mTitle != null) out.attribute(null, "title", toHtml(mTitle)); + if (mContextUri != null) out.attribute(null, "contexturi", mContextUri.toString()); + if (mContextDescription != null) { + out.attribute(null, "contextdescription", toHtml(mContextDescription)); + } + out.startTag(null, XML_TAG_DESCRIPTION); + for (CharSequence s : mDescription) out.attribute(null, "descriptionline", toHtml(s)); + out.endTag(null, XML_TAG_DESCRIPTION); + try { + out.startTag(null, XML_TAG_CONTENT); + mContent.saveToXml(out); + } catch (XmlPullParserException e) { + // Be extra conservative and don't fail when writing content since it could come + // from third parties + Log.e(TAG, "unable to convert wallpaper content to XML"); + } finally { + out.endTag(null, XML_TAG_CONTENT); + } + } + + /** @hide */ + public static WallpaperDescription restoreFromXml(TypedXmlPullParser in) throws IOException, + XmlPullParserException { + final int outerDepth = in.getDepth(); + String component = in.getAttributeValue(null, "component"); + ComponentName componentName = (component != null) ? ComponentName.unflattenFromString( + component) : null; + String id = in.getAttributeValue(null, "id"); + String thumbnailString = in.getAttributeValue(null, "thumbnail"); + Uri thumbnail = (thumbnailString != null) ? Uri.parse(thumbnailString) : null; + CharSequence title = fromHtml(in.getAttributeValue(null, "title")); + String contextUriString = in.getAttributeValue(null, "contexturi"); + Uri contextUri = (contextUriString != null) ? Uri.parse(contextUriString) : null; + CharSequence contextDescription = fromHtml( + in.getAttributeValue(null, "contextdescription")); + + List<CharSequence> description = new ArrayList<>(); + PersistableBundle content = null; + int type; + while ((type = in.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || in.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } + String name = in.getName(); + if (XML_TAG_DESCRIPTION.equals(name)) { + for (int i = 0; i < in.getAttributeCount(); i++) { + description.add(fromHtml(in.getAttributeValue(i))); + } + } else if (XML_TAG_CONTENT.equals(name)) { + content = PersistableBundle.restoreFromXml(in); + } + } + + return new WallpaperDescription(componentName, id, thumbnail, title, description, + contextUri, contextDescription, content); + } + + private static String toHtml(@NonNull CharSequence c) { + Spanned s = (c instanceof Spanned) ? (Spanned) c : new SpannedString(c); + return Html.toHtml(s, Html.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL); + } + + private static CharSequence fromHtml(@Nullable String text) { + if (text == null) { + return null; + } else { + return removeTrailingWhitespace(Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT)); + } + } + + // Html.fromHtml and toHtml add a trailing line. This removes it. See + // https://stackoverflow.com/q/9589381 + private static CharSequence removeTrailingWhitespace(CharSequence s) { + if (s == null) return null; + + int end = s.length(); + while (end > 0 && Character.isWhitespace(s.charAt(end - 1))) { + end--; + } + + return s.subSequence(0, end); + } + ////// Parcelable implementation WallpaperDescription(@NonNull Parcel in) { diff --git a/core/tests/coretests/src/android/app/wallpaper/WallpaperDescriptionTest.java b/core/tests/coretests/src/android/app/wallpaper/WallpaperDescriptionTest.java index 7c79ba709895..01c2abf2781b 100644 --- a/core/tests/coretests/src/android/app/wallpaper/WallpaperDescriptionTest.java +++ b/core/tests/coretests/src/android/app/wallpaper/WallpaperDescriptionTest.java @@ -22,15 +22,27 @@ import android.content.ComponentName; import android.net.Uri; import android.os.Parcel; import android.os.PersistableBundle; +import android.util.Xml; + +import com.android.modules.utils.TypedXmlPullParser; +import com.android.modules.utils.TypedXmlSerializer; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; @RunWith(JUnit4.class) public class WallpaperDescriptionTest { + private static final String TAG = "WallpaperDescriptionTest"; + private final ComponentName mTestComponent = new ComponentName("fakePackage", "fakeClass"); @Test @@ -56,6 +68,63 @@ public class WallpaperDescriptionTest { } @Test + public void xml_roundTripSucceeds() throws IOException, XmlPullParserException { + final Uri thumbnail = Uri.parse("http://www.bogus.com/thumbnail"); + final List<CharSequence> description = List.of("line1", "line2"); + final Uri contextUri = Uri.parse("http://www.bogus.com/contextUri"); + final PersistableBundle content = new PersistableBundle(); + content.putString("ckey", "cvalue"); + WallpaperDescription source = new WallpaperDescription.Builder() + .setComponent(mTestComponent).setId("fakeId").setThumbnail(thumbnail) + .setTitle("Fake title").setDescription(description) + .setContextUri(contextUri).setContextDescription("Context description") + .setContent(content).build(); + + ByteArrayOutputStream ostream = new ByteArrayOutputStream(); + TypedXmlSerializer serializer = Xml.newBinarySerializer(); + serializer.setOutput(ostream, StandardCharsets.UTF_8.name()); + serializer.startDocument(null, true); + serializer.startTag(null, "test"); + source.saveToXml(serializer); + serializer.endTag(null, "test"); + serializer.endDocument(); + ostream.close(); + + WallpaperDescription destination = null; + ByteArrayInputStream istream = new ByteArrayInputStream(ostream.toByteArray()); + TypedXmlPullParser parser = Xml.newBinaryPullParser(); + parser.setInput(istream, StandardCharsets.UTF_8.name()); + int type; + do { + type = parser.next(); + if (type == XmlPullParser.START_TAG && "test".equals(parser.getName())) { + destination = WallpaperDescription.restoreFromXml(parser); + } + } while (type != XmlPullParser.END_DOCUMENT); + + assertThat(destination).isNotNull(); + assertThat(destination.getComponent()).isEqualTo(source.getComponent()); + assertThat(destination.getId()).isEqualTo(source.getId()); + assertThat(destination.getThumbnail()).isEqualTo(source.getThumbnail()); + assertWithMessage("title mismatch").that( + CharSequence.compare(destination.getTitle(), source.getTitle())).isEqualTo(0); + assertThat(destination.getDescription()).hasSize(source.getDescription().size()); + for (int i = 0; i < destination.getDescription().size(); i++) { + CharSequence strDest = destination.getDescription().get(i); + CharSequence strSrc = source.getDescription().get(i); + assertWithMessage("description string mismatch") + .that(CharSequence.compare(strDest, strSrc)).isEqualTo(0); + } + assertThat(destination.getContextUri()).isEqualTo(source.getContextUri()); + assertWithMessage("context description mismatch").that( + CharSequence.compare(destination.getContextDescription(), + source.getContextDescription())).isEqualTo(0); + assertThat(destination.getContent()).isNotNull(); + assertThat(destination.getContent().getString("ckey")).isEqualTo( + source.getContent().getString("ckey")); + } + + @Test public void parcel_roundTripSucceeds() { final Uri thumbnail = Uri.parse("http://www.bogus.com/thumbnail"); final List<CharSequence> description = List.of("line1", "line2"); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperData.java b/services/core/java/com/android/server/wallpaper/WallpaperData.java index 15f86e9c08ff..c8d5a0332a4f 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperData.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperData.java @@ -29,6 +29,7 @@ import android.app.IWallpaperManagerCallback; import android.app.WallpaperColors; import android.app.WallpaperManager.ScreenOrientation; import android.app.WallpaperManager.SetWallpaperFlags; +import android.app.wallpaper.WallpaperDescription; import android.content.ComponentName; import android.graphics.Rect; import android.os.RemoteCallbackList; @@ -77,6 +78,8 @@ class WallpaperData { /** * The component name of the currently set live wallpaper. + * + * @deprecated */ private ComponentName mWallpaperComponent; @@ -179,6 +182,9 @@ class WallpaperData { */ int mOrientationWhenSet = ORIENTATION_UNKNOWN; + /** Description of the current wallpaper */ + private WallpaperDescription mDescription; + WallpaperData(int userId, @SetWallpaperFlags int wallpaperType) { this.userId = userId; this.mWhich = wallpaperType; @@ -238,6 +244,14 @@ class WallpaperData { this.mWallpaperComponent = componentName; } + WallpaperDescription getDescription() { + return mDescription; + } + + void setDescription(WallpaperDescription description) { + this.mDescription = description; + } + @Override public String toString() { StringBuilder out = new StringBuilder(defaultString(this)); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java index 74ca23038666..cf76bf05ab19 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java @@ -16,6 +16,7 @@ package com.android.server.wallpaper; +import static android.app.Flags.liveWallpaperContentHandling; import static android.app.Flags.removeNextWallpaperComponent; import static android.app.WallpaperManager.FLAG_LOCK; import static android.app.WallpaperManager.FLAG_SYSTEM; @@ -30,11 +31,13 @@ import static com.android.server.wallpaper.WallpaperUtils.getWallpaperDir; import static com.android.server.wallpaper.WallpaperUtils.makeWallpaperIdLocked; import static com.android.window.flags.Flags.multiCrop; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.app.WallpaperManager.SetWallpaperFlags; import android.app.backup.WallpaperBackupHelper; +import android.app.wallpaper.WallpaperDescription; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; @@ -194,9 +197,16 @@ public class WallpaperDataParser { if (loadSystem) { if (!success) { + // Set safe values that won't cause crashes wallpaper.cropHint.set(0, 0, 0, 0); wpdData.mPadding.set(0, 0, 0, 0); wallpaper.name = ""; + if (liveWallpaperContentHandling()) { + wallpaper.setDescription(new WallpaperDescription.Builder().setComponent( + mImageWallpaper).build()); + } else { + wallpaper.setComponent(mImageWallpaper); + } } else { if (wallpaper.wallpaperId <= 0) { wallpaper.wallpaperId = makeWallpaperIdLocked(); @@ -245,25 +255,11 @@ public class WallpaperDataParser { parseWallpaperAttributes(parser, wallpaperToParse, keepDimensionHints); } - String comp = parser.getAttributeValue(null, "component"); + ComponentName comp = parseComponentName(parser); if (removeNextWallpaperComponent()) { - wallpaperToParse.setComponent(comp != null - ? ComponentName.unflattenFromString(comp) - : null); - if (wallpaperToParse.getComponent() == null - || "android".equals(wallpaperToParse.getComponent() - .getPackageName())) { - wallpaperToParse.setComponent(mImageWallpaper); - } + wallpaperToParse.setComponent(comp); } else { - wallpaperToParse.nextWallpaperComponent = comp != null - ? ComponentName.unflattenFromString(comp) - : null; - if (wallpaperToParse.nextWallpaperComponent == null - || "android".equals(wallpaperToParse.nextWallpaperComponent - .getPackageName())) { - wallpaperToParse.nextWallpaperComponent = mImageWallpaper; - } + wallpaperToParse.nextWallpaperComponent = comp; } if (multiCrop()) { @@ -290,6 +286,17 @@ public class WallpaperDataParser { return lockWallpaper; } + @NonNull + private ComponentName parseComponentName(TypedXmlPullParser parser) { + String comp = parser.getAttributeValue(null, "component"); + ComponentName c = (comp != null) ? ComponentName.unflattenFromString(comp) : null; + if (c == null || "android".equals(c.getPackageName())) { + c = mImageWallpaper; + } + + return c; + } + private void ensureSaneWallpaperData(WallpaperData wallpaper) { // Only overwrite cropHint if the rectangle is invalid. if (wallpaper.cropHint.width() < 0 @@ -332,9 +339,29 @@ public class WallpaperDataParser { } } + void parseWallpaperDescription(TypedXmlPullParser parser, WallpaperData wallpaper) + throws XmlPullParserException, IOException { + + int type = parser.next(); + if (type == XmlPullParser.START_TAG && "description".equals(parser.getName())) { + // Always read the description if it's there - there may be one from a previous save + // with content handling enabled even if it's enabled now + WallpaperDescription description = WallpaperDescription.restoreFromXml(parser); + if (liveWallpaperContentHandling()) { + // null component means that wallpaper was last saved without content handling, so + // populate description from saved component + if (description.getComponent() == null) { + description = description.toBuilder().setComponent( + parseComponentName(parser)).build(); + } + wallpaper.setDescription(description); + } + } + } + @VisibleForTesting void parseWallpaperAttributes(TypedXmlPullParser parser, WallpaperData wallpaper, - boolean keepDimensionHints) throws XmlPullParserException { + boolean keepDimensionHints) throws XmlPullParserException, IOException { final int id = parser.getAttributeInt(null, "id", -1); if (id != -1) { wallpaper.wallpaperId = id; @@ -355,8 +382,7 @@ public class WallpaperDataParser { getAttributeInt(parser, "totalCropTop", 0), getAttributeInt(parser, "totalCropRight", 0), getAttributeInt(parser, "totalCropBottom", 0)); - ComponentName componentName = removeNextWallpaperComponent() ? wallpaper.getComponent() - : wallpaper.nextWallpaperComponent; + ComponentName componentName = parseComponentName(parser); if (multiCrop() && mImageWallpaper.equals(componentName)) { wallpaper.mCropHints = new SparseArray<>(); for (Pair<Integer, String> pair: screenDimensionPairs()) { @@ -443,6 +469,15 @@ public class WallpaperDataParser { } wallpaper.name = parser.getAttributeValue(null, "name"); wallpaper.allowBackup = parser.getAttributeBoolean(null, "backup", false); + + parseWallpaperDescription(parser, wallpaper); + if (liveWallpaperContentHandling() && wallpaper.getDescription().getComponent() == null) { + // The last save was done before the content handling flag was enabled and has no + // WallpaperDescription, so create a default one with the correct component. + // CSP: log boot after flag change to false -> true + wallpaper.setDescription( + new WallpaperDescription.Builder().setComponent(componentName).build()); + } } private static int getAttributeInt(TypedXmlPullParser parser, String name, int defValue) { @@ -610,9 +645,27 @@ public class WallpaperDataParser { out.attributeBoolean(null, "backup", true); } + writeWallpaperDescription(out, wallpaper); + out.endTag(null, tag); } + void writeWallpaperDescription(TypedXmlSerializer out, WallpaperData wallpaper) + throws IOException { + if (liveWallpaperContentHandling()) { + WallpaperDescription description = wallpaper.getDescription(); + if (description != null) { + String descriptionTag = "description"; + out.startTag(null, descriptionTag); + try { + description.saveToXml(out); + } catch (XmlPullParserException e) { + Slog.e(TAG, "Error writing wallpaper description", e); + } + out.endTag(null, descriptionTag); + } + } + } // Restore the named resource bitmap to both source + crop files boolean restoreNamedResourceLocked(WallpaperData wallpaper) { if (wallpaper.name.length() > 4 && "res:".equals(wallpaper.name.substring(0, 4))) { diff --git a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java index c099517475c2..1ea36748eb5d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java @@ -40,7 +40,6 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import static org.junit.Assume.assumeThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -55,6 +54,7 @@ import android.app.AppOpsManager; import android.app.Flags; import android.app.WallpaperColors; import android.app.WallpaperManager; +import android.app.wallpaper.WallpaperDescription; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -65,6 +65,7 @@ import android.content.pm.ServiceInfo; import android.graphics.Color; import android.hardware.display.DisplayManager; import android.os.ParcelFileDescriptor; +import android.os.PersistableBundle; import android.os.RemoteException; import android.os.SystemClock; import android.platform.test.annotations.DisableFlags; @@ -426,7 +427,8 @@ public class WallpaperManagerServiceTests { @Test @EnableFlags(Flags.FLAG_REMOVE_NEXT_WALLPAPER_COMPONENT) - public void testSaveLoadSettings() { + public void testSaveLoadSettings_withoutWallpaperDescription() + throws IOException, XmlPullParserException { WallpaperData expectedData = mService.getCurrentWallpaperData(FLAG_SYSTEM, 0); expectedData.setComponent(sDefaultWallpaperComponent); expectedData.primaryColors = new WallpaperColors(Color.valueOf(Color.RED), @@ -436,27 +438,19 @@ public class WallpaperManagerServiceTests { expectedData.mUidToDimAmount.put(1, 0.4f); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); - try { - TypedXmlSerializer serializer = Xml.newBinarySerializer(); - serializer.setOutput(ostream, StandardCharsets.UTF_8.name()); - mService.mWallpaperDataParser.saveSettingsToSerializer(serializer, expectedData, null); - ostream.close(); - } catch (IOException e) { - fail("exception occurred while writing system wallpaper attributes"); - } + TypedXmlSerializer serializer = Xml.newBinarySerializer(); + serializer.setOutput(ostream, StandardCharsets.UTF_8.name()); + mService.mWallpaperDataParser.saveSettingsToSerializer(serializer, expectedData, null); + ostream.close(); WallpaperData actualData = new WallpaperData(0, FLAG_SYSTEM); - try { - ByteArrayInputStream istream = new ByteArrayInputStream(ostream.toByteArray()); - TypedXmlPullParser parser = Xml.newBinaryPullParser(); - parser.setInput(istream, StandardCharsets.UTF_8.name()); - mService.mWallpaperDataParser.loadSettingsFromSerializer(parser, - actualData, /* userId= */0, /* loadSystem= */ true, /* loadLock= */ - false, /* keepDimensionHints= */ true, - new WallpaperDisplayHelper.DisplayData(0)); - } catch (IOException | XmlPullParserException e) { - fail("exception occurred while parsing wallpaper"); - } + ByteArrayInputStream istream = new ByteArrayInputStream(ostream.toByteArray()); + TypedXmlPullParser parser = Xml.newBinaryPullParser(); + parser.setInput(istream, StandardCharsets.UTF_8.name()); + mService.mWallpaperDataParser.loadSettingsFromSerializer(parser, + actualData, /* userId= */0, /* loadSystem= */ true, /* loadLock= */ + false, /* keepDimensionHints= */ true, + new WallpaperDisplayHelper.DisplayData(0)); assertThat(actualData.getComponent()).isEqualTo(expectedData.getComponent()); assertThat(actualData.primaryColors).isEqualTo(expectedData.primaryColors); @@ -472,33 +466,58 @@ public class WallpaperManagerServiceTests { } @Test + @EnableFlags(Flags.FLAG_REMOVE_NEXT_WALLPAPER_COMPONENT) + public void testSaveLoadSettings_withWallpaperDescription() + throws IOException, XmlPullParserException { + WallpaperData expectedData = mService.getCurrentWallpaperData(FLAG_SYSTEM, 0); + expectedData.setComponent(sDefaultWallpaperComponent); + PersistableBundle content = new PersistableBundle(); + content.putString("ckey", "cvalue"); + WallpaperDescription description = new WallpaperDescription.Builder() + .setComponent(sDefaultWallpaperComponent).setId("testId").setTitle("fake one") + .setContent(content).build(); + expectedData.setDescription(description); + + ByteArrayOutputStream ostream = new ByteArrayOutputStream(); + TypedXmlSerializer serializer = Xml.newBinarySerializer(); + serializer.setOutput(ostream, StandardCharsets.UTF_8.name()); + mService.mWallpaperDataParser.saveSettingsToSerializer(serializer, expectedData, null); + ostream.close(); + + WallpaperData actualData = new WallpaperData(0, FLAG_SYSTEM); + ByteArrayInputStream istream = new ByteArrayInputStream(ostream.toByteArray()); + TypedXmlPullParser parser = Xml.newBinaryPullParser(); + parser.setInput(istream, StandardCharsets.UTF_8.name()); + mService.mWallpaperDataParser.loadSettingsFromSerializer(parser, + actualData, /* userId= */0, /* loadSystem= */ true, /* loadLock= */ + false, /* keepDimensionHints= */ true, + new WallpaperDisplayHelper.DisplayData(0)); + + assertThat(actualData.getComponent()).isEqualTo(expectedData.getComponent()); + assertThat(actualData.getDescription()).isEqualTo(expectedData.getDescription()); + } + + @Test @DisableFlags(Flags.FLAG_REMOVE_NEXT_WALLPAPER_COMPONENT) - public void testSaveLoadSettings_legacyNextComponent() { + public void testSaveLoadSettings_legacyNextComponent() + throws IOException, XmlPullParserException { WallpaperData systemWallpaperData = mService.getCurrentWallpaperData(FLAG_SYSTEM, 0); systemWallpaperData.setComponent(sDefaultWallpaperComponent); ByteArrayOutputStream ostream = new ByteArrayOutputStream(); - try { - TypedXmlSerializer serializer = Xml.newBinarySerializer(); - serializer.setOutput(ostream, StandardCharsets.UTF_8.name()); - mService.mWallpaperDataParser.saveSettingsToSerializer(serializer, systemWallpaperData, - null); - ostream.close(); - } catch (IOException e) { - fail("exception occurred while writing system wallpaper attributes"); - } + TypedXmlSerializer serializer = Xml.newBinarySerializer(); + serializer.setOutput(ostream, StandardCharsets.UTF_8.name()); + mService.mWallpaperDataParser.saveSettingsToSerializer(serializer, systemWallpaperData, + null); + ostream.close(); WallpaperData shouldMatchSystem = new WallpaperData(0, FLAG_SYSTEM); - try { - ByteArrayInputStream istream = new ByteArrayInputStream(ostream.toByteArray()); - TypedXmlPullParser parser = Xml.newBinaryPullParser(); - parser.setInput(istream, StandardCharsets.UTF_8.name()); - mService.mWallpaperDataParser.loadSettingsFromSerializer(parser, - shouldMatchSystem, /* userId= */0, /* loadSystem= */ true, /* loadLock= */ - false, /* keepDimensionHints= */ true, - new WallpaperDisplayHelper.DisplayData(0)); - } catch (IOException | XmlPullParserException e) { - fail("exception occurred while parsing wallpaper"); - } + ByteArrayInputStream istream = new ByteArrayInputStream(ostream.toByteArray()); + TypedXmlPullParser parser = Xml.newBinaryPullParser(); + parser.setInput(istream, StandardCharsets.UTF_8.name()); + mService.mWallpaperDataParser.loadSettingsFromSerializer(parser, + shouldMatchSystem, /* userId= */0, /* loadSystem= */ true, /* loadLock= */ + false, /* keepDimensionHints= */ true, + new WallpaperDisplayHelper.DisplayData(0)); assertThat(shouldMatchSystem.nextWallpaperComponent).isEqualTo( systemWallpaperData.getComponent()); |