Merge changes from topic "sticky_placeholders_custom_finishing_behavior" into sc-v2-dev am: d2fceab0af

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

Change-Id: Ic06afcf70cf5f63c68b3679f04f0fa9f40058f53
This commit is contained in:
Andrii Kulian
2021-11-11 03:59:04 +00:00
committed by Automerger Merge Worker
3 changed files with 51 additions and 10 deletions

View File

@@ -73,17 +73,48 @@ class SplitContainer {
static boolean shouldFinishPrimaryWithSecondary(@NonNull SplitRule splitRule) { static boolean shouldFinishPrimaryWithSecondary(@NonNull SplitRule splitRule) {
final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule; final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule;
final boolean shouldFinishPrimaryWithSecondary = (splitRule instanceof SplitPairRule) final boolean shouldFinishPrimaryWithSecondary = (splitRule instanceof SplitPairRule)
&& ((SplitPairRule) splitRule).shouldFinishPrimaryWithSecondary(); && ((SplitPairRule) splitRule).getFinishPrimaryWithSecondary()
!= SplitRule.FINISH_NEVER;
return shouldFinishPrimaryWithSecondary || isPlaceholderContainer; return shouldFinishPrimaryWithSecondary || isPlaceholderContainer;
} }
static boolean shouldFinishSecondaryWithPrimary(@NonNull SplitRule splitRule) { static boolean shouldFinishSecondaryWithPrimary(@NonNull SplitRule splitRule) {
final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule; final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule;
final boolean shouldFinishSecondaryWithPrimary = (splitRule instanceof SplitPairRule) final boolean shouldFinishSecondaryWithPrimary = (splitRule instanceof SplitPairRule)
&& ((SplitPairRule) splitRule).shouldFinishSecondaryWithPrimary(); && ((SplitPairRule) splitRule).getFinishSecondaryWithPrimary()
!= SplitRule.FINISH_NEVER;
return shouldFinishSecondaryWithPrimary || isPlaceholderContainer; return shouldFinishSecondaryWithPrimary || isPlaceholderContainer;
} }
static boolean shouldFinishAssociatedContainerWhenStacked(int finishBehavior) {
return finishBehavior == SplitRule.FINISH_ALWAYS;
}
static boolean shouldFinishAssociatedContainerWhenAdjacent(int finishBehavior) {
return finishBehavior == SplitRule.FINISH_ALWAYS
|| finishBehavior == SplitRule.FINISH_ADJACENT;
}
static int getFinishPrimaryWithSecondaryBehavior(@NonNull SplitRule splitRule) {
if (splitRule instanceof SplitPlaceholderRule) {
return ((SplitPlaceholderRule) splitRule).getFinishPrimaryWithSecondary();
}
if (splitRule instanceof SplitPairRule) {
return ((SplitPairRule) splitRule).getFinishPrimaryWithSecondary();
}
return SplitRule.FINISH_NEVER;
}
static int getFinishSecondaryWithPrimaryBehavior(@NonNull SplitRule splitRule) {
if (splitRule instanceof SplitPlaceholderRule) {
return SplitRule.FINISH_ALWAYS;
}
if (splitRule instanceof SplitPairRule) {
return ((SplitPairRule) splitRule).getFinishSecondaryWithPrimary();
}
return SplitRule.FINISH_NEVER;
}
static boolean isStickyPlaceholderRule(@NonNull SplitRule splitRule) { static boolean isStickyPlaceholderRule(@NonNull SplitRule splitRule) {
if (!(splitRule instanceof SplitPlaceholderRule)) { if (!(splitRule instanceof SplitPlaceholderRule)) {
return false; return false;

View File

@@ -16,7 +16,11 @@
package androidx.window.extensions.embedding; package androidx.window.extensions.embedding;
import static androidx.window.extensions.embedding.SplitContainer.getFinishPrimaryWithSecondaryBehavior;
import static androidx.window.extensions.embedding.SplitContainer.getFinishSecondaryWithPrimaryBehavior;
import static androidx.window.extensions.embedding.SplitContainer.isStickyPlaceholderRule; import static androidx.window.extensions.embedding.SplitContainer.isStickyPlaceholderRule;
import static androidx.window.extensions.embedding.SplitContainer.shouldFinishAssociatedContainerWhenAdjacent;
import static androidx.window.extensions.embedding.SplitContainer.shouldFinishAssociatedContainerWhenStacked;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
@@ -665,15 +669,21 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
// Containers are not in the same split, no need to retain. // Containers are not in the same split, no need to retain.
return false; return false;
} }
// Find the finish behavior for the associated container
if (!isStickyPlaceholderRule(splitContainer.getSplitRule())) { int finishBehavior;
// Currently only the containers associated with sticky placeholders can be retained. SplitRule splitRule = splitContainer.getSplitRule();
return false; if (finishingContainer == splitContainer.getPrimaryContainer()) {
finishBehavior = getFinishSecondaryWithPrimaryBehavior(splitRule);
} else {
finishBehavior = getFinishPrimaryWithSecondaryBehavior(splitRule);
}
// Decide whether the associated container should be retained based on the current
// presentation mode.
if (mPresenter.shouldShowSideBySide(splitContainer)) {
return !shouldFinishAssociatedContainerWhenAdjacent(finishBehavior);
} else {
return !shouldFinishAssociatedContainerWhenStacked(finishBehavior);
} }
// When sticky placeholder is stacked on top of the main container it should not cause the
// destruction of the primary one.
return !mPresenter.shouldShowSideBySide(splitContainer);
} }
/** /**