1d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville/** 2d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Copyright (C) 2010 The Android Open Source Project 3d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 4d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * you may not use this file except in compliance with the License. 6d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * You may obtain a copy of the License at 7d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 8d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 10d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Unless required by applicable law or agreed to in writing, software 11d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * See the License for the specific language governing permissions and 14d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * limitations under the License. 15d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 16d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 17d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savillepackage com.android.internal.util; 18d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 19d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.content.ComponentName; 20d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.content.Context; 21d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.content.Intent; 22d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.content.ServiceConnection; 23d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Handler; 24d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.HandlerThread; 25d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.IBinder; 26d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Looper; 27d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Message; 28d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.Messenger; 29d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.os.RemoteException; 30d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport android.util.Slog; 31d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 32d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savilleimport java.util.Stack; 33d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 34d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville/** 3533c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <p>An asynchronous channel between two handlers.</p> 36d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 3733c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <p>The handlers maybe in the same process or in another process. There 38d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * are two protocol styles that can be used with an AysncChannel. The 39d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * first is a simple request/reply protocol where the server does 4033c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * not need to know which client is issuing the request.</p> 41d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 4233c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <p>In a simple request/reply protocol the client/source sends requests to the 43d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * server/destination. And the server uses the replyToMessage methods. 44d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * In this usage model there is no need for the destination to 4533c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * use the connect methods. The typical sequence of operations is:</p> 4633c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville *<ol> 470246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client calls AsyncChannel#connectSync or Asynchronously:</li> 480246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <ol>For an asynchronous half connection client calls AsyncChannel#connect.</ol> 490246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client receives CMD_CHANNEL_HALF_CONNECTED from AsyncChannel</li> 500246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * </ol> 5133c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li><code>comm-loop:</code></li> 520246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client calls AsyncChannel#sendMessage</li> 530246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Server processes messages and optionally replies using AsyncChannel#replyToMessage 5433c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Loop to <code>comm-loop</code> until done</li> 550246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>When done Client calls {@link AsyncChannel#disconnect}</li> 560246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client/Server receives CMD_CHANNEL_DISCONNECTED from AsyncChannel</li> 5733c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville *</ol> 5833c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville *<br/> 5933c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <p>A second usage model is where the server/destination needs to know 60d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * which client it's connected too. For example the server needs to 61d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * send unsolicited messages back to the client. Or the server keeps 62d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * different state for each client. In this model the server will also 6333c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * use the connect methods. The typical sequence of operation is:</p> 6433c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville *<ol> 650246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client calls AsyncChannel#fullyConnectSync or Asynchronously:<li> 660246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <ol>For an asynchronous full connection it calls AsyncChannel#connect</li> 670246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client receives CMD_CHANNEL_HALF_CONNECTED from AsyncChannel</li> 680246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Client calls AsyncChannel#sendMessage(CMD_CHANNEL_FULL_CONNECTION)</li> 690246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * </ol> 7033c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Server receives CMD_CHANNEL_FULL_CONNECTION</li> 710246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>Server calls AsyncChannel#connected</li> 7233c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Server sends AsyncChannel#sendMessage(CMD_CHANNEL_FULLY_CONNECTED)</li> 7333c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Client receives CMD_CHANNEL_FULLY_CONNECTED</li> 7433c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li><code>comm-loop:</code></li> 7533c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Client/Server uses AsyncChannel#sendMessage/replyToMessage 7633c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * to communicate and perform work</li> 7733c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Loop to <code>comm-loop</code> until done</li> 780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * <li>When done Client/Server calls {@link AsyncChannel#disconnect}</li> 7933c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville * <li>Client/Server receives CMD_CHANNEL_DISCONNECTED from AsyncChannel</li> 8033c54e3365d621fcc5b9f7564f18b33dc1e300dfWink Saville *</ol> 810246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 820246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * TODO: Consider simplifying where we have connect and fullyConnect with only one response 830246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * message RSP_CHANNEL_CONNECT instead of two, CMD_CHANNEL_HALF_CONNECTED and 840246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * CMD_CHANNEL_FULLY_CONNECTED. We'd also change CMD_CHANNEL_FULL_CONNECTION to REQ_CHANNEL_CONNECT. 85d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 86d20a5d6b5a821e28d73eba6502a2135134014a84Wink Savillepublic class AsyncChannel { 87d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Log tag */ 88d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static final String TAG = "AsyncChannel"; 89d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 90d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Enable to turn on debugging */ 91d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static final boolean DBG = false; 92d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 930246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville private static final int BASE = Protocol.BASE_SYSTEM_ASYNC_CHANNEL; 940246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 95d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 96d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Command sent when the channel is half connected. Half connected 97d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * means that the channel can be used to send commends to the destination 98d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * but the destination is unaware that the channel exists. The first 99d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * command sent to the destination is typically CMD_CHANNEL_FULL_CONNECTION if 100d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * it is desired to establish a long term connection, but any command maybe 101d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * sent. 102d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 103d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 == 0 : STATUS_SUCCESSFUL 104d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 1 : STATUS_BINDING_UNSUCCESSFUL 105cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj == the AsyncChannel 106d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.replyTo == dstMessenger if successful 107d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 1080246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int CMD_CHANNEL_HALF_CONNECTED = BASE + 0; 109d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 110d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 111d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Command typically sent when after receiving the CMD_CHANNEL_HALF_CONNECTED. 112d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * This is used to initiate a long term connection with the destination and 113d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * typically the destination will reply with CMD_CHANNEL_FULLY_CONNECTED. 114d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 115d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.replyTo = srcMessenger. 116d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 1170246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int CMD_CHANNEL_FULL_CONNECTION = BASE + 1; 118d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 119d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 120d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Command typically sent after the destination receives a CMD_CHANNEL_FULL_CONNECTION. 121d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * This signifies the acceptance or rejection of the channel by the sender. 122d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 123d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 == 0 : Accept connection 124d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * : All other values signify the destination rejected the connection 1250246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * and {@link AsyncChannel#disconnect} would typically be called. 126d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 1270246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int CMD_CHANNEL_FULLY_CONNECTED = BASE + 2; 128d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 129d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 130d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Command sent when one side or the other wishes to disconnect. The sender 131d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * may or may not be able to receive a reply depending upon the protocol and 1320246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * the state of the connection. The receiver should call {@link AsyncChannel#disconnect} 133d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * to close its side of the channel and it will receive a CMD_CHANNEL_DISCONNECTED 134d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * when the channel is closed. 135d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 136d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.replyTo = messenger that is disconnecting 137d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 1380246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int CMD_CHANNEL_DISCONNECT = BASE + 3; 139d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 140d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 141d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Command sent when the channel becomes disconnected. This is sent when the 142d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * channel is forcibly disconnected by the system or as a reply to CMD_CHANNEL_DISCONNECT. 143d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 144d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 == 0 : STATUS_SUCCESSFUL 1450246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 1 : STATUS_BINDING_UNSUCCESSFUL 1460246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2 : STATUS_SEND_UNSUCCESSFUL 147d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * : All other values signify failure and the channel state is indeterminate 148cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj == the AsyncChannel 149d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.replyTo = messenger disconnecting or null if it was never connected. 150d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 1510246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int CMD_CHANNEL_DISCONNECTED = BASE + 4; 152d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 15301ce0ce4724803112e7f2885d9ad49edf7515dcaWink Saville private static final int CMD_TO_STRING_COUNT = CMD_CHANNEL_DISCONNECTED - BASE + 1; 154583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; 155583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville static { 156583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville sCmdToString[CMD_CHANNEL_HALF_CONNECTED - BASE] = "CMD_CHANNEL_HALF_CONNECTED"; 157583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville sCmdToString[CMD_CHANNEL_FULL_CONNECTION - BASE] = "CMD_CHANNEL_FULL_CONNECTION"; 158583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville sCmdToString[CMD_CHANNEL_FULLY_CONNECTED - BASE] = "CMD_CHANNEL_FULLY_CONNECTED"; 159583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville sCmdToString[CMD_CHANNEL_DISCONNECT - BASE] = "CMD_CHANNEL_DISCONNECT"; 160583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville sCmdToString[CMD_CHANNEL_DISCONNECTED - BASE] = "CMD_CHANNEL_DISCONNECTED"; 161583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville } 162583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville protected static String cmdToString(int cmd) { 163583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville cmd -= BASE; 164583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville if ((cmd >= 0) && (cmd < sCmdToString.length)) { 165583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville return sCmdToString[cmd]; 166583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville } else { 167583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville return null; 168583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville } 169583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville } 170583eaaa57c51b28bf14da2a5cc94a2e6091cccf5Wink Saville 171d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Successful status always 0, !0 is an unsuccessful status */ 172d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public static final int STATUS_SUCCESSFUL = 0; 173d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 174d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Error attempting to bind on a connect */ 175d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public static final int STATUS_BINDING_UNSUCCESSFUL = 1; 176d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 1770246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** Error attempting to send a message */ 1780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int STATUS_SEND_UNSUCCESSFUL = 2; 1790246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 1800246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** CMD_FULLY_CONNECTED refused because a connection already exists*/ 1810246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public static final int STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED = 3; 1820246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 183ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan /** Error indicating abnormal termination of destination messenger */ 184ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan public static final int STATUS_REMOTE_DISCONNECTION = 4; 185ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 186d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Service connection */ 187d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private AsyncChannelConnection mConnection; 188d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 189d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Context for source */ 190d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Context mSrcContext; 191d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 192d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Handler for source */ 193d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Handler mSrcHandler; 194d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 195d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Messenger for source */ 196d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Messenger mSrcMessenger; 197d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 198d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Messenger for destination */ 199d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Messenger mDstMessenger; 200d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 201ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan /** Death Monitor for destination messenger */ 202ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan private DeathMonitor mDeathMonitor; 203ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 204d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 205d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * AsyncChannel constructor 206d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 207d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public AsyncChannel() { 208d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 209d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 210d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 2110246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Connect handler to named package/class synchronously. 212d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 213d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext is the context of the source 214d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 215d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * messages 216d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstPackageName is the destination package name 217d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstClassName is the fully qualified class name (i.e. contains 218d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * package name) 2190246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2200246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 221d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 2220246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int connectSrcHandlerToPackageSync( 223cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville Context srcContext, Handler srcHandler, String dstPackageName, String dstClassName) { 224d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class E"); 225d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 226cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville mConnection = new AsyncChannelConnection(); 227d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 228d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /* Initialize the source information */ 229d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcContext = srcContext; 230d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler = srcHandler; 231d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcMessenger = new Messenger(srcHandler); 232d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 233d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /* 234d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Initialize destination information to null they will 235d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * be initialized when the AsyncChannelConnection#onServiceConnected 236d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * is called 237d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 238d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = null; 239d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 240d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /* Send intent to create the connection */ 241d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Intent intent = new Intent(Intent.ACTION_MAIN); 242d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville intent.setClassName(dstPackageName, dstClassName); 243d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville boolean result = srcContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 244d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class X result=" + result); 2450246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return result ? STATUS_SUCCESSFUL : STATUS_BINDING_UNSUCCESSFUL; 2460246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2470246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2480246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 2490246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Connect a handler to Messenger synchronously. 2500246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2510246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext is the context of the source 2520246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 2530246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * messages 2540246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstMessenger is the hander to send messages to. 2550246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2560246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 2570246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 2580246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int connectSync(Context srcContext, Handler srcHandler, Messenger dstMessenger) { 2590246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("halfConnectSync srcHandler to the dstMessenger E"); 2600246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2610246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville // We are connected 2620246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville connected(srcContext, srcHandler, dstMessenger); 2630246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2640246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("halfConnectSync srcHandler to the dstMessenger X"); 2650246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return STATUS_SUCCESSFUL; 2660246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2670246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2680246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 2690246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * connect two local Handlers synchronously. 2700246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2710246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext is the context of the source 2720246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 2730246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * messages 2740246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstHandler is the hander to send messages to. 2750246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2760246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 2770246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 2780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int connectSync(Context srcContext, Handler srcHandler, Handler dstHandler) { 2790246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return connectSync(srcContext, srcHandler, new Messenger(dstHandler)); 2800246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2810246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2820246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 2830246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Fully connect two local Handlers synchronously. 2840246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2850246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext is the context of the source 2860246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 2870246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * messages 2880246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstHandler is the hander to send messages to. 2890246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2900246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 2910246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 2920246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int fullyConnectSync(Context srcContext, Handler srcHandler, Handler dstHandler) { 2930246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville int status = connectSync(srcContext, srcHandler, dstHandler); 2940246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (status == STATUS_SUCCESSFUL) { 2950246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville Message response = sendMessageSynchronously(CMD_CHANNEL_FULL_CONNECTION); 2960246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville status = response.arg1; 2970246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2980246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return status; 299d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 300d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 301d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 302d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect handler to named package/class. 303d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 304d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcHandler when complete. 305d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 306cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 307d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 308d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext is the context of the source 309d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 310d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * messages 311d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstPackageName is the destination package name 312d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstClassName is the fully qualified class name (i.e. contains 313d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * package name) 314d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 315d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void connect(Context srcContext, Handler srcHandler, String dstPackageName, 316cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville String dstClassName) { 317d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class E"); 318d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 319d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville final class ConnectAsync implements Runnable { 320d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Context mSrcCtx; 321d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Handler mSrcHdlr; 322d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville String mDstPackageName; 323d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville String mDstClassName; 324d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 325d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville ConnectAsync(Context srcContext, Handler srcHandler, String dstPackageName, 326cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville String dstClassName) { 327d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcCtx = srcContext; 328d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHdlr = srcHandler; 329d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstPackageName = dstPackageName; 330d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstClassName = dstClassName; 331d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 332d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 3330246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville @Override 334d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void run() { 3350246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville int result = connectSrcHandlerToPackageSync(mSrcCtx, mSrcHdlr, mDstPackageName, 3360246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville mDstClassName); 3370246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyHalfConnected(result); 338d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 339d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 340d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 341cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville ConnectAsync ca = new ConnectAsync(srcContext, srcHandler, dstPackageName, dstClassName); 342d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville new Thread(ca).start(); 343d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 344d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class X"); 345d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 346d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 347d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 348d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect handler to a class 349d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 350d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcHandler when complete. 351d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 352cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 353d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 354d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext 355d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler 356d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param klass is the class to send messages to. 357d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 358cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(Context srcContext, Handler srcHandler, Class<?> klass) { 359cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville connect(srcContext, srcHandler, klass.getPackage().getName(), klass.getName()); 360d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 361d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 362d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 363d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect handler and messenger. 364d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 365d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcHandler when complete. 366d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 367cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 368d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 369d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext 370d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler 371d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstMessenger 372d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 373cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(Context srcContext, Handler srcHandler, Messenger dstMessenger) { 374d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to the dstMessenger E"); 375d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 3760246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville // We are connected 3770246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville connected(srcContext, srcHandler, dstMessenger); 3780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 3790246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville // Tell source we are half connected 3800246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyHalfConnected(STATUS_SUCCESSFUL); 3810246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 3820246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("connect srcHandler to the dstMessenger X"); 3830246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 3840246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 3850246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 3860246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Connect handler to messenger. This method is typically called 3870246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * when a server receives a CMD_CHANNEL_FULL_CONNECTION request 3880246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * and initializes the internal instance variables to allow communication 3890246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * with the dstMessenger. 3900246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 3910246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext 3920246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler 3930246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstMessenger 3940246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 3950246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public void connected(Context srcContext, Handler srcHandler, Messenger dstMessenger) { 3960246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("connected srcHandler to the dstMessenger E"); 3970246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 398d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville // Initialize source fields 399d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcContext = srcContext; 400d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler = srcHandler; 401d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcMessenger = new Messenger(mSrcHandler); 402d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 403d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville // Initialize destination fields 404d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = dstMessenger; 405d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 4060246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("connected srcHandler to the dstMessenger X"); 407d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 408d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 409d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 410d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect two local Handlers. 411d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 412d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext is the context of the source 413d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 414d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * messages 415d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstHandler is the hander to send messages to. 416d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 417cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(Context srcContext, Handler srcHandler, Handler dstHandler) { 418cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville connect(srcContext, srcHandler, new Messenger(dstHandler)); 419d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 420d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 421d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 422d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect service and messenger. 423d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 424d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcAsyncService when complete. 425d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 426cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 427d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 428d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcAsyncService 429d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstMessenger 430d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 431cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(AsyncService srcAsyncService, Messenger dstMessenger) { 432cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville connect(srcAsyncService, srcAsyncService.getHandler(), dstMessenger); 433d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 434d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 435d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 436d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * To close the connection call when handler receives CMD_CHANNEL_DISCONNECTED 437d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 438d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void disconnected() { 4390246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville mSrcContext = null; 440d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler = null; 441d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcMessenger = null; 442d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = null; 443ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan mDeathMonitor = null; 444d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mConnection = null; 445d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 446d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 447d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 448d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Disconnect 449d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 450cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void disconnect() { 4510246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if ((mConnection != null) && (mSrcContext != null)) { 452d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcContext.unbindService(mConnection); 453d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 454f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville try { 455f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville // Send the DISCONNECTED, although it may not be received 456f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville // but its the best we can do. 457f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville Message msg = Message.obtain(); 458f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville msg.what = CMD_CHANNEL_DISCONNECTED; 459f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville msg.replyTo = mSrcMessenger; 460f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville mDstMessenger.send(msg); 461f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville } catch(Exception e) { 462f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville } 463f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville // Tell source we're disconnected. 464d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (mSrcHandler != null) { 4650246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyDisconnected(STATUS_SUCCESSFUL); 466d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 467ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan // Unlink only when bindService isn't used 468ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan if (mConnection == null && mDstMessenger != null && mDeathMonitor!= null) { 469ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan mDstMessenger.getBinder().unlinkToDeath(mDeathMonitor, 0); 470ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } 471d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 472d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 473d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 474d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler. 475d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 476d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param msg 477d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 478d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(Message msg) { 479d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.replyTo = mSrcMessenger; 480d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville try { 481d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger.send(msg); 482d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (RemoteException e) { 4830246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyDisconnected(STATUS_SEND_UNSUCCESSFUL); 484d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 485d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 486d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 487d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 488d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 489d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 490d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 491d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 492d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what) { 493d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 494d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 495d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 496d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 497d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 498d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 499d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 500d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 501d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 502d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 503d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 504d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, int arg1) { 505d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 506d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 507d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 508d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 509d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 510d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 511d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 512d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 513d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 514d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 515d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 516d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 517d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 518d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, int arg1, int arg2) { 519d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 520d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 521d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 522d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 523d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 524d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 525d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 526d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 527d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 528d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 529d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 530d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 531d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 532d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 533d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 534d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, int arg1, int arg2, Object obj) { 535d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 536d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 537d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 538d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 539d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 540d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 541d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 542d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 543d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 544d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 545d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 546d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 547d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 548d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 549d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, Object obj) { 550d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 551d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 552d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 553d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 554d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 555d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 556d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 557d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg sending dstMsg 558d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 559d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 560d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstMsg 561d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 562d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, Message dstMsg) { 563d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville try { 5640246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville dstMsg.replyTo = mSrcMessenger; 565d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville srcMsg.replyTo.send(dstMsg); 566d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (RemoteException e) { 567d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville log("TODO: handle replyToMessage RemoteException" + e); 568d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville e.printStackTrace(); 569d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 570d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 571d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 572d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 573d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 574d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 575d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 576d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 577d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 578d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what) { 579d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 580d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 581d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 582d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 583d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 584d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 585d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 586d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 587d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 588d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 589d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 590d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 591d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, int arg1) { 592d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 593d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 594d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 595d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 596d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 597d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 598d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 599d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 600d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 601d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 602d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 603d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 604d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 605d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 606d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, int arg1, int arg2) { 607d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 608d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 609d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 610d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 611d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 612d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 613d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 614d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 615d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 616d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 617d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 618d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 619d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 620d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 621d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 622d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 623d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, int arg1, int arg2, Object obj) { 624d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 625d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 626d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 627d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 628d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 629d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 630d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 631d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 632d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 633d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 634d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 635d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 636d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 637d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 638d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 639d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, Object obj) { 640d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 641d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 642d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 643d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 644d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 645d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 646d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 647d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 648d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 649d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param msg to send 650d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 651d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 652d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(Message msg) { 653d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = SyncMessenger.sendMessageSynchronously(mDstMessenger, msg); 654d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 655d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 656d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 657d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 658d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 659d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 660d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 661d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 662d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 663d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what) { 664d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 665d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 666d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 667d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 668d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 669d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 670d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 671d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 672d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 673d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 674d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 675d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 676d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 677d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, int arg1) { 678d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 679d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 680d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 681d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 682d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 683d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 684d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 685d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 686d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 687d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 688d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 689d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 690d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 691d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 692d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 693d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, int arg1, int arg2) { 694d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 695d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 696d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 697d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 698d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 699d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 700d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 701d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 702d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 703d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 704d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 705d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 706d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 707d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 708d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 709d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 710d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 711d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, int arg1, int arg2, Object obj) { 712d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 713d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 714d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 715d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 716d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 717d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 718d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 719d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 720d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 721d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 722d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 723d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 724d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 725d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 726d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 727d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 728d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, Object obj) { 729d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 730d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 731d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 732d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 733d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 734d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 735d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 736d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 737d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Helper class to send messages synchronously 738d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 739d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static class SyncMessenger { 740d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** A stack of SyncMessengers */ 741d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static Stack<SyncMessenger> sStack = new Stack<SyncMessenger>(); 742d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** A number of SyncMessengers created */ 743d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static int sCount = 0; 744d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The handler thread */ 745d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private HandlerThread mHandlerThread; 746d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The handler that will receive the result */ 747d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private SyncHandler mHandler; 748d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The messenger used to send the message */ 749d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Messenger mMessenger; 750d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 751d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** private constructor */ 752d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private SyncMessenger() { 753d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 754d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 755d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Synchronous Handler class */ 756d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private class SyncHandler extends Handler { 757d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The object used to wait/notify */ 758d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Object mLockObject = new Object(); 759d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The resulting message */ 760d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Message mResultMsg; 761d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 762d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Constructor */ 763d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private SyncHandler(Looper looper) { 764d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville super(looper); 765d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 766d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 767d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Handle of the reply message */ 768d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville @Override 769d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void handleMessage(Message msg) { 770d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mResultMsg = Message.obtain(); 771d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mResultMsg.copyFrom(msg); 772d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville synchronized(mLockObject) { 773d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mLockObject.notify(); 774d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 775d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 776d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 777d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 778d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 779d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return the SyncMessenger 780d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 781d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static SyncMessenger obtain() { 782d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville SyncMessenger sm; 783d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville synchronized (sStack) { 784d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (sStack.isEmpty()) { 785d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm = new SyncMessenger(); 786d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandlerThread = new HandlerThread("SyncHandler-" + sCount++); 787d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandlerThread.start(); 788d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandler = sm.new SyncHandler(sm.mHandlerThread.getLooper()); 789d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mMessenger = new Messenger(sm.mHandler); 790d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } else { 791d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm = sStack.pop(); 792d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 793d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 794d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return sm; 795d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 796d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 797d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 798d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Recycle this object 799d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 800d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private void recycle() { 801d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville synchronized (sStack) { 802d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sStack.push(this); 803d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 804d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 805d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 806d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 807d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message synchronously. 808d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 809d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param msg to send 810d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return result message or null if an error occurs 811d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 812d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static Message sendMessageSynchronously(Messenger dstMessenger, Message msg) { 813d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville SyncMessenger sm = SyncMessenger.obtain(); 814d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville try { 8150246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (dstMessenger != null && msg != null) { 8160246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.replyTo = sm.mMessenger; 8170246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville synchronized (sm.mHandler.mLockObject) { 8180246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville dstMessenger.send(msg); 8190246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville sm.mHandler.mLockObject.wait(); 8200246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 8210246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } else { 8220246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville sm.mHandler.mResultMsg = null; 823d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 824d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (InterruptedException e) { 825d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandler.mResultMsg = null; 826d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (RemoteException e) { 827d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandler.mResultMsg = null; 828d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 829d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sm.mHandler.mResultMsg; 830d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.recycle(); 831d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 832d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 833d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 834d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 835d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 836d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to the src handler that we're half connected. 8370246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * see: CMD_CHANNEL_HALF_CONNECTED for message contents 838d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 839d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param status to be stored in msg.arg1 840d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 841cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville private void replyHalfConnected(int status) { 842d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_HALF_CONNECTED); 843d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = status; 844cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville msg.obj = this; 845d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.replyTo = mDstMessenger; 846ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 847ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan /* 848ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan * Link to death only when bindService isn't used. 849ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan */ 850ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan if (mConnection == null) { 851ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan mDeathMonitor = new DeathMonitor(); 852ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan try { 853ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan mDstMessenger.getBinder().linkToDeath(mDeathMonitor, 0); 854ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } catch (RemoteException e) { 855ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan mDeathMonitor = null; 856ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan // Override status to indicate failure 857ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan msg.arg1 = STATUS_BINDING_UNSUCCESSFUL; 858ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } 859ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } 860ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 861d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler.sendMessage(msg); 862d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 863d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 864d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 8650246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Reply to the src handler that we are disconnected 8660246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * see: CMD_CHANNEL_DISCONNECTED for message contents 8670246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 8680246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param status to be stored in msg.arg1 8690246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 8700246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville private void replyDisconnected(int status) { 8710246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_DISCONNECTED); 8720246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.arg1 = status; 8730246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.obj = this; 8740246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.replyTo = mDstMessenger; 8750246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville mSrcHandler.sendMessage(msg); 8760246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 8770246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 8780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 8790246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 880d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * ServiceConnection to receive call backs. 881d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 882d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville class AsyncChannelConnection implements ServiceConnection { 883cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville AsyncChannelConnection() { 884d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 885d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 8860246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville @Override 887d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void onServiceConnected(ComponentName className, IBinder service) { 888d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = new Messenger(service); 889cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville replyHalfConnected(STATUS_SUCCESSFUL); 890d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 891d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 8920246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville @Override 893d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void onServiceDisconnected(ComponentName className) { 8940246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyDisconnected(STATUS_SUCCESSFUL); 895d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 896d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 897d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 898d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 899d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Log the string. 900d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 901d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param s 902d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 903d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static void log(String s) { 904d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Slog.d(TAG, s); 905d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 906ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 907ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan private final class DeathMonitor implements IBinder.DeathRecipient { 908ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 909ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan DeathMonitor() { 910ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } 911ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 912ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan public void binderDied() { 913ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan replyDisconnected(STATUS_REMOTE_DISCONNECTION); 914ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } 915ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan 916ba059bf54c58e312562ac527d97d2bc1d4dacb45Vairavan Srinivasan } 917d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville} 918