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