diff options
3 files changed, 57 insertions, 5 deletions
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 1b1568ac5a12..c5d343d168ca 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -178,6 +178,13 @@ public class WallpaperManager { public static final String COMMAND_DROP = "android.home.drop"; /** + * Command for {@link #sendWallpaperCommand}: reported when the wallpaper that was already + * set is re-applied by the user. + * @hide + */ + public static final String COMMAND_REAPPLY = "android.wallpaper.reapply"; + + /** * Extra passed back from setWallpaper() giving the new wallpaper's assigned ID. * @hide */ diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index a298b8915110..722d9f7e7c38 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -16,6 +16,7 @@ package com.android.server.wallpaper; +import static android.app.WallpaperManager.COMMAND_REAPPLY; import static android.app.WallpaperManager.FLAG_LOCK; import static android.app.WallpaperManager.FLAG_SYSTEM; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AUTO; @@ -1070,7 +1071,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub /** * Collect needed info for a display. */ - private final class DisplayConnector { + @VisibleForTesting + final class DisplayConnector { final int mDisplayId; final Binder mToken = new Binder(); IWallpaperEngine mEngine; @@ -1213,7 +1215,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } - private boolean isUsableDisplay(Display display) { + @VisibleForTesting + boolean isUsableDisplay(Display display) { if (display == null || !display.hasAccess(mClientUid)) { return false; } @@ -2583,6 +2586,19 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (bindWallpaperComponentLocked(name, false, true, wallpaper, null)) { if (!same) { wallpaper.primaryColors = null; + } else { + if (wallpaper.connection != null) { + wallpaper.connection.forEachDisplayConnector(displayConnector -> { + try { + if (displayConnector.mEngine != null) { + displayConnector.mEngine.dispatchWallpaperCommand( + COMMAND_REAPPLY, 0, 0, 0, null); + } + } catch (RemoteException e) { + Slog.w(TAG, "Error sending apply message to wallpaper", e); + } + }); + } } wallpaper.wallpaperId = makeWallpaperIdLocked(); notifyCallbacksLocked(wallpaper); 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 307092d24d84..5a42c4bc7f3a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java @@ -16,7 +16,9 @@ package com.android.server.wallpaper; +import static android.app.WallpaperManager.COMMAND_REAPPLY; import static android.app.WallpaperManager.FLAG_SYSTEM; +import static android.view.Display.DEFAULT_DISPLAY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -34,6 +36,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; import android.app.AppGlobals; import android.app.AppOpsManager; @@ -49,6 +52,7 @@ import android.hardware.display.DisplayManager; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.service.wallpaper.IWallpaperConnection; +import android.service.wallpaper.IWallpaperEngine; import android.service.wallpaper.WallpaperService; import android.testing.TestableContext; import android.util.Log; @@ -110,6 +114,7 @@ public class WallpaperManagerServiceTests { public final TemporaryFolder mFolder = new TemporaryFolder(); private final SparseArray<File> mTempDirs = new SparseArray<>(); private WallpaperManagerService mService; + private static IWallpaperConnection.Stub sWallpaperService; @BeforeClass public static void setUpClass() { @@ -134,7 +139,7 @@ public class WallpaperManagerServiceTests { doNothing().when(sContext).sendBroadcastAsUser(any(), any()); //Wallpaper components - final IWallpaperConnection.Stub wallpaperService = mock(IWallpaperConnection.Stub.class); + sWallpaperService = mock(IWallpaperConnection.Stub.class); sImageWallpaperComponentName = ComponentName.unflattenFromString( sContext.getResources().getString(R.string.image_wallpaper_component)); // Mock default wallpaper as image wallpaper if there is no pre-defined default wallpaper. @@ -145,10 +150,10 @@ public class WallpaperManagerServiceTests { doReturn(sImageWallpaperComponentName).when(() -> WallpaperManager.getDefaultWallpaperComponent(any())); } else { - sContext.addMockService(sDefaultWallpaperComponent, wallpaperService); + sContext.addMockService(sDefaultWallpaperComponent, sWallpaperService); } - sContext.addMockService(sImageWallpaperComponentName, wallpaperService); + sContext.addMockService(sImageWallpaperComponentName, sWallpaperService); } @AfterClass @@ -264,6 +269,30 @@ public class WallpaperManagerServiceTests { } /** + * Tests that when setWallpaperComponent is called with the currently set component, a command + * is issued to the wallpaper. + */ + @Test + public void testSetCurrentComponent() throws Exception { + final int testUserId = UserHandle.USER_SYSTEM; + mService.switchUser(testUserId, null); + verifyLastWallpaperData(testUserId, sDefaultWallpaperComponent); + verifyCurrentSystemData(testUserId); + + spyOn(mService.mLastWallpaper.connection); + doReturn(true).when(mService.mLastWallpaper.connection).isUsableDisplay(any()); + mService.mLastWallpaper.connection.attachEngine(mock(IWallpaperEngine.class), + DEFAULT_DISPLAY); + + WallpaperManagerService.WallpaperConnection.DisplayConnector connector = + mService.mLastWallpaper.connection.getDisplayConnectorOrCreate(DEFAULT_DISPLAY); + mService.setWallpaperComponent(sDefaultWallpaperComponent); + + verify(connector.mEngine).dispatchWallpaperCommand( + eq(COMMAND_REAPPLY), anyInt(), anyInt(), anyInt(), any()); + } + + /** * Tests internal data should be correct and no crash after switch user continuously. */ @Test |