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
diff --git a/core/java/android/app/wallpaper/WallpaperDescription.java b/core/java/android/app/wallpaper/WallpaperDescription.java
index e5b2cd3..dedcb48 100644
--- a/core/java/android/app/wallpaper/WallpaperDescription.java
+++ b/core/java/android/app/wallpaper/WallpaperDescription.java
@@ -25,10 +25,21 @@
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 @@
*/
@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 @@
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 7c79ba7..01c2abf 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.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 @@
}
@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 15f86e9..c8d5a03 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.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 @@
/**
* The component name of the currently set live wallpaper.
+ *
+ * @deprecated
*/
private ComponentName mWallpaperComponent;
@@ -179,6 +182,9 @@
*/
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 @@
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 74ca230..cf76bf0 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.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 @@
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 @@
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 @@
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 @@
}
}
+ 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 @@
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 @@
}
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 @@
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 c099517..1ea3674 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.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.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.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 @@
@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 @@
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 @@
}
@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());