From 00d3ad743e7de61e3c298ae97c2ab33cd8fc4daf Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Tue, 20 Jul 2021 13:45:28 -0700 Subject: [PATCH] Fix some shell transitions bugs breaking splashscreen cts Splashscreen CTS uses its own HOME activity that gets placed on top of the normal launcher. Prevent the launcher's remote transition from responding in that case by adding a component filter to the TransitionFilter class. Bug: 194112093 Test: atest SplashscreenTests Change-Id: Iaf4572279b84953ca20abd7e34c64d7e19700b09 --- core/java/android/window/TransitionFilter.java | 17 ++++++++++++++++- .../shared/system/RemoteTransitionCompat.java | 4 +++- 2 files changed, 19 insertions(+), 2 deletions(-) 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;