Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +36 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import androidx.annotation.NonNull; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.R; import com.android.wm.shell.common.ScreenshotUtils; import com.android.wm.shell.common.SurfaceUtils; import java.util.function.Consumer; Loading @@ -74,10 +75,14 @@ public class SplitDecorManager extends WindowlessWindowManager { private boolean mShown; private boolean mIsResizing; private Rect mBounds = new Rect(); private final Rect mBounds = new Rect(); private final Rect mResizingBounds = new Rect(); private final Rect mTempRect = new Rect(); private ValueAnimator mFadeAnimator; private int mIconSize; private int mOffsetX; private int mOffsetY; public SplitDecorManager(Configuration configuration, IconProvider iconProvider, SurfaceSession surfaceSession) { Loading Loading @@ -158,7 +163,7 @@ public class SplitDecorManager extends WindowlessWindowManager { /** Showing resizing hint. */ public void onResizing(ActivityManager.RunningTaskInfo resizingTask, Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t) { Rect sideBounds, SurfaceControl.Transaction t, int offsetX, int offsetY) { if (mResizingIconView == null) { return; } Loading @@ -167,6 +172,9 @@ public class SplitDecorManager extends WindowlessWindowManager { mIsResizing = true; mBounds.set(newBounds); } mResizingBounds.set(newBounds); mOffsetX = offsetX; mOffsetY = offsetY; final boolean show = newBounds.width() > mBounds.width() || newBounds.height() > mBounds.height(); Loading Loading @@ -221,11 +229,37 @@ public class SplitDecorManager extends WindowlessWindowManager { /** Stops showing resizing hint. */ public void onResized(SurfaceControl.Transaction t) { if (!mShown && mIsResizing) { mTempRect.set(mResizingBounds); mTempRect.offsetTo(-mOffsetX, -mOffsetY); final SurfaceControl screenshot = ScreenshotUtils.takeScreenshot(t, mHostLeash, mTempRect, Integer.MAX_VALUE - 1); final SurfaceControl.Transaction animT = new SurfaceControl.Transaction(); final ValueAnimator va = ValueAnimator.ofFloat(1, 0); va.addUpdateListener(valueAnimator -> { final float progress = (float) valueAnimator.getAnimatedValue(); animT.setAlpha(screenshot, progress); animT.apply(); }); va.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(@androidx.annotation.NonNull Animator animation) { animT.remove(screenshot); animT.apply(); animT.close(); } }); va.start(); } if (mResizingIconView == null) { return; } mIsResizing = false; mOffsetX = 0; mOffsetY = 0; if (mFadeAnimator != null && mFadeAnimator.isRunning()) { if (!mShown) { // If fade-out animation is running, just add release callback to it. Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +3 −2 Original line number Diff line number Diff line Loading @@ -448,7 +448,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange */ void updateDivideBounds(int position) { updateBounds(position); mSplitLayoutHandler.onLayoutSizeChanging(this); mSplitLayoutHandler.onLayoutSizeChanging(this, mSurfaceEffectPolicy.mParallaxOffset.x, mSurfaceEffectPolicy.mParallaxOffset.y); } void setDividePosition(int position, boolean applyLayoutChange) { Loading Loading @@ -811,7 +812,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange * @see #applySurfaceChanges(SurfaceControl.Transaction, SurfaceControl, SurfaceControl, * SurfaceControl, SurfaceControl, boolean) */ void onLayoutSizeChanging(SplitLayout layout); void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY); /** * Calls when finish resizing the split bounds. Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +3 −3 Original line number Diff line number Diff line Loading @@ -1633,14 +1633,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } @Override public void onLayoutSizeChanging(SplitLayout layout) { public void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY) { final SurfaceControl.Transaction t = mTransactionPool.acquire(); t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId()); updateSurfaceBounds(layout, t, true /* applyResizingOffset */); getMainStageBounds(mTempRect1); getSideStageBounds(mTempRect2); mMainStage.onResizing(mTempRect1, mTempRect2, t); mSideStage.onResizing(mTempRect2, mTempRect1, t); mMainStage.onResizing(mTempRect1, mTempRect2, t, offsetX, offsetY); mSideStage.onResizing(mTempRect2, mTempRect1, t, offsetX, offsetY); t.apply(); mTransactionPool.release(t); } Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +4 −2 Original line number Diff line number Diff line Loading @@ -288,9 +288,11 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t) { void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t, int offsetX, int offsetY) { if (mSplitDecorManager != null && mRootTaskInfo != null) { mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t); mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t, offsetX, offsetY); } } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java +2 −1 Original line number Diff line number Diff line Loading @@ -105,7 +105,8 @@ public class SplitLayoutTests extends ShellTestCase { @Test public void testUpdateDivideBounds() { mSplitLayout.updateDivideBounds(anyInt()); verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class)); verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class), anyInt(), anyInt()); } @Test Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +36 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import androidx.annotation.NonNull; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.R; import com.android.wm.shell.common.ScreenshotUtils; import com.android.wm.shell.common.SurfaceUtils; import java.util.function.Consumer; Loading @@ -74,10 +75,14 @@ public class SplitDecorManager extends WindowlessWindowManager { private boolean mShown; private boolean mIsResizing; private Rect mBounds = new Rect(); private final Rect mBounds = new Rect(); private final Rect mResizingBounds = new Rect(); private final Rect mTempRect = new Rect(); private ValueAnimator mFadeAnimator; private int mIconSize; private int mOffsetX; private int mOffsetY; public SplitDecorManager(Configuration configuration, IconProvider iconProvider, SurfaceSession surfaceSession) { Loading Loading @@ -158,7 +163,7 @@ public class SplitDecorManager extends WindowlessWindowManager { /** Showing resizing hint. */ public void onResizing(ActivityManager.RunningTaskInfo resizingTask, Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t) { Rect sideBounds, SurfaceControl.Transaction t, int offsetX, int offsetY) { if (mResizingIconView == null) { return; } Loading @@ -167,6 +172,9 @@ public class SplitDecorManager extends WindowlessWindowManager { mIsResizing = true; mBounds.set(newBounds); } mResizingBounds.set(newBounds); mOffsetX = offsetX; mOffsetY = offsetY; final boolean show = newBounds.width() > mBounds.width() || newBounds.height() > mBounds.height(); Loading Loading @@ -221,11 +229,37 @@ public class SplitDecorManager extends WindowlessWindowManager { /** Stops showing resizing hint. */ public void onResized(SurfaceControl.Transaction t) { if (!mShown && mIsResizing) { mTempRect.set(mResizingBounds); mTempRect.offsetTo(-mOffsetX, -mOffsetY); final SurfaceControl screenshot = ScreenshotUtils.takeScreenshot(t, mHostLeash, mTempRect, Integer.MAX_VALUE - 1); final SurfaceControl.Transaction animT = new SurfaceControl.Transaction(); final ValueAnimator va = ValueAnimator.ofFloat(1, 0); va.addUpdateListener(valueAnimator -> { final float progress = (float) valueAnimator.getAnimatedValue(); animT.setAlpha(screenshot, progress); animT.apply(); }); va.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(@androidx.annotation.NonNull Animator animation) { animT.remove(screenshot); animT.apply(); animT.close(); } }); va.start(); } if (mResizingIconView == null) { return; } mIsResizing = false; mOffsetX = 0; mOffsetY = 0; if (mFadeAnimator != null && mFadeAnimator.isRunning()) { if (!mShown) { // If fade-out animation is running, just add release callback to it. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +3 −2 Original line number Diff line number Diff line Loading @@ -448,7 +448,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange */ void updateDivideBounds(int position) { updateBounds(position); mSplitLayoutHandler.onLayoutSizeChanging(this); mSplitLayoutHandler.onLayoutSizeChanging(this, mSurfaceEffectPolicy.mParallaxOffset.x, mSurfaceEffectPolicy.mParallaxOffset.y); } void setDividePosition(int position, boolean applyLayoutChange) { Loading Loading @@ -811,7 +812,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange * @see #applySurfaceChanges(SurfaceControl.Transaction, SurfaceControl, SurfaceControl, * SurfaceControl, SurfaceControl, boolean) */ void onLayoutSizeChanging(SplitLayout layout); void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY); /** * Calls when finish resizing the split bounds. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +3 −3 Original line number Diff line number Diff line Loading @@ -1633,14 +1633,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } @Override public void onLayoutSizeChanging(SplitLayout layout) { public void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY) { final SurfaceControl.Transaction t = mTransactionPool.acquire(); t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId()); updateSurfaceBounds(layout, t, true /* applyResizingOffset */); getMainStageBounds(mTempRect1); getSideStageBounds(mTempRect2); mMainStage.onResizing(mTempRect1, mTempRect2, t); mSideStage.onResizing(mTempRect2, mTempRect1, t); mMainStage.onResizing(mTempRect1, mTempRect2, t, offsetX, offsetY); mSideStage.onResizing(mTempRect2, mTempRect1, t, offsetX, offsetY); t.apply(); mTransactionPool.release(t); } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +4 −2 Original line number Diff line number Diff line Loading @@ -288,9 +288,11 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener { } } void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t) { void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t, int offsetX, int offsetY) { if (mSplitDecorManager != null && mRootTaskInfo != null) { mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t); mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t, offsetX, offsetY); } } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java +2 −1 Original line number Diff line number Diff line Loading @@ -105,7 +105,8 @@ public class SplitLayoutTests extends ShellTestCase { @Test public void testUpdateDivideBounds() { mSplitLayout.updateDivideBounds(anyInt()); verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class)); verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class), anyInt(), anyInt()); } @Test Loading