Merge "Wrap IRemoteTransition in a parcelable to enable extra properties" into sc-v2-dev

This commit is contained in:
Evan Rosky
2021-09-03 19:53:10 +00:00
committed by Android (Google) Code Review
22 changed files with 376 additions and 125 deletions

View File

@@ -55,7 +55,7 @@ import android.view.RemoteAnimationAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.SplashScreen;
import android.window.WindowContainerToken;
@@ -426,7 +426,7 @@ public class ActivityOptions {
private IAppTransitionAnimationSpecsFuture mSpecsFuture;
private RemoteAnimationAdapter mRemoteAnimationAdapter;
private IBinder mLaunchCookie;
private IRemoteTransition mRemoteTransition;
private RemoteTransition mRemoteTransition;
private boolean mOverrideTaskTransition;
private String mSplashScreenThemeResName;
@SplashScreen.SplashScreenStyle
@@ -1054,7 +1054,7 @@ public class ActivityOptions {
*/
@RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS)
public static ActivityOptions makeRemoteAnimation(RemoteAnimationAdapter remoteAnimationAdapter,
IRemoteTransition remoteTransition) {
RemoteTransition remoteTransition) {
final ActivityOptions opts = new ActivityOptions();
opts.mRemoteAnimationAdapter = remoteAnimationAdapter;
opts.mAnimationType = ANIM_REMOTE_ANIMATION;
@@ -1064,11 +1064,11 @@ public class ActivityOptions {
/**
* Create an {@link ActivityOptions} instance that lets the application control the entire
* transition using a {@link IRemoteTransition}.
* transition using a {@link RemoteTransition}.
* @hide
*/
@RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS)
public static ActivityOptions makeRemoteTransition(IRemoteTransition remoteTransition) {
public static ActivityOptions makeRemoteTransition(RemoteTransition remoteTransition) {
final ActivityOptions opts = new ActivityOptions();
opts.mRemoteTransition = remoteTransition;
return opts;
@@ -1181,8 +1181,7 @@ public class ActivityOptions {
}
mRemoteAnimationAdapter = opts.getParcelable(KEY_REMOTE_ANIMATION_ADAPTER);
mLaunchCookie = opts.getBinder(KEY_LAUNCH_COOKIE);
mRemoteTransition = IRemoteTransition.Stub.asInterface(opts.getBinder(
KEY_REMOTE_TRANSITION));
mRemoteTransition = opts.getParcelable(KEY_REMOTE_TRANSITION);
mOverrideTaskTransition = opts.getBoolean(KEY_OVERRIDE_TASK_TRANSITION);
mSplashScreenThemeResName = opts.getString(KEY_SPLASH_SCREEN_THEME);
mRemoveWithTaskOrganizer = opts.getBoolean(KEY_REMOVE_WITH_TASK_ORGANIZER);
@@ -1348,7 +1347,7 @@ public class ActivityOptions {
}
/** @hide */
public IRemoteTransition getRemoteTransition() {
public RemoteTransition getRemoteTransition() {
return mRemoteTransition;
}
@@ -1965,7 +1964,7 @@ public class ActivityOptions {
b.putBinder(KEY_LAUNCH_COOKIE, mLaunchCookie);
}
if (mRemoteTransition != null) {
b.putBinder(KEY_REMOTE_TRANSITION, mRemoteTransition.asBinder());
b.putParcelable(KEY_REMOTE_TRANSITION, mRemoteTransition);
}
if (mOverrideTaskTransition) {
b.putBoolean(KEY_OVERRIDE_TASK_TRANSITION, mOverrideTaskTransition);

View File

@@ -0,0 +1,19 @@
/*
* Copyright (C) 2021 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 android.window;
parcelable RemoteTransition;

View File

@@ -0,0 +1,158 @@
/*
* Copyright (C) 2021 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 android.window;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.IBinder;
import android.os.Parcelable;
import com.android.internal.util.DataClass;
/**
* Represents a remote transition animation and information required to run it (eg. the app thread
* that needs to be boosted).
* @hide
*/
@DataClass(genToString = true, genSetters = true, genAidl = true)
public class RemoteTransition implements Parcelable {
/** The actual remote-transition interface used to run the transition animation. */
private @NonNull IRemoteTransition mRemoteTransition;
/** Get the IBinder associated with the underlying IRemoteTransition. */
public @Nullable IBinder asBinder() {
return mRemoteTransition.asBinder();
}
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/window/RemoteTransition.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
/**
* Creates a new RemoteTransition.
*
* @param remoteTransition
* The actual remote-transition interface used to run the transition animation.
*/
@DataClass.Generated.Member
public RemoteTransition(
@NonNull IRemoteTransition remoteTransition) {
this.mRemoteTransition = remoteTransition;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mRemoteTransition);
// onConstructed(); // You can define this method to get a callback
}
/**
* The actual remote-transition interface used to run the transition animation.
*/
@DataClass.Generated.Member
public @NonNull IRemoteTransition getRemoteTransition() {
return mRemoteTransition;
}
/**
* The actual remote-transition interface used to run the transition animation.
*/
@DataClass.Generated.Member
public @NonNull RemoteTransition setRemoteTransition(@NonNull IRemoteTransition value) {
mRemoteTransition = value;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mRemoteTransition);
return this;
}
@Override
@DataClass.Generated.Member
public String toString() {
// You can override field toString logic by defining methods like:
// String fieldNameToString() { ... }
return "RemoteTransition { " +
"remoteTransition = " + mRemoteTransition +
" }";
}
@Override
@DataClass.Generated.Member
public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
// You can override field parcelling by defining methods like:
// void parcelFieldName(Parcel dest, int flags) { ... }
dest.writeStrongInterface(mRemoteTransition);
}
@Override
@DataClass.Generated.Member
public int describeContents() { return 0; }
/** @hide */
@SuppressWarnings({"unchecked", "RedundantCast"})
@DataClass.Generated.Member
protected RemoteTransition(@NonNull android.os.Parcel in) {
// You can override field unparcelling by defining methods like:
// static FieldType unparcelFieldName(Parcel in) { ... }
IRemoteTransition remoteTransition = IRemoteTransition.Stub.asInterface(in.readStrongBinder());
this.mRemoteTransition = remoteTransition;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mRemoteTransition);
// onConstructed(); // You can define this method to get a callback
}
@DataClass.Generated.Member
public static final @NonNull Parcelable.Creator<RemoteTransition> CREATOR
= new Parcelable.Creator<RemoteTransition>() {
@Override
public RemoteTransition[] newArray(int size) {
return new RemoteTransition[size];
}
@Override
public RemoteTransition createFromParcel(@NonNull android.os.Parcel in) {
return new RemoteTransition(in);
}
};
@DataClass.Generated(
time = 1630613039043L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/window/RemoteTransition.java",
inputSignatures = "private @android.annotation.NonNull android.window.IRemoteTransition mRemoteTransition\npublic @android.annotation.Nullable android.os.IBinder asBinder()\nclass RemoteTransition extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)")
@Deprecated
private void __metadata() {}
//@formatter:on
// End of generated code
}

View File

@@ -40,11 +40,11 @@ public final class TransitionRequestInfo implements Parcelable {
private @Nullable ActivityManager.RunningTaskInfo mTriggerTask;
/** If non-null, a remote-transition associated with the source of this transition. */
private @Nullable IRemoteTransition mRemoteTransition;
private @Nullable RemoteTransition mRemoteTransition;
// Code below generated by codegen v1.0.22.
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -72,7 +72,7 @@ public final class TransitionRequestInfo implements Parcelable {
public TransitionRequestInfo(
@WindowManager.TransitionType int type,
@Nullable ActivityManager.RunningTaskInfo triggerTask,
@Nullable IRemoteTransition remoteTransition) {
@Nullable RemoteTransition remoteTransition) {
this.mType = type;
com.android.internal.util.AnnotationValidations.validate(
WindowManager.TransitionType.class, null, mType);
@@ -103,7 +103,7 @@ public final class TransitionRequestInfo implements Parcelable {
* If non-null, a remote-transition associated with the source of this transition.
*/
@DataClass.Generated.Member
public @Nullable IRemoteTransition getRemoteTransition() {
public @Nullable RemoteTransition getRemoteTransition() {
return mRemoteTransition;
}
@@ -121,7 +121,7 @@ public final class TransitionRequestInfo implements Parcelable {
* If non-null, a remote-transition associated with the source of this transition.
*/
@DataClass.Generated.Member
public @android.annotation.NonNull TransitionRequestInfo setRemoteTransition(@android.annotation.NonNull IRemoteTransition value) {
public @android.annotation.NonNull TransitionRequestInfo setRemoteTransition(@android.annotation.NonNull RemoteTransition value) {
mRemoteTransition = value;
return this;
}
@@ -151,7 +151,7 @@ public final class TransitionRequestInfo implements Parcelable {
dest.writeByte(flg);
dest.writeInt(mType);
if (mTriggerTask != null) dest.writeTypedObject(mTriggerTask, flags);
if (mRemoteTransition != null) dest.writeStrongInterface(mRemoteTransition);
if (mRemoteTransition != null) dest.writeTypedObject(mRemoteTransition, flags);
}
@Override
@@ -168,7 +168,7 @@ public final class TransitionRequestInfo implements Parcelable {
byte flg = in.readByte();
int type = in.readInt();
ActivityManager.RunningTaskInfo triggerTask = (flg & 0x2) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR);
IRemoteTransition remoteTransition = (flg & 0x4) == 0 ? null : IRemoteTransition.Stub.asInterface(in.readStrongBinder());
RemoteTransition remoteTransition = (flg & 0x4) == 0 ? null : (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR);
this.mType = type;
com.android.internal.util.AnnotationValidations.validate(
@@ -194,10 +194,10 @@ public final class TransitionRequestInfo implements Parcelable {
};
@DataClass.Generated(
time = 1610060387917L,
codegenVersion = "1.0.22",
time = 1629321632222L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java",
inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.IRemoteTransition mRemoteTransition\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)")
inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)")
@Deprecated
private void __metadata() {}

View File

@@ -22,7 +22,7 @@ import android.os.Bundle;
import android.os.UserHandle;
import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationTarget;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import com.android.wm.shell.splitscreen.ISplitScreenListener;
@@ -82,7 +82,7 @@ interface ISplitScreen {
* Starts tasks simultaneously in one transition.
*/
oneway void startTasks(int mainTaskId, in Bundle mainOptions, int sideTaskId,
in Bundle sideOptions, int sidePosition, in IRemoteTransition remoteTransition) = 10;
in Bundle sideOptions, int sidePosition, in RemoteTransition remoteTransition) = 10;
/**
* Version of startTasks using legacy transition system.

View File

@@ -43,7 +43,7 @@ import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.WindowManager;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.WindowContainerTransaction;
import androidx.annotation.BinderThread;
@@ -553,7 +553,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
public void startTasks(int mainTaskId, @Nullable Bundle mainOptions,
int sideTaskId, @Nullable Bundle sideOptions,
@SplitPosition int sidePosition,
@Nullable IRemoteTransition remoteTransition) {
@Nullable RemoteTransition remoteTransition) {
executeRemoteCallWithTaskPermission(mController, "startTasks",
(controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions,
sideTaskId, sideOptions, sidePosition, remoteTransition));

View File

@@ -35,7 +35,7 @@ import android.graphics.Rect;
import android.os.IBinder;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
@@ -169,7 +169,7 @@ class SplitScreenTransitions {
/** Starts a transition to enter split with a remote transition animator. */
IBinder startEnterTransition(@WindowManager.TransitionType int transitType,
@NonNull WindowContainerTransaction wct, @Nullable IRemoteTransition remoteTransition,
@NonNull WindowContainerTransaction wct, @Nullable RemoteTransition remoteTransition,
@NonNull Transitions.TransitionHandler handler) {
if (remoteTransition != null) {
// Wrapping it for ease-of-use (OneShot handles all the binder linking/death stuff)

View File

@@ -72,7 +72,7 @@ import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.WindowManager;
import android.window.DisplayAreaInfo;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerToken;
@@ -263,7 +263,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
/** Starts 2 tasks in one transition. */
void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId,
@Nullable Bundle sideOptions, @SplitPosition int sidePosition,
@Nullable IRemoteTransition remoteTransition) {
@Nullable RemoteTransition remoteTransition) {
final WindowContainerTransaction wct = new WindowContainerTransaction();
mainOptions = mainOptions != null ? mainOptions : new Bundle();
sideOptions = sideOptions != null ? sideOptions : new Bundle();
@@ -358,7 +358,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
public void startIntent(PendingIntent intent, Intent fillInIntent,
@SplitScreen.StageType int stage, @SplitPosition int position,
@androidx.annotation.Nullable Bundle options,
@Nullable IRemoteTransition remoteTransition) {
@Nullable RemoteTransition remoteTransition) {
final WindowContainerTransaction wct = new WindowContainerTransaction();
options = resolveStartStage(stage, position, options, wct);
wct.sendPendingIntent(intent, fillInIntent, options);

View File

@@ -16,7 +16,7 @@
package com.android.wm.shell.transition;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
/**
@@ -28,10 +28,10 @@ interface IShellTransitions {
* Registers a remote transition handler.
*/
oneway void registerRemote(in TransitionFilter filter,
in IRemoteTransition remoteTransition) = 1;
in RemoteTransition remoteTransition) = 1;
/**
* Unregisters a remote transition handler.
*/
oneway void unregisterRemote(in IRemoteTransition remoteTransition) = 2;
oneway void unregisterRemote(in RemoteTransition remoteTransition) = 2;
}

View File

@@ -24,6 +24,7 @@ import android.util.Log;
import android.view.SurfaceControl;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
@@ -43,10 +44,10 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler {
private IBinder mTransition = null;
/** The remote to delegate animation to */
private final IRemoteTransition mRemote;
private final RemoteTransition mRemote;
public OneShotRemoteHandler(@NonNull ShellExecutor mainExecutor,
@NonNull IRemoteTransition remote) {
@NonNull RemoteTransition remote) {
mMainExecutor = mainExecutor;
mRemote = remote;
}
@@ -88,7 +89,7 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler {
if (mRemote.asBinder() != null) {
mRemote.asBinder().linkToDeath(remoteDied, 0 /* flags */);
}
mRemote.startAnimation(transition, info, startTransaction, cb);
mRemote.getRemoteTransition().startAnimation(transition, info, startTransaction, cb);
} catch (RemoteException e) {
Log.e(Transitions.TAG, "Error running remote transition.", e);
if (mRemote.asBinder() != null) {
@@ -115,7 +116,7 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler {
}
};
try {
mRemote.mergeAnimation(transition, info, t, mergeTarget, cb);
mRemote.getRemoteTransition().mergeAnimation(transition, info, t, mergeTarget, cb);
} catch (RemoteException e) {
Log.e(Transitions.TAG, "Error merging remote transition.", e);
}
@@ -125,8 +126,9 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler {
@Nullable
public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
@Nullable TransitionRequestInfo request) {
IRemoteTransition remote = request.getRemoteTransition();
if (remote != mRemote) return null;
RemoteTransition remote = request.getRemoteTransition();
IRemoteTransition iRemote = remote != null ? remote.getRemoteTransition() : null;
if (iRemote != mRemote.getRemoteTransition()) return null;
mTransition = transition;
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "RemoteTransition directly requested"
+ " for %s: %s", transition, remote);

View File

@@ -27,6 +27,7 @@ import android.util.Slog;
import android.view.SurfaceControl;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
@@ -50,10 +51,10 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
private final ShellExecutor mMainExecutor;
/** Includes remotes explicitly requested by, eg, ActivityOptions */
private final ArrayMap<IBinder, IRemoteTransition> mRequestedRemotes = new ArrayMap<>();
private final ArrayMap<IBinder, RemoteTransition> mRequestedRemotes = new ArrayMap<>();
/** Ordered by specificity. Last filters will be checked first */
private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters =
private final ArrayList<Pair<TransitionFilter, RemoteTransition>> mFilters =
new ArrayList<>();
private final ArrayMap<IBinder, RemoteDeathHandler> mDeathHandlers = new ArrayMap<>();
@@ -62,19 +63,12 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
mMainExecutor = mainExecutor;
}
void addFiltered(TransitionFilter filter, IRemoteTransition remote) {
try {
RemoteDeathHandler handler = new RemoteDeathHandler(remote.asBinder());
remote.asBinder().linkToDeath(handler, 0 /* flags */);
mDeathHandlers.put(remote.asBinder(), handler);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to link to death");
return;
}
void addFiltered(TransitionFilter filter, RemoteTransition remote) {
handleDeath(remote.asBinder(), null /* finishCallback */);
mFilters.add(new Pair<>(filter, remote));
}
void removeFiltered(IRemoteTransition remote) {
void removeFiltered(RemoteTransition remote) {
boolean removed = false;
for (int i = mFilters.size() - 1; i >= 0; --i) {
if (mFilters.get(i).second == remote) {
@@ -83,8 +77,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
}
}
if (removed) {
RemoteDeathHandler handler = mDeathHandlers.remove(remote.asBinder());
remote.asBinder().unlinkToDeath(handler, 0 /* flags */);
unhandleDeath(remote.asBinder(), null /* finishCallback */);
}
}
@@ -98,7 +91,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction,
@NonNull Transitions.TransitionFinishCallback finishCallback) {
IRemoteTransition pendingRemote = mRequestedRemotes.get(transition);
RemoteTransition pendingRemote = mRequestedRemotes.get(transition);
if (pendingRemote == null) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s doesn't have "
+ "explicit remote, search filters for match for %s", transition, info);
@@ -120,21 +113,12 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
if (pendingRemote == null) return false;
final IRemoteTransition remote = pendingRemote;
final IBinder.DeathRecipient remoteDied = () -> {
Log.e(Transitions.TAG, "Remote transition died, finishing");
mMainExecutor.execute(() -> {
mRequestedRemotes.remove(transition);
finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */);
});
};
final RemoteTransition remote = pendingRemote;
IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() {
@Override
public void onTransitionFinished(WindowContainerTransaction wct,
SurfaceControl.Transaction sct) {
if (remote.asBinder() != null) {
remote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */);
}
unhandleDeath(remote.asBinder(), finishCallback);
mMainExecutor.execute(() -> {
if (sct != null) {
finishTransaction.merge(sct);
@@ -145,15 +129,11 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
}
};
try {
if (remote.asBinder() != null) {
remote.asBinder().linkToDeath(remoteDied, 0 /* flags */);
}
remote.startAnimation(transition, info, startTransaction, cb);
handleDeath(remote.asBinder(), finishCallback);
remote.getRemoteTransition().startAnimation(transition, info, startTransaction, cb);
} catch (RemoteException e) {
Log.e(Transitions.TAG, "Error running remote transition.", e);
if (remote.asBinder() != null) {
remote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */);
}
unhandleDeath(remote.asBinder(), finishCallback);
mRequestedRemotes.remove(transition);
mMainExecutor.execute(
() -> finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */));
@@ -165,7 +145,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
@NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
@NonNull Transitions.TransitionFinishCallback finishCallback) {
final IRemoteTransition remote = mRequestedRemotes.get(mergeTarget);
final IRemoteTransition remote = mRequestedRemotes.get(mergeTarget).getRemoteTransition();
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Attempt merge %s into %s",
transition, remote);
if (remote == null) return;
@@ -196,7 +176,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
@Nullable
public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
@Nullable TransitionRequestInfo request) {
IRemoteTransition remote = request.getRemoteTransition();
RemoteTransition remote = request.getRemoteTransition();
if (remote == null) return null;
mRequestedRemotes.put(transition, remote);
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "RemoteTransition directly requested"
@@ -204,14 +184,70 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
return new WindowContainerTransaction();
}
private void handleDeath(@NonNull IBinder remote,
@Nullable Transitions.TransitionFinishCallback finishCallback) {
synchronized (mDeathHandlers) {
RemoteDeathHandler deathHandler = mDeathHandlers.get(remote);
if (deathHandler == null) {
deathHandler = new RemoteDeathHandler(remote);
try {
remote.linkToDeath(deathHandler, 0 /* flags */);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to link to death");
return;
}
mDeathHandlers.put(remote, deathHandler);
}
deathHandler.addUser(finishCallback);
}
}
private void unhandleDeath(@NonNull IBinder remote,
@Nullable Transitions.TransitionFinishCallback finishCallback) {
synchronized (mDeathHandlers) {
RemoteDeathHandler deathHandler = mDeathHandlers.get(remote);
if (deathHandler == null) return;
deathHandler.removeUser(finishCallback);
if (deathHandler.getUserCount() == 0) {
if (!deathHandler.mPendingFinishCallbacks.isEmpty()) {
throw new IllegalStateException("Unhandling death for binder that still has"
+ " pending finishCallback(s).");
}
remote.unlinkToDeath(deathHandler, 0 /* flags */);
mDeathHandlers.remove(remote);
}
}
}
/** NOTE: binder deaths can alter the filter order */
private class RemoteDeathHandler implements IBinder.DeathRecipient {
private final IBinder mRemote;
private final ArrayList<Transitions.TransitionFinishCallback> mPendingFinishCallbacks =
new ArrayList<>();
private int mUsers = 0;
RemoteDeathHandler(IBinder remote) {
mRemote = remote;
}
void addUser(@Nullable Transitions.TransitionFinishCallback finishCallback) {
if (finishCallback != null) {
mPendingFinishCallbacks.add(finishCallback);
}
++mUsers;
}
void removeUser(@Nullable Transitions.TransitionFinishCallback finishCallback) {
if (finishCallback != null) {
mPendingFinishCallbacks.remove(finishCallback);
}
--mUsers;
}
int getUserCount() {
return mUsers;
}
@Override
@BinderThread
public void binderDied() {
@@ -221,6 +257,16 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler {
mFilters.remove(i);
}
}
for (int i = mRequestedRemotes.size() - 1; i >= 0; --i) {
if (mRemote.equals(mRequestedRemotes.valueAt(i).asBinder())) {
mRequestedRemotes.removeAt(i);
}
}
for (int i = mPendingFinishCallbacks.size() - 1; i >= 0; --i) {
mPendingFinishCallbacks.get(i).onTransitionFinished(
null /* wct */, null /* wctCB */);
}
mPendingFinishCallbacks.clear();
});
}
}

View File

@@ -17,7 +17,7 @@
package com.android.wm.shell.transition;
import android.annotation.NonNull;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
import com.android.wm.shell.common.annotations.ExternalThread;
@@ -39,10 +39,10 @@ public interface ShellTransitions {
* Registers a remote transition.
*/
void registerRemote(@NonNull TransitionFilter filter,
@NonNull IRemoteTransition remoteTransition);
@NonNull RemoteTransition remoteTransition);
/**
* Unregisters a remote transition.
*/
void unregisterRemote(@NonNull IRemoteTransition remoteTransition);
void unregisterRemote(@NonNull RemoteTransition remoteTransition);
}

View File

@@ -40,8 +40,8 @@ import android.provider.Settings;
import android.util.Log;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.IRemoteTransition;
import android.window.ITransitionPlayer;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
@@ -176,13 +176,13 @@ public class Transitions implements RemoteCallable<Transitions> {
return new ShellTransitions() {
@Override
public void registerRemote(@androidx.annotation.NonNull TransitionFilter filter,
@androidx.annotation.NonNull IRemoteTransition remoteTransition) {
@androidx.annotation.NonNull RemoteTransition remoteTransition) {
// Do nothing
}
@Override
public void unregisterRemote(
@androidx.annotation.NonNull IRemoteTransition remoteTransition) {
@androidx.annotation.NonNull RemoteTransition remoteTransition) {
// Do nothing
}
};
@@ -218,12 +218,12 @@ public class Transitions implements RemoteCallable<Transitions> {
/** Register a remote transition to be used when `filter` matches an incoming transition */
public void registerRemote(@NonNull TransitionFilter filter,
@NonNull IRemoteTransition remoteTransition) {
@NonNull RemoteTransition remoteTransition) {
mRemoteTransitionHandler.addFiltered(filter, remoteTransition);
}
/** Unregisters a remote transition and all associated filters */
public void unregisterRemote(@NonNull IRemoteTransition remoteTransition) {
public void unregisterRemote(@NonNull RemoteTransition remoteTransition) {
mRemoteTransitionHandler.removeFiltered(remoteTransition);
}
@@ -704,14 +704,14 @@ public class Transitions implements RemoteCallable<Transitions> {
@Override
public void registerRemote(@NonNull TransitionFilter filter,
@NonNull IRemoteTransition remoteTransition) {
@NonNull RemoteTransition remoteTransition) {
mMainExecutor.execute(() -> {
mRemoteTransitionHandler.addFiltered(filter, remoteTransition);
});
}
@Override
public void unregisterRemote(@NonNull IRemoteTransition remoteTransition) {
public void unregisterRemote(@NonNull RemoteTransition remoteTransition) {
mMainExecutor.execute(() -> {
mRemoteTransitionHandler.removeFiltered(remoteTransition);
});
@@ -738,7 +738,7 @@ public class Transitions implements RemoteCallable<Transitions> {
@Override
public void registerRemote(@NonNull TransitionFilter filter,
@NonNull IRemoteTransition remoteTransition) {
@NonNull RemoteTransition remoteTransition) {
executeRemoteCallWithTaskPermission(mTransitions, "registerRemote",
(transitions) -> {
transitions.mRemoteTransitionHandler.addFiltered(filter, remoteTransition);
@@ -746,7 +746,7 @@ public class Transitions implements RemoteCallable<Transitions> {
}
@Override
public void unregisterRemote(@NonNull IRemoteTransition remoteTransition) {
public void unregisterRemote(@NonNull RemoteTransition remoteTransition) {
executeRemoteCallWithTaskPermission(mTransitions, "unregisterRemote",
(transitions) -> {
transitions.mRemoteTransitionHandler.removeFiltered(remoteTransition);

View File

@@ -46,6 +46,7 @@ import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
@@ -130,8 +131,8 @@ public class SplitTransitionTests extends ShellTestCase {
TestRemoteTransition testRemote = new TestRemoteTransition();
IBinder transition = mSplitScreenTransitions.startEnterTransition(
TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), testRemote,
mStageCoordinator);
TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(),
new RemoteTransition(testRemote), mStageCoordinator);
mMainStage.onTaskAppeared(mMainChild, createMockSurface());
mSideStage.onTaskAppeared(mSideChild, createMockSurface());
boolean accepted = mStageCoordinator.startAnimation(transition, info,
@@ -304,7 +305,7 @@ public class SplitTransitionTests extends ShellTestCase {
TransitionInfo enterInfo = createEnterPairInfo();
IBinder enterTransit = mSplitScreenTransitions.startEnterTransition(
TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(),
new TestRemoteTransition(), mStageCoordinator);
new RemoteTransition(new TestRemoteTransition()), mStageCoordinator);
mMainStage.onTaskAppeared(mMainChild, createMockSurface());
mSideStage.onTaskAppeared(mSideChild, createMockSurface());
mStageCoordinator.startAnimation(enterTransit, enterInfo,

View File

@@ -63,6 +63,7 @@ import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
@@ -238,7 +239,8 @@ public class ShellTransitionTests {
};
IBinder transitToken = new Binder();
transitions.requestStartTransition(transitToken,
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, testRemote));
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */,
new RemoteTransition(testRemote)));
verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
@@ -383,7 +385,7 @@ public class ShellTransitionTests {
new TransitionFilter.Requirement[]{new TransitionFilter.Requirement()};
filter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT};
transitions.registerRemote(filter, testRemote);
transitions.registerRemote(filter, new RemoteTransition(testRemote));
mMainExecutor.flushAll();
IBinder transitToken = new Binder();
@@ -426,11 +428,12 @@ public class ShellTransitionTests {
final int transitType = TRANSIT_FIRST_CUSTOM + 1;
OneShotRemoteHandler oneShot = new OneShotRemoteHandler(mMainExecutor, testRemote);
OneShotRemoteHandler oneShot = new OneShotRemoteHandler(mMainExecutor,
new RemoteTransition(testRemote));
// Verify that it responds to the remote but not other things.
IBinder transitToken = new Binder();
assertNotNull(oneShot.handleRequest(transitToken,
new TransitionRequestInfo(transitType, null, testRemote)));
new TransitionRequestInfo(transitType, null, new RemoteTransition(testRemote))));
assertNull(oneShot.handleRequest(transitToken,
new TransitionRequestInfo(transitType, null, null)));

View File

@@ -37,6 +37,7 @@ import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import java.util.ArrayList;
@@ -62,7 +63,8 @@ public class RemoteAnimationAdapterCompat {
/** Helper to just build a remote transition. Use this if the legacy adapter isn't needed. */
public static RemoteTransitionCompat buildRemoteTransition(RemoteAnimationRunnerCompat runner) {
return new RemoteTransitionCompat(wrapRemoteTransition(runner));
return new RemoteTransitionCompat(
new RemoteTransition(wrapRemoteTransition(runner)));
}
public RemoteTransitionCompat getRemoteTransition() {

View File

@@ -42,6 +42,7 @@ import android.view.SurfaceControl;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.PictureInPictureSurfaceTransaction;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
@@ -63,16 +64,16 @@ import java.util.concurrent.Executor;
public class RemoteTransitionCompat implements Parcelable {
private static final String TAG = "RemoteTransitionCompat";
@NonNull final IRemoteTransition mTransition;
@NonNull final RemoteTransition mTransition;
@Nullable TransitionFilter mFilter = null;
RemoteTransitionCompat(IRemoteTransition transition) {
RemoteTransitionCompat(RemoteTransition transition) {
mTransition = transition;
}
public RemoteTransitionCompat(@NonNull RemoteTransitionRunner runner,
@NonNull Executor executor) {
mTransition = new IRemoteTransition.Stub() {
IRemoteTransition remote = new IRemoteTransition.Stub() {
@Override
public void startAnimation(IBinder transition, TransitionInfo info,
SurfaceControl.Transaction t,
@@ -102,12 +103,13 @@ public class RemoteTransitionCompat implements Parcelable {
finishAdapter));
}
};
mTransition = new RemoteTransition(remote);
}
/** Constructor specifically for recents animation */
public RemoteTransitionCompat(RecentsAnimationListener recents,
RecentsAnimationControllerCompat controller) {
mTransition = new IRemoteTransition.Stub() {
IRemoteTransition remote = new IRemoteTransition.Stub() {
final RecentsControllerWrap mRecentsSession = new RecentsControllerWrap();
IBinder mToken = null;
@@ -166,6 +168,7 @@ public class RemoteTransitionCompat implements Parcelable {
}
}
};
mTransition = new RemoteTransition(remote);
}
/** Adds a filter check that restricts this remote transition to home open transitions. */
@@ -381,7 +384,7 @@ public class RemoteTransitionCompat implements Parcelable {
// Code below generated by codegen v1.0.21.
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
@@ -393,8 +396,21 @@ public class RemoteTransitionCompat implements Parcelable {
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
@DataClass.Generated.Member
public @NonNull IRemoteTransition getTransition() {
/* package-private */ RemoteTransitionCompat(
@NonNull RemoteTransition transition,
@Nullable TransitionFilter filter) {
this.mTransition = transition;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mTransition);
this.mFilter = filter;
// onConstructed(); // You can define this method to get a callback
}
@DataClass.Generated.Member
public @NonNull RemoteTransition getTransition() {
return mTransition;
}
@@ -412,7 +428,7 @@ public class RemoteTransitionCompat implements Parcelable {
byte flg = 0;
if (mFilter != null) flg |= 0x2;
dest.writeByte(flg);
dest.writeStrongInterface(mTransition);
dest.writeTypedObject(mTransition, flags);
if (mFilter != null) dest.writeTypedObject(mFilter, flags);
}
@@ -428,7 +444,7 @@ public class RemoteTransitionCompat implements Parcelable {
// static FieldType unparcelFieldName(Parcel in) { ... }
byte flg = in.readByte();
IRemoteTransition transition = IRemoteTransition.Stub.asInterface(in.readStrongBinder());
RemoteTransition transition = (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR);
TransitionFilter filter = (flg & 0x2) == 0 ? null : (TransitionFilter) in.readTypedObject(TransitionFilter.CREATOR);
this.mTransition = transition;
@@ -460,20 +476,20 @@ public class RemoteTransitionCompat implements Parcelable {
@DataClass.Generated.Member
public static class Builder {
private @NonNull IRemoteTransition mTransition;
private @NonNull RemoteTransition mTransition;
private @Nullable TransitionFilter mFilter;
private long mBuilderFieldsSet = 0L;
public Builder(
@NonNull IRemoteTransition transition) {
@NonNull RemoteTransition transition) {
mTransition = transition;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mTransition);
}
@DataClass.Generated.Member
public @NonNull Builder setTransition(@NonNull IRemoteTransition value) {
public @NonNull Builder setTransition(@NonNull RemoteTransition value) {
checkNotUsed();
mBuilderFieldsSet |= 0x1;
mTransition = value;
@@ -496,8 +512,9 @@ public class RemoteTransitionCompat implements Parcelable {
if ((mBuilderFieldsSet & 0x2) == 0) {
mFilter = null;
}
RemoteTransitionCompat o = new RemoteTransitionCompat(mTransition);
o.mFilter = this.mFilter;
RemoteTransitionCompat o = new RemoteTransitionCompat(
mTransition,
mFilter);
return o;
}
@@ -510,10 +527,10 @@ public class RemoteTransitionCompat implements Parcelable {
}
@DataClass.Generated(
time = 1606862689344L,
codegenVersion = "1.0.21",
time = 1629321609807L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java",
inputSignatures = "final @android.annotation.NonNull com.android.systemui.shared.system.IRemoteTransition mTransition\n @android.annotation.Nullable android.window.TransitionFilter mFilter\npublic void addHomeOpenCheck()\nclass RemoteTransitionCompat extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass")
inputSignatures = "private static final java.lang.String TAG\nfinal @android.annotation.NonNull android.window.RemoteTransition mTransition\n @android.annotation.Nullable android.window.TransitionFilter mFilter\npublic void addHomeOpenCheck(android.content.ComponentName)\nclass RemoteTransitionCompat extends java.lang.Object implements [android.os.Parcelable]\nprivate com.android.systemui.shared.system.RecentsAnimationControllerCompat mWrapped\nprivate android.window.IRemoteTransitionFinishedCallback mFinishCB\nprivate android.window.WindowContainerToken mPausingTask\nprivate android.window.WindowContainerToken mPipTask\nprivate android.window.TransitionInfo mInfo\nprivate android.view.SurfaceControl mOpeningLeash\nprivate android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl> mLeashMap\nprivate android.window.PictureInPictureSurfaceTransaction mPipTransaction\nprivate android.os.IBinder mTransition\n void setup(com.android.systemui.shared.system.RecentsAnimationControllerCompat,android.window.TransitionInfo,android.window.IRemoteTransitionFinishedCallback,android.window.WindowContainerToken,android.window.WindowContainerToken,android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl>,android.os.IBinder)\n @android.annotation.SuppressLint boolean merge(android.window.TransitionInfo,android.view.SurfaceControl.Transaction,com.android.systemui.shared.system.RecentsAnimationListener)\npublic @java.lang.Override com.android.systemui.shared.recents.model.ThumbnailData screenshotTask(int)\npublic @java.lang.Override void setInputConsumerEnabled(boolean)\npublic @java.lang.Override void setAnimationTargetsBehindSystemBars(boolean)\npublic @java.lang.Override void hideCurrentInputMethod()\npublic @java.lang.Override void setFinishTaskTransaction(int,android.window.PictureInPictureSurfaceTransaction,android.view.SurfaceControl)\npublic @java.lang.Override @android.annotation.SuppressLint void finish(boolean,boolean)\npublic @java.lang.Override void setDeferCancelUntilNextTransition(boolean,boolean)\npublic @java.lang.Override void cleanupScreenshot()\npublic @java.lang.Override void setWillFinishToHome(boolean)\npublic @java.lang.Override boolean removeTask(int)\npublic @java.lang.Override void detachNavigationBarFromApp(boolean)\npublic @java.lang.Override void animateNavigationBarToApp(long)\nclass RecentsControllerWrap extends com.android.systemui.shared.system.RecentsAnimationControllerCompat implements []\n@com.android.internal.util.DataClass")
@Deprecated
private void __metadata() {}

View File

@@ -67,6 +67,7 @@ import android.view.WindowManager;
import android.view.WindowManagerPolicyConstants;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.RemoteTransition;
import android.window.TransitionFilter;
import android.window.TransitionInfo;
@@ -236,7 +237,8 @@ public class KeyguardService extends Service {
Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_GOING_AWAY");
TransitionFilter f = new TransitionFilter();
f.mFlags = TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
shellTransitions.registerRemote(f, wrap(mExitAnimationRunner));
shellTransitions.registerRemote(f,
new RemoteTransition(wrap(mExitAnimationRunner)));
}
if (sEnableRemoteKeyguardOccludeAnimation) {
Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_(UN)OCCLUDE");
@@ -255,7 +257,7 @@ public class KeyguardService extends Service {
f.mRequirements[1].mMustBeIndependent = false;
f.mRequirements[1].mFlags = FLAG_OCCLUDES_KEYGUARD;
f.mRequirements[1].mModes = new int[]{TRANSIT_CLOSE, TRANSIT_TO_BACK};
shellTransitions.registerRemote(f, mOccludeAnimation);
shellTransitions.registerRemote(f, new RemoteTransition(mOccludeAnimation));
// Now register for un-occlude.
f = new TransitionFilter();
@@ -275,7 +277,7 @@ public class KeyguardService extends Service {
f.mRequirements[0].mMustBeIndependent = false;
f.mRequirements[0].mFlags = FLAG_OCCLUDES_KEYGUARD;
f.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT};
shellTransitions.registerRemote(f, mUnoccludeAnimation);
shellTransitions.registerRemote(f, new RemoteTransition(mUnoccludeAnimation));
}
} else {
RemoteAnimationDefinition definition = new RemoteAnimationDefinition();

View File

@@ -317,7 +317,7 @@ import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.WindowManager.TransitionOldType;
import android.view.animation.Animation;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.SizeConfigurationBuckets;
import android.window.SplashScreen;
import android.window.SplashScreenView;
@@ -491,7 +491,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
private ActivityOptions mPendingOptions;
/** Non-null if {@link #mPendingOptions} specifies the remote animation. */
private RemoteAnimationAdapter mPendingRemoteAnimation;
private IRemoteTransition mPendingRemoteTransition;
private RemoteTransition mPendingRemoteTransition;
ActivityOptions returningOptions; // options that are coming back via convertToTranslucent
AppTimeTracker appTimeTracker; // set if we are tracking the time in this app/task/activity
ActivityServiceConnectionsHolder mServiceConnectionsHolder; // Service connections.
@@ -1022,7 +1022,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
pw.println(mPendingRemoteAnimation.getCallingPid());
}
if (mPendingRemoteTransition != null) {
pw.print(prefix + " pendingRemoteTransition=" + mPendingRemoteTransition);
pw.print(prefix + " pendingRemoteTransition="
+ mPendingRemoteTransition.getRemoteTransition());
}
if (appTimeTracker != null) {
appTimeTracker.dumpWithHeader(pw, prefix, false);
@@ -4579,8 +4580,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return opts;
}
IRemoteTransition takeRemoteTransition() {
IRemoteTransition out = mPendingRemoteTransition;
RemoteTransition takeRemoteTransition() {
RemoteTransition out = mPendingRemoteTransition;
mPendingRemoteTransition = null;
return out;
}

View File

@@ -115,7 +115,7 @@ import android.util.ArraySet;
import android.util.DebugUtils;
import android.util.Pools.SynchronizedPool;
import android.util.Slog;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.HeavyWeightSwitcherActivity;
@@ -1568,7 +1568,7 @@ class ActivityStarter {
final Transition newTransition = (!mService.getTransitionController().isCollecting()
&& mService.getTransitionController().getTransitionPlayer() != null)
? mService.getTransitionController().createTransition(TRANSIT_OPEN) : null;
IRemoteTransition remoteTransition = r.takeRemoteTransition();
RemoteTransition remoteTransition = r.takeRemoteTransition();
if (newTransition != null && remoteTransition != null) {
newTransition.setRemoteTransition(remoteTransition);
}

View File

@@ -70,7 +70,7 @@ import android.util.ArraySet;
import android.util.Slog;
import android.view.SurfaceControl;
import android.view.animation.Animation;
import android.window.IRemoteTransition;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import com.android.internal.annotations.VisibleForTesting;
@@ -123,7 +123,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
private @TransitionFlags int mFlags;
private final TransitionController mController;
private final BLASTSyncEngine mSyncEngine;
private IRemoteTransition mRemoteTransition = null;
private RemoteTransition mRemoteTransition = null;
/** Only use for clean-up after binder death! */
private SurfaceControl.Transaction mStartTransaction = null;
@@ -436,11 +436,11 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
mSyncEngine.abort(mSyncId);
}
void setRemoteTransition(IRemoteTransition remoteTransition) {
void setRemoteTransition(RemoteTransition remoteTransition) {
mRemoteTransition = remoteTransition;
}
IRemoteTransition getRemoteTransition() {
RemoteTransition getRemoteTransition() {
return mRemoteTransition;
}
@@ -565,7 +565,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
if (mFinishTransaction != null) {
mFinishTransaction.apply();
}
finishTransition();
mController.finishTransition(this);
}
/** @see RecentsAnimationController#attachNavigationBarToApp */

View File

@@ -34,6 +34,7 @@ import android.util.proto.ProtoOutputStream;
import android.view.WindowManager;
import android.window.IRemoteTransition;
import android.window.ITransitionPlayer;
import android.window.RemoteTransition;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
@@ -223,7 +224,7 @@ class TransitionController {
@Nullable
Transition requestTransitionIfNeeded(@WindowManager.TransitionType int type,
@WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger,
@NonNull WindowContainer readyGroupRef, @Nullable IRemoteTransition remoteTransition) {
@NonNull WindowContainer readyGroupRef, @Nullable RemoteTransition remoteTransition) {
if (mTransitionPlayer == null) {
return null;
}
@@ -252,7 +253,7 @@ class TransitionController {
/** Asks the transition player (shell) to start a created but not yet started transition. */
@NonNull
Transition requestStartTransition(@NonNull Transition transition, @Nullable Task startTask,
@Nullable IRemoteTransition remoteTransition) {
@Nullable RemoteTransition remoteTransition) {
try {
ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
"Requesting StartTransition: %s", transition);