Add activity-component to transition info change
This enables filtering on component for transitions
inside of a task.
Bug: 273828110
Test: atest TransitionTests ShellTransitionTests
Change-Id: I947380feb506974c86df510e97f54edc8eebe7e2
diff --git a/core/java/android/window/TransitionFilter.java b/core/java/android/window/TransitionFilter.java
index e62d5c9..64fe66e 100644
--- a/core/java/android/window/TransitionFilter.java
+++ b/core/java/android/window/TransitionFilter.java
@@ -212,7 +212,9 @@
continue;
}
}
- if (!matchesTopActivity(change.getTaskInfo())) continue;
+ if (!matchesTopActivity(change.getTaskInfo(), change.getActivityComponent())) {
+ continue;
+ }
if (mModes != null) {
boolean pass = false;
for (int m = 0; m < mModes.length; ++m) {
@@ -234,11 +236,15 @@
return false;
}
- private boolean matchesTopActivity(ActivityManager.RunningTaskInfo info) {
+ private boolean matchesTopActivity(ActivityManager.RunningTaskInfo taskInfo,
+ @Nullable ComponentName activityComponent) {
if (mTopActivity == null) return true;
- if (info == null) return false;
- final ComponentName component = info.topActivity;
- return mTopActivity.equals(component);
+ if (activityComponent != null) {
+ return mTopActivity.equals(activityComponent);
+ } else if (taskInfo != null) {
+ return mTopActivity.equals(taskInfo.topActivity);
+ }
+ return false;
}
/** Check if the request matches this filter. It may generate false positives */
@@ -247,7 +253,7 @@
if (mActivityType == ACTIVITY_TYPE_UNDEFINED) return true;
return request.getTriggerTask() != null
&& request.getTriggerTask().getActivityType() == mActivityType
- && matchesTopActivity(request.getTriggerTask());
+ && matchesTopActivity(request.getTriggerTask(), null /* activityCmp */);
}
@Override
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 7c9340e..bceb872 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -44,6 +44,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.content.ComponentName;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.HardwareBuffer;
@@ -635,6 +636,7 @@
private @ColorInt int mBackgroundColor;
private SurfaceControl mSnapshot = null;
private float mSnapshotLuma;
+ private ComponentName mActivityComponent = null;
public Change(@Nullable WindowContainerToken container, @NonNull SurfaceControl leash) {
mContainer = container;
@@ -663,6 +665,7 @@
mBackgroundColor = in.readInt();
mSnapshot = in.readTypedObject(SurfaceControl.CREATOR);
mSnapshotLuma = in.readFloat();
+ mActivityComponent = in.readTypedObject(ComponentName.CREATOR);
}
private Change localRemoteCopy() {
@@ -685,6 +688,7 @@
out.mBackgroundColor = mBackgroundColor;
out.mSnapshot = mSnapshot != null ? new SurfaceControl(mSnapshot, "localRemote") : null;
out.mSnapshotLuma = mSnapshotLuma;
+ out.mActivityComponent = mActivityComponent;
return out;
}
@@ -780,6 +784,11 @@
mSnapshotLuma = luma;
}
+ /** Sets the component-name of the container. Container must be an Activity. */
+ public void setActivityComponent(@Nullable ComponentName component) {
+ mActivityComponent = component;
+ }
+
/** @return the container that is changing. May be null if non-remotable (eg. activity) */
@Nullable
public WindowContainerToken getContainer() {
@@ -913,6 +922,12 @@
return mSnapshotLuma;
}
+ /** @return the component-name of this container (if it is an activity). */
+ @Nullable
+ public ComponentName getActivityComponent() {
+ return mActivityComponent;
+ }
+
/** @hide */
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
@@ -936,6 +951,7 @@
dest.writeInt(mBackgroundColor);
dest.writeTypedObject(mSnapshot, flags);
dest.writeFloat(mSnapshotLuma);
+ dest.writeTypedObject(mActivityComponent, flags);
}
@NonNull
@@ -994,6 +1010,10 @@
if (mLastParent != null) {
sb.append(" lastParent="); sb.append(mLastParent);
}
+ if (mActivityComponent != null) {
+ sb.append(" component=");
+ sb.append(mActivityComponent.flattenToShortString());
+ }
sb.append('}');
return sb.toString();
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
index e22bf3d..e9da258 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java
@@ -64,6 +64,7 @@
import android.app.ActivityManager.RunningTaskInfo;
import android.app.IApplicationThread;
import android.app.PendingIntent;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
@@ -420,6 +421,30 @@
}
@Test
+ public void testTransitionFilterActivityComponent() {
+ TransitionFilter filter = new TransitionFilter();
+ ComponentName cmpt = new ComponentName("testpak", "testcls");
+ filter.mRequirements =
+ new TransitionFilter.Requirement[]{new TransitionFilter.Requirement()};
+ filter.mRequirements[0].mTopActivity = cmpt;
+ filter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT};
+
+ final RunningTaskInfo taskInf = createTaskInfo(1);
+ final TransitionInfo openTask = new TransitionInfoBuilder(TRANSIT_OPEN)
+ .addChange(TRANSIT_OPEN, taskInf).build();
+ assertFalse(filter.matches(openTask));
+
+ taskInf.topActivity = cmpt;
+ final TransitionInfo openTaskCmpt = new TransitionInfoBuilder(TRANSIT_OPEN)
+ .addChange(TRANSIT_OPEN, taskInf).build();
+ assertTrue(filter.matches(openTaskCmpt));
+
+ final TransitionInfo openAct = new TransitionInfoBuilder(TRANSIT_OPEN)
+ .addChange(TRANSIT_OPEN, cmpt).build();
+ assertTrue(filter.matches(openAct));
+ }
+
+ @Test
public void testRegisteredRemoteTransition() {
Transitions transitions = createTestTransitions();
transitions.replaceDefaultHandlerForTest(mDefaultHandler);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TransitionInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TransitionInfoBuilder.java
index 8343858..b8939e6f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TransitionInfoBuilder.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TransitionInfoBuilder.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.mock;
import android.app.ActivityManager;
+import android.content.ComponentName;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.TransitionInfo;
@@ -50,20 +51,34 @@
}
public TransitionInfoBuilder addChange(@WindowManager.TransitionType int mode,
- @TransitionInfo.ChangeFlags int flags, ActivityManager.RunningTaskInfo taskInfo) {
+ @TransitionInfo.ChangeFlags int flags, ActivityManager.RunningTaskInfo taskInfo,
+ ComponentName activityComponent) {
final TransitionInfo.Change change = new TransitionInfo.Change(
taskInfo != null ? taskInfo.token : null, createMockSurface(true /* valid */));
change.setMode(mode);
change.setFlags(flags);
change.setTaskInfo(taskInfo);
+ change.setActivityComponent(activityComponent);
return addChange(change);
}
+ /** Add a change to the TransitionInfo */
+ public TransitionInfoBuilder addChange(@WindowManager.TransitionType int mode,
+ @TransitionInfo.ChangeFlags int flags, ActivityManager.RunningTaskInfo taskInfo) {
+ return addChange(mode, flags, taskInfo, null /* activityComponent */);
+ }
+
public TransitionInfoBuilder addChange(@WindowManager.TransitionType int mode,
ActivityManager.RunningTaskInfo taskInfo) {
return addChange(mode, TransitionInfo.FLAG_NONE, taskInfo);
}
+ /** Add a change to the TransitionInfo */
+ public TransitionInfoBuilder addChange(@WindowManager.TransitionType int mode,
+ ComponentName activityComponent) {
+ return addChange(mode, TransitionInfo.FLAG_NONE, null /* taskinfo */, activityComponent);
+ }
+
public TransitionInfoBuilder addChange(@WindowManager.TransitionType int mode) {
return addChange(mode, TransitionInfo.FLAG_NONE, null /* taskInfo */);
}
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index b12855e..4b3ffa5 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -2597,6 +2597,10 @@
change.setBackgroundColor(ColorUtils.setAlphaComponent(backgroundColor, 255));
}
+ if (activityRecord != null) {
+ change.setActivityComponent(activityRecord.mActivityComponent);
+ }
+
change.setRotation(info.mRotation, endRotation);
if (info.mSnapshot != null) {
change.setSnapshot(info.mSnapshot, info.mSnapshotLuma);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 0514943..51df1d4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -195,6 +195,36 @@
}
@Test
+ public void testCreateInfo_Activity() {
+ final Transition transition = createTestTransition(TRANSIT_OPEN);
+ ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges;
+ ArraySet<WindowContainer> participants = transition.mParticipants;
+
+ final Task theTask = createTask(mDisplayContent);
+ final ActivityRecord closing = createActivityRecord(theTask);
+ final ActivityRecord opening = createActivityRecord(theTask);
+ // Start states.
+ changes.put(theTask, new Transition.ChangeInfo(theTask, true /* vis */, false /* exChg */));
+ changes.put(opening, new Transition.ChangeInfo(opening, false /* vis */, true /* exChg */));
+ changes.put(closing, new Transition.ChangeInfo(closing, true /* vis */, false /* exChg */));
+ fillChangeMap(changes, theTask);
+ // End states.
+ closing.setVisibleRequested(false);
+ opening.setVisibleRequested(true);
+
+ final int transit = transition.mType;
+ int flags = 0;
+
+ participants.add(opening);
+ participants.add(closing);
+ ArrayList<Transition.ChangeInfo> targets =
+ Transition.calculateTargets(participants, changes);
+ TransitionInfo info = Transition.calculateTransitionInfo(transit, flags, targets, mMockT);
+ assertEquals(2, info.getChanges().size());
+ assertEquals(info.getChanges().get(1).getActivityComponent(), closing.mActivityComponent);
+ }
+
+ @Test
public void testCreateInfo_NestedTasks() {
final Transition transition = createTestTransition(TRANSIT_OPEN);
ArrayMap<WindowContainer, Transition.ChangeInfo> changes = transition.mChanges;