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 183d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Service connection */ 184d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private AsyncChannelConnection mConnection; 185d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 186d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Context for source */ 187d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Context mSrcContext; 188d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 189d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Handler for source */ 190d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Handler mSrcHandler; 191d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 192d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Messenger for source */ 193d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Messenger mSrcMessenger; 194d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 195d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Messenger for destination */ 196d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Messenger mDstMessenger; 197d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 198d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 199d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * AsyncChannel constructor 200d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 201d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public AsyncChannel() { 202d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 203d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 204d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 2050246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Connect handler to named package/class synchronously. 206d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 207d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext is the context of the source 208d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 209d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * messages 210d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstPackageName is the destination package name 211d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstClassName is the fully qualified class name (i.e. contains 212d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * package name) 2130246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2140246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 215d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 2160246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int connectSrcHandlerToPackageSync( 217cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville Context srcContext, Handler srcHandler, String dstPackageName, String dstClassName) { 218d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class E"); 219d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 220cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville mConnection = new AsyncChannelConnection(); 221d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 222d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /* Initialize the source information */ 223d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcContext = srcContext; 224d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler = srcHandler; 225d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcMessenger = new Messenger(srcHandler); 226d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 227d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /* 228d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Initialize destination information to null they will 229d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * be initialized when the AsyncChannelConnection#onServiceConnected 230d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * is called 231d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 232d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = null; 233d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 234d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /* Send intent to create the connection */ 235d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Intent intent = new Intent(Intent.ACTION_MAIN); 236d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville intent.setClassName(dstPackageName, dstClassName); 237d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville boolean result = srcContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 238d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class X result=" + result); 2390246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return result ? STATUS_SUCCESSFUL : STATUS_BINDING_UNSUCCESSFUL; 2400246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2410246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2420246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 2430246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Connect a handler to Messenger synchronously. 2440246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2450246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext is the context of the source 2460246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 2470246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * messages 2480246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstMessenger is the hander to send messages to. 2490246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2500246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 2510246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 2520246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int connectSync(Context srcContext, Handler srcHandler, Messenger dstMessenger) { 2530246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("halfConnectSync srcHandler to the dstMessenger E"); 2540246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2550246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville // We are connected 2560246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville connected(srcContext, srcHandler, dstMessenger); 2570246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2580246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("halfConnectSync srcHandler to the dstMessenger X"); 2590246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return STATUS_SUCCESSFUL; 2600246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2610246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2620246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 2630246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * connect two local Handlers synchronously. 2640246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2650246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext is the context of the source 2660246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 2670246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * messages 2680246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstHandler is the hander to send messages to. 2690246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2700246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 2710246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 2720246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int connectSync(Context srcContext, Handler srcHandler, Handler dstHandler) { 2730246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return connectSync(srcContext, srcHandler, new Messenger(dstHandler)); 2740246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2750246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 2760246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 2770246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Fully connect two local Handlers synchronously. 2780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2790246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext is the context of the source 2800246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 2810246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * messages 2820246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstHandler is the hander to send messages to. 2830246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 2840246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @return STATUS_SUCCESSFUL on success any other value is an error. 2850246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 2860246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public int fullyConnectSync(Context srcContext, Handler srcHandler, Handler dstHandler) { 2870246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville int status = connectSync(srcContext, srcHandler, dstHandler); 2880246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (status == STATUS_SUCCESSFUL) { 2890246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville Message response = sendMessageSynchronously(CMD_CHANNEL_FULL_CONNECTION); 2900246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville status = response.arg1; 2910246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 2920246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville return status; 293d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 294d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 295d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 296d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect handler to named package/class. 297d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 298d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcHandler when complete. 299d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 300cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 301d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 302d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext is the context of the source 303d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 304d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * messages 305d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstPackageName is the destination package name 306d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstClassName is the fully qualified class name (i.e. contains 307d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * package name) 308d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 309d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void connect(Context srcContext, Handler srcHandler, String dstPackageName, 310cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville String dstClassName) { 311d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class E"); 312d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 313d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville final class ConnectAsync implements Runnable { 314d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Context mSrcCtx; 315d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Handler mSrcHdlr; 316d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville String mDstPackageName; 317d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville String mDstClassName; 318d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 319d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville ConnectAsync(Context srcContext, Handler srcHandler, String dstPackageName, 320cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville String dstClassName) { 321d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcCtx = srcContext; 322d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHdlr = srcHandler; 323d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstPackageName = dstPackageName; 324d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstClassName = dstClassName; 325d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 326d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 3270246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville @Override 328d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void run() { 3290246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville int result = connectSrcHandlerToPackageSync(mSrcCtx, mSrcHdlr, mDstPackageName, 3300246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville mDstClassName); 3310246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyHalfConnected(result); 332d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 333d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 334d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 335cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville ConnectAsync ca = new ConnectAsync(srcContext, srcHandler, dstPackageName, dstClassName); 336d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville new Thread(ca).start(); 337d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 338d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to dst Package & class X"); 339d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 340d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 341d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 342d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect handler to a class 343d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 344d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcHandler when complete. 345d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 346cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 347d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 348d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext 349d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler 350d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param klass is the class to send messages to. 351d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 352cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(Context srcContext, Handler srcHandler, Class<?> klass) { 353cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville connect(srcContext, srcHandler, klass.getPackage().getName(), klass.getName()); 354d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 355d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 356d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 357d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect handler and messenger. 358d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 359d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcHandler when complete. 360d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 361cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 362d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 363d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext 364d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler 365d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstMessenger 366d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 367cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(Context srcContext, Handler srcHandler, Messenger dstMessenger) { 368d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (DBG) log("connect srcHandler to the dstMessenger E"); 369d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 3700246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville // We are connected 3710246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville connected(srcContext, srcHandler, dstMessenger); 3720246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 3730246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville // Tell source we are half connected 3740246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyHalfConnected(STATUS_SUCCESSFUL); 3750246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 3760246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("connect srcHandler to the dstMessenger X"); 3770246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 3780246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 3790246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 3800246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Connect handler to messenger. This method is typically called 3810246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * when a server receives a CMD_CHANNEL_FULL_CONNECTION request 3820246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * and initializes the internal instance variables to allow communication 3830246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * with the dstMessenger. 3840246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 3850246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcContext 3860246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param srcHandler 3870246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param dstMessenger 3880246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 3890246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville public void connected(Context srcContext, Handler srcHandler, Messenger dstMessenger) { 3900246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("connected srcHandler to the dstMessenger E"); 3910246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 392d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville // Initialize source fields 393d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcContext = srcContext; 394d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler = srcHandler; 395d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcMessenger = new Messenger(mSrcHandler); 396d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 397d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville // Initialize destination fields 398d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = dstMessenger; 399d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 4000246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (DBG) log("connected srcHandler to the dstMessenger X"); 401d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 402d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 403d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 404d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect two local Handlers. 405d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 406d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcContext is the context of the source 407d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcHandler is the hander to receive CONNECTED & DISCONNECTED 408d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * messages 409d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstHandler is the hander to send messages to. 410d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 411cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(Context srcContext, Handler srcHandler, Handler dstHandler) { 412cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville connect(srcContext, srcHandler, new Messenger(dstHandler)); 413d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 414d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 415d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 416d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Connect service and messenger. 417d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 418d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Sends a CMD_CHANNEL_HALF_CONNECTED message to srcAsyncService when complete. 419d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * msg.arg1 = status 420cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville * msg.obj = the AsyncChannel 421d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 422d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcAsyncService 423d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstMessenger 424d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 425cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void connect(AsyncService srcAsyncService, Messenger dstMessenger) { 426cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville connect(srcAsyncService, srcAsyncService.getHandler(), dstMessenger); 427d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 428d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 429d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 430d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * To close the connection call when handler receives CMD_CHANNEL_DISCONNECTED 431d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 432d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void disconnected() { 4330246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville mSrcContext = null; 434d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler = null; 435d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcMessenger = null; 436d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = null; 437d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mConnection = null; 438d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 439d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 440d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 441d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Disconnect 442d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 443cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville public void disconnect() { 4440246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if ((mConnection != null) && (mSrcContext != null)) { 445d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcContext.unbindService(mConnection); 446d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 447f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville try { 448f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville // Send the DISCONNECTED, although it may not be received 449f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville // but its the best we can do. 450f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville Message msg = Message.obtain(); 451f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville msg.what = CMD_CHANNEL_DISCONNECTED; 452f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville msg.replyTo = mSrcMessenger; 453f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville mDstMessenger.send(msg); 454f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville } catch(Exception e) { 455f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville } 456f3110dfc84f6d7ae0c2c0718db2d1948dfd99240Wink Saville // Tell source we're disconnected. 457d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (mSrcHandler != null) { 4580246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyDisconnected(STATUS_SUCCESSFUL); 459d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 460d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 461d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 462d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 463d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler. 464d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 465d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param msg 466d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 467d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(Message msg) { 468d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.replyTo = mSrcMessenger; 469d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville try { 470d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger.send(msg); 471d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (RemoteException e) { 4720246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyDisconnected(STATUS_SEND_UNSUCCESSFUL); 473d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 474d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 475d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 476d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 477d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 478d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 479d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 480d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 481d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what) { 482d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 483d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 484d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 485d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 486d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 487d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 488d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 489d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 490d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 491d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 492d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 493d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, int arg1) { 494d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 495d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 496d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 497d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 498d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 499d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 500d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 501d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 502d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 503d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 504d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 505d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 506d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 507d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, int arg1, int arg2) { 508d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 509d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 510d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 511d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 512d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 513d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 514d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 515d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 516d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 517d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 518d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 519d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 520d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 521d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 522d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 523d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, int arg1, int arg2, Object obj) { 524d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 525d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 526d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 527d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 528d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 529d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 530d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 531d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 532d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 533d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message to the destination handler 534d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 535d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 536d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 537d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 538d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void sendMessage(int what, Object obj) { 539d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 540d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 541d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 542d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sendMessage(msg); 543d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 544d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 545d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 546d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg sending dstMsg 547d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 548d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 549d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param dstMsg 550d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 551d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, Message dstMsg) { 552d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville try { 5530246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville dstMsg.replyTo = mSrcMessenger; 554d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville srcMsg.replyTo.send(dstMsg); 555d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (RemoteException e) { 556d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville log("TODO: handle replyToMessage RemoteException" + e); 557d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville e.printStackTrace(); 558d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 559d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 560d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 561d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 562d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 563d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 564d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 565d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 566d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 567d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what) { 568d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 569d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 570d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 571d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 572d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 573d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 574d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 575d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 576d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 577d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 578d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 579d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 580d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, int arg1) { 581d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 582d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 583d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 584d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 585d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 586d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 587d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 588d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 589d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 590d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 591d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 592d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 593d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 594d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 595d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, int arg1, int arg2) { 596d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 597d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 598d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 599d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 600d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 601d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 602d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 603d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 604d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 605d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 606d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 607d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 608d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 609d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 610d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 611d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 612d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, int arg1, int arg2, Object obj) { 613d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 614d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 615d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 616d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 617d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 618d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 619d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 620d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 621d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 622d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to srcMsg 623d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 624d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param srcMsg 625d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 626d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 627d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 628d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void replyToMessage(Message srcMsg, int what, Object obj) { 629d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 630d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 631d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 632d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville replyToMessage(srcMsg, msg); 633d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 634d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 635d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 636d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 637d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 638d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param msg to send 639d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 640d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 641d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(Message msg) { 642d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = SyncMessenger.sendMessageSynchronously(mDstMessenger, msg); 643d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 644d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 645d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 646d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 647d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 648d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 649d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 650d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 651d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 652d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what) { 653d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 654d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 655d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 656d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 657d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 658d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 659d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 660d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 661d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 662d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 663d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 664d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 665d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 666d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, int arg1) { 667d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 668d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 669d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 670d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 671d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 672d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 673d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 674d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 675d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 676d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 677d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 678d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 679d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 680d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 681d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 682d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, int arg1, int arg2) { 683d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 684d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 685d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 686d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 687d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 688d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 689d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 690d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 691d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 692d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 693d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 694d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 695d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg1 696d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param arg2 697d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 698d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 699d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 700d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, int arg1, int arg2, Object obj) { 701d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 702d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 703d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = arg1; 704d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg2 = arg2; 705d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 706d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 707d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 708d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 709d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 710d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 711d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send the Message synchronously. 712d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 713d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param what 714d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param obj 715d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return reply message or null if an error. 716d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 717d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public Message sendMessageSynchronously(int what, Object obj) { 718d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = Message.obtain(); 719d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.what = what; 720d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.obj = obj; 721d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sendMessageSynchronously(msg); 722d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 723d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 724d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 725d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 726d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Helper class to send messages synchronously 727d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 728d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static class SyncMessenger { 729d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** A stack of SyncMessengers */ 730d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static Stack<SyncMessenger> sStack = new Stack<SyncMessenger>(); 731d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** A number of SyncMessengers created */ 732d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static int sCount = 0; 733d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The handler thread */ 734d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private HandlerThread mHandlerThread; 735d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The handler that will receive the result */ 736d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private SyncHandler mHandler; 737d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The messenger used to send the message */ 738d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Messenger mMessenger; 739d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 740d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** private constructor */ 741d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private SyncMessenger() { 742d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 743d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 744d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Synchronous Handler class */ 745d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private class SyncHandler extends Handler { 746d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The object used to wait/notify */ 747d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Object mLockObject = new Object(); 748d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** The resulting message */ 749d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private Message mResultMsg; 750d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 751d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Constructor */ 752d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private SyncHandler(Looper looper) { 753d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville super(looper); 754d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 755d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 756d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** Handle of the reply message */ 757d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville @Override 758d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void handleMessage(Message msg) { 759d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mResultMsg = Message.obtain(); 760d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mResultMsg.copyFrom(msg); 761d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville synchronized(mLockObject) { 762d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mLockObject.notify(); 763d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 764d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 765d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 766d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 767d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 768d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return the SyncMessenger 769d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 770d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static SyncMessenger obtain() { 771d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville SyncMessenger sm; 772d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville synchronized (sStack) { 773d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville if (sStack.isEmpty()) { 774d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm = new SyncMessenger(); 775d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandlerThread = new HandlerThread("SyncHandler-" + sCount++); 776d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandlerThread.start(); 777d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandler = sm.new SyncHandler(sm.mHandlerThread.getLooper()); 778d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mMessenger = new Messenger(sm.mHandler); 779d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } else { 780d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm = sStack.pop(); 781d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 782d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 783d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return sm; 784d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 785d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 786d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 787d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Recycle this object 788d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 789d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private void recycle() { 790d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville synchronized (sStack) { 791d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sStack.push(this); 792d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 793d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 794d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 795d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 796d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Send a message synchronously. 797d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 798d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param msg to send 799d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @return result message or null if an error occurs 800d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 801d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static Message sendMessageSynchronously(Messenger dstMessenger, Message msg) { 802d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville SyncMessenger sm = SyncMessenger.obtain(); 803d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville try { 8040246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville if (dstMessenger != null && msg != null) { 8050246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.replyTo = sm.mMessenger; 8060246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville synchronized (sm.mHandler.mLockObject) { 8070246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville dstMessenger.send(msg); 8080246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville sm.mHandler.mLockObject.wait(); 8090246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 8100246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } else { 8110246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville sm.mHandler.mResultMsg = null; 812d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 813d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (InterruptedException e) { 814d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandler.mResultMsg = null; 815d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } catch (RemoteException e) { 816d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.mHandler.mResultMsg = null; 817d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 818d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message resultMsg = sm.mHandler.mResultMsg; 819d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville sm.recycle(); 820d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville return resultMsg; 821d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 822d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 823d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 824d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 825d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Reply to the src handler that we're half connected. 8260246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * see: CMD_CHANNEL_HALF_CONNECTED for message contents 827d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 828d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param status to be stored in msg.arg1 829d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 830cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville private void replyHalfConnected(int status) { 831d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_HALF_CONNECTED); 832d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.arg1 = status; 833cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville msg.obj = this; 834d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville msg.replyTo = mDstMessenger; 835d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mSrcHandler.sendMessage(msg); 836d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 837d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 838d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 8390246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * Reply to the src handler that we are disconnected 8400246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * see: CMD_CHANNEL_DISCONNECTED for message contents 8410246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * 8420246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville * @param status to be stored in msg.arg1 8430246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville */ 8440246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville private void replyDisconnected(int status) { 8450246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_DISCONNECTED); 8460246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.arg1 = status; 8470246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.obj = this; 8480246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville msg.replyTo = mDstMessenger; 8490246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville mSrcHandler.sendMessage(msg); 8500246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville } 8510246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 8520246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville 8530246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville /** 854d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * ServiceConnection to receive call backs. 855d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 856d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville class AsyncChannelConnection implements ServiceConnection { 857cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville AsyncChannelConnection() { 858d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 859d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 8600246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville @Override 861d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void onServiceConnected(ComponentName className, IBinder service) { 862d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville mDstMessenger = new Messenger(service); 863cfce303cbdd59a3883957e4bc96a0476ceeb86acWink Saville replyHalfConnected(STATUS_SUCCESSFUL); 864d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 865d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 8660246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville @Override 867d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville public void onServiceDisconnected(ComponentName className) { 8680246bbc8d7b646a2344d04d5af41580fa9e17a98Wink Saville replyDisconnected(STATUS_SUCCESSFUL); 869d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 870d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 871d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville 872d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville /** 873d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * Log the string. 874d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * 875d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville * @param s 876d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville */ 877d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville private static void log(String s) { 878d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville Slog.d(TAG, s); 879d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville } 880d20a5d6b5a821e28d73eba6502a2135134014a84Wink Saville} 881