blob: 44af1a9fd7800cff1827e12b98843fb279a49e92 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.window.extensions.embedding;
import android.annotation.NonNull;
import android.app.Activity;
/**
* Client-side descriptor of a split that holds two containers.
*/
class SplitContainer {
private final TaskFragmentContainer mPrimaryContainer;
private final TaskFragmentContainer mSecondaryContainer;
private final SplitRule mSplitRule;
SplitContainer(@NonNull TaskFragmentContainer primaryContainer,
@NonNull Activity primaryActivity,
@NonNull TaskFragmentContainer secondaryContainer,
@NonNull SplitRule splitRule) {
mPrimaryContainer = primaryContainer;
mSecondaryContainer = secondaryContainer;
mSplitRule = 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);
}
}
if (shouldFinishSecondaryWithPrimary(splitRule)) {
mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer);
}
}
@NonNull
TaskFragmentContainer getPrimaryContainer() {
return mPrimaryContainer;
}
@NonNull
TaskFragmentContainer getSecondaryContainer() {
return mSecondaryContainer;
}
@NonNull
SplitRule getSplitRule() {
return mSplitRule;
}
boolean isPlaceholderContainer() {
return (mSplitRule instanceof SplitPlaceholderRule);
}
static boolean shouldFinishPrimaryWithSecondary(@NonNull SplitRule splitRule) {
final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule;
final boolean shouldFinishPrimaryWithSecondary = (splitRule instanceof SplitPairRule)
&& ((SplitPairRule) splitRule).getFinishPrimaryWithSecondary()
!= SplitRule.FINISH_NEVER;
return shouldFinishPrimaryWithSecondary || isPlaceholderContainer;
}
static boolean shouldFinishSecondaryWithPrimary(@NonNull SplitRule splitRule) {
final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule;
final boolean shouldFinishSecondaryWithPrimary = (splitRule instanceof SplitPairRule)
&& ((SplitPairRule) splitRule).getFinishSecondaryWithPrimary()
!= SplitRule.FINISH_NEVER;
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) {
if (!(splitRule instanceof SplitPlaceholderRule)) {
return false;
}
return ((SplitPlaceholderRule) splitRule).isSticky();
}
@Override
public String toString() {
return "SplitContainer{"
+ " primaryContainer=" + mPrimaryContainer
+ " secondaryContainer=" + mSecondaryContainer
+ " splitRule=" + mSplitRule
+ "}";
}
}