1 /*
2  * Copyright (C) 2022 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 android.window;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.app.WindowConfiguration;
22 import android.content.res.Configuration;
23 import android.os.Parcel;
24 import android.os.Parcelable;
25 
26 /**
27  * The information about the parent Task of a particular TaskFragment
28  * @hide
29  */
30 public class TaskFragmentParentInfo implements Parcelable {
31     @NonNull
32     private final Configuration mConfiguration = new Configuration();
33 
34     private final int mDisplayId;
35 
36     private final boolean mVisible;
37 
TaskFragmentParentInfo(@onNull Configuration configuration, int displayId, boolean visible)38     public TaskFragmentParentInfo(@NonNull Configuration configuration, int displayId,
39             boolean visible) {
40         mConfiguration.setTo(configuration);
41         mDisplayId = displayId;
42         mVisible = visible;
43     }
44 
TaskFragmentParentInfo(@onNull TaskFragmentParentInfo info)45     public TaskFragmentParentInfo(@NonNull TaskFragmentParentInfo info) {
46         mConfiguration.setTo(info.getConfiguration());
47         mDisplayId = info.mDisplayId;
48         mVisible = info.mVisible;
49     }
50 
51     /** The {@link Configuration} of the parent Task */
52     @NonNull
getConfiguration()53     public Configuration getConfiguration() {
54         return mConfiguration;
55     }
56 
57     /**
58      * The display ID of the parent Task. {@link android.view.Display#INVALID_DISPLAY} means the
59      * Task is detached from previously associated display.
60      */
getDisplayId()61     public int getDisplayId() {
62         return mDisplayId;
63     }
64 
65     /** Whether the parent Task is visible or not */
isVisible()66     public boolean isVisible() {
67         return mVisible;
68     }
69 
70     /**
71      * Returns {@code true} if the parameters which are important for task fragment
72      * organizers are equal between this {@link TaskFragmentParentInfo} and {@code that}.
73      * Note that this method is usually called with
74      * {@link com.android.server.wm.WindowOrganizerController#configurationsAreEqualForOrganizer(
75      * Configuration, Configuration)} to determine if this {@link TaskFragmentParentInfo} should
76      * be dispatched to the client.
77      */
equalsForTaskFragmentOrganizer(@ullable TaskFragmentParentInfo that)78     public boolean equalsForTaskFragmentOrganizer(@Nullable TaskFragmentParentInfo that) {
79         if (that == null) {
80             return false;
81         }
82         return getWindowingMode() == that.getWindowingMode() && mDisplayId == that.mDisplayId
83                 && mVisible == that.mVisible;
84     }
85 
86     @WindowConfiguration.WindowingMode
getWindowingMode()87     private int getWindowingMode() {
88         return mConfiguration.windowConfiguration.getWindowingMode();
89     }
90 
91     @Override
toString()92     public String toString() {
93         return TaskFragmentParentInfo.class.getSimpleName() + ":{"
94                 + "config=" + mConfiguration
95                 + ", displayId=" + mDisplayId
96                 + ", visible=" + mVisible
97                 + "}";
98     }
99 
100     /**
101      * Indicates that whether this {@link TaskFragmentParentInfo} equals to {@code obj}.
102      * Note that {@link #equalsForTaskFragmentOrganizer(TaskFragmentParentInfo)} should be used
103      * for most cases because not all {@link Configuration} properties are interested for
104      * {@link TaskFragmentOrganizer}.
105      */
106     @Override
equals(Object obj)107     public boolean equals(Object obj) {
108         if (obj == this) {
109             return true;
110         }
111         if (!(obj instanceof TaskFragmentParentInfo)) {
112             return false;
113         }
114         final TaskFragmentParentInfo that = (TaskFragmentParentInfo) obj;
115         return mConfiguration.equals(that.mConfiguration)
116                 && mDisplayId == that.mDisplayId
117                 && mVisible == that.mVisible;
118     }
119 
120     @Override
hashCode()121     public int hashCode() {
122         int result = mConfiguration.hashCode();
123         result = 31 * result + mDisplayId;
124         result = 31 * result + (mVisible ? 1 : 0);
125         return result;
126     }
127 
128     @Override
writeToParcel(@onNull Parcel dest, int flags)129     public void writeToParcel(@NonNull Parcel dest, int flags) {
130         mConfiguration.writeToParcel(dest, flags);
131         dest.writeInt(mDisplayId);
132         dest.writeBoolean(mVisible);
133     }
134 
TaskFragmentParentInfo(Parcel in)135     private TaskFragmentParentInfo(Parcel in) {
136         mConfiguration.readFromParcel(in);
137         mDisplayId = in.readInt();
138         mVisible = in.readBoolean();
139     }
140 
141     public static final Creator<TaskFragmentParentInfo> CREATOR =
142             new Creator<TaskFragmentParentInfo>() {
143                 @Override
144                 public TaskFragmentParentInfo createFromParcel(Parcel in) {
145                     return new TaskFragmentParentInfo(in);
146                 }
147 
148                 @Override
149                 public TaskFragmentParentInfo[] newArray(int size) {
150                     return new TaskFragmentParentInfo[size];
151                 }
152             };
153 
154     @Override
describeContents()155     public int describeContents() {
156         return 0;
157     }
158 }
159