diff options
| author | 2016-04-18 21:17:24 +0000 | |
|---|---|---|
| committer | 2016-04-18 21:17:25 +0000 | |
| commit | f49b51e000af2d17e315294f9584890d5e93fa33 (patch) | |
| tree | 265c9c84d7081ef1d8e40d99f80b64a5bacdf682 | |
| parent | 8df940000ddf82e4268350abe6b1cf4be375160c (diff) | |
| parent | bd3353a6c41896ed74d53b056ca1aefb2196c979 (diff) | |
Merge "Use ConnectivityThread for RttManager." into nyc-dev
| -rw-r--r-- | core/java/android/app/SystemServiceRegistry.java | 3 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/RttManager.java | 151 | 
2 files changed, 60 insertions, 94 deletions
| diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index cd6e57268907..7cd13ea4ff9d 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -542,7 +542,8 @@ final class SystemServiceRegistry {              public RttManager createService(ContextImpl ctx) {                  IBinder b = ServiceManager.getService(Context.WIFI_RTT_SERVICE);                  IRttManager service = IRttManager.Stub.asInterface(b); -                return new RttManager(ctx.getOuterContext(), service); +                return new RttManager(ctx.getOuterContext(), service, +                        ConnectivityThread.getInstanceLooper());              }});          registerService(Context.ETHERNET_SERVICE, EthernetManager.class, diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index 2579d9f81b26..a404a90566e3 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -5,7 +5,6 @@ import android.annotation.SystemApi;  import android.content.Context;  import android.os.Bundle;  import android.os.Handler; -import android.os.HandlerThread;  import android.os.Looper;  import android.os.Message;  import android.os.Messenger; @@ -19,8 +18,6 @@ import com.android.internal.annotations.VisibleForTesting;  import com.android.internal.util.AsyncChannel;  import com.android.internal.util.Protocol; -import java.util.concurrent.CountDownLatch; -  /** @hide */  @SystemApi  public class RttManager { @@ -311,7 +308,7 @@ public class RttManager {      }      public RttCapabilities getRttCapabilities() { -        synchronized (sCapabilitiesLock) { +        synchronized (mCapabilitiesLock) {              if (mRttCapabilities == null) {                  try {                      mRttCapabilities = mService.getRttCapabilities(); @@ -932,13 +929,13 @@ public class RttManager {          validateChannel();          ParcelableRttParams parcelableParams = new ParcelableRttParams(params);          Log.i(TAG, "Send RTT request to RTT Service"); -        sAsyncChannel.sendMessage(CMD_OP_START_RANGING, +        mAsyncChannel.sendMessage(CMD_OP_START_RANGING,                  0, putListener(listener), parcelableParams);      }      public void stopRanging(RttListener listener) {          validateChannel(); -        sAsyncChannel.sendMessage(CMD_OP_STOP_RANGING, 0, removeListener(listener)); +        mAsyncChannel.sendMessage(CMD_OP_STOP_RANGING, 0, removeListener(listener));      }      /** @@ -975,7 +972,7 @@ public class RttManager {          }          validateChannel();          int key = putListenerIfAbsent(callback); -        sAsyncChannel.sendMessage(CMD_OP_ENABLE_RESPONDER, 0, key); +        mAsyncChannel.sendMessage(CMD_OP_ENABLE_RESPONDER, 0, key);      }      /** @@ -998,7 +995,7 @@ public class RttManager {              Log.e(TAG, "responder not enabled yet");              return;          } -        sAsyncChannel.sendMessage(CMD_OP_DISABLE_RESPONDER, 0, key); +        mAsyncChannel.sendMessage(CMD_OP_DISABLE_RESPONDER, 0, key);      }      /** @@ -1110,23 +1107,17 @@ public class RttManager {      public static final int              CMD_OP_ENALBE_RESPONDER_FAILED              = BASE + 8; -    private Context mContext; -    private IRttManager mService; -    private RttCapabilities mRttCapabilities; -      private static final int INVALID_KEY = 0; -    private static int sListenerKey = 1; -    private static final SparseArray sListenerMap = new SparseArray(); -    private static final Object sListenerMapLock = new Object(); -    private static final Object sCapabilitiesLock = new Object(); +    private final Context mContext; +    private final IRttManager mService; +    private final SparseArray mListenerMap = new SparseArray(); +    private final Object mListenerMapLock = new Object(); +    private final Object mCapabilitiesLock = new Object(); -    private static AsyncChannel sAsyncChannel; -    private static CountDownLatch sConnected; - -    private static final Object sThreadRefLock = new Object(); -    private static int sThreadRefCount; -    private static HandlerThread sHandlerThread; +    private RttCapabilities mRttCapabilities; +    private int mListenerKey = 1; +    private AsyncChannel mAsyncChannel;      /**       * Create a new WifiScanner instance. @@ -1135,122 +1126,107 @@ public class RttManager {       * the standard {@link android.content.Context#WIFI_RTT_SERVICE Context.WIFI_RTT_SERVICE}.       * @param context the application context       * @param service the Binder interface +     * @param looper Looper for running the callbacks. +     *       * @hide       */ - -    public RttManager(Context context, IRttManager service) { +    public RttManager(Context context, IRttManager service, Looper looper) {          mContext = context;          mService = service; -        init(); -    } - -    private void init() { -        synchronized (sThreadRefLock) { -            if (++sThreadRefCount == 1) { -                Messenger messenger = null; -                try { -                    Log.d(TAG, "Get the messenger from " + mService); -                    messenger = mService.getMessenger(); -                } catch (RemoteException e) { -                    throw e.rethrowFromSystemServer(); -                } catch (SecurityException e) { -                    /* do nothing */ -                } +        Messenger messenger = null; +        try { +            Log.d(TAG, "Get the messenger from " + mService); +            messenger = mService.getMessenger(); +        } catch (RemoteException e) { +            throw e.rethrowFromSystemServer(); +        } -                if (messenger == null) { -                    sAsyncChannel = null; -                    return; -                } +        if (messenger == null) { +            throw new IllegalStateException("getMessenger() returned null!  This is invalid."); +        } -                sHandlerThread = new HandlerThread("RttManager"); -                sAsyncChannel = new AsyncChannel(); -                sConnected = new CountDownLatch(1); +        mAsyncChannel = new AsyncChannel(); -                sHandlerThread.start(); -                Handler handler = new ServiceHandler(sHandlerThread.getLooper()); -                sAsyncChannel.connect(mContext, handler, messenger); -                try { -                    sConnected.await(); -                } catch (InterruptedException e) { -                    Log.e(TAG, "interrupted wait at init"); -                } -            } -        } +        Handler handler = new ServiceHandler(looper); +        mAsyncChannel.connectSync(mContext, handler, messenger); +        // We cannot use fullyConnectSync because it sends the FULL_CONNECTION message +        // synchronously, which causes RttService to receive the wrong replyTo value. +        mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);      }      private void validateChannel() { -        if (sAsyncChannel == null) throw new IllegalStateException( +        if (mAsyncChannel == null) throw new IllegalStateException(                  "No permission to access and change wifi or a bad initialization");      } -    private static int putListener(Object listener) { +    private int putListener(Object listener) {          if (listener == null) return INVALID_KEY;          int key; -        synchronized (sListenerMapLock) { +        synchronized (mListenerMapLock) {              do { -                key = sListenerKey++; +                key = mListenerKey++;              } while (key == INVALID_KEY); -            sListenerMap.put(key, listener); +            mListenerMap.put(key, listener);          }          return key;      } -    // Insert a listener if it doesn't exist in sListenerMap. Returns the key of the listener. -    private static int putListenerIfAbsent(Object listener) { +    // Insert a listener if it doesn't exist in mListenerMap. Returns the key of the listener. +    private int putListenerIfAbsent(Object listener) {          if (listener == null) return INVALID_KEY; -        synchronized (sListenerMapLock) { +        synchronized (mListenerMapLock) {              int key = getListenerKey(listener);              if (key != INVALID_KEY) {                  return key;              }              do { -                key = sListenerKey++; +                key = mListenerKey++;              } while (key == INVALID_KEY); -            sListenerMap.put(key, listener); +            mListenerMap.put(key, listener);              return key;          }      } -    private static Object getListener(int key) { +    private Object getListener(int key) {          if (key == INVALID_KEY) return null; -        synchronized (sListenerMapLock) { -            Object listener = sListenerMap.get(key); +        synchronized (mListenerMapLock) { +            Object listener = mListenerMap.get(key);              return listener;          }      } -    private static int getListenerKey(Object listener) { +    private int getListenerKey(Object listener) {          if (listener == null) return INVALID_KEY; -        synchronized (sListenerMapLock) { -            int index = sListenerMap.indexOfValue(listener); +        synchronized (mListenerMapLock) { +            int index = mListenerMap.indexOfValue(listener);              if (index == -1) {                  return INVALID_KEY;              } else { -                return sListenerMap.keyAt(index); +                return mListenerMap.keyAt(index);              }          }      } -    private static Object removeListener(int key) { +    private Object removeListener(int key) {          if (key == INVALID_KEY) return null; -        synchronized (sListenerMapLock) { -            Object listener = sListenerMap.get(key); -            sListenerMap.remove(key); +        synchronized (mListenerMapLock) { +            Object listener = mListenerMap.get(key); +            mListenerMap.remove(key);              return listener;          }      } -    private static int removeListener(Object listener) { +    private int removeListener(Object listener) {          int key = getListenerKey(listener);          if (key == INVALID_KEY) return key; -        synchronized (sListenerMapLock) { -            sListenerMap.remove(key); +        synchronized (mListenerMapLock) { +            mListenerMap.remove(key);              return key;          }      } -    private static class ServiceHandler extends Handler { +    private class ServiceHandler extends Handler {          ServiceHandler(Looper looper) {              super(looper);          } @@ -1258,24 +1234,13 @@ public class RttManager {          public void handleMessage(Message msg) {              Log.i(TAG, "RTT manager get message: " + msg.what);              switch (msg.what) { -                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: -                    if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { -                        sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); -                    } else { -                        Log.e(TAG, "Failed to set up channel connection"); -                        // This will cause all further async API calls on the WifiManager -                        // to fail and throw an exception -                        sAsyncChannel = null; -                    } -                    return;                  case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: -                    sConnected.countDown();                      return;                  case AsyncChannel.CMD_CHANNEL_DISCONNECTED:                      Log.e(TAG, "Channel connection lost");                      // This will cause all further async API calls on the WifiManager                      // to fail and throw an exception -                    sAsyncChannel = null; +                    mAsyncChannel = null;                      getLooper().quit();                      return;              } |