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 package android.app; 17 18 import android.app.servertransaction.ClientTransaction; 19 import android.app.servertransaction.PendingTransactionActions; 20 import android.app.servertransaction.TransactionExecutor; 21 import android.content.Intent; 22 import android.content.pm.ApplicationInfo; 23 import android.content.res.CompatibilityInfo; 24 import android.content.res.Configuration; 25 import android.os.IBinder; 26 import android.util.MergedConfiguration; 27 28 import com.android.internal.annotations.VisibleForTesting; 29 import com.android.internal.content.ReferrerIntent; 30 31 import java.util.List; 32 33 /** 34 * Defines operations that a {@link android.app.servertransaction.ClientTransaction} or its items 35 * can perform on client. 36 * @hide 37 */ 38 public abstract class ClientTransactionHandler { 39 40 // Schedule phase related logic and handlers. 41 42 /** Prepare and schedule transaction for execution. */ scheduleTransaction(ClientTransaction transaction)43 void scheduleTransaction(ClientTransaction transaction) { 44 transaction.preExecute(this); 45 sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction); 46 } 47 48 /** 49 * Execute transaction immediately without scheduling it. This is used for local requests, so 50 * it will also recycle the transaction. 51 */ 52 @VisibleForTesting executeTransaction(ClientTransaction transaction)53 public void executeTransaction(ClientTransaction transaction) { 54 transaction.preExecute(this); 55 getTransactionExecutor().execute(transaction); 56 transaction.recycle(); 57 } 58 59 /** 60 * Get the {@link TransactionExecutor} that will be performing lifecycle transitions and 61 * callbacks for activities. 62 */ getTransactionExecutor()63 abstract TransactionExecutor getTransactionExecutor(); 64 sendMessage(int what, Object obj)65 abstract void sendMessage(int what, Object obj); 66 67 68 // Prepare phase related logic and handlers. Methods that inform about about pending changes or 69 // do other internal bookkeeping. 70 71 /** Set pending config in case it will be updated by other transaction item. */ updatePendingConfiguration(Configuration config)72 public abstract void updatePendingConfiguration(Configuration config); 73 74 /** Set current process state. */ updateProcessState(int processState, boolean fromIpc)75 public abstract void updateProcessState(int processState, boolean fromIpc); 76 77 78 // Execute phase related logic and handlers. Methods here execute actual lifecycle transactions 79 // and deliver callbacks. 80 81 /** Destroy the activity. */ handleDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance, String reason)82 public abstract void handleDestroyActivity(IBinder token, boolean finishing, int configChanges, 83 boolean getNonConfigInstance, String reason); 84 85 /** Pause the activity. */ handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, int configChanges, PendingTransactionActions pendingActions, String reason)86 public abstract void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, 87 int configChanges, PendingTransactionActions pendingActions, String reason); 88 89 /** 90 * Resume the activity. 91 * @param token Target activity token. 92 * @param finalStateRequest Flag indicating if this call is handling final lifecycle state 93 * request for a transaction. 94 * @param isForward Flag indicating if next transition is forward. 95 * @param reason Reason for performing this operation. 96 */ handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason)97 public abstract void handleResumeActivity(IBinder token, boolean finalStateRequest, 98 boolean isForward, String reason); 99 100 /** 101 * Stop the activity. 102 * @param token Target activity token. 103 * @param show Flag indicating whether activity is still shown. 104 * @param configChanges Activity configuration changes. 105 * @param pendingActions Pending actions to be used on this or later stages of activity 106 * transaction. 107 * @param finalStateRequest Flag indicating if this call is handling final lifecycle state 108 * request for a transaction. 109 * @param reason Reason for performing this operation. 110 */ handleStopActivity(IBinder token, boolean show, int configChanges, PendingTransactionActions pendingActions, boolean finalStateRequest, String reason)111 public abstract void handleStopActivity(IBinder token, boolean show, int configChanges, 112 PendingTransactionActions pendingActions, boolean finalStateRequest, String reason); 113 114 /** Report that activity was stopped to server. */ reportStop(PendingTransactionActions pendingActions)115 public abstract void reportStop(PendingTransactionActions pendingActions); 116 117 /** Restart the activity after it was stopped. */ performRestartActivity(IBinder token, boolean start)118 public abstract void performRestartActivity(IBinder token, boolean start); 119 120 /** Deliver activity (override) configuration change. */ handleActivityConfigurationChanged(IBinder activityToken, Configuration overrideConfig, int displayId)121 public abstract void handleActivityConfigurationChanged(IBinder activityToken, 122 Configuration overrideConfig, int displayId); 123 124 /** Deliver result from another activity. */ handleSendResult(IBinder token, List<ResultInfo> results, String reason)125 public abstract void handleSendResult(IBinder token, List<ResultInfo> results, String reason); 126 127 /** Deliver multi-window mode change notification. */ handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, Configuration overrideConfig)128 public abstract void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode, 129 Configuration overrideConfig); 130 131 /** Deliver new intent. */ handleNewIntent(IBinder token, List<ReferrerIntent> intents, boolean andPause)132 public abstract void handleNewIntent(IBinder token, List<ReferrerIntent> intents, 133 boolean andPause); 134 135 /** Deliver picture-in-picture mode change notification. */ handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, Configuration overrideConfig)136 public abstract void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode, 137 Configuration overrideConfig); 138 139 /** Update window visibility. */ handleWindowVisibility(IBinder token, boolean show)140 public abstract void handleWindowVisibility(IBinder token, boolean show); 141 142 /** Perform activity launch. */ handleLaunchActivity(ActivityThread.ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent)143 public abstract Activity handleLaunchActivity(ActivityThread.ActivityClientRecord r, 144 PendingTransactionActions pendingActions, Intent customIntent); 145 146 /** Perform activity start. */ handleStartActivity(ActivityThread.ActivityClientRecord r, PendingTransactionActions pendingActions)147 public abstract void handleStartActivity(ActivityThread.ActivityClientRecord r, 148 PendingTransactionActions pendingActions); 149 150 /** Get package info. */ getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo)151 public abstract LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, 152 CompatibilityInfo compatInfo); 153 154 /** Deliver app configuration change notification. */ handleConfigurationChanged(Configuration config)155 public abstract void handleConfigurationChanged(Configuration config); 156 157 /** 158 * Get {@link android.app.ActivityThread.ActivityClientRecord} instance that corresponds to the 159 * provided token. 160 */ getActivityClient(IBinder token)161 public abstract ActivityThread.ActivityClientRecord getActivityClient(IBinder token); 162 163 /** 164 * Prepare activity relaunch to update internal bookkeeping. This is used to track multiple 165 * relaunch and config update requests. 166 * @param token Activity token. 167 * @param pendingResults Activity results to be delivered. 168 * @param pendingNewIntents New intent messages to be delivered. 169 * @param configChanges Mask of configuration changes that have occurred. 170 * @param config New configuration applied to the activity. 171 * @param preserveWindow Whether the activity should try to reuse the window it created, 172 * including the decor view after the relaunch. 173 * @return An initialized instance of {@link ActivityThread.ActivityClientRecord} to use during 174 * relaunch, or {@code null} if relaunch cancelled. 175 */ prepareRelaunchActivity(IBinder token, List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents, int configChanges, MergedConfiguration config, boolean preserveWindow)176 public abstract ActivityThread.ActivityClientRecord prepareRelaunchActivity(IBinder token, 177 List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents, 178 int configChanges, MergedConfiguration config, boolean preserveWindow); 179 180 /** 181 * Perform activity relaunch. 182 * @param r Activity client record prepared for relaunch. 183 * @param pendingActions Pending actions to be used on later stages of activity transaction. 184 * */ handleRelaunchActivity(ActivityThread.ActivityClientRecord r, PendingTransactionActions pendingActions)185 public abstract void handleRelaunchActivity(ActivityThread.ActivityClientRecord r, 186 PendingTransactionActions pendingActions); 187 188 /** 189 * Report that relaunch request was handled. 190 * @param token Target activity token. 191 * @param pendingActions Pending actions initialized on earlier stages of activity transaction. 192 * Used to check if we should report relaunch to WM. 193 * */ reportRelaunch(IBinder token, PendingTransactionActions pendingActions)194 public abstract void reportRelaunch(IBinder token, PendingTransactionActions pendingActions); 195 } 196