diff --git a/services/core/java/com/android/server/wallpaper/WallpaperData.java b/services/core/java/com/android/server/wallpaper/WallpaperData.java index 79de282d226c4..25ce28047fe17 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperData.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperData.java @@ -18,10 +18,10 @@ package com.android.server.wallpaper; import static android.app.WallpaperManager.FLAG_LOCK; -import static com.android.server.wallpaper.WallpaperManagerService.WALLPAPER; -import static com.android.server.wallpaper.WallpaperManagerService.WALLPAPER_CROP; -import static com.android.server.wallpaper.WallpaperManagerService.WALLPAPER_LOCK_CROP; -import static com.android.server.wallpaper.WallpaperManagerService.WALLPAPER_LOCK_ORIG; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER_CROP; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER_LOCK_CROP; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER_LOCK_ORIG; import static com.android.server.wallpaper.WallpaperUtils.getWallpaperDir; import android.app.IWallpaperManagerCallback; diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 962eb86dd60cf..8c58e150e3347 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -32,7 +32,14 @@ import static android.os.ParcelFileDescriptor.MODE_TRUNCATE; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static com.android.server.wallpaper.WallpaperUtils.RECORD_FILE; +import static com.android.server.wallpaper.WallpaperUtils.RECORD_LOCK_FILE; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER_CROP; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER_INFO; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER_LOCK_ORIG; import static com.android.server.wallpaper.WallpaperUtils.getWallpaperDir; +import static com.android.server.wallpaper.WallpaperUtils.makeWallpaperIdLocked; import android.annotation.NonNull; import android.app.ActivityManager; @@ -199,20 +206,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub */ private static final long MIN_WALLPAPER_CRASH_TIME = 10000; private static final int MAX_WALLPAPER_COMPONENT_LOG_LENGTH = 128; - static final String WALLPAPER = "wallpaper_orig"; - static final String WALLPAPER_CROP = "wallpaper"; - static final String WALLPAPER_LOCK_ORIG = "wallpaper_lock_orig"; - static final String WALLPAPER_LOCK_CROP = "wallpaper_lock"; - static final String WALLPAPER_INFO = "wallpaper_info.xml"; - private static final String RECORD_FILE = "decode_record"; - private static final String RECORD_LOCK_FILE = "decode_lock_record"; - - // All the various per-user state files we need to be aware of - private static final String[] sPerUserFiles = new String[] { - WALLPAPER, WALLPAPER_CROP, - WALLPAPER_LOCK_ORIG, WALLPAPER_LOCK_CROP, - WALLPAPER_INFO - }; /** * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks @@ -891,12 +884,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub private boolean mWaitingForUnlock; private boolean mShuttingDown; - /** - * ID of the current wallpaper, changed every time anything sets a wallpaper. - * This is used for external detection of wallpaper update activity. - */ - private int mWallpaperId; - /** * Name of the component used to display bitmap wallpapers from either the gallery or * built-in wallpapers. @@ -979,13 +966,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } - int makeWallpaperIdLocked() { - do { - ++mWallpaperId; - } while (mWallpaperId == 0); - return mWallpaperId; - } - private boolean supportsMultiDisplay(WallpaperConnection connection) { if (connection != null) { return connection.mInfo == null // This is image wallpaper @@ -1855,11 +1835,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG); t.traceBegin("Wallpaper_selinux_restorecon-" + userId); try { - final File wallpaperDir = getWallpaperDir(userId); - for (String filename : sPerUserFiles) { - File f = new File(wallpaperDir, filename); - if (f.exists()) { - SELinux.restorecon(f); + for (File file: WallpaperUtils.getWallpaperFiles(userId)) { + if (file.exists()) { + SELinux.restorecon(file); } } } finally { @@ -1875,12 +1853,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub void onRemoveUser(int userId) { if (userId < 1) return; - final File wallpaperDir = getWallpaperDir(userId); synchronized (mLock) { stopObserversLocked(userId); - for (String filename : sPerUserFiles) { - new File(wallpaperDir, filename).delete(); - } + WallpaperUtils.getWallpaperFiles(userId).forEach(File::delete); mUserRestorecon.delete(userId); } } @@ -3671,8 +3646,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub final int id = parser.getAttributeInt(null, "id", -1); if (id != -1) { wallpaper.wallpaperId = id; - if (id > mWallpaperId) { - mWallpaperId = id; + if (id > WallpaperUtils.getCurrentWallpaperId()) { + WallpaperUtils.setCurrentWallpaperId(id); } } else { wallpaper.wallpaperId = makeWallpaperIdLocked(); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperUtils.java b/services/core/java/com/android/server/wallpaper/WallpaperUtils.java index a9b809212124e..d0311e398137c 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperUtils.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperUtils.java @@ -19,10 +19,68 @@ package com.android.server.wallpaper; import android.os.Environment; import java.io.File; +import java.util.ArrayList; +import java.util.List; class WallpaperUtils { + static final String WALLPAPER = "wallpaper_orig"; + static final String WALLPAPER_CROP = "wallpaper"; + static final String WALLPAPER_LOCK_ORIG = "wallpaper_lock_orig"; + static final String WALLPAPER_LOCK_CROP = "wallpaper_lock"; + static final String WALLPAPER_INFO = "wallpaper_info.xml"; + static final String RECORD_FILE = "decode_record"; + static final String RECORD_LOCK_FILE = "decode_lock_record"; + + // All the various per-user state files we need to be aware of + private static final String[] sPerUserFiles = new String[] { + WALLPAPER, WALLPAPER_CROP, + WALLPAPER_LOCK_ORIG, WALLPAPER_LOCK_CROP, + WALLPAPER_INFO + }; + + /** + * ID of the current wallpaper, incremented every time anything sets a wallpaper. + * This is used for external detection of wallpaper update activity. + */ + private static int sWallpaperId; + static File getWallpaperDir(int userId) { return Environment.getUserSystemDirectory(userId); } + + /** + * generate a new wallpaper id + * should be called with the {@link WallpaperManagerService} lock held + */ + static int makeWallpaperIdLocked() { + do { + ++sWallpaperId; + } while (sWallpaperId == 0); + return sWallpaperId; + } + + /** + * returns the id of the current wallpaper (the last one that has been set) + */ + static int getCurrentWallpaperId() { + return sWallpaperId; + } + + /** + * sets the id of the current wallpaper + * used when a wallpaper with higher id than current is loaded from settings + */ + static void setCurrentWallpaperId(int id) { + sWallpaperId = id; + } + + static List getWallpaperFiles(int userId) { + File wallpaperDir = getWallpaperDir(userId); + List result = new ArrayList(); + for (int i = 0; i < sPerUserFiles.length; i++) { + result.add(new File(wallpaperDir, sPerUserFiles[i])); + } + return result; + } } 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 bcba4a1878d8b..52ed3bc1dde9d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java @@ -28,7 +28,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; -import static com.android.server.wallpaper.WallpaperManagerService.WALLPAPER; +import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER; import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals;