diff options
author | Chavi Weingarten <chaviw@google.com> | 2020-06-24 21:21:42 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-06-24 21:21:42 +0000 |
commit | 955faf48f291727fe2022b4c7872e96f142100c4 (patch) | |
tree | da2a0e9989508270a521bc3c0b6ae9bfede57f02 | |
parent | d16a0c7dc43c2841a4bae542b22dfdb52dbbe0c5 (diff) | |
parent | cae0a5b56a49c9d76f201acfd92a1c275575224a (diff) |
Merge "Call finishDrawing and notify when Window is removed or hidden" into rvc-dev am: cae0a5b56a
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11971839
Change-Id: I77a5ac8e0d247afb2d7513a9d28a9c48b859a75a
4 files changed, 21 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 52fb941ebfc0..564eecf725cc 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5142,8 +5142,8 @@ public class WindowManagerService extends IWindowManager.Stub } case WINDOW_STATE_BLAST_SYNC_TIMEOUT: { synchronized (mGlobalLock) { - final WindowState ws = (WindowState) msg.obj; - ws.finishDrawing(null); + final WindowState ws = (WindowState) msg.obj; + ws.immediatelyNotifyBlastSync(); } break; } diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index fbc5afadac6b..46e1bf04bdbe 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -428,6 +428,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub try { callback.onTransactionReady(mSyncId, mergedTransaction); } catch (RemoteException e) { + // If there's an exception when trying to send the mergedTransaction to the client, we + // should immediately apply it here so the transactions aren't lost. + mergedTransaction.apply(); } mTransactionCallbacksByPendingSyncId.remove(mSyncId); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 26a1fea1732b..49ef4e46bfeb 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2192,7 +2192,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP void removeIfPossible() { super.removeIfPossible(); removeIfPossible(false /*keepVisibleDeadWindow*/); - finishDrawing(null); + immediatelyNotifyBlastSync(); } private void removeIfPossible(boolean keepVisibleDeadWindow) { @@ -5806,7 +5806,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // client will not render when visibility is GONE. Therefore, call finishDrawing here to // prevent system server from blocking on a window that will not draw. if (viewVisibility == View.GONE && mUsingBLASTSyncTransaction) { - finishDrawing(null); + immediatelyNotifyBlastSync(); } } @@ -5844,7 +5844,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mWinAnimator.finishDrawingLocked(postDrawTransaction); } - mWmService.mH.removeMessages(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this); if (postDrawTransaction != null) { mBLASTSyncTransaction.merge(postDrawTransaction); } @@ -5853,8 +5852,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mWinAnimator.finishDrawingLocked(null); } - @VisibleForTesting - void notifyBlastSyncTransaction() { + private void notifyBlastSyncTransaction() { + mWmService.mH.removeMessages(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this); + if (!mNotifyBlastOnSurfacePlacement || mWaitingListener == null) { mNotifyBlastOnSurfacePlacement = false; return; @@ -5877,6 +5877,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mNotifyBlastOnSurfacePlacement = false; } + void immediatelyNotifyBlastSync() { + finishDrawing(null); + notifyBlastSyncTransaction(); + } + private boolean requestResizeForBlastSync() { return useBLASTSync() && !mResizeForBlastSyncReported; } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 7ce0c1edfb4c..341e20946c30 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -729,7 +729,7 @@ public class WindowOrganizerTests extends WindowTestsBase { // We should be rejected from the second sync since we are already // in one. assertEquals(false, bse.addToSyncSet(id2, task)); - finishAndNotifyDrawing(w); + w.immediatelyNotifyBlastSync(); assertEquals(true, bse.addToSyncSet(id2, task)); bse.setReady(id2); } @@ -753,7 +753,7 @@ public class WindowOrganizerTests extends WindowTestsBase { // Since we have a window we have to wait for it to draw to finish sync. verify(transactionListener, never()) .onTransactionReady(anyInt(), any()); - finishAndNotifyDrawing(w); + w.immediatelyNotifyBlastSync(); verify(transactionListener) .onTransactionReady(anyInt(), any()); } @@ -821,14 +821,14 @@ public class WindowOrganizerTests extends WindowTestsBase { int id = bse.startSyncSet(transactionListener); assertEquals(true, bse.addToSyncSet(id, task)); bse.setReady(id); - finishAndNotifyDrawing(w); + w.immediatelyNotifyBlastSync(); // Since we have a child window we still shouldn't be done. verify(transactionListener, never()) .onTransactionReady(anyInt(), any()); reset(transactionListener); - finishAndNotifyDrawing(child); + child.immediatelyNotifyBlastSync(); // Ah finally! Done verify(transactionListener) .onTransactionReady(anyInt(), any()); @@ -1002,20 +1002,15 @@ public class WindowOrganizerTests extends WindowTestsBase { verify(mockCallback, never()).onTransactionReady(anyInt(), any()); assertTrue(w1.useBLASTSync()); assertTrue(w2.useBLASTSync()); - finishAndNotifyDrawing(w1); + w1.immediatelyNotifyBlastSync(); // Even though one Window finished drawing, both windows should still be using blast sync assertTrue(w1.useBLASTSync()); assertTrue(w2.useBLASTSync()); - finishAndNotifyDrawing(w2); + w2.immediatelyNotifyBlastSync(); verify(mockCallback).onTransactionReady(anyInt(), any()); assertFalse(w1.useBLASTSync()); assertFalse(w2.useBLASTSync()); } - - private void finishAndNotifyDrawing(WindowState ws) { - ws.finishDrawing(null); - ws.notifyBlastSyncTransaction(); - } } |