Minor refactoring to support moving code to shell

Bug: 148148105
Test: atest SystemUITests
Change-Id: I8614fe50cb87f66b1e403dfbfe8a68d1e043bd13
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index aacc2c4..93b6a41 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -123,8 +123,8 @@
 import com.android.systemui.util.leak.LeakDetector;
 import com.android.systemui.util.leak.LeakReporter;
 import com.android.systemui.util.sensors.AsyncSensorManager;
+import com.android.systemui.wm.DisplayController;
 import com.android.systemui.wm.DisplayImeController;
-import com.android.systemui.wm.DisplayWindowController;
 import com.android.systemui.wm.SystemWindows;
 
 import java.io.FileDescriptor;
@@ -323,7 +323,7 @@
     @Inject Lazy<CommandQueue> mCommandQueue;
     @Inject Lazy<Recents> mRecents;
     @Inject Lazy<StatusBar> mStatusBar;
-    @Inject Lazy<DisplayWindowController> mDisplayWindowController;
+    @Inject Lazy<DisplayController> mDisplayController;
     @Inject Lazy<SystemWindows> mSystemWindows;
     @Inject Lazy<DisplayImeController> mDisplayImeController;
     @Inject Lazy<RecordingController> mRecordingController;
@@ -516,7 +516,7 @@
         mProviders.put(CommandQueue.class, mCommandQueue::get);
         mProviders.put(Recents.class, mRecents::get);
         mProviders.put(StatusBar.class, mStatusBar::get);
-        mProviders.put(DisplayWindowController.class, mDisplayWindowController::get);
+        mProviders.put(DisplayController.class, mDisplayController::get);
         mProviders.put(SystemWindows.class, mSystemWindows::get);
         mProviders.put(DisplayImeController.class, mDisplayImeController::get);
 
diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
index d1d9b3d..92aa020 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
@@ -20,13 +20,13 @@
 import android.content.res.Configuration;
 
 import com.android.systemui.broadcast.BroadcastDispatcher;
-import com.android.systemui.wm.DisplayWindowController;
+import com.android.systemui.wm.DisplayController;
 
 import java.io.PrintWriter;
 
 public interface BasePipManager {
     void initialize(Context context, BroadcastDispatcher broadcastDispatcher,
-            DisplayWindowController displayWindowController);
+            DisplayController displayController);
     void showPictureInPictureMenu();
     default void expandPip() {}
     default void hidePipMenu(Runnable onStartCallback, Runnable onEndCallback) {}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
index 29de90b..cecdc9c 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
@@ -28,7 +28,7 @@
 import com.android.systemui.SystemUI;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.statusbar.CommandQueue;
-import com.android.systemui.wm.DisplayWindowController;
+import com.android.systemui.wm.DisplayController;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -45,17 +45,17 @@
     private final CommandQueue mCommandQueue;
     private BasePipManager mPipManager;
     private final BroadcastDispatcher mBroadcastDispatcher;
-    private final DisplayWindowController mDisplayWindowController;
+    private final DisplayController mDisplayController;
     private boolean mSupportsPip;
 
     @Inject
     public PipUI(Context context, CommandQueue commandQueue,
             BroadcastDispatcher broadcastDispatcher,
-            DisplayWindowController displayWindowController) {
+            DisplayController displayController) {
         super(context);
         mBroadcastDispatcher = broadcastDispatcher;
         mCommandQueue = commandQueue;
-        mDisplayWindowController = displayWindowController;
+        mDisplayController = displayController;
     }
 
     @Override
@@ -75,7 +75,7 @@
         mPipManager = pm.hasSystemFeature(FEATURE_LEANBACK_ONLY)
                 ? com.android.systemui.pip.tv.PipManager.getInstance()
                 : com.android.systemui.pip.phone.PipManager.getInstance();
-        mPipManager.initialize(mContext, mBroadcastDispatcher, mDisplayWindowController);
+        mPipManager.initialize(mContext, mBroadcastDispatcher, mDisplayController);
 
         mCommandQueue.addCallback(this);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index e48a23f..239ef36 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -46,7 +46,8 @@
 import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener;
 import com.android.systemui.shared.system.TaskStackChangeListener;
 import com.android.systemui.shared.system.WindowManagerWrapper;
-import com.android.systemui.wm.DisplayWindowController;
+import com.android.systemui.wm.DisplayChangeController;
+import com.android.systemui.wm.DisplayController;
 
 import java.io.PrintWriter;
 
@@ -79,7 +80,7 @@
     /**
      * Handler for display rotation changes.
      */
