Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +47 −59 Original line number Original line Diff line number Diff line Loading @@ -58,13 +58,13 @@ import android.view.SurfaceControl; import android.window.TaskOrganizer; import android.window.TaskOrganizer; import android.window.WindowContainerToken; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransactionCallback; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.wm.shell.R; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.phone.PipMotionHelper; import com.android.wm.shell.pip.phone.PipMotionHelper; Loading Loading @@ -123,6 +123,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } } } } private final SyncTransactionQueue mSyncTransactionQueue; private final PipBoundsState mPipBoundsState; private final PipBoundsState mPipBoundsState; private final PipBoundsAlgorithm mPipBoundsAlgorithm; private final PipBoundsAlgorithm mPipBoundsAlgorithm; private final @NonNull PipMenuController mPipMenuController; private final @NonNull PipMenuController mPipMenuController; Loading Loading @@ -205,7 +206,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, */ */ private boolean mInSwipePipToHomeTransition; private boolean mInSwipePipToHomeTransition; public PipTaskOrganizer(Context context, @NonNull PipBoundsState pipBoundsState, public PipTaskOrganizer(Context context, @NonNull SyncTransactionQueue syncTransactionQueue, @NonNull PipBoundsState pipBoundsState, @NonNull PipBoundsAlgorithm boundsHandler, @NonNull PipBoundsAlgorithm boundsHandler, @NonNull PipMenuController pipMenuController, @NonNull PipMenuController pipMenuController, @NonNull PipAnimationController pipAnimationController, @NonNull PipAnimationController pipAnimationController, Loading @@ -216,6 +219,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull ShellTaskOrganizer shellTaskOrganizer, @NonNull ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) { mSyncTransactionQueue = syncTransactionQueue; mPipBoundsState = pipBoundsState; mPipBoundsState = pipBoundsState; mPipBoundsAlgorithm = boundsHandler; mPipBoundsAlgorithm = boundsHandler; mPipMenuController = pipMenuController; mPipMenuController = pipMenuController; Loading Loading @@ -337,11 +341,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, : WINDOWING_MODE_FULLSCREEN); : WINDOWING_MODE_FULLSCREEN); wct.setBounds(mToken, destinationBounds); wct.setBounds(mToken, destinationBounds); wct.setBoundsChangeTransaction(mToken, tx); wct.setBoundsChangeTransaction(mToken, tx); mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() { mSyncTransactionQueue.queue(wct); @Override mSyncTransactionQueue.runInSync(t -> { public void onTransactionReady(int id, SurfaceControl.Transaction t) { mMainExecutor.execute(() -> { t.apply(); // Make sure to grab the latest source hint rect as it could have been // Make sure to grab the latest source hint rect as it could have been // updated right after applying the windowing mode change. // updated right after applying the windowing mode change. final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect( final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect( Loading @@ -352,8 +353,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mState = State.EXITING_PIP; mState = State.EXITING_PIP; }); }); } } }); } private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) { private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) { // Reset the final windowing mode. // Reset the final windowing mode. Loading Loading @@ -502,18 +501,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); wct.setBounds(mToken, destinationBounds); wct.setBounds(mToken, destinationBounds); wct.scheduleFinishEnterPip(mToken, destinationBounds); wct.scheduleFinishEnterPip(mToken, destinationBounds); // TODO: Migrate to SyncTransactionQueue mSyncTransactionQueue.queue(wct); mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() { @Override public void onTransactionReady(int id, SurfaceControl.Transaction t) { mMainExecutor.execute(() -> { t.apply(); if (runnable != null) { if (runnable != null) { runnable.run(); mSyncTransactionQueue.runInSync(t -> runnable.run()); } } }); } }); } } private void sendOnPipTransitionStarted( private void sendOnPipTransitionStarted( Loading Loading @@ -951,16 +942,14 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, final SurfaceControl snapshotSurface = mTaskOrganizer.takeScreenshot(mToken); final SurfaceControl snapshotSurface = mTaskOrganizer.takeScreenshot(mToken); mSurfaceTransactionHelper.reparentAndShowSurfaceSnapshot( mSurfaceTransactionHelper.reparentAndShowSurfaceSnapshot( mSurfaceControlTransactionFactory.getTransaction(), mLeash, snapshotSurface); mSurfaceControlTransactionFactory.getTransaction(), mLeash, snapshotSurface); mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() { mSyncTransactionQueue.queue(wct); @Override mSyncTransactionQueue.runInSync(t -> { public void onTransactionReady(int id, @NonNull SurfaceControl.Transaction t) { // Scale the snapshot from its pre-resize bounds to the post-resize bounds. // Scale the snapshot from its pre-resize bounds to the post-resize bounds. final Rect snapshotSrc = new Rect(0, 0, snapshotSurface.getWidth(), final Rect snapshotSrc = new Rect(0, 0, snapshotSurface.getWidth(), snapshotSurface.getHeight()); snapshotSurface.getHeight()); final Rect snapshotDest = new Rect(0, 0, destinationBounds.width(), final Rect snapshotDest = new Rect(0, 0, destinationBounds.width(), destinationBounds.height()); destinationBounds.height()); mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest); mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest); t.apply(); mMainExecutor.execute(() -> { mMainExecutor.execute(() -> { // Start animation to fade out the snapshot. // Start animation to fade out the snapshot. Loading @@ -968,10 +957,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, animator.setDuration(mEnterExitAnimationDuration); animator.setDuration(mEnterExitAnimationDuration); animator.addUpdateListener(animation -> { animator.addUpdateListener(animation -> { final float alpha = (float) animation.getAnimatedValue(); final float alpha = (float) animation.getAnimatedValue(); final SurfaceControl.Transaction tx = final SurfaceControl.Transaction transaction = mSurfaceControlTransactionFactory.getTransaction(); mSurfaceControlTransactionFactory.getTransaction(); tx.setAlpha(snapshotSurface, alpha); transaction.setAlpha(snapshotSurface, alpha); tx.apply(); transaction.apply(); }); }); animator.addListener(new AnimatorListenerAdapter() { animator.addListener(new AnimatorListenerAdapter() { @Override @Override Loading @@ -984,7 +973,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, }); }); animator.start(); animator.start(); }); }); } }); }); } else { } else { applyFinishBoundsResize(wct, direction); applyFinishBoundsResize(wct, direction); Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java +7 −5 Original line number Original line Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.phone.PhonePipMenuController; import com.android.wm.shell.pip.phone.PhonePipMenuController; Loading @@ -65,8 +66,8 @@ import java.util.Optional; public class PipTaskOrganizerTest extends ShellTestCase { public class PipTaskOrganizerTest extends ShellTestCase { private PipTaskOrganizer mSpiedPipTaskOrganizer; private PipTaskOrganizer mSpiedPipTaskOrganizer; @Mock private DisplayController mMockdDisplayController; @Mock private DisplayController mMockDisplayController; @Mock private SyncTransactionQueue mMockSyncTransactionQueue; @Mock private PhonePipMenuController mMockPhonePipMenuController; @Mock private PhonePipMenuController mMockPhonePipMenuController; @Mock private PipAnimationController mMockPipAnimationController; @Mock private PipAnimationController mMockPipAnimationController; @Mock private PipTransitionController mMockPipTransitionController; @Mock private PipTransitionController mMockPipTransitionController; Loading @@ -89,10 +90,11 @@ public class PipTaskOrganizerTest extends ShellTestCase { mPipBoundsState = new PipBoundsState(mContext); mPipBoundsState = new PipBoundsState(mContext); mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); mMainExecutor = new TestShellExecutor(); mMainExecutor = new TestShellExecutor(); mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mPipBoundsState, mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mMockSyncTransactionQueue, mPipBoundsState, mPipBoundsAlgorithm, mMockPhonePipMenuController, mPipBoundsAlgorithm, mMockPhonePipMenuController, mMockPipAnimationController, mMockPipSurfaceTransactionHelper, mMockPipAnimationController, mMockPipSurfaceTransactionHelper, mMockPipTransitionController, mMockOptionalSplitScreen, mMockdDisplayController, mMockPipTransitionController, mMockOptionalSplitScreen, mMockDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer, mMainExecutor)); mMockPipUiEventLogger, mMockShellTaskOrganizer, mMainExecutor)); mMainExecutor.flushAll(); mMainExecutor.flushAll(); preparePipTaskOrg(); preparePipTaskOrg(); Loading @@ -105,7 +107,7 @@ public class PipTaskOrganizerTest extends ShellTestCase { @Test @Test public void instantiatePipTaskOrganizer_addsDisplayWindowListener() { public void instantiatePipTaskOrganizer_addsDisplayWindowListener() { verify(mMockdDisplayController).addDisplayWindowListener(any()); verify(mMockDisplayController).addDisplayWindowListener(any()); } } @Test @Test Loading packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -19,16 +19,15 @@ package com.android.systemui.wmshell; import android.content.Context; import android.content.Context; import android.os.Handler; import android.os.Handler; import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMSingleton; import com.android.systemui.dagger.WMSingleton; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipAnimationController; Loading Loading @@ -140,6 +139,7 @@ public abstract class TvPipModule { @Provides @Provides static PipTaskOrganizer providePipTaskOrganizer(Context context, static PipTaskOrganizer providePipTaskOrganizer(Context context, TvPipMenuController tvPipMenuController, TvPipMenuController tvPipMenuController, SyncTransactionQueue syncTransactionQueue, PipBoundsState pipBoundsState, PipBoundsState pipBoundsState, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsAlgorithm pipBoundsAlgorithm, PipAnimationController pipAnimationController, PipAnimationController pipAnimationController, Loading @@ -149,7 +149,8 @@ public abstract class TvPipModule { DisplayController displayController, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm, return new PipTaskOrganizer(context, syncTransactionQueue, pipBoundsState, pipBoundsAlgorithm, tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper, tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); shellTaskOrganizer, mainExecutor); Loading packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -172,6 +172,7 @@ public class WMShellModule { @WMSingleton @WMSingleton @Provides @Provides static PipTaskOrganizer providePipTaskOrganizer(Context context, static PipTaskOrganizer providePipTaskOrganizer(Context context, SyncTransactionQueue syncTransactionQueue, PipBoundsState pipBoundsState, PipBoundsState pipBoundsState, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipMenuController menuPhoneController, PhonePipMenuController menuPhoneController, Loading @@ -182,7 +183,8 @@ public class WMShellModule { DisplayController displayController, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm, return new PipTaskOrganizer(context, syncTransactionQueue, pipBoundsState, pipBoundsAlgorithm, menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper, menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); shellTaskOrganizer, mainExecutor); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +47 −59 Original line number Original line Diff line number Diff line Loading @@ -58,13 +58,13 @@ import android.view.SurfaceControl; import android.window.TaskOrganizer; import android.window.TaskOrganizer; import android.window.WindowContainerToken; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransactionCallback; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.wm.shell.R; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.phone.PipMotionHelper; import com.android.wm.shell.pip.phone.PipMotionHelper; Loading Loading @@ -123,6 +123,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } } } } private final SyncTransactionQueue mSyncTransactionQueue; private final PipBoundsState mPipBoundsState; private final PipBoundsState mPipBoundsState; private final PipBoundsAlgorithm mPipBoundsAlgorithm; private final PipBoundsAlgorithm mPipBoundsAlgorithm; private final @NonNull PipMenuController mPipMenuController; private final @NonNull PipMenuController mPipMenuController; Loading Loading @@ -205,7 +206,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, */ */ private boolean mInSwipePipToHomeTransition; private boolean mInSwipePipToHomeTransition; public PipTaskOrganizer(Context context, @NonNull PipBoundsState pipBoundsState, public PipTaskOrganizer(Context context, @NonNull SyncTransactionQueue syncTransactionQueue, @NonNull PipBoundsState pipBoundsState, @NonNull PipBoundsAlgorithm boundsHandler, @NonNull PipBoundsAlgorithm boundsHandler, @NonNull PipMenuController pipMenuController, @NonNull PipMenuController pipMenuController, @NonNull PipAnimationController pipAnimationController, @NonNull PipAnimationController pipAnimationController, Loading @@ -216,6 +219,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull ShellTaskOrganizer shellTaskOrganizer, @NonNull ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) { mSyncTransactionQueue = syncTransactionQueue; mPipBoundsState = pipBoundsState; mPipBoundsState = pipBoundsState; mPipBoundsAlgorithm = boundsHandler; mPipBoundsAlgorithm = boundsHandler; mPipMenuController = pipMenuController; mPipMenuController = pipMenuController; Loading Loading @@ -337,11 +341,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, : WINDOWING_MODE_FULLSCREEN); : WINDOWING_MODE_FULLSCREEN); wct.setBounds(mToken, destinationBounds); wct.setBounds(mToken, destinationBounds); wct.setBoundsChangeTransaction(mToken, tx); wct.setBoundsChangeTransaction(mToken, tx); mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() { mSyncTransactionQueue.queue(wct); @Override mSyncTransactionQueue.runInSync(t -> { public void onTransactionReady(int id, SurfaceControl.Transaction t) { mMainExecutor.execute(() -> { t.apply(); // Make sure to grab the latest source hint rect as it could have been // Make sure to grab the latest source hint rect as it could have been // updated right after applying the windowing mode change. // updated right after applying the windowing mode change. final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect( final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect( Loading @@ -352,8 +353,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mState = State.EXITING_PIP; mState = State.EXITING_PIP; }); }); } } }); } private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) { private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) { // Reset the final windowing mode. // Reset the final windowing mode. Loading Loading @@ -502,18 +501,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); wct.setBounds(mToken, destinationBounds); wct.setBounds(mToken, destinationBounds); wct.scheduleFinishEnterPip(mToken, destinationBounds); wct.scheduleFinishEnterPip(mToken, destinationBounds); // TODO: Migrate to SyncTransactionQueue mSyncTransactionQueue.queue(wct); mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() { @Override public void onTransactionReady(int id, SurfaceControl.Transaction t) { mMainExecutor.execute(() -> { t.apply(); if (runnable != null) { if (runnable != null) { runnable.run(); mSyncTransactionQueue.runInSync(t -> runnable.run()); } } }); } }); } } private void sendOnPipTransitionStarted( private void sendOnPipTransitionStarted( Loading Loading @@ -951,16 +942,14 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, final SurfaceControl snapshotSurface = mTaskOrganizer.takeScreenshot(mToken); final SurfaceControl snapshotSurface = mTaskOrganizer.takeScreenshot(mToken); mSurfaceTransactionHelper.reparentAndShowSurfaceSnapshot( mSurfaceTransactionHelper.reparentAndShowSurfaceSnapshot( mSurfaceControlTransactionFactory.getTransaction(), mLeash, snapshotSurface); mSurfaceControlTransactionFactory.getTransaction(), mLeash, snapshotSurface); mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() { mSyncTransactionQueue.queue(wct); @Override mSyncTransactionQueue.runInSync(t -> { public void onTransactionReady(int id, @NonNull SurfaceControl.Transaction t) { // Scale the snapshot from its pre-resize bounds to the post-resize bounds. // Scale the snapshot from its pre-resize bounds to the post-resize bounds. final Rect snapshotSrc = new Rect(0, 0, snapshotSurface.getWidth(), final Rect snapshotSrc = new Rect(0, 0, snapshotSurface.getWidth(), snapshotSurface.getHeight()); snapshotSurface.getHeight()); final Rect snapshotDest = new Rect(0, 0, destinationBounds.width(), final Rect snapshotDest = new Rect(0, 0, destinationBounds.width(), destinationBounds.height()); destinationBounds.height()); mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest); mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest); t.apply(); mMainExecutor.execute(() -> { mMainExecutor.execute(() -> { // Start animation to fade out the snapshot. // Start animation to fade out the snapshot. Loading @@ -968,10 +957,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, animator.setDuration(mEnterExitAnimationDuration); animator.setDuration(mEnterExitAnimationDuration); animator.addUpdateListener(animation -> { animator.addUpdateListener(animation -> { final float alpha = (float) animation.getAnimatedValue(); final float alpha = (float) animation.getAnimatedValue(); final SurfaceControl.Transaction tx = final SurfaceControl.Transaction transaction = mSurfaceControlTransactionFactory.getTransaction(); mSurfaceControlTransactionFactory.getTransaction(); tx.setAlpha(snapshotSurface, alpha); transaction.setAlpha(snapshotSurface, alpha); tx.apply(); transaction.apply(); }); }); animator.addListener(new AnimatorListenerAdapter() { animator.addListener(new AnimatorListenerAdapter() { @Override @Override Loading @@ -984,7 +973,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, }); }); animator.start(); animator.start(); }); }); } }); }); } else { } else { applyFinishBoundsResize(wct, direction); applyFinishBoundsResize(wct, direction); Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/PipTaskOrganizerTest.java +7 −5 Original line number Original line Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.phone.PhonePipMenuController; import com.android.wm.shell.pip.phone.PhonePipMenuController; Loading @@ -65,8 +66,8 @@ import java.util.Optional; public class PipTaskOrganizerTest extends ShellTestCase { public class PipTaskOrganizerTest extends ShellTestCase { private PipTaskOrganizer mSpiedPipTaskOrganizer; private PipTaskOrganizer mSpiedPipTaskOrganizer; @Mock private DisplayController mMockdDisplayController; @Mock private DisplayController mMockDisplayController; @Mock private SyncTransactionQueue mMockSyncTransactionQueue; @Mock private PhonePipMenuController mMockPhonePipMenuController; @Mock private PhonePipMenuController mMockPhonePipMenuController; @Mock private PipAnimationController mMockPipAnimationController; @Mock private PipAnimationController mMockPipAnimationController; @Mock private PipTransitionController mMockPipTransitionController; @Mock private PipTransitionController mMockPipTransitionController; Loading @@ -89,10 +90,11 @@ public class PipTaskOrganizerTest extends ShellTestCase { mPipBoundsState = new PipBoundsState(mContext); mPipBoundsState = new PipBoundsState(mContext); mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState); mMainExecutor = new TestShellExecutor(); mMainExecutor = new TestShellExecutor(); mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mPipBoundsState, mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mMockSyncTransactionQueue, mPipBoundsState, mPipBoundsAlgorithm, mMockPhonePipMenuController, mPipBoundsAlgorithm, mMockPhonePipMenuController, mMockPipAnimationController, mMockPipSurfaceTransactionHelper, mMockPipAnimationController, mMockPipSurfaceTransactionHelper, mMockPipTransitionController, mMockOptionalSplitScreen, mMockdDisplayController, mMockPipTransitionController, mMockOptionalSplitScreen, mMockDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer, mMainExecutor)); mMockPipUiEventLogger, mMockShellTaskOrganizer, mMainExecutor)); mMainExecutor.flushAll(); mMainExecutor.flushAll(); preparePipTaskOrg(); preparePipTaskOrg(); Loading @@ -105,7 +107,7 @@ public class PipTaskOrganizerTest extends ShellTestCase { @Test @Test public void instantiatePipTaskOrganizer_addsDisplayWindowListener() { public void instantiatePipTaskOrganizer_addsDisplayWindowListener() { verify(mMockdDisplayController).addDisplayWindowListener(any()); verify(mMockDisplayController).addDisplayWindowListener(any()); } } @Test @Test Loading
packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -19,16 +19,15 @@ package com.android.systemui.wmshell; import android.content.Context; import android.content.Context; import android.os.Handler; import android.os.Handler; import com.android.systemui.dagger.WMComponent; import com.android.systemui.dagger.WMSingleton; import com.android.systemui.dagger.WMSingleton; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipAnimationController; Loading Loading @@ -140,6 +139,7 @@ public abstract class TvPipModule { @Provides @Provides static PipTaskOrganizer providePipTaskOrganizer(Context context, static PipTaskOrganizer providePipTaskOrganizer(Context context, TvPipMenuController tvPipMenuController, TvPipMenuController tvPipMenuController, SyncTransactionQueue syncTransactionQueue, PipBoundsState pipBoundsState, PipBoundsState pipBoundsState, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsAlgorithm pipBoundsAlgorithm, PipAnimationController pipAnimationController, PipAnimationController pipAnimationController, Loading @@ -149,7 +149,8 @@ public abstract class TvPipModule { DisplayController displayController, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm, return new PipTaskOrganizer(context, syncTransactionQueue, pipBoundsState, pipBoundsAlgorithm, tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper, tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); shellTaskOrganizer, mainExecutor); Loading
packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -172,6 +172,7 @@ public class WMShellModule { @WMSingleton @WMSingleton @Provides @Provides static PipTaskOrganizer providePipTaskOrganizer(Context context, static PipTaskOrganizer providePipTaskOrganizer(Context context, SyncTransactionQueue syncTransactionQueue, PipBoundsState pipBoundsState, PipBoundsState pipBoundsState, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsAlgorithm pipBoundsAlgorithm, PhonePipMenuController menuPhoneController, PhonePipMenuController menuPhoneController, Loading @@ -182,7 +183,8 @@ public class WMShellModule { DisplayController displayController, DisplayController displayController, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor) { return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm, return new PipTaskOrganizer(context, syncTransactionQueue, pipBoundsState, pipBoundsAlgorithm, menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper, menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor); shellTaskOrganizer, mainExecutor); Loading