Merge "Call WindowManagerInternal#waitForAllWindowsDrawn for secondary displays" into sc-dev
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 0ce9650..7f325f1 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -413,13 +413,6 @@
     volatile boolean mBootAnimationDismissable;
     private KeyguardServiceDelegate mKeyguardDelegate;
     private boolean mKeyguardBound;
-    final Runnable mWindowManagerDrawCallback = new Runnable() {
-        @Override
-        public void run() {
-            if (DEBUG_WAKEUP) Slog.i(TAG, "All windows ready for display!");
-            mHandler.sendEmptyMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE);
-        }
-    };
     final DrawnListener mKeyguardDrawnCallback = new DrawnListener() {
         @Override
         public void onDrawn() {
@@ -646,7 +639,7 @@
                     break;
                 case MSG_WINDOW_MANAGER_DRAWN_COMPLETE:
                     if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mWindowManagerDrawComplete");
-                    finishWindowsDrawn();
+                    finishWindowsDrawn(msg.arg1);
                     break;
                 case MSG_HIDE_BOOT_MESSAGE:
                     handleHideBootMessage();
@@ -4308,8 +4301,11 @@
 
         // ... eventually calls finishWindowsDrawn which will finalize our screen turn on
         // as well as enabling the orientation change logic/sensor.
-        mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback,
-                WAITING_FOR_DRAWN_TIMEOUT, INVALID_DISPLAY);
+        mWindowManagerInternal.waitForAllWindowsDrawn(() -> {
+            if (DEBUG_WAKEUP) Slog.i(TAG, "All windows ready for every display");
+            mHandler.sendMessage(mHandler.obtainMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE,
+                    INVALID_DISPLAY, 0));
+            }, WAITING_FOR_DRAWN_TIMEOUT, INVALID_DISPLAY);
     }
 
     // Called on the DisplayManager's DisplayPowerController thread.
@@ -4369,6 +4365,11 @@
             }
         } else {
             mScreenOnListeners.put(displayId, screenOnListener);
+            mWindowManagerInternal.waitForAllWindowsDrawn(() -> {
+                if (DEBUG_WAKEUP) Slog.i(TAG, "All windows ready for display: " + displayId);
+                mHandler.sendMessage(mHandler.obtainMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE,
+                        displayId, 0));
+            }, WAITING_FOR_DRAWN_TIMEOUT, displayId);
         }
     }
 
@@ -4409,7 +4410,15 @@
         mVrManagerInternal.onScreenStateChanged(isScreenOn);
     }
 
-    private void finishWindowsDrawn() {
+    private void finishWindowsDrawn(int displayId) {
+        if (displayId != DEFAULT_DISPLAY && displayId != INVALID_DISPLAY) {
+            final ScreenOnListener screenOnListener = mScreenOnListeners.removeReturnOld(displayId);
+            if (screenOnListener != null) {
+                screenOnListener.onScreenOn();
+            }
+            return;
+        }
+
         if (!mDefaultDisplayPolicy.finishWindowsDrawn()) {
             return;
         }
@@ -4453,14 +4462,6 @@
             if (listener != null) {
                 listener.onScreenOn();
             }
-
-            for (int i = mScreenOnListeners.size() - 1; i >= 0; i--) {
-                final ScreenOnListener screenOnListener = mScreenOnListeners.valueAt(i);
-                if (screenOnListener != null) {
-                    screenOnListener.onScreenOn();
-                }
-            }
-            mScreenOnListeners.clear();
         }
 
         if (enableScreen) {