Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e424669 authored by Chris Poultney's avatar Chris Poultney
Browse files

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
parent 82f6ca9c
Loading
Loading
Loading
Loading
+108 −0
Original line number Diff line number Diff line
@@ -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) {
+69 −0
Original line number Diff line number Diff line
@@ -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
@@ -55,6 +67,63 @@ public class WallpaperDescriptionTest {
        assertThat(desc1.hashCode()).isEqualTo(desc2.hashCode());
    }

    @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");
+14 −0
Original line number Diff line number Diff line
@@ -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));
+73 −20
Original line number Diff line number Diff line
@@ -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))) {
+61 −42
Original line number Diff line number Diff line
@@ -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,17 +438,12 @@ 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");
        }

        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());
@@ -454,9 +451,6 @@ public class WallpaperManagerServiceTests {
                actualData, /* userId= */0, /* loadSystem= */ true, /* loadLock= */
                false, /* keepDimensionHints= */ true,
                new WallpaperDisplayHelper.DisplayData(0));
        } catch (IOException | XmlPullParserException e) {
            fail("exception occurred while parsing wallpaper");
        }

        assertThat(actualData.getComponent()).isEqualTo(expectedData.getComponent());
        assertThat(actualData.primaryColors).isEqualTo(expectedData.primaryColors);
@@ -471,24 +465,52 @@ 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");
        }

        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());
@@ -496,9 +518,6 @@ public class WallpaperManagerServiceTests {
                shouldMatchSystem, /* userId= */0, /* loadSystem= */ true, /* loadLock= */
                false, /* keepDimensionHints= */ true,
                new WallpaperDisplayHelper.DisplayData(0));
        } catch (IOException | XmlPullParserException e) {
            fail("exception occurred while parsing wallpaper");
        }

        assertThat(shouldMatchSystem.nextWallpaperComponent).isEqualTo(
                systemWallpaperData.getComponent());