diff --git a/core/java/android/window/TransitionFilter.java b/core/java/android/window/TransitionFilter.java index 6351b03950205..607e316aab057 100644 --- a/core/java/android/window/TransitionFilter.java +++ b/core/java/android/window/TransitionFilter.java @@ -21,7 +21,9 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.ActivityManager; import android.app.WindowConfiguration; +import android.content.ComponentName; import android.os.Parcel; import android.os.Parcelable; @@ -140,6 +142,7 @@ public final class TransitionFilter implements Parcelable { public int mActivityType = ACTIVITY_TYPE_UNDEFINED; public int[] mModes = null; public @ContainerOrder int mOrder = CONTAINER_ORDER_ANY; + public ComponentName mTopActivity; public Requirement() { } @@ -148,6 +151,7 @@ public final class TransitionFilter implements Parcelable { mActivityType = in.readInt(); mModes = in.createIntArray(); mOrder = in.readInt(); + mTopActivity = in.readTypedObject(ComponentName.CREATOR); } /** Go through changes and find if at-least one change matches this filter */ @@ -167,6 +171,7 @@ public final class TransitionFilter implements Parcelable { continue; } } + if (!matchesTopActivity(change.getTaskInfo())) continue; if (mModes != null) { boolean pass = false; for (int m = 0; m < mModes.length; ++m) { @@ -182,12 +187,20 @@ public final class TransitionFilter implements Parcelable { return false; } + private boolean matchesTopActivity(ActivityManager.RunningTaskInfo info) { + if (mTopActivity == null) return true; + if (info == null) return false; + final ComponentName component = info.topActivity; + return mTopActivity.equals(component); + } + /** Check if the request matches this filter. It may generate false positives */ boolean matches(@NonNull TransitionRequestInfo request) { // Can't check modes/order since the transition hasn't been built at this point. if (mActivityType == ACTIVITY_TYPE_UNDEFINED) return true; return request.getTriggerTask() != null - && request.getTriggerTask().getActivityType() == mActivityType; + && request.getTriggerTask().getActivityType() == mActivityType + && matchesTopActivity(request.getTriggerTask()); } @Override @@ -196,6 +209,7 @@ public final class TransitionFilter implements Parcelable { dest.writeInt(mActivityType); dest.writeIntArray(mModes); dest.writeInt(mOrder); + dest.writeTypedObject(mTopActivity, flags); } @NonNull @@ -230,6 +244,7 @@ public final class TransitionFilter implements Parcelable { } out.append("]").toString(); out.append(" order=" + containerOrderToString(mOrder)); + out.append(" topActivity=").append(mTopActivity); return out.toString(); } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java index 3eea99a462455..7f2d252cd73b4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java @@ -29,6 +29,7 @@ import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.ActivityTaskManager; +import android.content.ComponentName; import android.graphics.Rect; import android.os.IBinder; import android.os.Parcelable; @@ -166,7 +167,7 @@ public class RemoteTransitionCompat implements Parcelable { } /** Adds a filter check that restricts this remote transition to home open transitions. */ - public void addHomeOpenCheck() { + public void addHomeOpenCheck(ComponentName homeActivity) { if (mFilter == null) { mFilter = new TransitionFilter(); } @@ -174,6 +175,7 @@ public class RemoteTransitionCompat implements Parcelable { new TransitionFilter.Requirement[]{new TransitionFilter.Requirement(), new TransitionFilter.Requirement()}; mFilter.mRequirements[0].mActivityType = ACTIVITY_TYPE_HOME; + mFilter.mRequirements[0].mTopActivity = homeActivity; mFilter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT}; mFilter.mRequirements[0].mOrder = CONTAINER_ORDER_TOP; mFilter.mRequirements[1].mActivityType = ACTIVITY_TYPE_STANDARD;