Introducing ConfigurationContainerListener

Class provides a structured way for window containers on the window
manager side to listener for configuration changes happening in the
window controllers on the activity manager side so things stay in
sync and they don't miss anything.

Test: bit FrameworksServicesTests:com.android.server.wm.WindowContainerControllerTests
Test: bit FrameworksServicesTests:com.android.server.wm.ConfigurationContainerTests
Test: go/wm-smoke
Change-Id: I6a6bc98a35bda89b3aaa7a29a9814905f0c3a9ee
diff --git a/services/core/java/com/android/server/wm/WindowContainerController.java b/services/core/java/com/android/server/wm/WindowContainerController.java
index c4a6837..eb23faf 100644
--- a/services/core/java/com/android/server/wm/WindowContainerController.java
+++ b/services/core/java/com/android/server/wm/WindowContainerController.java
@@ -16,9 +16,7 @@
 
 package com.android.server.wm;
 
-import android.os.IBinder;
-
-import java.util.HashMap;
+import android.content.res.Configuration;
 
 /**
  * Class that allows the owner/creator of a {@link WindowContainer} to communicate directly with the
@@ -29,7 +27,8 @@
  *
  * Test class: {@link WindowContainerControllerTests}
  */
-class WindowContainerController<E extends WindowContainer, I extends WindowContainerListener> {
+class WindowContainerController<E extends WindowContainer, I extends WindowContainerListener>
+        implements ConfigurationContainerListener {
 
     final WindowManagerService mService;
     final RootWindowContainer mRoot;
@@ -53,18 +52,32 @@
                     + " for controller=" + this + " Already set to=" + mContainer);
         }
         mContainer = container;
+        if (mContainer != null && mListener != null) {
+            mListener.registerConfigurationChangeListener(this);
+        }
     }
 
     void removeContainer() {
         // TODO: See if most uses cases should support removeIfPossible here.
         //mContainer.removeIfPossible();
-        if (mContainer != null) {
-            mContainer.setController(null);
-            mContainer = null;
+        if (mContainer == null) {
+            return;
+        }
+
+        mContainer.setController(null);
+        mContainer = null;
+        if (mListener != null) {
+            mListener.unregisterConfigurationChangeListener(this);
         }
     }
 
-    boolean checkCallingPermission(String permission, String func) {
-        return mService.checkCallingPermission(permission, func);
+    @Override
+    public void onOverrideConfigurationChanged(Configuration overrideConfiguration) {
+        synchronized (mWindowMap) {
+            if (mContainer == null) {
+                return;
+            }
+            mContainer.onOverrideConfigurationChanged(overrideConfiguration);
+        }
     }
 }