| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.am; |
| |
| import android.annotation.NonNull; |
| import android.app.IApplicationThread; |
| import android.app.servertransaction.ClientTransaction; |
| import android.app.servertransaction.ClientTransactionItem; |
| import android.app.servertransaction.ActivityLifecycleItem; |
| import android.os.IBinder; |
| import android.os.RemoteException; |
| |
| /** |
| * Class that is able to combine multiple client lifecycle transition requests and/or callbacks, |
| * and execute them as a single transaction. |
| * |
| * @see ClientTransaction |
| */ |
| class ClientLifecycleManager { |
| // TODO(lifecycler): Implement building transactions or global transaction. |
| // TODO(lifecycler): Use object pools for transactions and transaction items. |
| |
| /** |
| * Schedule a transaction, which may consist of multiple callbacks and a lifecycle request. |
| * @param transaction A sequence of client transaction items. |
| * @throws RemoteException |
| * |
| * @see ClientTransaction |
| */ |
| void scheduleTransaction(ClientTransaction transaction) throws RemoteException { |
| transaction.schedule(); |
| // TODO: b/70616950 |
| //transaction.recycle(); |
| } |
| |
| /** |
| * Schedule a single lifecycle request or callback to client activity. |
| * @param client Target client. |
| * @param activityToken Target activity token. |
| * @param stateRequest A request to move target activity to a desired lifecycle state. |
| * @throws RemoteException |
| * |
| * @see ClientTransactionItem |
| */ |
| void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken, |
| @NonNull ActivityLifecycleItem stateRequest) throws RemoteException { |
| final ClientTransaction clientTransaction = transactionWithState(client, activityToken, |
| stateRequest); |
| scheduleTransaction(clientTransaction); |
| } |
| |
| /** |
| * Schedule a single callback delivery to client activity. |
| * @param client Target client. |
| * @param activityToken Target activity token. |
| * @param callback A request to deliver a callback. |
| * @throws RemoteException |
| * |
| * @see ClientTransactionItem |
| */ |
| void scheduleTransaction(@NonNull IApplicationThread client, @NonNull IBinder activityToken, |
| @NonNull ClientTransactionItem callback) throws RemoteException { |
| final ClientTransaction clientTransaction = transactionWithCallback(client, activityToken, |
| callback); |
| scheduleTransaction(clientTransaction); |
| } |
| |
| /** |
| * Schedule a single callback delivery to client application. |
| * @param client Target client. |
| * @param callback A request to deliver a callback. |
| * @throws RemoteException |
| * |
| * @see ClientTransactionItem |
| */ |
| void scheduleTransaction(@NonNull IApplicationThread client, |
| @NonNull ClientTransactionItem callback) throws RemoteException { |
| final ClientTransaction clientTransaction = transactionWithCallback(client, |
| null /* activityToken */, callback); |
| scheduleTransaction(clientTransaction); |
| } |
| |
| /** |
| * @return A new instance of {@link ClientTransaction} with a single lifecycle state request. |
| * |
| * @see ClientTransaction |
| * @see ClientTransactionItem |
| */ |
| private static ClientTransaction transactionWithState(@NonNull IApplicationThread client, |
| @NonNull IBinder activityToken, @NonNull ActivityLifecycleItem stateRequest) { |
| final ClientTransaction clientTransaction = ClientTransaction.obtain(client, activityToken); |
| clientTransaction.setLifecycleStateRequest(stateRequest); |
| return clientTransaction; |
| } |
| |
| /** |
| * @return A new instance of {@link ClientTransaction} with a single callback invocation. |
| * |
| * @see ClientTransaction |
| * @see ClientTransactionItem |
| */ |
| private static ClientTransaction transactionWithCallback(@NonNull IApplicationThread client, |
| IBinder activityToken, @NonNull ClientTransactionItem callback) { |
| final ClientTransaction clientTransaction = ClientTransaction.obtain(client, activityToken); |
| clientTransaction.addCallback(callback); |
| return clientTransaction; |
| } |
| } |