blob: d8a7463cb0869f14a7a0d974421cf3dedbfdfde6 [file] [log] [blame]
Andrii Kulianb372da62018-01-18 10:46:24 -08001/*
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
17package android.app.servertransaction;
18
19import static android.app.ActivityThread.DEBUG_ORDER;
20
21import android.app.ActivityThread;
22import android.app.ClientTransactionHandler;
23import android.app.ResultInfo;
24import android.os.IBinder;
25import android.os.Parcel;
26import android.os.Trace;
27import android.util.MergedConfiguration;
28import android.util.Slog;
29
30import com.android.internal.content.ReferrerIntent;
31
32import java.util.List;
33import java.util.Objects;
34
35/**
36 * Activity relaunch callback.
37 * @hide
38 */
39public class ActivityRelaunchItem extends ClientTransactionItem {
40
41 private static final String TAG = "ActivityRelaunchItem";
42
43 private List<ResultInfo> mPendingResults;
44 private List<ReferrerIntent> mPendingNewIntents;
45 private int mConfigChanges;
46 private MergedConfiguration mConfig;
47 private boolean mPreserveWindow;
48
49 /**
50 * A record that was properly configured for relaunch. Execution will be cancelled if not
51 * initialized after {@link #preExecute(ClientTransactionHandler, IBinder)}.
52 */
53 private ActivityThread.ActivityClientRecord mActivityClientRecord;
54
55 @Override
56 public void preExecute(ClientTransactionHandler client, IBinder token) {
57 mActivityClientRecord = client.prepareRelaunchActivity(token, mPendingResults,
58 mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow);
59 }
60
61 @Override
62 public void execute(ClientTransactionHandler client, IBinder token,
63 PendingTransactionActions pendingActions) {
64 if (mActivityClientRecord == null) {
65 if (DEBUG_ORDER) Slog.d(TAG, "Activity relaunch cancelled");
66 return;
67 }
68 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
69 client.handleRelaunchActivity(mActivityClientRecord, pendingActions);
70 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
71 }
72
73 @Override
74 public void postExecute(ClientTransactionHandler client, IBinder token,
75 PendingTransactionActions pendingActions) {
76 client.reportRelaunch(token, pendingActions);
77 }
78
79 // ObjectPoolItem implementation
80
81 private ActivityRelaunchItem() {}
82
83 /** Obtain an instance initialized with provided params. */
84 public static ActivityRelaunchItem obtain(List<ResultInfo> pendingResults,
85 List<ReferrerIntent> pendingNewIntents, int configChanges, MergedConfiguration config,
86 boolean preserveWindow) {
87 ActivityRelaunchItem instance = ObjectPool.obtain(ActivityRelaunchItem.class);
88 if (instance == null) {
89 instance = new ActivityRelaunchItem();
90 }
91 instance.mPendingResults = pendingResults;
92 instance.mPendingNewIntents = pendingNewIntents;
93 instance.mConfigChanges = configChanges;
94 instance.mConfig = config;
95 instance.mPreserveWindow = preserveWindow;
96
97 return instance;
98 }
99
100 @Override
101 public void recycle() {
102 mPendingResults = null;
103 mPendingNewIntents = null;
104 mConfigChanges = 0;
105 mConfig = null;
106 mPreserveWindow = false;
107 mActivityClientRecord = null;
108 ObjectPool.recycle(this);
109 }
110
111
112 // Parcelable implementation
113
114 /** Write to Parcel. */
115 @Override
116 public void writeToParcel(Parcel dest, int flags) {
117 dest.writeTypedList(mPendingResults, flags);
118 dest.writeTypedList(mPendingNewIntents, flags);
119 dest.writeInt(mConfigChanges);
120 dest.writeTypedObject(mConfig, flags);
121 dest.writeBoolean(mPreserveWindow);
122 }
123
124 /** Read from Parcel. */
125 private ActivityRelaunchItem(Parcel in) {
126 mPendingResults = in.createTypedArrayList(ResultInfo.CREATOR);
127 mPendingNewIntents = in.createTypedArrayList(ReferrerIntent.CREATOR);
128 mConfigChanges = in.readInt();
129 mConfig = in.readTypedObject(MergedConfiguration.CREATOR);
130 mPreserveWindow = in.readBoolean();
131 }
132
133 public static final Creator<ActivityRelaunchItem> CREATOR =
134 new Creator<ActivityRelaunchItem>() {
135 public ActivityRelaunchItem createFromParcel(Parcel in) {
136 return new ActivityRelaunchItem(in);
137 }
138
139 public ActivityRelaunchItem[] newArray(int size) {
140 return new ActivityRelaunchItem[size];
141 }
142 };
143
144 @Override
145 public boolean equals(Object o) {
146 if (this == o) {
147 return true;
148 }
149 if (o == null || getClass() != o.getClass()) {
150 return false;
151 }
152 final ActivityRelaunchItem other = (ActivityRelaunchItem) o;
153 return Objects.equals(mPendingResults, other.mPendingResults)
154 && Objects.equals(mPendingNewIntents, other.mPendingNewIntents)
155 && mConfigChanges == other.mConfigChanges && Objects.equals(mConfig, other.mConfig)
156 && mPreserveWindow == other.mPreserveWindow;
157 }
158
159 @Override
160 public int hashCode() {
161 int result = 17;
162 result = 31 * result + Objects.hashCode(mPendingResults);
163 result = 31 * result + Objects.hashCode(mPendingNewIntents);
164 result = 31 * result + mConfigChanges;
165 result = 31 * result + Objects.hashCode(mConfig);
166 result = 31 * result + (mPreserveWindow ? 1 : 0);
167 return result;
168 }
169
170 @Override
171 public String toString() {
172 return "ActivityRelaunchItem{pendingResults=" + mPendingResults
173 + ",pendingNewIntents=" + mPendingNewIntents + ",configChanges=" + mConfigChanges
174 + ",config=" + mConfig + ",preserveWindow" + mPreserveWindow + "}";
175 }
176}