Merge "Finish the primary container while secondary exited" into sc-v2-dev
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
+ "}";
|
+ "}";
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user