Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7bdc13ad authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Reduce surface placement of sync group

1. setReady may be called multiples times from
WindowOrganizerController#startTransition and
DisplayContent#executeAppTransition. If the state is the same,
there is no need to request traversal.

2. When collecting a change if the group is not ready, the
visibility, config, lifecycle events and setReady=true will
trigger traversal as well.

Bug: 260059642
Test: atest SyncEngineTests
Test: Start next activity and finish current activity.
      The slice of trace "finishActivity" should not contain
      "performSurfacePlacement".
Change-Id: I8cc0c70bb8c2da504cc53379ea107c13d8bdd197
parent 5a31efbf
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -226,6 +226,9 @@ class BLASTSyncEngine {
        }

        private void setReady(boolean ready) {
            if (mReady == ready) {
                return;
            }
            ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Set ready", mSyncId);
            mReady = ready;
            if (!ready) return;
@@ -239,8 +242,10 @@ class BLASTSyncEngine {
            ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Adding to group: %s", mSyncId, wc);
            wc.setSyncGroup(this);
            wc.prepareSync();
            if (mReady) {
                mWm.mWindowPlacerLocked.requestTraversal();
            }
        }

        void onCancelSync(WindowContainer wc) {
            mRootMembers.remove(wc);
+9 −9
Original line number Diff line number Diff line
@@ -74,15 +74,15 @@ public class SyncEngineTests extends WindowTestsBase {

        int id = startSyncSet(bse, listener);
        bse.addToSyncSet(id, mockWC);
        // Make sure a traversal is requested
        verify(mWm.mWindowPlacerLocked, times(1)).requestTraversal();
        // The traversal is not requested because ready is not set.
        verify(mWm.mWindowPlacerLocked, times(0)).requestTraversal();

        bse.onSurfacePlacement();
        verify(listener, times(0)).onTransactionReady(anyInt(), any());

        bse.setReady(id);
        // Make sure a traversal is requested
        verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal();
        verify(mWm.mWindowPlacerLocked).requestTraversal();
        bse.onSurfacePlacement();
        verify(listener, times(1)).onTransactionReady(eq(id), notNull());

@@ -103,14 +103,14 @@ public class SyncEngineTests extends WindowTestsBase {
        int id = startSyncSet(bse, listener);
        bse.addToSyncSet(id, mockWC);
        bse.setReady(id);
        // Make sure traversals requested (one for add and another for setReady)
        verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal();
        // Make sure traversals requested.
        verify(mWm.mWindowPlacerLocked).requestTraversal();
        bse.onSurfacePlacement();
        verify(listener, times(0)).onTransactionReady(anyInt(), any());

        mockWC.onSyncFinishedDrawing();
        // Make sure a (third) traversal is requested.
        verify(mWm.mWindowPlacerLocked, times(3)).requestTraversal();
        // Make sure the second traversal is requested.
        verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal();
        bse.onSurfacePlacement();
        verify(listener, times(1)).onTransactionReady(eq(id), notNull());
    }
@@ -127,8 +127,8 @@ public class SyncEngineTests extends WindowTestsBase {
        int id = startSyncSet(bse, listener);
        bse.addToSyncSet(id, mockWC);
        bse.setReady(id);
        // Make sure traversals requested (one for add and another for setReady)
        verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal();
        // Make sure traversals requested.
        verify(mWm.mWindowPlacerLocked).requestTraversal();
        bse.onSurfacePlacement();
        verify(listener, times(0)).onTransactionReady(anyInt(), any());