Loading core/java/android/window/TransitionFilter.java +12 −6 Original line number Diff line number Diff line Loading @@ -212,7 +212,9 @@ public final class TransitionFilter implements Parcelable { 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) { Loading @@ -234,11 +236,15 @@ public final class TransitionFilter implements Parcelable { 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 */ Loading @@ -247,7 +253,7 @@ public final class TransitionFilter implements Parcelable { if (mActivityType == ACTIVITY_TYPE_UNDEFINED) return true; return request.getTriggerTask() != null && request.getTriggerTask().getActivityType() == mActivityType && matchesTopActivity(request.getTriggerTask()); && matchesTopActivity(request.getTriggerTask(), null /* activityCmp */); } @Override Loading core/java/android/window/TransitionInfo.java +20 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.annotation.IntDef; 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; Loading Loading @@ -635,6 +636,7 @@ public final class TransitionInfo implements Parcelable { 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; Loading Loading @@ -663,6 +665,7 @@ public final class TransitionInfo implements Parcelable { mBackgroundColor = in.readInt(); mSnapshot = in.readTypedObject(SurfaceControl.CREATOR); mSnapshotLuma = in.readFloat(); mActivityComponent = in.readTypedObject(ComponentName.CREATOR); } private Change localRemoteCopy() { Loading @@ -685,6 +688,7 @@ public final class TransitionInfo implements Parcelable { out.mBackgroundColor = mBackgroundColor; out.mSnapshot = mSnapshot != null ? new SurfaceControl(mSnapshot, "localRemote") : null; out.mSnapshotLuma = mSnapshotLuma; out.mActivityComponent = mActivityComponent; return out; } Loading Loading @@ -780,6 +784,11 @@ public final class TransitionInfo implements Parcelable { 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() { Loading Loading @@ -913,6 +922,12 @@ public final class TransitionInfo implements Parcelable { 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) { Loading @@ -936,6 +951,7 @@ public final class TransitionInfo implements Parcelable { dest.writeInt(mBackgroundColor); dest.writeTypedObject(mSnapshot, flags); dest.writeFloat(mSnapshotLuma); dest.writeTypedObject(mActivityComponent, flags); } @NonNull Loading Loading @@ -994,6 +1010,10 @@ public final class TransitionInfo implements Parcelable { if (mLastParent != null) { sb.append(" lastParent="); sb.append(mLastParent); } if (mActivityComponent != null) { sb.append(" component="); sb.append(mActivityComponent.flattenToShortString()); } sb.append('}'); return sb.toString(); } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +25 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import static org.mockito.Mockito.verify; 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; Loading Loading @@ -419,6 +420,30 @@ public class ShellTransitionTests extends ShellTestCase { assertTrue(filter.matches(withoutFlag)); } @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(); Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TransitionInfoBuilder.java +16 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; 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; Loading Loading @@ -50,20 +51,34 @@ public class TransitionInfoBuilder { } 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 */); } Loading services/core/java/com/android/server/wm/Transition.java +4 −0 Original line number Diff line number Diff line Loading @@ -2596,6 +2596,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { 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); Loading Loading
core/java/android/window/TransitionFilter.java +12 −6 Original line number Diff line number Diff line Loading @@ -212,7 +212,9 @@ public final class TransitionFilter implements Parcelable { 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) { Loading @@ -234,11 +236,15 @@ public final class TransitionFilter implements Parcelable { 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 */ Loading @@ -247,7 +253,7 @@ public final class TransitionFilter implements Parcelable { if (mActivityType == ACTIVITY_TYPE_UNDEFINED) return true; return request.getTriggerTask() != null && request.getTriggerTask().getActivityType() == mActivityType && matchesTopActivity(request.getTriggerTask()); && matchesTopActivity(request.getTriggerTask(), null /* activityCmp */); } @Override Loading
core/java/android/window/TransitionInfo.java +20 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.annotation.IntDef; 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; Loading Loading @@ -635,6 +636,7 @@ public final class TransitionInfo implements Parcelable { 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; Loading Loading @@ -663,6 +665,7 @@ public final class TransitionInfo implements Parcelable { mBackgroundColor = in.readInt(); mSnapshot = in.readTypedObject(SurfaceControl.CREATOR); mSnapshotLuma = in.readFloat(); mActivityComponent = in.readTypedObject(ComponentName.CREATOR); } private Change localRemoteCopy() { Loading @@ -685,6 +688,7 @@ public final class TransitionInfo implements Parcelable { out.mBackgroundColor = mBackgroundColor; out.mSnapshot = mSnapshot != null ? new SurfaceControl(mSnapshot, "localRemote") : null; out.mSnapshotLuma = mSnapshotLuma; out.mActivityComponent = mActivityComponent; return out; } Loading Loading @@ -780,6 +784,11 @@ public final class TransitionInfo implements Parcelable { 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() { Loading Loading @@ -913,6 +922,12 @@ public final class TransitionInfo implements Parcelable { 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) { Loading @@ -936,6 +951,7 @@ public final class TransitionInfo implements Parcelable { dest.writeInt(mBackgroundColor); dest.writeTypedObject(mSnapshot, flags); dest.writeFloat(mSnapshotLuma); dest.writeTypedObject(mActivityComponent, flags); } @NonNull Loading Loading @@ -994,6 +1010,10 @@ public final class TransitionInfo implements Parcelable { if (mLastParent != null) { sb.append(" lastParent="); sb.append(mLastParent); } if (mActivityComponent != null) { sb.append(" component="); sb.append(mActivityComponent.flattenToShortString()); } sb.append('}'); return sb.toString(); } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +25 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import static org.mockito.Mockito.verify; 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; Loading Loading @@ -419,6 +420,30 @@ public class ShellTransitionTests extends ShellTestCase { assertTrue(filter.matches(withoutFlag)); } @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(); Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/TransitionInfoBuilder.java +16 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; 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; Loading Loading @@ -50,20 +51,34 @@ public class TransitionInfoBuilder { } 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 */); } Loading
services/core/java/com/android/server/wm/Transition.java +4 −0 Original line number Diff line number Diff line Loading @@ -2596,6 +2596,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { 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); Loading