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