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 21 import android.app.ActivityManager; 22 import android.app.ClientTransactionHandler; 23 import android.os.IBinder; 24 import android.os.Parcel; 25 import android.os.RemoteException; 26 import android.os.Trace; 27 28 /** 29 * Request to move an activity to paused state. 30 * @hide 31 */ 32 public class PauseActivityItem extends ActivityLifecycleItem { 33 34 private static final String TAG = "PauseActivityItem"; 35 36 private boolean mFinished; 37 private boolean mUserLeaving; 38 private int mConfigChanges; 39 private boolean mDontReport; 40 41 @Override execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions)42 public void execute(ClientTransactionHandler client, IBinder token, 43 PendingTransactionActions pendingActions) { 44 Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause"); 45 client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, pendingActions, 46 "PAUSE_ACTIVITY_ITEM"); 47 Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); 48 } 49 50 @Override getTargetState()51 public int getTargetState() { 52 return ON_PAUSE; 53 } 54 55 @Override postExecute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions)56 public void postExecute(ClientTransactionHandler client, IBinder token, 57 PendingTransactionActions pendingActions) { 58 if (mDontReport) { 59 return; 60 } 61 try { 62 // TODO(lifecycler): Use interface callback instead of AMS. 63 ActivityManager.getService().activityPaused(token); 64 } catch (RemoteException ex) { 65 throw ex.rethrowFromSystemServer(); 66 } 67 } 68 69 70 // ObjectPoolItem implementation 71 PauseActivityItem()72 private PauseActivityItem() {} 73 74 /** Obtain an instance initialized with provided params. */ obtain(boolean finished, boolean userLeaving, int configChanges, boolean dontReport)75 public static PauseActivityItem obtain(boolean finished, boolean userLeaving, int configChanges, 76 boolean dontReport) { 77 PauseActivityItem instance = ObjectPool.obtain(PauseActivityItem.class); 78 if (instance == null) { 79 instance = new PauseActivityItem(); 80 } 81 instance.mFinished = finished; 82 instance.mUserLeaving = userLeaving; 83 instance.mConfigChanges = configChanges; 84 instance.mDontReport = dontReport; 85 86 return instance; 87 } 88 89 /** Obtain an instance initialized with default params. */ obtain()90 public static PauseActivityItem obtain() { 91 PauseActivityItem instance = ObjectPool.obtain(PauseActivityItem.class); 92 if (instance == null) { 93 instance = new PauseActivityItem(); 94 } 95 instance.mFinished = false; 96 instance.mUserLeaving = false; 97 instance.mConfigChanges = 0; 98 instance.mDontReport = true; 99 100 return instance; 101 } 102 103 @Override recycle()104 public void recycle() { 105 super.recycle(); 106 mFinished = false; 107 mUserLeaving = false; 108 mConfigChanges = 0; 109 mDontReport = false; 110 ObjectPool.recycle(this); 111 } 112 113 // Parcelable implementation 114 115 /** Write to Parcel. */ 116 @Override writeToParcel(Parcel dest, int flags)117 public void writeToParcel(Parcel dest, int flags) { 118 dest.writeBoolean(mFinished); 119 dest.writeBoolean(mUserLeaving); 120 dest.writeInt(mConfigChanges); 121 dest.writeBoolean(mDontReport); 122 } 123 124 /** Read from Parcel. */ PauseActivityItem(Parcel in)125 private PauseActivityItem(Parcel in) { 126 mFinished = in.readBoolean(); 127 mUserLeaving = in.readBoolean(); 128 mConfigChanges = in.readInt(); 129 mDontReport = in.readBoolean(); 130 } 131 132 public static final Creator<PauseActivityItem> CREATOR = 133 new Creator<PauseActivityItem>() { 134 public PauseActivityItem createFromParcel(Parcel in) { 135 return new PauseActivityItem(in); 136 } 137 138 public PauseActivityItem[] newArray(int size) { 139 return new PauseActivityItem[size]; 140 } 141 }; 142 143 @Override equals(Object o)144 public boolean equals(Object o) { 145 if (this == o) { 146 return true; 147 } 148 if (o == null || getClass() != o.getClass()) { 149 return false; 150 } 151 final PauseActivityItem other = (PauseActivityItem) o; 152 return mFinished == other.mFinished && mUserLeaving == other.mUserLeaving 153 && mConfigChanges == other.mConfigChanges && mDontReport == other.mDontReport; 154 } 155 156 @Override hashCode()157 public int hashCode() { 158 int result = 17; 159 result = 31 * result + (mFinished ? 1 : 0); 160 result = 31 * result + (mUserLeaving ? 1 : 0); 161 result = 31 * result + mConfigChanges; 162 result = 31 * result + (mDontReport ? 1 : 0); 163 return result; 164 } 165 166 @Override toString()167 public String toString() { 168 return "PauseActivityItem{finished=" + mFinished + ",userLeaving=" + mUserLeaving 169 + ",configChanges=" + mConfigChanges + ",dontReport=" + mDontReport + "}"; 170 } 171 } 172