-    private final DisplayWindowController.OnDisplayWindowRotationController mRotationController = (
+    private final DisplayChangeController.OnDisplayChangingListener mRotationController = (
             int displayId, int fromRotation, int toRotation, WindowContainerTransaction t) -> {
         final boolean changed = mPipBoundsHandler.onDisplayRotationChanged(mTmpNormalBounds,
                 displayId, fromRotation, toRotation, t);
@@ -230,7 +231,7 @@
      * Initializes {@link PipManager}.
      */
     public void initialize(Context context, BroadcastDispatcher broadcastDispatcher,
-            DisplayWindowController displayWindowController) {
+            DisplayController displayController) {
         mContext = context;
         mActivityManager = ActivityManager.getService();
         mActivityTaskManager = ActivityTaskManager.getService();
@@ -251,7 +252,7 @@
                 mMenuController, mInputConsumerController, mPipBoundsHandler);
         mAppOpsListener = new PipAppOpsListener(context, mActivityManager,
                 mTouchHandler.getMotionHelper());
-        displayWindowController.addRotationController(mRotationController);
+        displayController.addDisplayChangingController(mRotationController);
 
         // If SystemUI restart, and it already existed a pinned stack,
         // register the pip input consumer to ensure touch can send to it.
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 1d92375..7532f9f 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -55,7 +55,7 @@
 import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener;
 import com.android.systemui.shared.system.TaskStackChangeListener;
 import com.android.systemui.shared.system.WindowManagerWrapper;
-import com.android.systemui.wm.DisplayWindowController;
+import com.android.systemui.wm.DisplayController;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -230,7 +230,7 @@
      * Initializes {@link PipManager}.
      */
     public void initialize(Context context, BroadcastDispatcher broadcastDispatcher,
-            DisplayWindowController displayWindowController) {
+            DisplayController displayController) {
         if (mInitialized) {
             return;
         }
diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayChangeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayChangeController.java
new file mode 100644
index 0000000..66bc306
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayChangeController.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.wm;
+
+import android.os.Handler;
+import android.os.RemoteException;
+import android.view.IDisplayWindowRotationCallback;
+import android.view.IDisplayWindowRotationController;
+import android.view.IWindowManager;
+import android.view.WindowContainerTransaction;
+
+import java.util.ArrayList;
+
+/**
+ * This module deals with display rotations coming from WM. When WM starts a rotation: after it has
+ * frozen the screen, it will call into this class. This will then call all registered local
+ * controllers and give them a chance to queue up task changes to be applied synchronously with that
+ * rotation.
+ */
+public class DisplayChangeController {
+
+    private final Handler mHandler;
+    private final IWindowManager mWmService;
+
+    private final ArrayList<OnDisplayChangingListener> mRotationListener =
+            new ArrayList<>();
+    private final ArrayList<OnDisplayChangingListener> mTmpListeners = new ArrayList<>();
+
+    private final IDisplayWindowRotationController mDisplayRotationController =
+            new IDisplayWindowRotationController.Stub() {
+                @Override
+                public void onRotateDisplay(int displayId, final int fromRotation,
+                        final int toRotation, IDisplayWindowRotationCallback callback) {
+                    mHandler.post(() -> {
+                        WindowContainerTransaction t = new WindowContainerTransaction();
+                        synchronized (mRotationListener) {
+                            mTmpListeners.clear();
+                            // Make a local copy in case the handlers add/remove themselves.
+                            mTmpListeners.addAll(mRotationListener);
+                        }
+                        for (OnDisplayChangingListener c : mTmpListeners) {
+                            c.onRotateDisplay(displayId, fromRotation, toRotation, t);
+                        }
+                        try {
+                            callback.continueRotateDisplay(toRotation, t);
+                        } catch (RemoteException e) {
+                        }
+                    });
+                }
+            };
+
+    public DisplayChangeController(Handler mainHandler, IWindowManager wmService) {
+        mHandler = mainHandler;
+        mWmService = wmService;
+        try {
+            mWmService.setDisplayWindowRotationController(mDisplayRotationController);
+        } catch (RemoteException e) {
+            throw new RuntimeException("Unable to register rotation controller");
+        }
+    }
+
+    /**
+     * Adds a display rotation controller.
+     */
+    public void addRotationListener(OnDisplayChangingListener listener) {
+        synchronized (mRotationListener) {
+            mRotationListener.add(listener);
+        }
+    }
+
+    /**
+     * Removes a display rotation controller.
+     */
+    public void removeRotationListener(OnDisplayChangingListener listener) {
+        synchronized (mRotationListener) {
+            mRotationListener.remove(listener);
+        }
+    }
+
+    /**
+     * Give a listener a chance to queue up configuration changes to execute as part of a
+     * display rotation. The contents of {@link #onRotateDisplay} must run synchronously.
+     */
+    public interface OnDisplayChangingListener {
+        /**
+         * Called before the display is rotated. Contents of this method must run synchronously.
+         * @param displayId Id of display that is rotating.
+         * @param fromRotation starting rotation of the display.
+         * @param toRotation target rotation of the display (after rotating).
+         * @param t A task transaction to populate.
+         */
+        void onRotateDisplay(int displayId, int fromRotation, int toRotation,
+                WindowContainerTransaction t);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayWindowController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayController.java
similarity index 69%
rename from packages/SystemUI/src/com/android/systemui/wm/DisplayWindowController.java
rename to packages/SystemUI/src/com/android/systemui/wm/DisplayController.java
index 951d6dd..bc24ad0 100644
--- a/packages/SystemUI/src/com/android/systemui/wm/DisplayWindowController.java
+++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayController.java
@@ -26,12 +26,10 @@
 import android.util.SparseArray;
 import android.view.Display;
 import android.view.IDisplayWindowListener;
-import android.view.IDisplayWindowRotationCallback;
-import android.view.IDisplayWindowRotationController;
 import android.view.IWindowManager;
-import android.view.WindowContainerTransaction;
 
 import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.wm.DisplayChangeController.OnDisplayChangingListener;
 
 import java.util.ArrayList;
 
@@ -45,42 +43,16 @@
  * rotation.
  */
 @Singleton
-public class DisplayWindowController {
-    private static final String TAG = "DisplayWindowController";
+public class DisplayController {
+    private static final String TAG = "DisplayController";
 
     private final Handler mHandler;
     private final Context mContext;
     private final IWindowManager mWmService;
-
-    private final ArrayList<OnDisplayWindowRotationController> mRotationControllers =
-            new ArrayList<>();
-    private final ArrayList<OnDisplayWindowRotationController> mTmpControllers = new ArrayList<>();
+    private final DisplayChangeController mChangeController;
 
     private final SparseArray<DisplayRecord> mDisplays = new SparseArray<>();
-    private final ArrayList<DisplayWindowListener> mDisplayChangedListeners = new ArrayList<>();
-
-    private final IDisplayWindowRotationController mDisplayRotationController =
-            new IDisplayWindowRotationController.Stub() {
-                @Override
-                public void onRotateDisplay(int displayId, final int fromRotation,
-                        final int toRotation, IDisplayWindowRotationCallback callback) {
-                    mHandler.post(() -> {
-                        WindowContainerTransaction t = new WindowContainerTransaction();
-                        synchronized (mRotationControllers) {
-                            mTmpControllers.clear();
-                            // Make a local copy in case the handlers add/remove themselves.
-                            mTmpControllers.addAll(mRotationControllers);
-                        }
-                        for (OnDisplayWindowRotationController c : mTmpControllers) {
-                            c.onRotateDisplay(displayId, fromRotation, toRotation, t);
-                        }
-                        try {
-                            callback.continueRotateDisplay(toRotation, t);
-                        } catch (RemoteException e) {
-                        }
-                    });
-                }
-            };
+    private final ArrayList<OnDisplaysChangedListener> mDisplayChangedListeners = new ArrayList<>();
 
     /**
      * Get's a display by id from DisplayManager.
@@ -160,14 +132,14 @@
             };
 
     @Inject
-    public DisplayWindowController(Context context, @Main Handler mainHandler,
+    public DisplayController(Context context, @Main Handler mainHandler,
             IWindowManager wmService) {
         mHandler = mainHandler;
         mContext = context;
         mWmService = wmService;
+        mChangeController = new DisplayChangeController(mHandler, mWmService);
         try {
             mWmService.registerDisplayWindowListener(mDisplayContainerListener);
-            mWmService.setDisplayWindowRotationController(mDisplayRotationController);
         } catch (RemoteException e) {
             throw new RuntimeException("Unable to register hierarchy listener");
         }
@@ -193,7 +165,7 @@
      * Add a display window-container listener. It will get notified whenever a display's
      * configuration changes or when displays are added/removed from the WM hierarchy.
      */
-    public void addDisplayWindowListener(DisplayWindowListener listener) {
+    public void addDisplayWindowListener(OnDisplaysChangedListener listener) {
         synchronized (mDisplays) {
             if (mDisplayChangedListeners.contains(listener)) {
                 return;
@@ -208,7 +180,7 @@
     /**
      * Remove a display window-container listener.
      */
-    public void removeDisplayWindowListener(DisplayWindowListener listener) {
+    public void removeDisplayWindowListener(OnDisplaysChangedListener listener) {
         synchronized (mDisplays) {
             mDisplayChangedListeners.remove(listener);
         }
@@ -217,19 +189,15 @@
     /**
      * Adds a display rotation controller.
      */
-    public void addRotationController(OnDisplayWindowRotationController controller) {
-        synchronized (mRotationControllers) {
-            mRotationControllers.add(controller);
-        }
+    public void addDisplayChangingController(OnDisplayChangingListener controller) {
+        mChangeController.addRotationListener(controller);
     }
 
     /**
      * Removes a display rotation controller.
      */
-    public void removeRotationController(OnDisplayWindowRotationController controller) {
-        synchronized (mRotationControllers) {
-            mRotationControllers.remove(controller);
-        }
+    public void removeDisplayChangingController(OnDisplayChangingListener controller) {
+        mChangeController.removeRotationListener(controller);
     }
 
     private static class DisplayRecord {
@@ -244,36 +212,20 @@
      *
      * @see IDisplayWindowListener
      */
-    public interface DisplayWindowListener {
+    public interface OnDisplaysChangedListener {
         /**
          * Called when a display has been added to the WM hierarchy.
          */
-        void onDisplayAdded(int displayId);
+        default void onDisplayAdded(int displayId) {}
 
         /**
          * Called when a display's window-container configuration changes.
          */
-        void onDisplayConfigurationChanged(int displayId, Configuration newConfig);
+        default void onDisplayConfigurationChanged(int displayId, Configuration newConfig) {}
 
         /**
          * Called when a display is removed.
          */
-        void onDisplayRemoved(int displayId);
-    }
-
-    /**
-     * Give a controller a chance to queue up configuration changes to execute as part of a
-     * display rotation. The contents of {@link #onRotateDisplay} must run synchronously.
-     */
-    public interface OnDisplayWindowRotationController {
-        /**
-         * Called before the display is rotated. Contents of this method must run synchronously.
-         * @param displayId Id of display that is rotating.
-         * @param fromRotation starting rotation of the display.
-         * @param toRotation target rotation of the display (after rotating).
-         * @param t A task transaction to populate.
-         */
-        void onRotateDisplay(int displayId, int fromRotation, int toRotation,
-                WindowContainerTransaction t);
+        default void onDisplayRemoved(int displayId) {}
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
index d413308..7dad05d 100644
--- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
+++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
@@ -45,7 +45,7 @@
  * Manages IME control at the display-level. This occurs when IME comes up in multi-window mode.
  */
 @Singleton
-public class DisplayImeController implements DisplayWindowController.DisplayWindowListener {
+public class DisplayImeController implements DisplayController.OnDisplaysChangedListener {
     private static final String TAG = "DisplayImeController";
 
     static final int ANIMATION_DURATION_SHOW_MS = 275;
@@ -63,7 +63,7 @@
     final ArrayList<ImePositionProcessor> mPositionProcessors = new ArrayList<>();
 
     @Inject
-    DisplayImeController(SystemWindows syswin, DisplayWindowController displayController,
+    public DisplayImeController(SystemWindows syswin, DisplayController displayController,
             @Main Handler mainHandler) {
         mHandler = mainHandler;
         mSystemWindows = syswin;
@@ -315,19 +315,20 @@
         /**
          * Called when the IME position is starting to animate.
          */
-        void onImeStartPositioning(int displayId, int imeTop, int finalImeTop, boolean showing,
-                SurfaceControl.Transaction t);
+        default void onImeStartPositioning(int displayId, int imeTop, int finalImeTop,
+                boolean showing, SurfaceControl.Transaction t) {}
 
         /**
          * Called when the ime position changed. This is expected to be a synchronous call on the
          * animation thread. Operations can be added to the transaction to be applied in sync.
          */
-        void onImePositionChanged(int displayId, int imeTop, SurfaceControl.Transaction t);
+        default void onImePositionChanged(int displayId, int imeTop,
+                SurfaceControl.Transaction t) {}
 
         /**
          * Called when the IME position is done animating.
          */
-        void onImeEndPositioning(int displayId, int imeTop, boolean showing,
-                SurfaceControl.Transaction t);
+        default void onImeEndPositioning(int displayId, int imeTop, boolean showing,
+                SurfaceControl.Transaction t) {}
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java
index 5aba013..9faee68 100644
--- a/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java
+++ b/packages/SystemUI/src/com/android/systemui/wm/SystemWindows.java
@@ -64,11 +64,11 @@
     final HashMap<View, SurfaceControlViewHost> mViewRoots = new HashMap<>();
     Context mContext;
     IWindowSession mSession;
-    DisplayWindowController mDisplayController;
+    DisplayController mDisplayController;
     IWindowManager mWmService;
 
-    private final DisplayWindowController.DisplayWindowListener mDisplayListener =
-            new DisplayWindowController.DisplayWindowListener() {
+    private final DisplayController.OnDisplaysChangedListener mDisplayListener =
+            new DisplayController.OnDisplaysChangedListener() {
                 @Override
                 public void onDisplayAdded(int displayId) { }
 
@@ -86,7 +86,7 @@
             };
 
     @Inject
-    public SystemWindows(Context context, DisplayWindowController displayController,
+    public SystemWindows(Context context, DisplayController displayController,
             IWindowManager wmService) {
         mContext = context;
         mWmService = wmService;