| /* |
| * 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 |
| + "}"; |
| } |
| } |