Loading core/java/android/window/BackAnimationAdapter.java +32 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,12 @@ package android.window; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; /** * Object that describes how to run a remote back animation. * Loading @@ -26,6 +29,7 @@ import android.os.Parcelable; */ public class BackAnimationAdapter implements Parcelable { private final IBackAnimationRunner mRunner; private int[] mSupportedAnimators; public BackAnimationAdapter(IBackAnimationRunner runner) { mRunner = runner; Loading @@ -33,12 +37,23 @@ public class BackAnimationAdapter implements Parcelable { public BackAnimationAdapter(Parcel in) { mRunner = IBackAnimationRunner.Stub.asInterface(in.readStrongBinder()); mSupportedAnimators = new int[in.readInt()]; in.readIntArray(mSupportedAnimators); } public IBackAnimationRunner getRunner() { return mRunner; } /** Update the latest animators in the system. */ public void updateSupportedAnimators(@NonNull ArrayList<Integer> animators) { final int size = animators.size(); mSupportedAnimators = new int[size]; for (int i = size - 1; i >= 0; --i) { mSupportedAnimators[i] = animators.get(i); } } @Override public int describeContents() { return 0; Loading @@ -47,6 +62,8 @@ public class BackAnimationAdapter implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeStrongInterface(mRunner); dest.writeInt(mSupportedAnimators.length); dest.writeIntArray(mSupportedAnimators); } public static final @android.annotation.NonNull Creator<BackAnimationAdapter> CREATOR = Loading @@ -59,4 +76,19 @@ public class BackAnimationAdapter implements Parcelable { return new BackAnimationAdapter[size]; } }; /** * Check if the back type is animatable. */ public boolean isAnimatable(@BackNavigationInfo.BackTargetType int backType) { if (mSupportedAnimators == null) { return false; } for (int i = mSupportedAnimators.length - 1; i >= 0; --i) { if (backType == mSupportedAnimators[i]) { return true; } } return false; } } libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +7 −1 Original line number Diff line number Diff line Loading @@ -573,8 +573,14 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private void startBackNavigation(@NonNull BackTouchTracker touchTracker) { try { startLatencyTracking(); final BackAnimationAdapter adapter = mEnableAnimations.get() ? mBackAnimationAdapter : null; if (adapter != null && mShellBackAnimationRegistry.hasSupportedAnimatorsChanged()) { adapter.updateSupportedAnimators( mShellBackAnimationRegistry.getSupportedAnimators()); } mBackNavigationInfo = mActivityTaskManager.startBackNavigation( mNavigationObserver, mEnableAnimations.get() ? mBackAnimationAdapter : null); mNavigationObserver, adapter); onBackNavigationInfoReceived(mBackNavigationInfo, touchTracker); } catch (RemoteException remoteException) { Log.e(TAG, "Failed to initAnimation", remoteException); Loading libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java +24 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.util.Log; import android.util.SparseArray; import android.window.BackNavigationInfo; import java.util.ArrayList; /** Registry for all types of default back animations */ public class ShellBackAnimationRegistry { private static final String TAG = "ShellBackPreview"; Loading @@ -31,6 +33,8 @@ public class ShellBackAnimationRegistry { private ShellBackAnimation mDefaultCrossActivityAnimation; private final ShellBackAnimation mCustomizeActivityAnimation; private final ShellBackAnimation mCrossTaskAnimation; private boolean mSupportedAnimatorsChanged = false; private final ArrayList<Integer> mSupportedAnimators = new ArrayList<>(); public ShellBackAnimationRegistry( @ShellBackAnimation.CrossActivity @Nullable ShellBackAnimation crossActivityAnimation, Loading Loading @@ -60,7 +64,7 @@ public class ShellBackAnimationRegistry { mDefaultCrossActivityAnimation = crossActivityAnimation; mCustomizeActivityAnimation = customizeActivityAnimation; mCrossTaskAnimation = crossTaskAnimation; updateSupportedAnimators(); // TODO(b/236760237): register dialog close animation when it's completed. } Loading @@ -71,6 +75,7 @@ public class ShellBackAnimationRegistry { if (BackNavigationInfo.TYPE_CROSS_ACTIVITY == type) { mDefaultCrossActivityAnimation = null; } updateSupportedAnimators(); } void unregisterAnimation(@BackNavigationInfo.BackTargetType int type) { Loading @@ -79,6 +84,24 @@ public class ShellBackAnimationRegistry { if (BackNavigationInfo.TYPE_CROSS_ACTIVITY == type) { mDefaultCrossActivityAnimation = null; } updateSupportedAnimators(); } private void updateSupportedAnimators() { mSupportedAnimators.clear(); for (int i = mAnimationDefinition.size() - 1; i >= 0; --i) { mSupportedAnimators.add(mAnimationDefinition.keyAt(i)); } mSupportedAnimatorsChanged = true; } boolean hasSupportedAnimatorsChanged() { return mSupportedAnimatorsChanged; } ArrayList<Integer> getSupportedAnimators() { mSupportedAnimatorsChanged = false; return mSupportedAnimators; } /** Loading services/core/java/com/android/server/wm/BackNavigationController.java +1 −2 Original line number Diff line number Diff line Loading @@ -339,13 +339,12 @@ class BackNavigationController { removedWindowContainer, BackNavigationInfo.typeToString(backType)); // For now, we only animate when going home, cross task or cross-activity. boolean prepareAnimation = (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME || backType == BackNavigationInfo.TYPE_CROSS_TASK || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY || backType == BackNavigationInfo.TYPE_DIALOG_CLOSE) && adapter != null; && (adapter != null && adapter.isAnimatable(backType)); if (prepareAnimation) { final AnimationHandler.ScheduleAnimationBuilder builder = Loading services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +1 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { mWindowManagerInternal = mock(WindowManagerInternal.class); LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal); mBackAnimationAdapter = mock(BackAnimationAdapter.class); doReturn(true).when(mBackAnimationAdapter).isAnimatable(anyInt()); mNavigationMonitor = mock(BackNavigationController.NavigationMonitor.class); mRootHomeTask = initHomeActivity(); } Loading Loading
core/java/android/window/BackAnimationAdapter.java +32 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,12 @@ package android.window; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; /** * Object that describes how to run a remote back animation. * Loading @@ -26,6 +29,7 @@ import android.os.Parcelable; */ public class BackAnimationAdapter implements Parcelable { private final IBackAnimationRunner mRunner; private int[] mSupportedAnimators; public BackAnimationAdapter(IBackAnimationRunner runner) { mRunner = runner; Loading @@ -33,12 +37,23 @@ public class BackAnimationAdapter implements Parcelable { public BackAnimationAdapter(Parcel in) { mRunner = IBackAnimationRunner.Stub.asInterface(in.readStrongBinder()); mSupportedAnimators = new int[in.readInt()]; in.readIntArray(mSupportedAnimators); } public IBackAnimationRunner getRunner() { return mRunner; } /** Update the latest animators in the system. */ public void updateSupportedAnimators(@NonNull ArrayList<Integer> animators) { final int size = animators.size(); mSupportedAnimators = new int[size]; for (int i = size - 1; i >= 0; --i) { mSupportedAnimators[i] = animators.get(i); } } @Override public int describeContents() { return 0; Loading @@ -47,6 +62,8 @@ public class BackAnimationAdapter implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeStrongInterface(mRunner); dest.writeInt(mSupportedAnimators.length); dest.writeIntArray(mSupportedAnimators); } public static final @android.annotation.NonNull Creator<BackAnimationAdapter> CREATOR = Loading @@ -59,4 +76,19 @@ public class BackAnimationAdapter implements Parcelable { return new BackAnimationAdapter[size]; } }; /** * Check if the back type is animatable. */ public boolean isAnimatable(@BackNavigationInfo.BackTargetType int backType) { if (mSupportedAnimators == null) { return false; } for (int i = mSupportedAnimators.length - 1; i >= 0; --i) { if (backType == mSupportedAnimators[i]) { return true; } } return false; } }
libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +7 −1 Original line number Diff line number Diff line Loading @@ -573,8 +573,14 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private void startBackNavigation(@NonNull BackTouchTracker touchTracker) { try { startLatencyTracking(); final BackAnimationAdapter adapter = mEnableAnimations.get() ? mBackAnimationAdapter : null; if (adapter != null && mShellBackAnimationRegistry.hasSupportedAnimatorsChanged()) { adapter.updateSupportedAnimators( mShellBackAnimationRegistry.getSupportedAnimators()); } mBackNavigationInfo = mActivityTaskManager.startBackNavigation( mNavigationObserver, mEnableAnimations.get() ? mBackAnimationAdapter : null); mNavigationObserver, adapter); onBackNavigationInfoReceived(mBackNavigationInfo, touchTracker); } catch (RemoteException remoteException) { Log.e(TAG, "Failed to initAnimation", remoteException); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/back/ShellBackAnimationRegistry.java +24 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.util.Log; import android.util.SparseArray; import android.window.BackNavigationInfo; import java.util.ArrayList; /** Registry for all types of default back animations */ public class ShellBackAnimationRegistry { private static final String TAG = "ShellBackPreview"; Loading @@ -31,6 +33,8 @@ public class ShellBackAnimationRegistry { private ShellBackAnimation mDefaultCrossActivityAnimation; private final ShellBackAnimation mCustomizeActivityAnimation; private final ShellBackAnimation mCrossTaskAnimation; private boolean mSupportedAnimatorsChanged = false; private final ArrayList<Integer> mSupportedAnimators = new ArrayList<>(); public ShellBackAnimationRegistry( @ShellBackAnimation.CrossActivity @Nullable ShellBackAnimation crossActivityAnimation, Loading Loading @@ -60,7 +64,7 @@ public class ShellBackAnimationRegistry { mDefaultCrossActivityAnimation = crossActivityAnimation; mCustomizeActivityAnimation = customizeActivityAnimation; mCrossTaskAnimation = crossTaskAnimation; updateSupportedAnimators(); // TODO(b/236760237): register dialog close animation when it's completed. } Loading @@ -71,6 +75,7 @@ public class ShellBackAnimationRegistry { if (BackNavigationInfo.TYPE_CROSS_ACTIVITY == type) { mDefaultCrossActivityAnimation = null; } updateSupportedAnimators(); } void unregisterAnimation(@BackNavigationInfo.BackTargetType int type) { Loading @@ -79,6 +84,24 @@ public class ShellBackAnimationRegistry { if (BackNavigationInfo.TYPE_CROSS_ACTIVITY == type) { mDefaultCrossActivityAnimation = null; } updateSupportedAnimators(); } private void updateSupportedAnimators() { mSupportedAnimators.clear(); for (int i = mAnimationDefinition.size() - 1; i >= 0; --i) { mSupportedAnimators.add(mAnimationDefinition.keyAt(i)); } mSupportedAnimatorsChanged = true; } boolean hasSupportedAnimatorsChanged() { return mSupportedAnimatorsChanged; } ArrayList<Integer> getSupportedAnimators() { mSupportedAnimatorsChanged = false; return mSupportedAnimators; } /** Loading
services/core/java/com/android/server/wm/BackNavigationController.java +1 −2 Original line number Diff line number Diff line Loading @@ -339,13 +339,12 @@ class BackNavigationController { removedWindowContainer, BackNavigationInfo.typeToString(backType)); // For now, we only animate when going home, cross task or cross-activity. boolean prepareAnimation = (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME || backType == BackNavigationInfo.TYPE_CROSS_TASK || backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY || backType == BackNavigationInfo.TYPE_DIALOG_CLOSE) && adapter != null; && (adapter != null && adapter.isAnimatable(backType)); if (prepareAnimation) { final AnimationHandler.ScheduleAnimationBuilder builder = Loading
services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +1 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { mWindowManagerInternal = mock(WindowManagerInternal.class); LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal); mBackAnimationAdapter = mock(BackAnimationAdapter.class); doReturn(true).when(mBackAnimationAdapter).isAnimatable(anyInt()); mNavigationMonitor = mock(BackNavigationController.NavigationMonitor.class); mRootHomeTask = initHomeActivity(); } Loading