Add CTS test for wallpaper dimming API

Test: manual and atest WallpaperManagerTest
Bug: 213426781
Change-Id: I62f7d085a8adb1eec0517e6bb48d047b1329da66
diff --git a/tests/app/src/android/app/cts/WallpaperManagerTest.java b/tests/app/src/android/app/cts/WallpaperManagerTest.java
index 7fbd297..f2f4985 100644
--- a/tests/app/src/android/app/cts/WallpaperManagerTest.java
+++ b/tests/app/src/android/app/cts/WallpaperManagerTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.Manifest;
 import android.app.WallpaperColors;
 import android.app.WallpaperManager;
 import android.app.stubs.R;
@@ -68,6 +69,9 @@
 
     private static final boolean DEBUG = false;
     private static final String TAG = "WallpaperManagerTest";
+    private static final long MAX_WAIT_TIME_SECS = 2;
+    private static final long MAX_WAIT_TIME_MS = MAX_WAIT_TIME_SECS * 1000;
+    private static final long WAIT_TIME_INCR_MS = 100;
 
     private WallpaperManager mWallpaperManager;
     private Context mContext;
@@ -75,6 +79,7 @@
     private BroadcastReceiver mBroadcastReceiver;
     private CountDownLatch mCountDownLatch;
     private boolean mEnableWcg;
+    private boolean mAcquiredWallpaperDimmingPermission = false;
 
     @Before
     public void setUp() throws Exception {
@@ -106,6 +111,23 @@
         if (mBroadcastReceiver != null) {
             mContext.unregisterReceiver(mBroadcastReceiver);
         }
+        try {
+            ensureSetWallpaperDimAmountPermissionIsGranted();
+            mWallpaperManager.setWallpaperDimAmount(0f);
+            assertDimAmountEqualsTo(0f);
+        } finally {
+            InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                    .dropShellPermissionIdentity();
+            mAcquiredWallpaperDimmingPermission = false;
+        }
+    }
+
+    private void ensureSetWallpaperDimAmountPermissionIsGranted() {
+        if (!mAcquiredWallpaperDimmingPermission) {
+            InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity(Manifest.permission.SET_WALLPAPER_DIM_AMOUNT);
+            mAcquiredWallpaperDimmingPermission = true;
+        }
     }
 
     @Test
@@ -403,6 +425,95 @@
         }
     }
 
+    @Test
+    public void testGetWallpaperDimAmountWithNoPermission_shouldThrowException() {
+        Assert.assertThrows(SecurityException.class,
+                () -> mWallpaperManager.getWallpaperDimAmount());
+    }
+
+    @Test
+    public void testSetWallpaperDimAmountWithNoPermission_shouldThrowException() {
+        Assert.assertThrows(SecurityException.class,
+                () -> {
+                    float dimAmount = 0.5f;
+                    mWallpaperManager.setWallpaperDimAmount(dimAmount);
+                    assertDimAmountEqualsTo(dimAmount);
+                });
+    }
+
+    @Test
+    public void setWallpaperDimAmount_withinBound_shouldSetDimAmount() {
+        ensureSetWallpaperDimAmountPermissionIsGranted();
+
+        float dimAmount = 0.6f;
+        mWallpaperManager.setWallpaperDimAmount(dimAmount);
+        assertDimAmountEqualsTo(dimAmount);
+
+        // Remove additional dimming and verify that the dim amount is set to 0 again
+        mWallpaperManager.setWallpaperDimAmount(0f);
+        assertDimAmountEqualsTo(0f);
+    }
+
+    @Test
+    public void setWallpaperDimAmountBeyondRange_shouldBeBounded() {
+        ensureSetWallpaperDimAmountPermissionIsGranted();
+
+        // Setting dim amount < 0 should be bounded to lower limit 0.0
+        mWallpaperManager.setWallpaperDimAmount(-1f);
+        assertDimAmountEqualsTo(0f);
+
+        // Setting dim amount > 1 should be bounded to upper limit 1.0
+        mWallpaperManager.setWallpaperDimAmount(1.5f);
+        assertDimAmountEqualsTo(1f);
+    }
+
+    @Test
+    public void setWallpaperDimAmount_changingWallpaperShouldRemainDimmed() throws IOException {
+        ensureSetWallpaperDimAmountPermissionIsGranted();
+
+        float dimAmount = 0.65f;
+        mWallpaperManager.setWallpaperDimAmount(dimAmount);
+        mWallpaperManager.setResource(R.drawable.robot);
+
+        assertDimAmountEqualsTo(dimAmount);
+    }
+
+    @Test
+    public void colorHintsOnDimTest() throws IOException {
+        ensureSetWallpaperDimAmountPermissionIsGranted();
+
+        Bitmap tmpWallpaper = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(tmpWallpaper);
+        canvas.drawColor(Color.WHITE);
+
+        mWallpaperManager.setBitmap(tmpWallpaper);
+
+        WallpaperColors colors = mWallpaperManager
+                .getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+        int colorHints = colors.getColorHints();
+        // Color hints support dark text on white wallpaper
+        Assert.assertEquals(WallpaperColors.HINT_SUPPORTS_DARK_TEXT,
+                colorHints & WallpaperColors.HINT_SUPPORTS_DARK_TEXT);
+
+        float lowDimAmount = 0.1f;
+        mWallpaperManager.setWallpaperDimAmount(lowDimAmount);
+        assertDimAmountEqualsTo(lowDimAmount);
+        colors = mWallpaperManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+        colorHints = colors.getColorHints();
+        // Color hints still support dark text on white wallpaper that is not dimmed enough
+        Assert.assertEquals(WallpaperColors.HINT_SUPPORTS_DARK_TEXT,
+                colorHints & WallpaperColors.HINT_SUPPORTS_DARK_TEXT);
+
+        float higherDimAmount = 0.7f;
+        mWallpaperManager.setWallpaperDimAmount(higherDimAmount);
+        assertDimAmountEqualsTo(higherDimAmount);
+        colors = mWallpaperManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+        colorHints = colors.getColorHints();
+        // Dimmed white wallpaper does not support dark text
+        Assert.assertNotEquals(WallpaperColors.HINT_SUPPORTS_DARK_TEXT,
+                colorHints & WallpaperColors.HINT_SUPPORTS_DARK_TEXT);
+    }
+
     private void assertBitmapDimensions(Bitmap bitmap) {
         int maxSize = getMaxTextureSize();
         boolean safe = false;
@@ -571,6 +682,20 @@
         return spy(new TestableColorListener());
     }
 
+    private void assertDimAmountEqualsTo(float dimAmount) {
+        float storedDimAmount = -1f;
+        for (int i = 0; i < MAX_WAIT_TIME_MS; i += WAIT_TIME_INCR_MS) {
+            storedDimAmount = mWallpaperManager.getWallpaperDimAmount();
+            if (dimAmount == storedDimAmount) break;
+            try {
+                Thread.sleep(WAIT_TIME_INCR_MS);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+        Assert.assertEquals(dimAmount, storedDimAmount, /* delta */ 0f);
+    }
+
     public class TestableColorListener implements WallpaperManager.OnColorsChangedListener {
         @Override
         public void onColorsChanged(WallpaperColors colors, int which) {