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