Merge "Finish the primary container while secondary exited" into sc-v2-dev

This commit is contained in:
Louis Chang
2021-09-03 04:59:16 +00:00
committed by Android (Google) Code Review
5 changed files with 38 additions and 11 deletions

View File

@@ -3229,6 +3229,7 @@ package android.window {
method @NonNull public android.content.res.Configuration getConfiguration(); method @NonNull public android.content.res.Configuration getConfiguration();
method @NonNull public android.os.IBinder getFragmentToken(); method @NonNull public android.os.IBinder getFragmentToken();
method @NonNull public android.graphics.Point getPositionInParent(); method @NonNull public android.graphics.Point getPositionInParent();
method public int getRunningActivityCount();
method @NonNull public android.window.WindowContainerToken getToken(); method @NonNull public android.window.WindowContainerToken getToken();
method public int getWindowingMode(); method public int getWindowingMode();
method public boolean hasRunningActivity(); method public boolean hasRunningActivity();

View File

@@ -55,8 +55,8 @@ public final class TaskFragmentInfo implements Parcelable {
/** Whether the TaskFragment contains any child Window Container. */ /** Whether the TaskFragment contains any child Window Container. */
private final boolean mIsEmpty; private final boolean mIsEmpty;
/** Whether the TaskFragment contains any running Activity. */ /** The number of the running activities in the TaskFragment. */
private final boolean mHasRunningActivity; private final int mRunningActivityCount;
/** Whether this TaskFragment is visible on the window hierarchy. */ /** Whether this TaskFragment is visible on the window hierarchy. */
private final boolean mIsVisible; private final boolean mIsVisible;
@@ -74,13 +74,13 @@ public final class TaskFragmentInfo implements Parcelable {
/** @hide */ /** @hide */
public TaskFragmentInfo( public TaskFragmentInfo(
@NonNull IBinder fragmentToken, @NonNull WindowContainerToken token, @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token,
@NonNull Configuration configuration, boolean isEmpty, boolean hasRunningActivity, @NonNull Configuration configuration, boolean isEmpty, int runningActivityCount,
boolean isVisible, @NonNull List<IBinder> activities, @NonNull Point positionInParent) { boolean isVisible, @NonNull List<IBinder> activities, @NonNull Point positionInParent) {
mFragmentToken = requireNonNull(fragmentToken); mFragmentToken = requireNonNull(fragmentToken);
mToken = requireNonNull(token); mToken = requireNonNull(token);
mConfiguration.setTo(configuration); mConfiguration.setTo(configuration);
mIsEmpty = isEmpty; mIsEmpty = isEmpty;
mHasRunningActivity = hasRunningActivity; mRunningActivityCount = runningActivityCount;
mIsVisible = isVisible; mIsVisible = isVisible;
mActivities.addAll(activities); mActivities.addAll(activities);
mPositionInParent = requireNonNull(positionInParent); mPositionInParent = requireNonNull(positionInParent);
@@ -106,7 +106,11 @@ public final class TaskFragmentInfo implements Parcelable {
} }
public boolean hasRunningActivity() { public boolean hasRunningActivity() {
return mHasRunningActivity; return mRunningActivityCount > 0;
}
public int getRunningActivityCount() {
return mRunningActivityCount;
} }
public boolean isVisible() { public boolean isVisible() {
@@ -141,7 +145,7 @@ public final class TaskFragmentInfo implements Parcelable {
return mFragmentToken.equals(that.mFragmentToken) return mFragmentToken.equals(that.mFragmentToken)
&& mToken.equals(that.mToken) && mToken.equals(that.mToken)
&& mIsEmpty == that.mIsEmpty && mIsEmpty == that.mIsEmpty
&& mHasRunningActivity == that.mHasRunningActivity && mRunningActivityCount == that.mRunningActivityCount
&& mIsVisible == that.mIsVisible && mIsVisible == that.mIsVisible
&& getWindowingMode() == that.getWindowingMode() && getWindowingMode() == that.getWindowingMode()
&& mActivities.equals(that.mActivities) && mActivities.equals(that.mActivities)
@@ -153,7 +157,7 @@ public final class TaskFragmentInfo implements Parcelable {
mToken = in.readTypedObject(WindowContainerToken.CREATOR); mToken = in.readTypedObject(WindowContainerToken.CREATOR);
mConfiguration.readFromParcel(in); mConfiguration.readFromParcel(in);
mIsEmpty = in.readBoolean(); mIsEmpty = in.readBoolean();
mHasRunningActivity = in.readBoolean(); mRunningActivityCount = in.readInt();
mIsVisible = in.readBoolean(); mIsVisible = in.readBoolean();
in.readBinderList(mActivities); in.readBinderList(mActivities);
mPositionInParent = requireNonNull(in.readTypedObject(Point.CREATOR)); mPositionInParent = requireNonNull(in.readTypedObject(Point.CREATOR));
@@ -166,7 +170,7 @@ public final class TaskFragmentInfo implements Parcelable {
dest.writeTypedObject(mToken, flags); dest.writeTypedObject(mToken, flags);
mConfiguration.writeToParcel(dest, flags); mConfiguration.writeToParcel(dest, flags);
dest.writeBoolean(mIsEmpty); dest.writeBoolean(mIsEmpty);
dest.writeBoolean(mHasRunningActivity); dest.writeInt(mRunningActivityCount);
dest.writeBoolean(mIsVisible); dest.writeBoolean(mIsVisible);
dest.writeBinderList(mActivities); dest.writeBinderList(mActivities);
dest.writeTypedObject(mPositionInParent, flags); dest.writeTypedObject(mPositionInParent, flags);
@@ -192,7 +196,7 @@ public final class TaskFragmentInfo implements Parcelable {
+ " fragmentToken=" + mFragmentToken + " fragmentToken=" + mFragmentToken
+ " token=" + mToken + " token=" + mToken
+ " isEmpty=" + mIsEmpty + " isEmpty=" + mIsEmpty
+ " hasRunningActivity=" + mHasRunningActivity + " runningActivityCount=" + mRunningActivityCount
+ " isVisible=" + mIsVisible + " isVisible=" + mIsVisible
+ " positionInParent=" + mPositionInParent + " positionInParent=" + mPositionInParent
+ "}"; + "}";

View File

@@ -40,8 +40,16 @@ class SplitContainer {
mSplitRule = splitRule; mSplitRule = splitRule;
if (shouldFinishPrimaryWithSecondary(splitRule)) { if (shouldFinishPrimaryWithSecondary(splitRule)) {
if (mPrimaryContainer.getRunningActivityCount() == 1
&& mPrimaryContainer.hasActivity(primaryActivity.getActivityToken())) {
mSecondaryContainer.addContainerToFinishOnExit(mPrimaryContainer);
} else {
// Only adding the activity to be finished vs. the entire TaskFragment while
// the secondary container exits because there are other unrelated activities in the
// primary TaskFragment.
mSecondaryContainer.addActivityToFinishOnExit(primaryActivity); mSecondaryContainer.addActivityToFinishOnExit(primaryActivity);
} }
}
if (shouldFinishSecondaryWithPrimary(splitRule)) { if (shouldFinishSecondaryWithPrimary(splitRule)) {
mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer); mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer);
} }

View File

@@ -125,6 +125,14 @@ class TaskFragmentContainer {
return false; return false;
} }
int getRunningActivityCount() {
int count = mPendingAppearedActivities.size();
if (mInfo != null) {
count += mInfo.getRunningActivityCount();
}
return count;
}
@Nullable @Nullable
TaskFragmentInfo getInfo() { TaskFragmentInfo getInfo() {
return mInfo; return mInfo;

View File

@@ -2080,12 +2080,18 @@ class TaskFragment extends WindowContainer<WindowContainer> {
} }
final Point positionInParent = new Point(); final Point positionInParent = new Point();
getRelativePosition(positionInParent); getRelativePosition(positionInParent);
final int[] runningActivityCount = new int[1];
forAllActivities(a -> {
if (!a.finishing) {
runningActivityCount[0]++;
}
});
return new TaskFragmentInfo( return new TaskFragmentInfo(
mFragmentToken, mFragmentToken,
mRemoteToken.toWindowContainerToken(), mRemoteToken.toWindowContainerToken(),
getConfiguration(), getConfiguration(),
getChildCount() == 0, getChildCount() == 0,
hasRunningActivity(this), runningActivityCount[0],
isVisible(), isVisible(),
childActivities, childActivities,
positionInParent); positionInParent);