Loading core/java/android/hardware/display/DisplayManagerInternal.java +4 −1 Original line number Diff line number Diff line Loading @@ -202,8 +202,11 @@ public abstract class DisplayManagerInternal { /** * Called by the window manager to perform traversals while holding a * surface flinger transaction. * @param t The default transaction. * @param displayTransactions The transactions mapped by display id. */ public abstract void performTraversal(Transaction t); public abstract void performTraversal(Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions); /** * Tells the display manager about properties of the display that depend on the windows on it. Loading services/core/java/com/android/server/display/DisplayManagerService.java +12 −7 Original line number Diff line number Diff line Loading @@ -872,14 +872,15 @@ public final class DisplayManagerService extends SystemService { } @VisibleForTesting void performTraversalInternal(SurfaceControl.Transaction t) { void performTraversalInternal(SurfaceControl.Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions) { synchronized (mSyncRoot) { if (!mPendingTraversal) { return; } mPendingTraversal = false; performTraversalLocked(t); performTraversalLocked(t, displayTransactions); } // List is self-synchronized copy-on-write. Loading Loading @@ -2593,7 +2594,8 @@ public final class DisplayManagerService extends SystemService { } } private void performTraversalLocked(SurfaceControl.Transaction t) { private void performTraversalLocked(SurfaceControl.Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions) { // Clear all viewports before configuring displays so that we can keep // track of which ones we have configured. clearViewportsLocked(); Loading @@ -2601,9 +2603,11 @@ public final class DisplayManagerService extends SystemService { // Configure each display device. mLogicalDisplayMapper.forEachLocked((LogicalDisplay display) -> { final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); final SurfaceControl.Transaction displayTransaction = displayTransactions.get(display.getDisplayIdLocked(), t); if (device != null) { configureDisplayLocked(t, device); device.performTraversalLocked(t); configureDisplayLocked(displayTransaction, device); device.performTraversalLocked(displayTransaction); } }); Loading Loading @@ -4680,8 +4684,9 @@ public final class DisplayManagerService extends SystemService { } @Override public void performTraversal(SurfaceControl.Transaction t) { performTraversalInternal(t); public void performTraversal(SurfaceControl.Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions) { performTraversalInternal(t, displayTransactions); } @Override Loading services/core/java/com/android/server/wm/DisplayContent.java +0 −1 Original line number Diff line number Diff line Loading @@ -2250,7 +2250,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } } mWmService.mDisplayManagerInternal.performTraversal(transaction); if (shellTransitions) { // Before setDisplayProjection is applied by the start transaction of transition, // set the transform hint to avoid using surface in old rotation. Loading services/core/java/com/android/server/wm/RootWindowContainer.java +5 −1 Original line number Diff line number Diff line Loading @@ -249,6 +249,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** Reference to default display so we can quickly look it up. */ private DisplayContent mDefaultDisplay; private final SparseArray<IntArray> mDisplayAccessUIDs = new SparseArray<>(); private final SparseArray<SurfaceControl.Transaction> mDisplayTransactions = new SparseArray<>(); /** The current user */ int mCurrentUser; Loading Loading @@ -991,11 +993,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> for (int j = 0; j < count; ++j) { final DisplayContent dc = mChildren.get(j); dc.applySurfaceChangesTransaction(); mDisplayTransactions.append(dc.mDisplayId, dc.getSyncTransaction()); } // Give the display manager a chance to adjust properties like display rotation if it needs // to. mWmService.mDisplayManagerInternal.performTraversal(t); mWmService.mDisplayManagerInternal.performTraversal(t, mDisplayTransactions); mDisplayTransactions.clear(); } /** Loading services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +17 −11 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemProperties; import android.platform.test.flag.junit.SetFlagsRule; import android.util.SparseArray; import android.view.ContentRecordingSession; import android.view.Display; import android.view.DisplayAdjustments; Loading Loading @@ -432,7 +433,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -507,7 +508,7 @@ public class DisplayManagerServiceTest { assertTrue(expectedDisplayTypeToViewPortTypeMapping.keySet().contains(info.type)); } displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -559,7 +560,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -594,7 +595,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); Loading Loading @@ -632,7 +633,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); Loading Loading @@ -667,7 +668,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); Loading Loading @@ -947,7 +948,7 @@ public class DisplayManagerServiceTest { PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -1439,7 +1440,7 @@ public class DisplayManagerServiceTest { PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -1694,7 +1695,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -1728,7 +1729,7 @@ public class DisplayManagerServiceTest { null /* projection */, PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId); assertNotNull(ddi); Loading Loading @@ -1797,7 +1798,7 @@ public class DisplayManagerServiceTest { mock(DisplayWindowPolicyController.class), PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId); assertNotNull(ddi); Loading Loading @@ -2912,6 +2913,11 @@ public class DisplayManagerServiceTest { assertEquals(expectedMode, displayInfo.getMode()); } private void performTraversalInternal(DisplayManagerService displayManager) { displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class), new SparseArray<>()); } private int getDisplayIdForDisplayDevice( DisplayManagerService displayManager, DisplayManagerService.BinderService displayManagerBinderService, Loading Loading
core/java/android/hardware/display/DisplayManagerInternal.java +4 −1 Original line number Diff line number Diff line Loading @@ -202,8 +202,11 @@ public abstract class DisplayManagerInternal { /** * Called by the window manager to perform traversals while holding a * surface flinger transaction. * @param t The default transaction. * @param displayTransactions The transactions mapped by display id. */ public abstract void performTraversal(Transaction t); public abstract void performTraversal(Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions); /** * Tells the display manager about properties of the display that depend on the windows on it. Loading
services/core/java/com/android/server/display/DisplayManagerService.java +12 −7 Original line number Diff line number Diff line Loading @@ -872,14 +872,15 @@ public final class DisplayManagerService extends SystemService { } @VisibleForTesting void performTraversalInternal(SurfaceControl.Transaction t) { void performTraversalInternal(SurfaceControl.Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions) { synchronized (mSyncRoot) { if (!mPendingTraversal) { return; } mPendingTraversal = false; performTraversalLocked(t); performTraversalLocked(t, displayTransactions); } // List is self-synchronized copy-on-write. Loading Loading @@ -2593,7 +2594,8 @@ public final class DisplayManagerService extends SystemService { } } private void performTraversalLocked(SurfaceControl.Transaction t) { private void performTraversalLocked(SurfaceControl.Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions) { // Clear all viewports before configuring displays so that we can keep // track of which ones we have configured. clearViewportsLocked(); Loading @@ -2601,9 +2603,11 @@ public final class DisplayManagerService extends SystemService { // Configure each display device. mLogicalDisplayMapper.forEachLocked((LogicalDisplay display) -> { final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); final SurfaceControl.Transaction displayTransaction = displayTransactions.get(display.getDisplayIdLocked(), t); if (device != null) { configureDisplayLocked(t, device); device.performTraversalLocked(t); configureDisplayLocked(displayTransaction, device); device.performTraversalLocked(displayTransaction); } }); Loading Loading @@ -4680,8 +4684,9 @@ public final class DisplayManagerService extends SystemService { } @Override public void performTraversal(SurfaceControl.Transaction t) { performTraversalInternal(t); public void performTraversal(SurfaceControl.Transaction t, SparseArray<SurfaceControl.Transaction> displayTransactions) { performTraversalInternal(t, displayTransactions); } @Override Loading
services/core/java/com/android/server/wm/DisplayContent.java +0 −1 Original line number Diff line number Diff line Loading @@ -2250,7 +2250,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } } mWmService.mDisplayManagerInternal.performTraversal(transaction); if (shellTransitions) { // Before setDisplayProjection is applied by the start transaction of transition, // set the transform hint to avoid using surface in old rotation. Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +5 −1 Original line number Diff line number Diff line Loading @@ -249,6 +249,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> /** Reference to default display so we can quickly look it up. */ private DisplayContent mDefaultDisplay; private final SparseArray<IntArray> mDisplayAccessUIDs = new SparseArray<>(); private final SparseArray<SurfaceControl.Transaction> mDisplayTransactions = new SparseArray<>(); /** The current user */ int mCurrentUser; Loading Loading @@ -991,11 +993,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent> for (int j = 0; j < count; ++j) { final DisplayContent dc = mChildren.get(j); dc.applySurfaceChangesTransaction(); mDisplayTransactions.append(dc.mDisplayId, dc.getSyncTransaction()); } // Give the display manager a chance to adjust properties like display rotation if it needs // to. mWmService.mDisplayManagerInternal.performTraversal(t); mWmService.mDisplayManagerInternal.performTraversal(t, mDisplayTransactions); mDisplayTransactions.clear(); } /** Loading
services/tests/displayservicetests/src/com/android/server/display/DisplayManagerServiceTest.java +17 −11 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.SystemProperties; import android.platform.test.flag.junit.SetFlagsRule; import android.util.SparseArray; import android.view.ContentRecordingSession; import android.view.Display; import android.view.DisplayAdjustments; Loading Loading @@ -432,7 +433,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -507,7 +508,7 @@ public class DisplayManagerServiceTest { assertTrue(expectedDisplayTypeToViewPortTypeMapping.keySet().contains(info.type)); } displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -559,7 +560,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -594,7 +595,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); Loading Loading @@ -632,7 +633,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); Loading Loading @@ -667,7 +668,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, /* now= */ 0); Loading Loading @@ -947,7 +948,7 @@ public class DisplayManagerServiceTest { PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -1439,7 +1440,7 @@ public class DisplayManagerServiceTest { PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -1694,7 +1695,7 @@ public class DisplayManagerServiceTest { verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); // flush the handler displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); Loading Loading @@ -1728,7 +1729,7 @@ public class DisplayManagerServiceTest { null /* projection */, PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId); assertNotNull(ddi); Loading Loading @@ -1797,7 +1798,7 @@ public class DisplayManagerServiceTest { mock(DisplayWindowPolicyController.class), PACKAGE_NAME); verify(mMockProjectionService, never()).setContentRecordingSession(any(), nullable(IMediaProjection.class)); displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class)); performTraversalInternal(displayManager); displayManager.getDisplayHandler().runWithScissors(() -> {}, 0 /* now */); DisplayDeviceInfo ddi = displayManager.getDisplayDeviceInfoInternal(displayId); assertNotNull(ddi); Loading Loading @@ -2912,6 +2913,11 @@ public class DisplayManagerServiceTest { assertEquals(expectedMode, displayInfo.getMode()); } private void performTraversalInternal(DisplayManagerService displayManager) { displayManager.performTraversalInternal(mock(SurfaceControl.Transaction.class), new SparseArray<>()); } private int getDisplayIdForDisplayDevice( DisplayManagerService displayManager, DisplayManagerService.BinderService displayManagerBinderService, Loading