diff options
2 files changed, 169 insertions, 77 deletions
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java index e3e83b3e1fd7..74ca23038666 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java @@ -171,63 +171,9 @@ public class WallpaperDataParser { stream = new FileInputStream(file); TypedXmlPullParser parser = Xml.resolvePullParser(stream); - int type; - do { - type = parser.next(); - if (type == XmlPullParser.START_TAG) { - String tag = parser.getName(); - if (("wp".equals(tag) && loadSystem) || ("kwp".equals(tag) && loadLock)) { - if ("kwp".equals(tag)) { - lockWallpaper = new WallpaperData(userId, FLAG_LOCK); - } - WallpaperData wallpaperToParse = - "wp".equals(tag) ? wallpaper : lockWallpaper; - - if (!multiCrop()) { - parseWallpaperAttributes(parser, wallpaperToParse, keepDimensionHints); - } - - String comp = parser.getAttributeValue(null, "component"); - if (removeNextWallpaperComponent()) { - wallpaperToParse.setComponent(comp != null - ? ComponentName.unflattenFromString(comp) - : null); - if (wallpaperToParse.getComponent() == null - || "android".equals(wallpaperToParse.getComponent() - .getPackageName())) { - wallpaperToParse.setComponent(mImageWallpaper); - } - } else { - wallpaperToParse.nextWallpaperComponent = comp != null - ? ComponentName.unflattenFromString(comp) - : null; - if (wallpaperToParse.nextWallpaperComponent == null - || "android".equals(wallpaperToParse.nextWallpaperComponent - .getPackageName())) { - wallpaperToParse.nextWallpaperComponent = mImageWallpaper; - } - } + lockWallpaper = loadSettingsFromSerializer(parser, wallpaper, userId, loadSystem, + loadLock, keepDimensionHints, wpdData); - if (multiCrop()) { - parseWallpaperAttributes(parser, wallpaperToParse, keepDimensionHints); - } - - if (DEBUG) { - Slog.v(TAG, "mWidth:" + wpdData.mWidth); - Slog.v(TAG, "mHeight:" + wpdData.mHeight); - Slog.v(TAG, "cropRect:" + wallpaper.cropHint); - Slog.v(TAG, "primaryColors:" + wallpaper.primaryColors); - Slog.v(TAG, "mName:" + wallpaper.name); - if (removeNextWallpaperComponent()) { - Slog.v(TAG, "mWallpaperComponent:" + wallpaper.getComponent()); - } else { - Slog.v(TAG, "mNextWallpaperComponent:" - + wallpaper.nextWallpaperComponent); - } - } - } - } - } while (type != XmlPullParser.END_DOCUMENT); success = true; } catch (FileNotFoundException e) { Slog.w(TAG, "no current wallpaper -- first boot?"); @@ -275,6 +221,75 @@ public class WallpaperDataParser { return new WallpaperLoadingResult(wallpaper, lockWallpaper, success); } + // This method updates `wallpaper` in place, but returns `lockWallpaper`. This is because + // `wallpaper` already exists if it's being read per `loadSystem`, but `lockWallpaper` is + // created conditionally if there is lock screen wallpaper data to read. + @VisibleForTesting + WallpaperData loadSettingsFromSerializer(TypedXmlPullParser parser, WallpaperData wallpaper, + int userId, boolean loadSystem, boolean loadLock, boolean keepDimensionHints, + DisplayData wpdData) throws IOException, XmlPullParserException { + WallpaperData lockWallpaper = null; + int type; + do { + type = parser.next(); + if (type == XmlPullParser.START_TAG) { + String tag = parser.getName(); + if (("wp".equals(tag) && loadSystem) || ("kwp".equals(tag) && loadLock)) { + if ("kwp".equals(tag)) { + lockWallpaper = new WallpaperData(userId, FLAG_LOCK); + } + WallpaperData wallpaperToParse = + "wp".equals(tag) ? wallpaper : lockWallpaper; + + if (!multiCrop()) { + parseWallpaperAttributes(parser, wallpaperToParse, keepDimensionHints); + } + + String comp = parser.getAttributeValue(null, "component"); + if (removeNextWallpaperComponent()) { + wallpaperToParse.setComponent(comp != null + ? ComponentName.unflattenFromString(comp) + : null); + if (wallpaperToParse.getComponent() == null + || "android".equals(wallpaperToParse.getComponent() + .getPackageName())) { + wallpaperToParse.setComponent(mImageWallpaper); + } + } else { + wallpaperToParse.nextWallpaperComponent = comp != null + ? ComponentName.unflattenFromString(comp) + : null; + if (wallpaperToParse.nextWallpaperComponent == null + || "android".equals(wallpaperToParse.nextWallpaperComponent + .getPackageName())) { + wallpaperToParse.nextWallpaperComponent = mImageWallpaper; + } + } + + if (multiCrop()) { + parseWallpaperAttributes(parser, wallpaperToParse, keepDimensionHints); + } + + if (DEBUG) { + Slog.v(TAG, "mWidth:" + wpdData.mWidth); + Slog.v(TAG, "mHeight:" + wpdData.mHeight); + Slog.v(TAG, "cropRect:" + wallpaper.cropHint); + Slog.v(TAG, "primaryColors:" + wallpaper.primaryColors); + Slog.v(TAG, "mName:" + wallpaper.name); + if (removeNextWallpaperComponent()) { + Slog.v(TAG, "mWallpaperComponent:" + wallpaper.getComponent()); + } else { + Slog.v(TAG, "mNextWallpaperComponent:" + + wallpaper.nextWallpaperComponent); + } + } + } + } + } while (type != XmlPullParser.END_DOCUMENT); + + return lockWallpaper; + } + private void ensureSaneWallpaperData(WallpaperData wallpaper) { // Only overwrite cropHint if the rectangle is invalid. if (wallpaper.cropHint.width() < 0 @@ -449,18 +464,7 @@ public class WallpaperDataParser { try { fstream = new FileOutputStream(journal.chooseForWrite(), false); TypedXmlSerializer out = Xml.resolveSerializer(fstream); - out.startDocument(null, true); - - if (wallpaper != null) { - writeWallpaperAttributes(out, "wp", wallpaper); - } - - if (lockWallpaper != null) { - writeWallpaperAttributes(out, "kwp", lockWallpaper); - } - - out.endDocument(); - + saveSettingsToSerializer(out, wallpaper, lockWallpaper); fstream.flush(); FileUtils.sync(fstream); fstream.close(); @@ -472,6 +476,22 @@ public class WallpaperDataParser { } @VisibleForTesting + void saveSettingsToSerializer(TypedXmlSerializer out, WallpaperData wallpaper, + WallpaperData lockWallpaper) throws IOException { + out.startDocument(null, true); + + if (wallpaper != null) { + writeWallpaperAttributes(out, "wp", wallpaper); + } + + if (lockWallpaper != null) { + writeWallpaperAttributes(out, "kwp", lockWallpaper); + } + + out.endDocument(); + } + + @VisibleForTesting void writeWallpaperAttributes(TypedXmlSerializer out, String tag, WallpaperData wallpaper) throws IllegalArgumentException, IllegalStateException, IOException { if (DEBUG) { 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 0b762df86df9..9983fb4748a5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java @@ -32,6 +32,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER; +import static com.google.common.truth.Truth.assertThat; + import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; @@ -50,6 +52,7 @@ import static org.mockito.Mockito.verify; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.Flags; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.ComponentName; @@ -64,7 +67,10 @@ import android.hardware.display.DisplayManager; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.SystemClock; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; import android.service.wallpaper.IWallpaperConnection; import android.service.wallpaper.IWallpaperEngine; import android.service.wallpaper.WallpaperService; @@ -91,8 +97,10 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.RuleChain; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -100,6 +108,7 @@ import org.mockito.MockitoAnnotations; import org.mockito.quality.Strictness; import org.xmlpull.v1.XmlPullParserException; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -125,6 +134,7 @@ public class WallpaperManagerServiceTests { @ClassRule public static final TestableContext sContext = new TestableContext( InstrumentationRegistry.getInstrumentation().getTargetContext(), null); + private static ComponentName sImageWallpaperComponentName; private static ComponentName sDefaultWallpaperComponent; @@ -133,8 +143,11 @@ public class WallpaperManagerServiceTests { @Mock private DisplayManager mDisplayManager; + private final TemporaryFolder mFolder = new TemporaryFolder(); + private final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Rule - public final TemporaryFolder mFolder = new TemporaryFolder(); + public RuleChain rules = RuleChain.outerRule(mSetFlagsRule).around(mFolder); + private final SparseArray<File> mTempDirs = new SparseArray<>(); private WallpaperManagerService mService; private static IWallpaperConnection.Stub sWallpaperService; @@ -325,6 +338,7 @@ public class WallpaperManagerServiceTests { * is issued to the wallpaper. */ @Test + @Ignore("b/368345733") public void testSetCurrentComponent() throws Exception { final int testUserId = USER_SYSTEM; mService.switchUser(testUserId, null); @@ -411,26 +425,84 @@ public class WallpaperManagerServiceTests { } @Test - public void testXmlSerializationRoundtrip() { + @EnableFlags(Flags.FLAG_REMOVE_NEXT_WALLPAPER_COMPONENT) + public void testSaveLoadSettings() { + WallpaperData expectedData = mService.getCurrentWallpaperData(FLAG_SYSTEM, 0); + expectedData.setComponent(sDefaultWallpaperComponent); + expectedData.primaryColors = new WallpaperColors(Color.valueOf(Color.RED), + Color.valueOf(Color.BLUE), null); + expectedData.mWallpaperDimAmount = 0.5f; + expectedData.mUidToDimAmount.put(0, 0.5f); + 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()); + 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"); + } + + assertThat(actualData.getComponent()).isEqualTo(expectedData.getComponent()); + assertThat(actualData.primaryColors).isEqualTo(expectedData.primaryColors); + assertThat(actualData.mWallpaperDimAmount).isEqualTo(expectedData.mWallpaperDimAmount); + assertThat(actualData.mUidToDimAmount).isNotNull(); + assertThat(actualData.mUidToDimAmount.size()).isEqualTo( + expectedData.mUidToDimAmount.size()); + for (int i = 0; i < actualData.mUidToDimAmount.size(); i++) { + int key = actualData.mUidToDimAmount.keyAt(0); + assertThat(actualData.mUidToDimAmount.get(key)).isEqualTo( + expectedData.mUidToDimAmount.get(key)); + } + } + + @Test + @DisableFlags(Flags.FLAG_REMOVE_NEXT_WALLPAPER_COMPONENT) + public void testSaveLoadSettings_legacyNextComponent() { WallpaperData systemWallpaperData = mService.getCurrentWallpaperData(FLAG_SYSTEM, 0); + systemWallpaperData.setComponent(sDefaultWallpaperComponent); + ByteArrayOutputStream ostream = new ByteArrayOutputStream(); try { TypedXmlSerializer serializer = Xml.newBinarySerializer(); - serializer.setOutput(new ByteArrayOutputStream(), StandardCharsets.UTF_8.name()); - serializer.startDocument(StandardCharsets.UTF_8.name(), true); - mService.mWallpaperDataParser.writeWallpaperAttributes( - serializer, "wp", systemWallpaperData); + 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(); - mService.mWallpaperDataParser.parseWallpaperAttributes(parser, shouldMatchSystem, true); - } catch (XmlPullParserException e) { + 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"); } - assertEquals(systemWallpaperData.primaryColors, shouldMatchSystem.primaryColors); + + assertThat(shouldMatchSystem.nextWallpaperComponent).isEqualTo( + systemWallpaperData.getComponent()); + assertThat(shouldMatchSystem.primaryColors).isEqualTo(systemWallpaperData.primaryColors); } @Test |