• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 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.app.servertransaction;
18 
19 import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
20 import static android.view.Display.INVALID_DISPLAY;
21 
22 import static java.util.Objects.requireNonNull;
23 
24 import android.annotation.NonNull;
25 import android.annotation.Nullable;
26 import android.app.ActivityThread.ActivityClientRecord;
27 import android.app.ClientTransactionHandler;
28 import android.content.res.CompatibilityInfo;
29 import android.content.res.Configuration;
30 import android.os.IBinder;
31 import android.os.Parcel;
32 import android.os.Trace;
33 import android.window.ActivityWindowInfo;
34 
35 import java.util.Objects;
36 
37 /**
38  * Activity configuration changed callback.
39  *
40  * @hide
41  */
42 public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
43 
44     @NonNull
45     private final Configuration mConfiguration;
46 
47     @NonNull
48     private final ActivityWindowInfo mActivityWindowInfo;
49 
ActivityConfigurationChangeItem(@onNull IBinder activityToken, @NonNull Configuration config, @NonNull ActivityWindowInfo activityWindowInfo)50     public ActivityConfigurationChangeItem(@NonNull IBinder activityToken,
51             @NonNull Configuration config, @NonNull ActivityWindowInfo activityWindowInfo) {
52         super(activityToken);
53         mConfiguration = new Configuration(config);
54         mActivityWindowInfo = new ActivityWindowInfo(activityWindowInfo);
55     }
56 
57     @Override
preExecute(@onNull ClientTransactionHandler client)58     public void preExecute(@NonNull ClientTransactionHandler client) {
59         CompatibilityInfo.applyOverrideIfNeeded(mConfiguration);
60         // Notify the client of an upcoming change in the token configuration. This ensures that
61         // batches of config change items only process the newest configuration.
62         client.updatePendingActivityConfiguration(getActivityToken(), mConfiguration);
63     }
64 
65     @Override
execute(@onNull ClientTransactionHandler client, @NonNull ActivityClientRecord r, @NonNull PendingTransactionActions pendingActions)66     public void execute(@NonNull ClientTransactionHandler client, @NonNull ActivityClientRecord r,
67             @NonNull PendingTransactionActions pendingActions) {
68         // TODO(lifecycler): detect if PIP or multi-window mode changed and report it here.
69         Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");
70         client.handleActivityConfigurationChanged(r, mConfiguration, INVALID_DISPLAY,
71                 mActivityWindowInfo);
72         Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
73     }
74 
75     // Parcelable implementation
76 
77     /** Writes to Parcel. */
78     @Override
writeToParcel(@onNull Parcel dest, int flags)79     public void writeToParcel(@NonNull Parcel dest, int flags) {
80         super.writeToParcel(dest, flags);
81         dest.writeTypedObject(mConfiguration, flags);
82         dest.writeTypedObject(mActivityWindowInfo, flags);
83     }
84 
85     /** Reads from Parcel. */
ActivityConfigurationChangeItem(@onNull Parcel in)86     private ActivityConfigurationChangeItem(@NonNull Parcel in) {
87         super(in);
88         mConfiguration = requireNonNull(in.readTypedObject(Configuration.CREATOR));
89         mActivityWindowInfo = requireNonNull(in.readTypedObject(ActivityWindowInfo.CREATOR));
90     }
91 
92     public static final @NonNull Creator<ActivityConfigurationChangeItem> CREATOR =
93             new Creator<>() {
94                 public ActivityConfigurationChangeItem createFromParcel(@NonNull Parcel in) {
95                     return new ActivityConfigurationChangeItem(in);
96                 }
97 
98                 public ActivityConfigurationChangeItem[] newArray(int size) {
99                     return new ActivityConfigurationChangeItem[size];
100                 }
101             };
102 
103     @Override
equals(@ullable Object o)104     public boolean equals(@Nullable Object o) {
105         if (this == o) {
106             return true;
107         }
108         if (!super.equals(o)) {
109             return false;
110         }
111         final ActivityConfigurationChangeItem other = (ActivityConfigurationChangeItem) o;
112         return Objects.equals(mConfiguration, other.mConfiguration)
113                 && Objects.equals(mActivityWindowInfo, other.mActivityWindowInfo);
114     }
115 
116     @Override
hashCode()117     public int hashCode() {
118         int result = 17;
119         result = 31 * result + super.hashCode();
120         result = 31 * result + Objects.hashCode(mConfiguration);
121         result = 31 * result + Objects.hashCode(mActivityWindowInfo);
122         return result;
123     }
124 
125     @Override
toString()126     public String toString() {
127         return "ActivityConfigurationChange{" + super.toString()
128                 + ",config=" + mConfiguration
129                 + ",activityWindowInfo=" + mActivityWindowInfo + "}";
130     }
131 }
132