Loading packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java +57 −5 Original line number Diff line number Diff line Loading @@ -65,6 +65,9 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements @Nullable private UIComponent.Transaction mOriginTransaction; @Nullable private TransitionAnimationController mAnimationController; @Nullable private SurfaceControl mOriginLeash; @Nullable private IBinder mLocalTransactionToken; @Nullable private IBinder mShellTransactionToken; OriginRemoteTransition( Context context, Loading Loading @@ -131,6 +134,10 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements private void startAnimationInternal( TransitionInfo info, @Nullable WindowAnimationState[] states) { // setup shared transaction queue shareTransactionQueue(); if (!prepareUIs(info)) { logE("Unable to prepare UI!"); finishAnimation(/* finished= */ false); Loading Loading @@ -343,6 +350,7 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements mStartTransaction = null; mOriginTransaction = null; mFinishCallback = null; unshareTransactionQueue(); } public void cancel() { Loading @@ -355,6 +363,50 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements }); } /** * Provide server side (shell) token for use in applying transactions. * @hide */ public void setShellTransactionToken(IBinder shellApplyToken) { mShellTransactionToken = shellApplyToken; } /** * Use server side (shell) transaction-queue instead of local/independent one. This is necessary * if client/server need to coordinate transactions (eg. for shell transitions). */ private void shareTransactionQueue() { if (mLocalTransactionToken == null) { mLocalTransactionToken = SurfaceControl.Transaction.getDefaultApplyToken(); } setupTransactionQueue(); } /** * Switch back to using local processes independent transaction queue. */ private void unshareTransactionQueue() { if (mLocalTransactionToken == null) { return; } SurfaceControl.Transaction.setDefaultApplyToken(mLocalTransactionToken); mLocalTransactionToken = null; mShellTransactionToken = null; } private void setupTransactionQueue() { if (mLocalTransactionToken == null) { return; } if (mShellTransactionToken == null) { Log.e(TAG, "Didn't receive apply token from server side (shell)"); return; } SurfaceControl.Transaction.setDefaultApplyToken(mShellTransactionToken); } private static void logD(String msg) { if (OriginTransitionSession.DEBUG) { Log.d(TAG, msg); Loading packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java +20 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.util.Log; Loading Loading @@ -64,7 +65,6 @@ public class OriginTransitionSession { @Nullable private final IRemoteTransition mEntryTransition; @Nullable private final IRemoteTransition mExitTransition; private final AtomicInteger mState = new AtomicInteger(NOT_STARTED); @Nullable private RemoteTransition mOriginTransition; private OriginTransitionSession( Loading @@ -82,6 +82,7 @@ public class OriginTransitionSession { throw new IllegalArgumentException( "Entry transition must be supplied if you want to play an exit transition!"); } } /** Loading @@ -96,6 +97,8 @@ public class OriginTransitionSession { return false; } setupTransactionQueues(); RemoteTransition remoteTransition = null; if (hasEntryTransition() && hasExitTransition()) { logD("start: starting with entry and exit transition."); Loading Loading @@ -160,6 +163,22 @@ public class OriginTransitionSession { return mOriginTransitions != null && mExitTransition != null; } private void setupTransactionQueues() { final IBinder shellApplyToken; try { shellApplyToken = mOriginTransitions.getDefaultTransactionApplyToken(); } catch (RemoteException e) { Log.e(TAG, "Error getting server side (shell) apply token", e); return; } if (mEntryTransition != null && mEntryTransition instanceof OriginRemoteTransition) { ((OriginRemoteTransition) mEntryTransition).setShellTransactionToken(shellApplyToken); } if (mExitTransition != null && mExitTransition instanceof OriginRemoteTransition) { ((OriginRemoteTransition) mExitTransition).setShellTransactionToken(shellApplyToken); } } private void logD(String msg) { if (DEBUG) { Log.d(TAG, "Session[" + mName + "] - " + msg); Loading packages/SystemUI/animation/lib/src/com/android/systemui/animation/server/IOriginTransitionsImpl.java +6 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,12 @@ public class IOriginTransitionsImpl extends IOriginTransitions.Stub { } } @Override public IBinder getDefaultTransactionApplyToken() { enforceRemoteTransitionPermission(); return SurfaceControl.Transaction.getDefaultApplyToken(); } private void enforceRemoteTransitionPermission() { mContext.enforceCallingPermission( Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, Loading packages/SystemUI/animation/lib/src/com/android/systemui/animation/shared/IOriginTransitions.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -41,4 +41,9 @@ interface IOriginTransitions { * origin transition object will reset to a single frame animation. */ void cancelOriginTransition(in RemoteTransition originTransition) = 2; /** * Returns the token to be used as the default `apply` token with SurfaceControl.Transaction. */ IBinder getDefaultTransactionApplyToken() = 3; } packages/SystemUI/animation/lib/tests/src/com/android/systemui/animation/OriginTransitionSessionTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -336,6 +336,11 @@ public final class OriginTransitionSessionTest { mRecords.remove(originTransition); } @Override public IBinder getDefaultTransactionApplyToken() throws RemoteException { return null; } public void runReturnTransition(RemoteTransition originTransition, TransitionInfo info) { RemoteTransition transition = mRecords.remove(originTransition); try { Loading Loading
packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginRemoteTransition.java +57 −5 Original line number Diff line number Diff line Loading @@ -65,6 +65,9 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements @Nullable private UIComponent.Transaction mOriginTransaction; @Nullable private TransitionAnimationController mAnimationController; @Nullable private SurfaceControl mOriginLeash; @Nullable private IBinder mLocalTransactionToken; @Nullable private IBinder mShellTransactionToken; OriginRemoteTransition( Context context, Loading Loading @@ -131,6 +134,10 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements private void startAnimationInternal( TransitionInfo info, @Nullable WindowAnimationState[] states) { // setup shared transaction queue shareTransactionQueue(); if (!prepareUIs(info)) { logE("Unable to prepare UI!"); finishAnimation(/* finished= */ false); Loading Loading @@ -343,6 +350,7 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements mStartTransaction = null; mOriginTransaction = null; mFinishCallback = null; unshareTransactionQueue(); } public void cancel() { Loading @@ -355,6 +363,50 @@ public class OriginRemoteTransition extends IRemoteTransition.Stub implements }); } /** * Provide server side (shell) token for use in applying transactions. * @hide */ public void setShellTransactionToken(IBinder shellApplyToken) { mShellTransactionToken = shellApplyToken; } /** * Use server side (shell) transaction-queue instead of local/independent one. This is necessary * if client/server need to coordinate transactions (eg. for shell transitions). */ private void shareTransactionQueue() { if (mLocalTransactionToken == null) { mLocalTransactionToken = SurfaceControl.Transaction.getDefaultApplyToken(); } setupTransactionQueue(); } /** * Switch back to using local processes independent transaction queue. */ private void unshareTransactionQueue() { if (mLocalTransactionToken == null) { return; } SurfaceControl.Transaction.setDefaultApplyToken(mLocalTransactionToken); mLocalTransactionToken = null; mShellTransactionToken = null; } private void setupTransactionQueue() { if (mLocalTransactionToken == null) { return; } if (mShellTransactionToken == null) { Log.e(TAG, "Didn't receive apply token from server side (shell)"); return; } SurfaceControl.Transaction.setDefaultApplyToken(mShellTransactionToken); } private static void logD(String msg) { if (OriginTransitionSession.DEBUG) { Log.d(TAG, msg); Loading
packages/SystemUI/animation/lib/src/com/android/systemui/animation/OriginTransitionSession.java +20 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.util.Log; Loading Loading @@ -64,7 +65,6 @@ public class OriginTransitionSession { @Nullable private final IRemoteTransition mEntryTransition; @Nullable private final IRemoteTransition mExitTransition; private final AtomicInteger mState = new AtomicInteger(NOT_STARTED); @Nullable private RemoteTransition mOriginTransition; private OriginTransitionSession( Loading @@ -82,6 +82,7 @@ public class OriginTransitionSession { throw new IllegalArgumentException( "Entry transition must be supplied if you want to play an exit transition!"); } } /** Loading @@ -96,6 +97,8 @@ public class OriginTransitionSession { return false; } setupTransactionQueues(); RemoteTransition remoteTransition = null; if (hasEntryTransition() && hasExitTransition()) { logD("start: starting with entry and exit transition."); Loading Loading @@ -160,6 +163,22 @@ public class OriginTransitionSession { return mOriginTransitions != null && mExitTransition != null; } private void setupTransactionQueues() { final IBinder shellApplyToken; try { shellApplyToken = mOriginTransitions.getDefaultTransactionApplyToken(); } catch (RemoteException e) { Log.e(TAG, "Error getting server side (shell) apply token", e); return; } if (mEntryTransition != null && mEntryTransition instanceof OriginRemoteTransition) { ((OriginRemoteTransition) mEntryTransition).setShellTransactionToken(shellApplyToken); } if (mExitTransition != null && mExitTransition instanceof OriginRemoteTransition) { ((OriginRemoteTransition) mExitTransition).setShellTransactionToken(shellApplyToken); } } private void logD(String msg) { if (DEBUG) { Log.d(TAG, "Session[" + mName + "] - " + msg); Loading
packages/SystemUI/animation/lib/src/com/android/systemui/animation/server/IOriginTransitionsImpl.java +6 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,12 @@ public class IOriginTransitionsImpl extends IOriginTransitions.Stub { } } @Override public IBinder getDefaultTransactionApplyToken() { enforceRemoteTransitionPermission(); return SurfaceControl.Transaction.getDefaultApplyToken(); } private void enforceRemoteTransitionPermission() { mContext.enforceCallingPermission( Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, Loading
packages/SystemUI/animation/lib/src/com/android/systemui/animation/shared/IOriginTransitions.aidl +5 −0 Original line number Diff line number Diff line Loading @@ -41,4 +41,9 @@ interface IOriginTransitions { * origin transition object will reset to a single frame animation. */ void cancelOriginTransition(in RemoteTransition originTransition) = 2; /** * Returns the token to be used as the default `apply` token with SurfaceControl.Transaction. */ IBinder getDefaultTransactionApplyToken() = 3; }
packages/SystemUI/animation/lib/tests/src/com/android/systemui/animation/OriginTransitionSessionTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -336,6 +336,11 @@ public final class OriginTransitionSessionTest { mRecords.remove(originTransition); } @Override public IBinder getDefaultTransactionApplyToken() throws RemoteException { return null; } public void runReturnTransition(RemoteTransition originTransition, TransitionInfo info) { RemoteTransition transition = mRecords.remove(originTransition); try { Loading