Merge "Send all-window-drawn message of caller directly" into udc-dev

This commit is contained in:
Riddle Hsu
2023-07-03 10:24:45 +00:00
committed by Android (Google) Code Review
3 changed files with 29 additions and 45 deletions

View File

@@ -702,8 +702,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
finishKeyguardDrawn();
break;
case MSG_WINDOW_MANAGER_DRAWN_COMPLETE:
if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mWindowManagerDrawComplete");
finishWindowsDrawn(msg.arg1);
final int displayId = msg.arg1;
if (DEBUG_WAKEUP) Slog.w(TAG, "All windows drawn on display " + displayId);
Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER,
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, displayId /* cookie */);
finishWindowsDrawn(displayId);
break;
case MSG_HIDE_BOOT_MESSAGE:
handleHideBootMessage();
@@ -4996,15 +4999,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// ... eventually calls finishWindowsDrawn which will finalize our screen turn on
// as well as enabling the orientation change logic/sensor.
Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, /* cookie= */ 0);
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));
Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER,
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, /* cookie= */ 0);
}, WAITING_FOR_DRAWN_TIMEOUT, INVALID_DISPLAY);
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, INVALID_DISPLAY /* cookie */);
mWindowManagerInternal.waitForAllWindowsDrawn(mHandler.obtainMessage(
MSG_WINDOW_MANAGER_DRAWN_COMPLETE, INVALID_DISPLAY, 0),
WAITING_FOR_DRAWN_TIMEOUT, INVALID_DISPLAY);
}
// Called on the DisplayManager's DisplayPowerController thread.
@@ -5084,15 +5082,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mScreenOnListeners.put(displayId, screenOnListener);
Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER,
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, /* cookie= */ 0);
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));
Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER,
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, /* cookie= */ 0);
}, WAITING_FOR_DRAWN_TIMEOUT, displayId);
TRACE_WAIT_FOR_ALL_WINDOWS_DRAWN_METHOD, displayId /* cookie */);
mWindowManagerInternal.waitForAllWindowsDrawn(mHandler.obtainMessage(
MSG_WINDOW_MANAGER_DRAWN_COMPLETE, displayId, 0),
WAITING_FOR_DRAWN_TIMEOUT, displayId);
}
}

View File

@@ -30,6 +30,7 @@ import android.graphics.Region;
import android.hardware.display.DisplayManagerInternal;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.util.Pair;
import android.view.ContentRecordingSession;
import android.view.Display;
@@ -515,12 +516,13 @@ public abstract class WindowManagerInternal {
* Invalidate all visible windows on a given display, and report back on the callback when all
* windows have redrawn.
*
* @param callback reporting callback to be called when all windows have redrawn.
* @param message The message will be sent when all windows have redrawn. Note that the message
* must be obtained from handler, otherwise it will throw NPE.
* @param timeout calls the callback anyway after the timeout.
* @param displayId waits for the windows on the given display, INVALID_DISPLAY to wait for all
* windows on all displays.
*/
public abstract void waitForAllWindowsDrawn(Runnable callback, long timeout, int displayId);
public abstract void waitForAllWindowsDrawn(Message message, long timeout, int displayId);
/**
* Overrides the display size.

View File

@@ -601,7 +601,7 @@ public class WindowManagerService extends IWindowManager.Stub
* The callbacks to make when the windows all have been drawn for a given
* {@link WindowContainer}.
*/
final HashMap<WindowContainer, Runnable> mWaitingForDrawnCallbacks = new HashMap<>();
final ArrayMap<WindowContainer<?>, Message> mWaitingForDrawnCallbacks = new ArrayMap<>();
/** List of window currently causing non-system overlay windows to be hidden. */
private ArrayList<WindowState> mHidingNonSystemOverlayWindows = new ArrayList<>();
@@ -5368,8 +5368,6 @@ public class WindowManagerService extends IWindowManager.Stub
public static final int CLIENT_FREEZE_TIMEOUT = 30;
public static final int NOTIFY_ACTIVITY_DRAWN = 32;
public static final int ALL_WINDOWS_DRAWN = 33;
public static final int NEW_ANIMATOR_SCALE = 34;
public static final int SHOW_EMULATOR_DISPLAY_OVERLAY = 36;
@@ -5491,7 +5489,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
case WAITING_FOR_DRAWN_TIMEOUT: {
Runnable callback = null;
final Message callback;
final WindowContainer<?> container = (WindowContainer<?>) msg.obj;
synchronized (mGlobalLock) {
ProtoLog.w(WM_ERROR, "Timeout waiting for drawn: undrawn=%s",
@@ -5505,7 +5503,7 @@ public class WindowManagerService extends IWindowManager.Stub
callback = mWaitingForDrawnCallbacks.remove(container);
}
if (callback != null) {
callback.run();
callback.sendToTarget();
}
break;
}
@@ -5529,17 +5527,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
break;
}
case ALL_WINDOWS_DRAWN: {
Runnable callback;
final WindowContainer container = (WindowContainer) msg.obj;
synchronized (mGlobalLock) {
callback = mWaitingForDrawnCallbacks.remove(container);
}
if (callback != null) {
callback.run();
}
break;
}
case NEW_ANIMATOR_SCALE: {
float scale = getCurrentAnimatorScale();
ValueAnimator.setDurationScale(scale);
@@ -6097,7 +6084,8 @@ public class WindowManagerService extends IWindowManager.Stub
if (mWaitingForDrawnCallbacks.isEmpty()) {
return;
}
mWaitingForDrawnCallbacks.forEach((container, callback) -> {
for (int i = mWaitingForDrawnCallbacks.size() - 1; i >= 0; i--) {
final WindowContainer<?> container = mWaitingForDrawnCallbacks.keyAt(i);
for (int j = container.mWaitingForDrawn.size() - 1; j >= 0; j--) {
final WindowState win = (WindowState) container.mWaitingForDrawn.get(j);
ProtoLog.i(WM_DEBUG_SCREEN_ON,
@@ -6123,9 +6111,9 @@ public class WindowManagerService extends IWindowManager.Stub
if (container.mWaitingForDrawn.isEmpty()) {
ProtoLog.d(WM_DEBUG_SCREEN_ON, "All windows drawn!");
mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT, container);
mH.sendMessage(mH.obtainMessage(H.ALL_WINDOWS_DRAWN, container));
mWaitingForDrawnCallbacks.removeAt(i).sendToTarget();
}
});
}
}
private void traceStartWaitingForWindowDrawn(WindowState window) {
@@ -7811,13 +7799,14 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
public void waitForAllWindowsDrawn(Runnable callback, long timeout, int displayId) {
public void waitForAllWindowsDrawn(Message message, long timeout, int displayId) {
Objects.requireNonNull(message.getTarget());
final WindowContainer<?> container = displayId == INVALID_DISPLAY
? mRoot : mRoot.getDisplayContent(displayId);
if (container == null) {
// The waiting container doesn't exist, no need to wait to run the callback. Run and
// return;
callback.run();
message.sendToTarget();
return;
}
boolean allWindowsDrawn = false;
@@ -7834,13 +7823,13 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
mWaitingForDrawnCallbacks.put(container, callback);
mWaitingForDrawnCallbacks.put(container, message);
mH.sendNewMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, container, timeout);
checkDrawnWindowsLocked();
}
}
if (allWindowsDrawn) {
callback.run();
message.sendToTarget();
}
}