Verify WindowContext#registerComponentCallbacks

Bug: 181134729
Test: atest WindowContextTests
Change-Id: I4ed49cd7e08c9ec58682834b760b10f3ffa5292d
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java
index cd66878..36f9890 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java
@@ -22,10 +22,12 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import android.content.ComponentCallbacks;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.IBinder;
 import android.platform.test.annotations.AppModeFull;
@@ -33,8 +35,13 @@
 import android.view.View;
 import android.view.WindowManager;
 
+import androidx.annotation.NonNull;
+
 import org.junit.Test;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Tests that verify the behavior of window context
  *
@@ -99,4 +106,45 @@
             windowContext.unbindService(serviceConnection);
         }
     }
+
+    /**
+     * Verify if the {@link ComponentCallbacks#onConfigurationChanged(Configuration)} callback
+     * is received when the window context configuration changes.
+     */
+    @Test
+    public void testWindowContextRegisterComponentCallbacks() throws Exception {
+        final TestComponentCallbacks callbacks = new TestComponentCallbacks();
+        final WindowManagerState.DisplayContent display = createManagedVirtualDisplaySession()
+                .setSimulateDisplay(true).createDisplay();
+        final Context windowContext = createWindowContext(display.mId);
+        final DisplayMetricsSession displayMetricsSession =
+                createManagedDisplayMetricsSession(display.mId);
+
+        windowContext.registerComponentCallbacks(callbacks);
+
+        callbacks.mLatch = new CountDownLatch(1);
+
+        displayMetricsSession.changeDisplayMetrics(1.2 /* sizeRatio */, 1.1 /* densityRatio */);
+
+        // verify if there is a gicallback from the window context configuration change.
+        assertTrue(callbacks.mLatch.await(4, TimeUnit.SECONDS));
+        Rect bounds = callbacks.mConfiguration.windowConfiguration.getBounds();
+        assertBoundsEquals(displayMetricsSession.getDisplayMetrics(), bounds);
+
+        windowContext.unregisterComponentCallbacks(callbacks);
+    }
+
+    private static class TestComponentCallbacks implements ComponentCallbacks {
+        private Configuration mConfiguration;
+        private CountDownLatch mLatch = new CountDownLatch(1);
+
+        @Override
+        public void onConfigurationChanged(@NonNull Configuration newConfig) {
+            mConfiguration = newConfig;
+            mLatch.countDown();
+        }
+
+        @Override
+        public void onLowMemory() {}
+    }
 }