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