1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.window.extensions.embedding; 18 19 import android.annotation.NonNull; 20 import android.app.Activity; 21 22 /** 23 * Client-side descriptor of a split that holds two containers. 24 */ 25 class SplitContainer { 26 private final TaskFragmentContainer mPrimaryContainer; 27 private final TaskFragmentContainer mSecondaryContainer; 28 private final SplitRule mSplitRule; 29 SplitContainer(@onNull TaskFragmentContainer primaryContainer, @NonNull Activity primaryActivity, @NonNull TaskFragmentContainer secondaryContainer, @NonNull SplitRule splitRule)30 SplitContainer(@NonNull TaskFragmentContainer primaryContainer, 31 @NonNull Activity primaryActivity, 32 @NonNull TaskFragmentContainer secondaryContainer, 33 @NonNull SplitRule splitRule) { 34 mPrimaryContainer = primaryContainer; 35 mSecondaryContainer = secondaryContainer; 36 mSplitRule = splitRule; 37 38 if (shouldFinishPrimaryWithSecondary(splitRule)) { 39 if (mPrimaryContainer.getRunningActivityCount() == 1 40 && mPrimaryContainer.hasActivity(primaryActivity.getActivityToken())) { 41 mSecondaryContainer.addContainerToFinishOnExit(mPrimaryContainer); 42 } else { 43 // Only adding the activity to be finished vs. the entire TaskFragment while 44 // the secondary container exits because there are other unrelated activities in the 45 // primary TaskFragment. 46 mSecondaryContainer.addActivityToFinishOnExit(primaryActivity); 47 } 48 } 49 if (shouldFinishSecondaryWithPrimary(splitRule)) { 50 mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer); 51 } 52 } 53 54 @NonNull getPrimaryContainer()55 TaskFragmentContainer getPrimaryContainer() { 56 return mPrimaryContainer; 57 } 58 59 @NonNull getSecondaryContainer()60 TaskFragmentContainer getSecondaryContainer() { 61 return mSecondaryContainer; 62 } 63 64 @NonNull getSplitRule()65 SplitRule getSplitRule() { 66 return mSplitRule; 67 } 68 isPlaceholderContainer()69 boolean isPlaceholderContainer() { 70 return (mSplitRule instanceof SplitPlaceholderRule); 71 } 72 shouldFinishPrimaryWithSecondary(@onNull SplitRule splitRule)73 static boolean shouldFinishPrimaryWithSecondary(@NonNull SplitRule splitRule) { 74 final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule; 75 final boolean shouldFinishPrimaryWithSecondary = (splitRule instanceof SplitPairRule) 76 && ((SplitPairRule) splitRule).getFinishPrimaryWithSecondary() 77 != SplitRule.FINISH_NEVER; 78 return shouldFinishPrimaryWithSecondary || isPlaceholderContainer; 79 } 80 shouldFinishSecondaryWithPrimary(@onNull SplitRule splitRule)81 static boolean shouldFinishSecondaryWithPrimary(@NonNull SplitRule splitRule) { 82 final boolean isPlaceholderContainer = splitRule instanceof SplitPlaceholderRule; 83 final boolean shouldFinishSecondaryWithPrimary = (splitRule instanceof SplitPairRule) 84 && ((SplitPairRule) splitRule).getFinishSecondaryWithPrimary() 85 != SplitRule.FINISH_NEVER; 86 return shouldFinishSecondaryWithPrimary || isPlaceholderContainer; 87 } 88 shouldFinishAssociatedContainerWhenStacked(int finishBehavior)89 static boolean shouldFinishAssociatedContainerWhenStacked(int finishBehavior) { 90 return finishBehavior == SplitRule.FINISH_ALWAYS; 91 } 92 shouldFinishAssociatedContainerWhenAdjacent(int finishBehavior)93 static boolean shouldFinishAssociatedContainerWhenAdjacent(int finishBehavior) { 94 return finishBehavior == SplitRule.FINISH_ALWAYS 95 || finishBehavior == SplitRule.FINISH_ADJACENT; 96 } 97 getFinishPrimaryWithSecondaryBehavior(@onNull SplitRule splitRule)98 static int getFinishPrimaryWithSecondaryBehavior(@NonNull SplitRule splitRule) { 99 if (splitRule instanceof SplitPlaceholderRule) { 100 return ((SplitPlaceholderRule) splitRule).getFinishPrimaryWithSecondary(); 101 } 102 if (splitRule instanceof SplitPairRule) { 103 return ((SplitPairRule) splitRule).getFinishPrimaryWithSecondary(); 104 } 105 return SplitRule.FINISH_NEVER; 106 } 107 getFinishSecondaryWithPrimaryBehavior(@onNull SplitRule splitRule)108 static int getFinishSecondaryWithPrimaryBehavior(@NonNull SplitRule splitRule) { 109 if (splitRule instanceof SplitPlaceholderRule) { 110 return SplitRule.FINISH_ALWAYS; 111 } 112 if (splitRule instanceof SplitPairRule) { 113 return ((SplitPairRule) splitRule).getFinishSecondaryWithPrimary(); 114 } 115 return SplitRule.FINISH_NEVER; 116 } 117 isStickyPlaceholderRule(@onNull SplitRule splitRule)118 static boolean isStickyPlaceholderRule(@NonNull SplitRule splitRule) { 119 if (!(splitRule instanceof SplitPlaceholderRule)) { 120 return false; 121 } 122 return ((SplitPlaceholderRule) splitRule).isSticky(); 123 } 124 125 @Override toString()126 public String toString() { 127 return "SplitContainer{" 128 + " primaryContainer=" + mPrimaryContainer 129 + " secondaryContainer=" + mSecondaryContainer 130 + " splitRule=" + mSplitRule 131 + "}"; 132 } 133 } 134