RttService.java revision 143657392bf0702a155fe688171a5abbf4c86570
1143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandepackage com.android.server.wifi;
2143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
3143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.content.BroadcastReceiver;
4143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.content.Context;
5143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.content.Intent;
6143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.content.IntentFilter;
7143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.net.wifi.RttManager;
8143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.net.wifi.WifiManager;
9143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.os.Handler;
10143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.os.HandlerThread;
11143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.os.Looper;
12143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.os.Message;
13143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.os.Messenger;
14143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.os.RemoteException;
15143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.util.Log;
16143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.net.wifi.IRttManager;
17143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.util.Slog;
18143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
19143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport com.android.internal.util.AsyncChannel;
20143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport com.android.internal.util.Protocol;
21143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport com.android.internal.util.StateMachine;
22143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport com.android.internal.util.State;
23143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport com.android.server.SystemService;
24143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
25143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport java.util.HashMap;
26143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport java.util.LinkedList;
27143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport java.util.Queue;
28143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
29143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeclass RttService extends SystemService {
30143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
31143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    public static final boolean DBG = false;
32143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
33143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    class RttServiceImpl extends IRttManager.Stub {
34143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
35143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        @Override
36143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        public Messenger getMessenger() {
37143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            return new Messenger(mClientHandler);
38143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
39143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
40143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private class ClientHandler extends Handler {
41143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
42143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            ClientHandler(android.os.Looper looper) {
43143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                super(looper);
44143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
45143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
46143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            @Override
47143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            public void handleMessage(Message msg) {
48143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
49143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                if (DBG) Log.d(TAG, "ClientHandler got" + msg);
50143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
51143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                switch (msg.what) {
52143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
53143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
54143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
55143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            AsyncChannel c = (AsyncChannel) msg.obj;
56143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            if (DBG) Slog.d(TAG, "New client listening to asynchronous messages: " +
57143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                    msg.replyTo);
58143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            ClientInfo cInfo = new ClientInfo(c, msg.replyTo);
59143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            mClients.put(msg.replyTo, cInfo);
60143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        } else {
61143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            Slog.e(TAG, "Client connection failure, error=" + msg.arg1);
62143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        }
63143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        return;
64143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
65143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        if (msg.arg1 == AsyncChannel.STATUS_SEND_UNSUCCESSFUL) {
66143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            Slog.e(TAG, "Send failed, client connection lost");
67143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        } else {
68143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            if (DBG) Slog.d(TAG, "Client connection lost with reason: " + msg.arg1);
69143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        }
70143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        if (DBG) Slog.d(TAG, "closing client " + msg.replyTo);
71143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        ClientInfo ci = mClients.remove(msg.replyTo);
72143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        ci.cleanup();
73143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        return;
74143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION:
75143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        AsyncChannel ac = new AsyncChannel();
76143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        ac.connect(mContext, this, msg.replyTo);
77143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        return;
78143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
79143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
80143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                ClientInfo ci = mClients.get(msg.replyTo);
81143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                if (ci == null) {
82143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    Slog.e(TAG, "Could not find client info for message " + msg.replyTo);
83143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    replyFailed(msg, RttManager.REASON_INVALID_LISTENER, "Could not find listener");
84143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    return;
85143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
86143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
87143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                int validCommands[] = {
88143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        RttManager.CMD_OP_START_RANGING,
89143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        RttManager.CMD_OP_STOP_RANGING
90143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        };
91143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
92143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                for(int cmd : validCommands) {
93143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    if (cmd == msg.what) {
94143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        mStateMachine.sendMessage(Message.obtain(msg));
95143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        return;
96143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    }
97143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
98143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
99143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                replyFailed(msg, RttManager.REASON_INVALID_REQUEST, "Invalid request");
100143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
101143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
102143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
103143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private Context mContext;
104143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private RttStateMachine mStateMachine;
105143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private ClientHandler mClientHandler;
106143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
107143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        RttServiceImpl() { }
108143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
109143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        RttServiceImpl(Context context) {
110143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mContext = context;
111143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
112143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
113143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        public void startService(Context context) {
114143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mContext = context;
115143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
116143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            HandlerThread thread = new HandlerThread("WifiRttService");
117143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            thread.start();
118143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
119143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mClientHandler = new ClientHandler(thread.getLooper());
120143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mStateMachine = new RttStateMachine(thread.getLooper());
121143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
122143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mContext.registerReceiver(
123143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    new BroadcastReceiver() {
124143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        @Override
125143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        public void onReceive(Context context, Intent intent) {
126143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            int state = intent.getIntExtra(
127143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                    WifiManager.EXTRA_SCAN_AVAILABLE, WifiManager.WIFI_STATE_DISABLED);
128143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            if (DBG) Log.d(TAG, "SCAN_AVAILABLE : " + state);
129143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            if (state == WifiManager.WIFI_STATE_ENABLED) {
130143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                mStateMachine.sendMessage(CMD_DRIVER_LOADED);
131143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            } else if (state == WifiManager.WIFI_STATE_DISABLED) {
132143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                mStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
133143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            }
134143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        }
135143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    }, new IntentFilter(WifiManager.WIFI_SCAN_AVAILABLE));
136143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
137143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mStateMachine.start();
138143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
139143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
140143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private class RttRequest {
141143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            Integer key;
142143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            ClientInfo ci;
143143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            RttManager.RttParams params;
144143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
145143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
146143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private class ClientInfo {
147143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            private final AsyncChannel mChannel;
148143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            private final Messenger mMessenger;
149143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            HashMap<Integer, RttManager.RttParams> mRequests = new HashMap<Integer,
150143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    RttManager.RttParams>();
151143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
152143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            ClientInfo(AsyncChannel c, Messenger m) {
153143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mChannel = c;
154143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mMessenger = m;
155143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
156143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
157143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            void addRttRequest(int key, RttManager.RttParams params) {
158143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                RttRequest request = new RttRequest();
159143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                request.key = key;
160143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                request.ci = this;
161143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                request.params = params;
162143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mRequests.put(key, params);
163143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mRequestQueue.add(request);
164143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mStateMachine.sendMessage(CMD_ISSUE_NEXT_REQUEST);
165143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
166143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
167143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            void removeRttRequest(int key) {
168143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mRequests.remove(key);
169143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
170143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
171143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            void reportResult(RttRequest request, RttManager.RttResult[] results) {
172143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mChannel.sendMessage(RttManager.CMD_OP_SUCCEEDED, request.key, 0, results);
173143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mRequests.remove(request.key);
174143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
175143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
176143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            void reportFailed(RttRequest request, int reason, String description) {
177143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mChannel.sendMessage(RttManager.CMD_OP_FAILED, request.key, reason, description);
178143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mRequests.remove(request.key);
179143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
180143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
181143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            void cleanup() {
182143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mRequests.clear();
183143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
184143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
185143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
186143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private Queue<RttRequest> mRequestQueue = new LinkedList<RttRequest>();
187143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private HashMap<Messenger, ClientInfo> mClients = new HashMap<Messenger, ClientInfo>(4);
188143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
189143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private static final int BASE = Protocol.BASE_WIFI_SCANNER_SERVICE;
190143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
191143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private static final int CMD_DRIVER_LOADED                       = BASE + 0;
192143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private static final int CMD_DRIVER_UNLOADED                     = BASE + 1;
193143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private static final int CMD_ISSUE_NEXT_REQUEST                  = BASE + 2;
194143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private static final int CMD_RTT_RESPONSE                        = BASE + 3;
195143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
196143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        class RttStateMachine extends StateMachine {
197143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
198143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            DefaultState mDefaultState = new DefaultState();
199143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            EnabledState mEnabledState = new EnabledState();
200143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            RequestPendingState mRequestPendingState = new RequestPendingState();
201143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
202143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            RttStateMachine(Looper looper) {
203143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                super("RttStateMachine", looper);
204143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
205143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
206143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            class DefaultState extends State {
207143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                @Override
208143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                public boolean processMessage(Message msg) {
209143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    switch (msg.what) {
210143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_DRIVER_LOADED:
211143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            transitionTo(mEnabledState);
212143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
213143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_ISSUE_NEXT_REQUEST:
214143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            deferMessage(msg);
215143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
216143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        default:
217143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            return NOT_HANDLED;
218143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    }
219143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    return HANDLED;
220143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
221143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
222143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
223143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            class EnabledState extends State {
224143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                @Override
225143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                public boolean processMessage(Message msg) {
226143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    switch (msg.what) {
227143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_DRIVER_UNLOADED:
228143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            transitionTo(mDefaultState);
229143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
230143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_ISSUE_NEXT_REQUEST:
231143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            deferMessage(msg);
232143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            transitionTo(mRequestPendingState);
233143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
234143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        default:
235143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            return NOT_HANDLED;
236143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    }
237143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    return HANDLED;
238143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
239143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
240143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
241143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            class RequestPendingState extends State {
242143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                RttRequest mOutstandingRequest;
243143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                @Override
244143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                public boolean processMessage(Message msg) {
245143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    switch (msg.what) {
246143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_DRIVER_UNLOADED:
247143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            if (mOutstandingRequest != null) {
248143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                WifiNative.cancelRtt(
249143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                        new RttManager.RttParams[]{mOutstandingRequest.params});
250143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            }
251143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            transitionTo(mDefaultState);
252143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
253143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_ISSUE_NEXT_REQUEST:
254143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            if (mOutstandingRequest == null) {
255143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                mOutstandingRequest = issueNextRequest();
256143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                if (mOutstandingRequest == null) {
257143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                    transitionTo(mEnabledState);
258143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                }
259143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            } else {
260143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                /* just wait; we'll issue next request after
261143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                 * current one is finished */
262143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            }
263143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
264143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        case CMD_RTT_RESPONSE:
265143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            mOutstandingRequest.ci.reportResult(
266143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                                    mOutstandingRequest, (RttManager.RttResult[])msg.obj);
267143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            sendMessage(CMD_ISSUE_NEXT_REQUEST);
268143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            break;
269143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        default:
270143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            return NOT_HANDLED;
271143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    }
272143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    return HANDLED;
273143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
274143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
275143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
276143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
277143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        void replySucceeded(Message msg, Object obj) {
278143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            if (msg.replyTo != null) {
279143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                Message reply = Message.obtain();
280143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                reply.what = RttManager.CMD_OP_SUCCEEDED;
281143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                reply.arg2 = msg.arg2;
282143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                reply.obj = obj;
283143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                try {
284143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    msg.replyTo.send(reply);
285143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                } catch (RemoteException e) {
286143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    // There's not much we can do if reply can't be sent!
287143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
288143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            } else {
289143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                // locally generated message; doesn't need a reply!
290143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
291143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
292143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
293143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        void replyFailed(Message msg, int reason, String description) {
294143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            Message reply = Message.obtain();
295143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            reply.what = RttManager.CMD_OP_FAILED;
296143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            reply.arg1 = reason;
297143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            reply.arg2 = msg.arg2;
298143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            reply.obj = description;
299143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            try {
300143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                msg.replyTo.send(reply);
301143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            } catch (RemoteException e) {
302143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                // There's not much we can do if reply can't be sent!
303143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
304143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
305143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
306143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        private WifiNative.RttEventHandler mEventHandler = new WifiNative.RttEventHandler() {
307143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            @Override
308143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            public void onRttResults(RttManager.RttResult[] result) {
309143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mStateMachine.sendMessage(CMD_RTT_RESPONSE, result);
310143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
311143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        };
312143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
313143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        RttRequest issueNextRequest() {
314143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            RttRequest request = null;
315143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            do {
316143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                request = mRequestQueue.remove();
317143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                if (WifiNative.requestRtt(
318143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                        new RttManager.RttParams[] {request.params}, mEventHandler)) {
319143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    return request;
320143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                } else {
321143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                    request.ci.reportFailed(request,
322143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                            RttManager.REASON_UNSPECIFIED, "Failed to start");
323143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                }
324143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            } while (request != null);
325143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
326143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            /* all requests exhausted */
327143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            return null;
328143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
329143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
330143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
331143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    private static final String TAG = "RttService";
332143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    RttServiceImpl mImpl;
333143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
334143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    public RttService(Context context) {
335143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        super(context);
336143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        Log.i(TAG, "Creating " + Context.WIFI_RTT_SERVICE);
337143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
338143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
339143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    @Override
340143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    public void onStart() {
341143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        mImpl = new RttServiceImpl(getContext());
342143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
343143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        Log.i(TAG, "Starting " + Context.WIFI_RTT_SERVICE);
344143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        publishBinderService(Context.WIFI_RTT_SERVICE, mImpl);
345143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
346143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
347143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    @Override
348143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    public void onBootPhase(int phase) {
349143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
350143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            Log.i(TAG, "Registering " + Context.WIFI_RTT_SERVICE);
351143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            if (mImpl == null) {
352143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande                mImpl = new RttServiceImpl(getContext());
353143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            }
354143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            mImpl.startService(getContext());
355143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        }
356143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
357143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande}
358