summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/WallpaperManager.java7
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperManagerService.java20
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java35
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