Merge "Add some more transition filter properties" into sc-v2-dev am: cc3b202fab am: 84b5bb952e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15365409

Change-Id: I483dd032e7087f31cc6cde780bad5760c3fdb29c
This commit is contained in:
Evan Rosky
2021-07-30 02:04:42 +00:00
committed by Automerger Merge Worker
4 changed files with 76 additions and 6 deletions

View File

@@ -943,6 +943,8 @@ public interface WindowManager extends ViewManager {
case TRANSIT_KEYGUARD_GOING_AWAY: return "KEYGUARD_GOING_AWAY";
case TRANSIT_KEYGUARD_OCCLUDE: return "KEYGUARD_OCCLUDE";
case TRANSIT_KEYGUARD_UNOCCLUDE: return "KEYGUARD_UNOCCLUDE";
case TRANSIT_PIP: return "PIP";
case TRANSIT_WAKE: return "WAKE";
case TRANSIT_FIRST_CUSTOM: return "FIRST_CUSTOM";
default:
if (type > TRANSIT_FIRST_CUSTOM) {

View File

@@ -27,6 +27,7 @@ import android.app.WindowConfiguration;
import android.content.ComponentName;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.WindowManager;
/**
* A parcelable filter that can be used for rerouting transitions to a remote. This is a local
@@ -55,6 +56,9 @@ public final class TransitionFilter implements Parcelable {
*/
@Nullable public @TransitionType int[] mTypeSet = null;
/** All flags must be set on a transition. */
public @WindowManager.TransitionFlags int mFlags = 0;
/**
* A list of required changes. To pass, a transition must meet all requirements.
*/
@@ -65,6 +69,7 @@ public final class TransitionFilter implements Parcelable {
private TransitionFilter(Parcel in) {
mTypeSet = in.createIntArray();
mFlags = in.readInt();
mRequirements = in.createTypedArray(Requirement.CREATOR);
}
@@ -81,10 +86,16 @@ public final class TransitionFilter implements Parcelable {
}
if (!typePass) return false;
}
if ((info.getFlags() & mFlags) != mFlags) {
return false;
}
// Make sure info meets all of the requirements.
if (mRequirements != null) {
for (int i = 0; i < mRequirements.length; ++i) {
if (!mRequirements[i].matches(info)) return false;
final boolean matches = mRequirements[i].matches(info);
if (matches == mRequirements[i].mNot) {
return false;
}
}
}
return true;
@@ -94,6 +105,7 @@ public final class TransitionFilter implements Parcelable {
/** @hide */
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeIntArray(mTypeSet);
dest.writeInt(mFlags);
dest.writeTypedArray(mRequirements, flags);
}
@@ -123,10 +135,11 @@ public final class TransitionFilter implements Parcelable {
sb.append("{types=[");
if (mTypeSet != null) {
for (int i = 0; i < mTypeSet.length; ++i) {
sb.append((i == 0 ? "" : ",") + mTypeSet[i]);
sb.append((i == 0 ? "" : ",") + WindowManager.transitTypeToString(mTypeSet[i]));
}
}
sb.append("] checks=[");
sb.append("] flags=0x" + Integer.toHexString(mFlags));
sb.append(" checks=[");
if (mRequirements != null) {
for (int i = 0; i < mRequirements.length; ++i) {
sb.append((i == 0 ? "" : ",") + mRequirements[i]);
@@ -141,7 +154,21 @@ public final class TransitionFilter implements Parcelable {
*/
public static final class Requirement implements Parcelable {
public int mActivityType = ACTIVITY_TYPE_UNDEFINED;
/** This only matches if the change is independent of its parents. */
public boolean mMustBeIndependent = true;
/** If this matches, the parent filter will fail */
public boolean mNot = false;
public int[] mModes = null;
/** Matches only if all the flags here are set on the change. */
public @TransitionInfo.ChangeFlags int mFlags = 0;
/** If this needs to be a task. */
public boolean mMustBeTask = false;
public @ContainerOrder int mOrder = CONTAINER_ORDER_ANY;
public ComponentName mTopActivity;
@@ -150,7 +177,11 @@ public final class TransitionFilter implements Parcelable {
private Requirement(Parcel in) {
mActivityType = in.readInt();
mMustBeIndependent = in.readBoolean();
mNot = in.readBoolean();
mModes = in.createIntArray();
mFlags = in.readInt();
mMustBeTask = in.readBoolean();
mOrder = in.readInt();
mTopActivity = in.readTypedObject(ComponentName.CREATOR);
}
@@ -159,7 +190,7 @@ public final class TransitionFilter implements Parcelable {
boolean matches(@NonNull TransitionInfo info) {
for (int i = info.getChanges().size() - 1; i >= 0; --i) {
final TransitionInfo.Change change = info.getChanges().get(i);
if (!TransitionInfo.isIndependent(change, info)) {
if (mMustBeIndependent && !TransitionInfo.isIndependent(change, info)) {
// Only look at independent animating windows.
continue;
}
@@ -183,6 +214,12 @@ public final class TransitionFilter implements Parcelable {
}
if (!pass) continue;
}
if ((change.getFlags() & mFlags) != mFlags) {
continue;
}
if (mMustBeTask && change.getTaskInfo() == null) {
continue;
}
return true;
}
return false;
@@ -208,7 +245,11 @@ public final class TransitionFilter implements Parcelable {
/** @hide */
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mActivityType);
dest.writeBoolean(mMustBeIndependent);
dest.writeBoolean(mNot);
dest.writeIntArray(mModes);
dest.writeInt(mFlags);
dest.writeBoolean(mMustBeTask);
dest.writeInt(mOrder);
dest.writeTypedObject(mTopActivity, flags);
}
@@ -236,7 +277,10 @@ public final class TransitionFilter implements Parcelable {
@Override
public String toString() {
StringBuilder out = new StringBuilder();
out.append("{atype=" + WindowConfiguration.activityTypeToString(mActivityType));
out.append('{');
if (mNot) out.append("NOT ");
out.append("atype=" + WindowConfiguration.activityTypeToString(mActivityType));
out.append(" independent=" + mMustBeIndependent);
out.append(" modes=[");
if (mModes != null) {
for (int i = 0; i < mModes.length; ++i) {
@@ -244,8 +288,11 @@ public final class TransitionFilter implements Parcelable {
}
}
out.append("]").toString();
out.append(" flags=" + TransitionInfo.flagsToString(mFlags));
out.append(" mustBeTask=" + mMustBeTask);
out.append(" order=" + containerOrderToString(mOrder));
out.append(" topActivity=").append(mTopActivity);
out.append("}");
return out.toString();
}
}

View File

@@ -26,6 +26,7 @@ import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -274,6 +275,26 @@ public class ShellTransitionTests {
assertTrue(filter.matches(openClose));
}
@Test
public void testTransitionFilterNotRequirement() {
// filter that requires one opening and NO translucent apps
TransitionFilter filter = new TransitionFilter();
filter.mRequirements = new TransitionFilter.Requirement[]{
new TransitionFilter.Requirement(), new TransitionFilter.Requirement()};
filter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT};
filter.mRequirements[1].mFlags = FLAG_TRANSLUCENT;
filter.mRequirements[1].mNot = true;
final TransitionInfo openOnly = new TransitionInfoBuilder(TRANSIT_OPEN)
.addChange(TRANSIT_OPEN).build();
assertTrue(filter.matches(openOnly));
final TransitionInfo openAndTranslucent = new TransitionInfoBuilder(TRANSIT_OPEN)
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
openAndTranslucent.getChanges().get(1).setFlags(FLAG_TRANSLUCENT);
assertFalse(filter.matches(openAndTranslucent));
}
@Test
public void testRegisteredRemoteTransition() {
Transitions transitions = new Transitions(mOrganizer, mTransactionPool, mContext,

View File

@@ -276,4 +276,4 @@ public class KeyguardServiceWrapper implements IKeyguardService {
public void dump(String prefix, PrintWriter pw) {
mKeyguardStateMonitor.dump(prefix, pw);
}
}
}