Loading core/java/android/window/TransitionRequestInfo.java +19 −3 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable private Rect mEndAbsBounds = null; private int mStartRotation = WindowConfiguration.ROTATION_UNDEFINED; private int mEndRotation = WindowConfiguration.ROTATION_UNDEFINED; private boolean mPhysicalDisplayChanged = false; /** Create empty display-change. */ public DisplayChange(int displayId) { Loading Loading @@ -120,6 +121,11 @@ public final class TransitionRequestInfo implements Parcelable { return mEndRotation; } @DataClass.Generated.Member public boolean isPhysicalDisplayChanged() { return mPhysicalDisplayChanged; } @DataClass.Generated.Member public @android.annotation.NonNull DisplayChange setStartAbsBounds(@android.annotation.NonNull Rect value) { mStartAbsBounds = value; Loading @@ -144,6 +150,12 @@ public final class TransitionRequestInfo implements Parcelable { return this; } @DataClass.Generated.Member public @android.annotation.NonNull DisplayChange setPhysicalDisplayChanged( boolean value) { mPhysicalDisplayChanged = value; return this; } @Override @DataClass.Generated.Member public String toString() { Loading @@ -155,7 +167,8 @@ public final class TransitionRequestInfo implements Parcelable { "startAbsBounds = " + mStartAbsBounds + ", " + "endAbsBounds = " + mEndAbsBounds + ", " + "startRotation = " + mStartRotation + ", " + "endRotation = " + mEndRotation + "endRotation = " + mEndRotation + ", " + "physicalDisplayChanged = " + mPhysicalDisplayChanged + " }"; } Loading @@ -166,6 +179,7 @@ public final class TransitionRequestInfo implements Parcelable { // void parcelFieldName(Parcel dest, int flags) { ... } byte flg = 0; if (mPhysicalDisplayChanged) flg |= 0x20; if (mStartAbsBounds != null) flg |= 0x2; if (mEndAbsBounds != null) flg |= 0x4; dest.writeByte(flg); Loading @@ -188,6 +202,7 @@ public final class TransitionRequestInfo implements Parcelable { // static FieldType unparcelFieldName(Parcel in) { ... } byte flg = in.readByte(); boolean physicalDisplayChanged = (flg & 0x20) != 0; int displayId = in.readInt(); Rect startAbsBounds = (flg & 0x2) == 0 ? null : (Rect) in.readTypedObject(Rect.CREATOR); Rect endAbsBounds = (flg & 0x4) == 0 ? null : (Rect) in.readTypedObject(Rect.CREATOR); Loading @@ -199,6 +214,7 @@ public final class TransitionRequestInfo implements Parcelable { this.mEndAbsBounds = endAbsBounds; this.mStartRotation = startRotation; this.mEndRotation = endRotation; this.mPhysicalDisplayChanged = physicalDisplayChanged; // onConstructed(); // You can define this method to get a callback } Loading @@ -218,10 +234,10 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( time = 1639445520915L, time = 1648141181315L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nprivate boolean mPhysicalDisplayChanged\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") @Deprecated private void __metadata() {} Loading libs/WindowManager/Shell/src/com/android/wm/shell/ShellInitImpl.java +5 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.wm.shell.recents.RecentTasksController; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.startingsurface.StartingWindowController; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.unfold.UnfoldTransitionHandler; import java.util.Optional; Loading @@ -56,6 +57,7 @@ public class ShellInitImpl { private final Optional<PipTouchHandler> mPipTouchHandlerOptional; private final FullscreenTaskListener mFullscreenTaskListener; private final Optional<FullscreenUnfoldController> mFullscreenUnfoldController; private final Optional<UnfoldTransitionHandler> mUnfoldTransitionHandler; private final Optional<FreeformTaskListener> mFreeformTaskListenerOptional; private final ShellExecutor mMainExecutor; private final Transitions mTransitions; Loading @@ -77,6 +79,7 @@ public class ShellInitImpl { Optional<PipTouchHandler> pipTouchHandlerOptional, FullscreenTaskListener fullscreenTaskListener, Optional<FullscreenUnfoldController> fullscreenUnfoldTransitionController, Optional<UnfoldTransitionHandler> unfoldTransitionHandler, Optional<FreeformTaskListener> freeformTaskListenerOptional, Optional<RecentTasksController> recentTasks, Transitions transitions, Loading @@ -94,6 +97,7 @@ public class ShellInitImpl { mFullscreenTaskListener = fullscreenTaskListener; mPipTouchHandlerOptional = pipTouchHandlerOptional; mFullscreenUnfoldController = fullscreenUnfoldTransitionController; mUnfoldTransitionHandler = unfoldTransitionHandler; mFreeformTaskListenerOptional = freeformTaskListenerOptional; mRecentTasks = recentTasks; mTransitions = transitions; Loading Loading @@ -126,6 +130,7 @@ public class ShellInitImpl { if (Transitions.ENABLE_SHELL_TRANSITIONS) { mTransitions.register(mShellTaskOrganizer); mUnfoldTransitionHandler.ifPresent(UnfoldTransitionHandler::init); } // TODO(b/181599115): This should really be the pip controller, but until we can provide the Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +18 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import com.android.wm.shell.tasksurfacehelper.TaskSurfaceHelperController; import com.android.wm.shell.transition.ShellTransitions; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.unfold.ShellUnfoldProgressProvider; import com.android.wm.shell.unfold.UnfoldTransitionHandler; import java.util.Optional; Loading Loading @@ -327,6 +328,21 @@ public abstract class WMShellBaseModule { return Optional.empty(); } @WMSingleton @Provides static Optional<UnfoldTransitionHandler> provideUnfoldTransitionHandler( Optional<ShellUnfoldProgressProvider> progressProvider, TransactionPool transactionPool, Transitions transitions, @ShellMainThread ShellExecutor executor) { if (progressProvider.isPresent()) { return Optional.of( new UnfoldTransitionHandler(progressProvider.get(), transactionPool, executor, transitions)); } return Optional.empty(); } // // Freeform (optional feature) // Loading Loading @@ -660,6 +676,7 @@ public abstract class WMShellBaseModule { Optional<PipTouchHandler> pipTouchHandlerOptional, FullscreenTaskListener fullscreenTaskListener, Optional<FullscreenUnfoldController> appUnfoldTransitionController, Optional<UnfoldTransitionHandler> unfoldTransitionHandler, Optional<FreeformTaskListener> freeformTaskListener, Optional<RecentTasksController> recentTasksOptional, Transitions transitions, Loading @@ -677,6 +694,7 @@ public abstract class WMShellBaseModule { pipTouchHandlerOptional, fullscreenTaskListener, appUnfoldTransitionController, unfoldTransitionHandler, freeformTaskListener, recentTasksOptional, transitions, Loading libs/WindowManager/Shell/src/com/android/wm/shell/unfold/UnfoldTransitionHandler.java 0 → 100644 +130 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wm.shell.unfold; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.view.WindowManager.TRANSIT_CHANGE; import android.os.IBinder; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.transition.Transitions.TransitionFinishCallback; import com.android.wm.shell.transition.Transitions.TransitionHandler; import com.android.wm.shell.unfold.ShellUnfoldProgressProvider.UnfoldListener; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; public class UnfoldTransitionHandler implements TransitionHandler, UnfoldListener { private final ShellUnfoldProgressProvider mUnfoldProgressProvider; private final Transitions mTransitions; private final Executor mExecutor; private final TransactionPool mTransactionPool; @Nullable private TransitionFinishCallback mFinishCallback; @Nullable private IBinder mTransition; private final List<TransitionInfo.Change> mAnimatedFullscreenTasks = new ArrayList<>(); public UnfoldTransitionHandler(ShellUnfoldProgressProvider unfoldProgressProvider, TransactionPool transactionPool, Executor executor, Transitions transitions) { mUnfoldProgressProvider = unfoldProgressProvider; mTransactionPool = transactionPool; mExecutor = executor; mTransitions = transitions; } public void init() { mTransitions.addHandler(this); mUnfoldProgressProvider.addListener(mExecutor, this); } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull TransitionFinishCallback finishCallback) { if (transition != mTransition) return false; startTransaction.apply(); mAnimatedFullscreenTasks.clear(); info.getChanges().forEach(change -> { final boolean allowedToAnimate = change.getTaskInfo() != null && change.getTaskInfo().getWindowingMode() == WINDOWING_MODE_FULLSCREEN && change.getTaskInfo().getActivityType() != ACTIVITY_TYPE_HOME && change.getMode() == TRANSIT_CHANGE; if (allowedToAnimate) { mAnimatedFullscreenTasks.add(change); } }); mFinishCallback = finishCallback; mTransition = null; return true; } @Override public void onStateChangeProgress(float progress) { mAnimatedFullscreenTasks.forEach(change -> { final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); // TODO: this is a placeholder animation, replace with a spec version in the next CLs final float testScale = 0.8f + 0.2f * progress; transaction.setScale(change.getLeash(), testScale, testScale); transaction.apply(); mTransactionPool.release(transaction); }); } @Override public void onStateChangeFinished() { if (mFinishCallback != null) { mFinishCallback.onTransitionFinished(null, null); mFinishCallback = null; mAnimatedFullscreenTasks.clear(); } } @Nullable @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { if (request.getType() == TRANSIT_CHANGE && request.getDisplayChange() != null && request.getDisplayChange().isPhysicalDisplayChanged()) { mTransition = transition; return new WindowContainerTransaction(); } return null; } } services/core/java/com/android/server/wm/DisplayContent.java +11 −0 Original line number Diff line number Diff line Loading @@ -551,6 +551,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final FixedRotationTransitionListener mFixedRotationTransitionListener = new FixedRotationTransitionListener(); private PhysicalDisplaySwitchTransitionLauncher mDisplaySwitchTransitionLauncher; /** Windows added since {@link #mCurrentFocus} was set to null. Used for ANR blaming. */ final ArrayList<WindowState> mWinAddedSinceNullFocus = new ArrayList<>(); Loading Loading @@ -1043,6 +1045,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mAppTransitionController = new AppTransitionController(mWmService, this); mTransitionController.registerLegacyListener(mFixedRotationTransitionListener); mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this); mDisplaySwitchTransitionLauncher = new PhysicalDisplaySwitchTransitionLauncher(this, mTransitionController); final InputChannel inputChannel = mWmService.mInputManager.monitorInput( "PointerEventDispatcher" + mDisplayId, mDisplayId); Loading Loading @@ -2751,6 +2755,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // metrics are updated as rotation settings might depend on them mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this, /* includeRotationSettings */ false); mDisplaySwitchTransitionLauncher.requestDisplaySwitchTransitionIfNeeded(mDisplayId, mInitialDisplayWidth, mInitialDisplayHeight, newWidth, newHeight); } // If there is an override set for base values - use it, otherwise use new values. Loading Loading @@ -2779,6 +2785,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInitialRoundedCorners = newRoundedCorners; mCurrentUniqueDisplayId = newUniqueId; reconfigureDisplayLocked(); if (physicalDisplayChanged) { mDisplaySwitchTransitionLauncher.onDisplayUpdated(); } } } Loading Loading @@ -3105,6 +3115,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mTransitionController.unregisterLegacyListener(mFixedRotationTransitionListener); handleAnimatingStoppedAndTransition(); mWmService.stopFreezingDisplayLocked(); mDisplaySwitchTransitionLauncher.destroy(); super.removeImmediately(); if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this); mPointerEventDispatcher.dispose(); Loading Loading
core/java/android/window/TransitionRequestInfo.java +19 −3 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ public final class TransitionRequestInfo implements Parcelable { @Nullable private Rect mEndAbsBounds = null; private int mStartRotation = WindowConfiguration.ROTATION_UNDEFINED; private int mEndRotation = WindowConfiguration.ROTATION_UNDEFINED; private boolean mPhysicalDisplayChanged = false; /** Create empty display-change. */ public DisplayChange(int displayId) { Loading Loading @@ -120,6 +121,11 @@ public final class TransitionRequestInfo implements Parcelable { return mEndRotation; } @DataClass.Generated.Member public boolean isPhysicalDisplayChanged() { return mPhysicalDisplayChanged; } @DataClass.Generated.Member public @android.annotation.NonNull DisplayChange setStartAbsBounds(@android.annotation.NonNull Rect value) { mStartAbsBounds = value; Loading @@ -144,6 +150,12 @@ public final class TransitionRequestInfo implements Parcelable { return this; } @DataClass.Generated.Member public @android.annotation.NonNull DisplayChange setPhysicalDisplayChanged( boolean value) { mPhysicalDisplayChanged = value; return this; } @Override @DataClass.Generated.Member public String toString() { Loading @@ -155,7 +167,8 @@ public final class TransitionRequestInfo implements Parcelable { "startAbsBounds = " + mStartAbsBounds + ", " + "endAbsBounds = " + mEndAbsBounds + ", " + "startRotation = " + mStartRotation + ", " + "endRotation = " + mEndRotation + "endRotation = " + mEndRotation + ", " + "physicalDisplayChanged = " + mPhysicalDisplayChanged + " }"; } Loading @@ -166,6 +179,7 @@ public final class TransitionRequestInfo implements Parcelable { // void parcelFieldName(Parcel dest, int flags) { ... } byte flg = 0; if (mPhysicalDisplayChanged) flg |= 0x20; if (mStartAbsBounds != null) flg |= 0x2; if (mEndAbsBounds != null) flg |= 0x4; dest.writeByte(flg); Loading @@ -188,6 +202,7 @@ public final class TransitionRequestInfo implements Parcelable { // static FieldType unparcelFieldName(Parcel in) { ... } byte flg = in.readByte(); boolean physicalDisplayChanged = (flg & 0x20) != 0; int displayId = in.readInt(); Rect startAbsBounds = (flg & 0x2) == 0 ? null : (Rect) in.readTypedObject(Rect.CREATOR); Rect endAbsBounds = (flg & 0x4) == 0 ? null : (Rect) in.readTypedObject(Rect.CREATOR); Loading @@ -199,6 +214,7 @@ public final class TransitionRequestInfo implements Parcelable { this.mEndAbsBounds = endAbsBounds; this.mStartRotation = startRotation; this.mEndRotation = endRotation; this.mPhysicalDisplayChanged = physicalDisplayChanged; // onConstructed(); // You can define this method to get a callback } Loading @@ -218,10 +234,10 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( time = 1639445520915L, time = 1648141181315L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nprivate boolean mPhysicalDisplayChanged\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)") @Deprecated private void __metadata() {} Loading
libs/WindowManager/Shell/src/com/android/wm/shell/ShellInitImpl.java +5 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.wm.shell.recents.RecentTasksController; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.startingsurface.StartingWindowController; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.unfold.UnfoldTransitionHandler; import java.util.Optional; Loading @@ -56,6 +57,7 @@ public class ShellInitImpl { private final Optional<PipTouchHandler> mPipTouchHandlerOptional; private final FullscreenTaskListener mFullscreenTaskListener; private final Optional<FullscreenUnfoldController> mFullscreenUnfoldController; private final Optional<UnfoldTransitionHandler> mUnfoldTransitionHandler; private final Optional<FreeformTaskListener> mFreeformTaskListenerOptional; private final ShellExecutor mMainExecutor; private final Transitions mTransitions; Loading @@ -77,6 +79,7 @@ public class ShellInitImpl { Optional<PipTouchHandler> pipTouchHandlerOptional, FullscreenTaskListener fullscreenTaskListener, Optional<FullscreenUnfoldController> fullscreenUnfoldTransitionController, Optional<UnfoldTransitionHandler> unfoldTransitionHandler, Optional<FreeformTaskListener> freeformTaskListenerOptional, Optional<RecentTasksController> recentTasks, Transitions transitions, Loading @@ -94,6 +97,7 @@ public class ShellInitImpl { mFullscreenTaskListener = fullscreenTaskListener; mPipTouchHandlerOptional = pipTouchHandlerOptional; mFullscreenUnfoldController = fullscreenUnfoldTransitionController; mUnfoldTransitionHandler = unfoldTransitionHandler; mFreeformTaskListenerOptional = freeformTaskListenerOptional; mRecentTasks = recentTasks; mTransitions = transitions; Loading Loading @@ -126,6 +130,7 @@ public class ShellInitImpl { if (Transitions.ENABLE_SHELL_TRANSITIONS) { mTransitions.register(mShellTaskOrganizer); mUnfoldTransitionHandler.ifPresent(UnfoldTransitionHandler::init); } // TODO(b/181599115): This should really be the pip controller, but until we can provide the Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +18 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import com.android.wm.shell.tasksurfacehelper.TaskSurfaceHelperController; import com.android.wm.shell.transition.ShellTransitions; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.unfold.ShellUnfoldProgressProvider; import com.android.wm.shell.unfold.UnfoldTransitionHandler; import java.util.Optional; Loading Loading @@ -327,6 +328,21 @@ public abstract class WMShellBaseModule { return Optional.empty(); } @WMSingleton @Provides static Optional<UnfoldTransitionHandler> provideUnfoldTransitionHandler( Optional<ShellUnfoldProgressProvider> progressProvider, TransactionPool transactionPool, Transitions transitions, @ShellMainThread ShellExecutor executor) { if (progressProvider.isPresent()) { return Optional.of( new UnfoldTransitionHandler(progressProvider.get(), transactionPool, executor, transitions)); } return Optional.empty(); } // // Freeform (optional feature) // Loading Loading @@ -660,6 +676,7 @@ public abstract class WMShellBaseModule { Optional<PipTouchHandler> pipTouchHandlerOptional, FullscreenTaskListener fullscreenTaskListener, Optional<FullscreenUnfoldController> appUnfoldTransitionController, Optional<UnfoldTransitionHandler> unfoldTransitionHandler, Optional<FreeformTaskListener> freeformTaskListener, Optional<RecentTasksController> recentTasksOptional, Transitions transitions, Loading @@ -677,6 +694,7 @@ public abstract class WMShellBaseModule { pipTouchHandlerOptional, fullscreenTaskListener, appUnfoldTransitionController, unfoldTransitionHandler, freeformTaskListener, recentTasksOptional, transitions, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/unfold/UnfoldTransitionHandler.java 0 → 100644 +130 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wm.shell.unfold; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.view.WindowManager.TRANSIT_CHANGE; import android.os.IBinder; import android.view.SurfaceControl; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.transition.Transitions.TransitionFinishCallback; import com.android.wm.shell.transition.Transitions.TransitionHandler; import com.android.wm.shell.unfold.ShellUnfoldProgressProvider.UnfoldListener; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; public class UnfoldTransitionHandler implements TransitionHandler, UnfoldListener { private final ShellUnfoldProgressProvider mUnfoldProgressProvider; private final Transitions mTransitions; private final Executor mExecutor; private final TransactionPool mTransactionPool; @Nullable private TransitionFinishCallback mFinishCallback; @Nullable private IBinder mTransition; private final List<TransitionInfo.Change> mAnimatedFullscreenTasks = new ArrayList<>(); public UnfoldTransitionHandler(ShellUnfoldProgressProvider unfoldProgressProvider, TransactionPool transactionPool, Executor executor, Transitions transitions) { mUnfoldProgressProvider = unfoldProgressProvider; mTransactionPool = transactionPool; mExecutor = executor; mTransitions = transitions; } public void init() { mTransitions.addHandler(this); mUnfoldProgressProvider.addListener(mExecutor, this); } @Override public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull TransitionFinishCallback finishCallback) { if (transition != mTransition) return false; startTransaction.apply(); mAnimatedFullscreenTasks.clear(); info.getChanges().forEach(change -> { final boolean allowedToAnimate = change.getTaskInfo() != null && change.getTaskInfo().getWindowingMode() == WINDOWING_MODE_FULLSCREEN && change.getTaskInfo().getActivityType() != ACTIVITY_TYPE_HOME && change.getMode() == TRANSIT_CHANGE; if (allowedToAnimate) { mAnimatedFullscreenTasks.add(change); } }); mFinishCallback = finishCallback; mTransition = null; return true; } @Override public void onStateChangeProgress(float progress) { mAnimatedFullscreenTasks.forEach(change -> { final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); // TODO: this is a placeholder animation, replace with a spec version in the next CLs final float testScale = 0.8f + 0.2f * progress; transaction.setScale(change.getLeash(), testScale, testScale); transaction.apply(); mTransactionPool.release(transaction); }); } @Override public void onStateChangeFinished() { if (mFinishCallback != null) { mFinishCallback.onTransitionFinished(null, null); mFinishCallback = null; mAnimatedFullscreenTasks.clear(); } } @Nullable @Override public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @NonNull TransitionRequestInfo request) { if (request.getType() == TRANSIT_CHANGE && request.getDisplayChange() != null && request.getDisplayChange().isPhysicalDisplayChanged()) { mTransition = transition; return new WindowContainerTransaction(); } return null; } }
services/core/java/com/android/server/wm/DisplayContent.java +11 −0 Original line number Diff line number Diff line Loading @@ -551,6 +551,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final FixedRotationTransitionListener mFixedRotationTransitionListener = new FixedRotationTransitionListener(); private PhysicalDisplaySwitchTransitionLauncher mDisplaySwitchTransitionLauncher; /** Windows added since {@link #mCurrentFocus} was set to null. Used for ANR blaming. */ final ArrayList<WindowState> mWinAddedSinceNullFocus = new ArrayList<>(); Loading Loading @@ -1043,6 +1045,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mAppTransitionController = new AppTransitionController(mWmService, this); mTransitionController.registerLegacyListener(mFixedRotationTransitionListener); mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this); mDisplaySwitchTransitionLauncher = new PhysicalDisplaySwitchTransitionLauncher(this, mTransitionController); final InputChannel inputChannel = mWmService.mInputManager.monitorInput( "PointerEventDispatcher" + mDisplayId, mDisplayId); Loading Loading @@ -2751,6 +2755,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // metrics are updated as rotation settings might depend on them mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this, /* includeRotationSettings */ false); mDisplaySwitchTransitionLauncher.requestDisplaySwitchTransitionIfNeeded(mDisplayId, mInitialDisplayWidth, mInitialDisplayHeight, newWidth, newHeight); } // If there is an override set for base values - use it, otherwise use new values. Loading Loading @@ -2779,6 +2785,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInitialRoundedCorners = newRoundedCorners; mCurrentUniqueDisplayId = newUniqueId; reconfigureDisplayLocked(); if (physicalDisplayChanged) { mDisplaySwitchTransitionLauncher.onDisplayUpdated(); } } } Loading Loading @@ -3105,6 +3115,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mTransitionController.unregisterLegacyListener(mFixedRotationTransitionListener); handleAnimatingStoppedAndTransition(); mWmService.stopFreezingDisplayLocked(); mDisplaySwitchTransitionLauncher.destroy(); super.removeImmediately(); if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this); mPointerEventDispatcher.dispose(); Loading