diff options
11 files changed, 111 insertions, 134 deletions
diff --git a/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java b/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java index b344527e4be5..e18abd5bf23f 100644 --- a/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java +++ b/lowpan/java/android/net/lowpan/LowpanBeaconInfo.java @@ -26,7 +26,7 @@ import java.util.TreeSet; * * @hide */ -//@SystemApi +// @SystemApi public class LowpanBeaconInfo extends LowpanIdentity { private int mRssi = UNKNOWN; @@ -104,7 +104,7 @@ public class LowpanBeaconInfo extends LowpanIdentity { } public Collection<Integer> getFlags() { - return mFlags.clone(); + return (Collection<Integer>) mFlags.clone(); } public boolean isFlagSet(int flag) { diff --git a/lowpan/java/android/net/lowpan/LowpanChannelInfo.java b/lowpan/java/android/net/lowpan/LowpanChannelInfo.java index 50afe6d3a4c0..621affee6d06 100644 --- a/lowpan/java/android/net/lowpan/LowpanChannelInfo.java +++ b/lowpan/java/android/net/lowpan/LowpanChannelInfo.java @@ -16,14 +16,12 @@ package android.net.lowpan; - /** Provides detailed information about a given channel. */ -//@SystemApi +// @SystemApi public class LowpanChannelInfo { public static final int UNKNOWN_POWER = Integer.MAX_VALUE; - ////////////////////////////////////////////////////////////////////////// // Instance Variables private String mName = null; @@ -33,7 +31,6 @@ public class LowpanChannelInfo { private float mSpectrumBandwidth = 0.0f; private int mMaxTransmitPower = UNKNOWN_POWER; - ////////////////////////////////////////////////////////////////////////// // Public Getters and Setters public String getName() { diff --git a/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java b/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java index 9cad00c3415a..1da085ddb294 100644 --- a/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java +++ b/lowpan/java/android/net/lowpan/LowpanCommissioningSession.java @@ -30,7 +30,7 @@ import java.net.InetSocketAddress; * * @hide */ -//@SystemApi +// @SystemApi public abstract class LowpanCommissioningSession { public LowpanCommissioningSession() {} @@ -39,7 +39,7 @@ public abstract class LowpanCommissioningSession { * * @hide */ - //@SystemApi + // @SystemApi public class Callback { public void onReceiveFromCommissioner(@NonNull byte[] packet) {}; diff --git a/lowpan/java/android/net/lowpan/LowpanCredential.java b/lowpan/java/android/net/lowpan/LowpanCredential.java index dea4d7888884..ca8602151515 100644 --- a/lowpan/java/android/net/lowpan/LowpanCredential.java +++ b/lowpan/java/android/net/lowpan/LowpanCredential.java @@ -16,7 +16,6 @@ package android.net.lowpan; - import java.util.Map; /** @@ -24,7 +23,7 @@ import java.util.Map; * * @hide */ -//@SystemApi +// @SystemApi public class LowpanCredential { public static final int UNSPECIFIED_KEY_INDEX = 0; @@ -84,8 +83,7 @@ public class LowpanCredential { void addToMap(Map<String, Object> parameters) throws LowpanException { if (isMasterKey()) { LowpanProperties.KEY_NETWORK_MASTER_KEY.putInMap(parameters, getMasterKey()); - LowpanProperties.KEY_NETWORK_MASTER_KEY_INDEX.putInMap( - parameters, getMasterKeyIndex()); + LowpanProperties.KEY_NETWORK_MASTER_KEY_INDEX.putInMap(parameters, getMasterKeyIndex()); } else { throw new LowpanException("Unsupported Network Credential"); } diff --git a/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java b/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java index c680687d0e09..91ed19c488eb 100644 --- a/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java +++ b/lowpan/java/android/net/lowpan/LowpanEnergyScanResult.java @@ -16,13 +16,12 @@ package android.net.lowpan; - /** * Describes the result from one channel of an energy scan. * * @hide */ -//@SystemApi +// @SystemApi public class LowpanEnergyScanResult { public static final int UNKNOWN = Integer.MAX_VALUE; diff --git a/lowpan/java/android/net/lowpan/LowpanException.java b/lowpan/java/android/net/lowpan/LowpanException.java index 8ff37f926899..b43b2fe087e1 100644 --- a/lowpan/java/android/net/lowpan/LowpanException.java +++ b/lowpan/java/android/net/lowpan/LowpanException.java @@ -28,7 +28,7 @@ import android.util.AndroidException; * @see LowpanInterface * @hide */ -//@SystemApi +// @SystemApi public class LowpanException extends AndroidException { // Make the eclipse warning about serializable exceptions go away private static final long serialVersionUID = 0x31863cbe562b0e11l; // randomly generated diff --git a/lowpan/java/android/net/lowpan/LowpanIdentity.java b/lowpan/java/android/net/lowpan/LowpanIdentity.java index 2e7b560fda5e..9be45ef14b98 100644 --- a/lowpan/java/android/net/lowpan/LowpanIdentity.java +++ b/lowpan/java/android/net/lowpan/LowpanIdentity.java @@ -24,10 +24,9 @@ import java.util.Map; * * @hide */ -//@SystemApi +// @SystemApi public class LowpanIdentity { - ////////////////////////////////////////////////////////////////////////// // Constants /** @hide */ @@ -41,11 +40,10 @@ public class LowpanIdentity { public static final int UNKNOWN = Integer.MAX_VALUE; - ////////////////////////////////////////////////////////////////////////// // Builder /** @hide */ - //@SystemApi + // @SystemApi public static class Builder { private final LowpanIdentity identity = new LowpanIdentity(); @@ -102,7 +100,6 @@ public class LowpanIdentity { LowpanIdentity() {} - ////////////////////////////////////////////////////////////////////////// // Instance Variables private String mName = null; @@ -111,7 +108,6 @@ public class LowpanIdentity { private int mPanid = UNKNOWN; private int mChannel = UNKNOWN; - ////////////////////////////////////////////////////////////////////////// // Public Getters and Setters public String getName() { @@ -140,12 +136,10 @@ public class LowpanIdentity { LowpanProperties.KEY_NETWORK_NAME.putInMap(parameters, networkInfo.getName()); } if (networkInfo.getPanid() != LowpanIdentity.UNKNOWN) { - LowpanProperties.KEY_NETWORK_PANID.putInMap( - parameters, networkInfo.getPanid()); + LowpanProperties.KEY_NETWORK_PANID.putInMap(parameters, networkInfo.getPanid()); } if (networkInfo.getChannel() != LowpanIdentity.UNKNOWN) { - LowpanProperties.KEY_CHANNEL.putInMap( - parameters, networkInfo.getChannel()); + LowpanProperties.KEY_CHANNEL.putInMap(parameters, networkInfo.getChannel()); } if (networkInfo.getXpanid() != null) { LowpanProperties.KEY_NETWORK_XPANID.putInMap(parameters, networkInfo.getXpanid()); diff --git a/lowpan/java/android/net/lowpan/LowpanInterface.java b/lowpan/java/android/net/lowpan/LowpanInterface.java index cd548190fa17..2bb4ecd380f2 100644 --- a/lowpan/java/android/net/lowpan/LowpanInterface.java +++ b/lowpan/java/android/net/lowpan/LowpanInterface.java @@ -33,7 +33,7 @@ import java.util.Set; * * @hide */ -//@SystemApi +// @SystemApi public class LowpanInterface { private static final String TAG = LowpanInterface.class.getSimpleName(); @@ -170,7 +170,7 @@ public class LowpanInterface { * * @hide */ - //@SystemApi + // @SystemApi public abstract static class Callback { public void onConnectedChanged(boolean value) {} @@ -244,7 +244,6 @@ public class LowpanInterface { LowpanException.throwAsPublicException(t); } - ////////////////////////////////////////////////////////////////////////// // Private Property Helpers void setProperties(Map properties) throws LowpanException { @@ -311,10 +310,9 @@ public class LowpanInterface { boolean getPropertyAsBoolean(LowpanProperty<Boolean> key) throws LowpanException { Boolean value = getProperty(key); - return (value != null) ? value : 0; + return (value != null) ? value : false; } - ////////////////////////////////////////////////////////////////////////// // Public Actions /** @@ -424,7 +422,6 @@ public class LowpanInterface { } } - ////////////////////////////////////////////////////////////////////////// // Public Getters and Setters /** @@ -448,13 +445,13 @@ public class LowpanInterface { return ""; } - /** - * Indicates if the interface is enabled or disabled. - * - * @see #setEnabled - * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED - */ - public boolean isEnabled() { + /** + * Indicates if the interface is enabled or disabled. + * + * @see #setEnabled + * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED + */ + public boolean isEnabled() { try { return getPropertyAsBoolean(LowpanProperties.KEY_INTERFACE_ENABLED); } catch (LowpanException x) { @@ -462,16 +459,16 @@ public class LowpanInterface { } } - /** - * Enables or disables the LoWPAN interface. When disabled, the interface is put into a low-power - * state and all commands that require the NCP to be queried will fail with {@link - * android.net.lowpan.LowpanException#LOWPAN_DISABLED}. - * - * @see #isEnabled - * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED - * @hide - */ - public void setEnabled(boolean enabled) throws LowpanException { + /** + * Enables or disables the LoWPAN interface. When disabled, the interface is put into a + * low-power state and all commands that require the NCP to be queried will fail with {@link + * android.net.lowpan.LowpanException#LOWPAN_DISABLED}. + * + * @see #isEnabled + * @see android.net.lowpan.LowpanException#LOWPAN_DISABLED + * @hide + */ + public void setEnabled(boolean enabled) throws LowpanException { setProperty(LowpanProperties.KEY_INTERFACE_ENABLED, enabled); } @@ -628,7 +625,6 @@ public class LowpanInterface { setProperties(map); } - ////////////////////////////////////////////////////////////////////////// // Listener Support /** @@ -644,7 +640,7 @@ public class LowpanInterface { public void registerCallback(@NonNull Callback cb, @Nullable Handler handler) { ILowpanInterfaceListener.Stub listenerBinder = new ILowpanInterfaceListener.Stub() { - public void onPropertiesChanged(Map<String, Object> properties) { + public void onPropertiesChanged(Map properties) { Runnable runnable = new Runnable() { @Override @@ -724,36 +720,35 @@ public class LowpanInterface { */ public void unregisterCallback(Callback cb) { int hashCode = System.identityHashCode(cb); - ILowpanInterfaceListener listenerBinder = mListenerMap.get(hashCode); + synchronized (mListenerMap) { + ILowpanInterfaceListener listenerBinder = mListenerMap.get(hashCode); - if (listenerBinder != null) { - synchronized (mListenerMap) { + if (listenerBinder != null) { mListenerMap.remove(hashCode); - } - try { - mBinder.removeListener(listenerBinder); - } catch (RemoteException x) { - // Catch and ignore all binder exceptions - Log.e(TAG, x.toString()); + + try { + mBinder.removeListener(listenerBinder); + } catch (RemoteException x) { + // Catch and ignore all binder exceptions + Log.e(TAG, x.toString()); + } } } } - ////////////////////////////////////////////////////////////////////////// - // Active and Passive Scanning + // Active and Passive Scanning - /** - * Creates a new {@link android.net.lowpan.LowpanScanner} object for this interface. - * - * <p>This method allocates a new unique object for each call. - * - * @see android.net.lowpan.LowpanScanner - */ - public @NonNull LowpanScanner createScanner() { + /** + * Creates a new {@link android.net.lowpan.LowpanScanner} object for this interface. + * + * <p>This method allocates a new unique object for each call. + * + * @see android.net.lowpan.LowpanScanner + */ + public @NonNull LowpanScanner createScanner() { return new LowpanScanner(mBinder); } - ////////////////////////////////////////////////////////////////////////// // Route Management /** diff --git a/lowpan/java/android/net/lowpan/LowpanManager.java b/lowpan/java/android/net/lowpan/LowpanManager.java index b58608da7c21..ecdda49f718a 100644 --- a/lowpan/java/android/net/lowpan/LowpanManager.java +++ b/lowpan/java/android/net/lowpan/LowpanManager.java @@ -33,32 +33,24 @@ import java.util.HashMap; * * @hide */ -//@SystemApi +// @SystemApi public class LowpanManager { private static final String TAG = LowpanManager.class.getSimpleName(); - ////////////////////////////////////////////////////////////////////////// - // Public Classes - /** @hide */ - //@SystemApi + // @SystemApi public abstract static class Callback { - public void onInterfaceAdded(LowpanInterface lowpan_interface) {} + public void onInterfaceAdded(LowpanInterface lowpanInterface) {} - public void onInterfaceRemoved(LowpanInterface lowpan_interface) {} + public void onInterfaceRemoved(LowpanInterface lowpanInterface) {} } - ////////////////////////////////////////////////////////////////////////// - // Instance Variables - + private Context mContext; private ILowpanManager mManager; private HashMap<Integer, ILowpanManagerListener> mListenerMap = new HashMap<>(); - ////////////////////////////////////////////////////////////////////////// - private static LowpanManager sSingletonInstance; - ////////////////////////////////////////////////////////////////////////// // Static Methods /** Returns a reference to the LowpanManager object, allocating it if necessary. */ @@ -75,7 +67,6 @@ public class LowpanManager { return sSingletonInstance; } - ////////////////////////////////////////////////////////////////////////// // Constructors /** @@ -84,28 +75,34 @@ public class LowpanManager { */ private LowpanManager() {} - ////////////////////////////////////////////////////////////////////////// // Private Methods /** * Returns a reference to the ILowpanManager interface, provided by the LoWPAN Manager Service. */ @Nullable - private ILowpanManager getILowpanManager() { + private synchronized ILowpanManager getILowpanManager() { + // Use a local reference of this object for thread safety. ILowpanManager manager = mManager; + if (manager == null) { IBinder serviceBinder = new ServiceManager().getService(ILowpanManager.LOWPAN_SERVICE_NAME); - mManager = manager = ILowpanManager.Stub.asInterface(serviceBinder); + + manager = ILowpanManager.Stub.asInterface(serviceBinder); + + mManager = manager; // Add any listeners synchronized (mListenerMap) { - for (Integer hashObj : mListenerMap.keySet()) { + for (ILowpanManagerListener listener : mListenerMap.values()) { try { - manager.addListener(mListenerMap.get(hashObj)); + manager.addListener(listener); + } catch (RemoteException x) { // Consider any failure here as implying the manager is defunct - mManager = manager = null; + mManager = null; + manager = null; } } } @@ -113,7 +110,6 @@ public class LowpanManager { return manager; } - ////////////////////////////////////////////////////////////////////////// // Public Methods /** @@ -141,6 +137,7 @@ public class LowpanManager { manager = getILowpanManager(); } } + return ret; } @@ -151,7 +148,7 @@ public class LowpanManager { @Nullable public LowpanInterface getInterface() { String[] ifaceList = getInterfaceList(); - if (ifaceList != null && ifaceList.length > 0) { + if (ifaceList.length > 0) { return getInterface(ifaceList[0]); } return null; @@ -165,24 +162,16 @@ public class LowpanManager { public String[] getInterfaceList() { ILowpanManager manager = getILowpanManager(); - if (manager != null) { + // Maximum number of tries is two. We should only try + // more than once if our manager has died or there + // was some sort of AIDL buffer full event. + for (int i = 0; i < 2 && manager != null; i++) { try { return manager.getInterfaceList(); - } catch (RemoteException x) { // In all of the cases when we get this exception, we reconnect and try again mManager = null; - try { - manager = getILowpanManager(); - if (manager != null) { - return manager.getInterfaceList(); - } - } catch (RemoteException ex) { - // Something weird is going on, so we log it - // and fall back thru to returning an empty array. - Log.e(TAG, ex.toString()); - mManager = null; - } + manager = getILowpanManager(); } } @@ -200,14 +189,14 @@ public class LowpanManager { throws LowpanException { ILowpanManagerListener.Stub listenerBinder = new ILowpanManagerListener.Stub() { - public void onInterfaceAdded(ILowpanInterface lowpan_interface) { + public void onInterfaceAdded(ILowpanInterface lowpanInterface) { Runnable runnable = new Runnable() { @Override public void run() { cb.onInterfaceAdded( LowpanInterface.getInterfaceFromBinder( - lowpan_interface.asBinder())); + lowpanInterface.asBinder())); } }; @@ -218,14 +207,14 @@ public class LowpanManager { } } - public void onInterfaceRemoved(ILowpanInterface lowpan_interface) { + public void onInterfaceRemoved(ILowpanInterface lowpanInterface) { Runnable runnable = new Runnable() { @Override public void run() { cb.onInterfaceRemoved( LowpanInterface.getInterfaceFromBinder( - lowpan_interface.asBinder())); + lowpanInterface.asBinder())); } }; diff --git a/lowpan/java/android/net/lowpan/LowpanProvision.java b/lowpan/java/android/net/lowpan/LowpanProvision.java index ace1f9c05c4d..7028807679a1 100644 --- a/lowpan/java/android/net/lowpan/LowpanProvision.java +++ b/lowpan/java/android/net/lowpan/LowpanProvision.java @@ -25,14 +25,13 @@ import java.util.Map; * * @hide */ -//@SystemApi +// @SystemApi public class LowpanProvision { - ////////////////////////////////////////////////////////////////////////// // Builder /** @hide */ - //@SystemApi + // @SystemApi public static class Builder { private final LowpanProvision provision = new LowpanProvision(); @@ -53,13 +52,11 @@ public class LowpanProvision { private LowpanProvision() {} - ////////////////////////////////////////////////////////////////////////// // Instance Variables private LowpanIdentity mIdentity = new LowpanIdentity(); private LowpanCredential mCredential = null; - ////////////////////////////////////////////////////////////////////////// // Public Getters and Setters @NonNull @@ -72,7 +69,6 @@ public class LowpanProvision { return mCredential; } - ////////////////////////////////////////////////////////////////////////// // LoWPAN-Internal Methods static void addToMap(Map<String, Object> parameters, LowpanProvision provision) diff --git a/lowpan/java/android/net/lowpan/LowpanScanner.java b/lowpan/java/android/net/lowpan/LowpanScanner.java index 754f72e3cb84..e0df55d9af3f 100644 --- a/lowpan/java/android/net/lowpan/LowpanScanner.java +++ b/lowpan/java/android/net/lowpan/LowpanScanner.java @@ -25,7 +25,6 @@ import android.util.Log; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -36,11 +35,10 @@ import java.util.Map; * @see LowpanInterface * @hide */ -//@SystemApi +// @SystemApi public class LowpanScanner { private static final String TAG = LowpanInterface.class.getSimpleName(); - ////////////////////////////////////////////////////////////////////////// // Public Classes /** @@ -48,7 +46,7 @@ public class LowpanScanner { * * @hide */ - //@SystemApi + // @SystemApi public abstract static class Callback { public void onNetScanBeacon(LowpanBeaconInfo beacon) {} @@ -57,16 +55,14 @@ public class LowpanScanner { public void onScanFinished() {} } - ////////////////////////////////////////////////////////////////////////// // Instance Variables private ILowpanInterface mBinder; private Callback mCallback = null; private Handler mHandler = null; - private List<Integer> mChannelMask = null; + private ArrayList<Integer> mChannelMask = null; private int mTxPower = Integer.MAX_VALUE; - ////////////////////////////////////////////////////////////////////////// // Constructors/Accessors and Exception Glue LowpanScanner(@NonNull ILowpanInterface binder) { @@ -74,7 +70,7 @@ public class LowpanScanner { } /** Sets an instance of {@link LowpanScanner.Callback} to receive events. */ - public void setCallback(@Nullable Callback cb, @Nullable Handler handler) { + public synchronized void setCallback(@Nullable Callback cb, @Nullable Handler handler) { mCallback = cb; mHandler = handler; } @@ -110,7 +106,7 @@ public class LowpanScanner { * @return the current channel mask, or <code>null</code> if no channel mask is currently set. */ public @Nullable Collection<Integer> getChannelMask() { - return mChannelMask.clone(); + return (Collection<Integer>) mChannelMask.clone(); } /** @@ -179,17 +175,24 @@ public class LowpanScanner { ILowpanNetScanCallback binderListener = new ILowpanNetScanCallback.Stub() { public void onNetScanBeacon(Map parameters) { - Callback callback = mCallback; - Handler handler = mHandler; + Callback callback; + Handler handler; + + synchronized (LowpanScanner.this) { + callback = mCallback; + handler = mHandler; + } if (callback == null) { return; } - Runnable runnable = () -> callback.onNetScanBeacon( - new LowpanBeaconInfo.Builder() - .updateFromMap(parameters) - .build()); + Runnable runnable = + () -> + callback.onNetScanBeacon( + new LowpanBeaconInfo.Builder() + .updateFromMap(parameters) + .build()); if (handler != null) { handler.post(runnable); @@ -199,8 +202,13 @@ public class LowpanScanner { } public void onNetScanFinished() { - Callback callback = mCallback; - Handler handler = mHandler; + Callback callback; + Handler handler; + + synchronized (LowpanScanner.this) { + callback = mCallback; + handler = mHandler; + } if (callback == null) { return; @@ -218,7 +226,7 @@ public class LowpanScanner { try { mBinder.startNetScan(map, binderListener); - } catch (ServiceSpecificException|RemoteException x) { + } catch (ServiceSpecificException | RemoteException x) { LowpanException.throwAsPublicException(x); } } @@ -257,7 +265,8 @@ public class LowpanScanner { return; } - Runnable runnable = () -> { + Runnable runnable = + () -> { if (callback != null) { LowpanEnergyScanResult result = new LowpanEnergyScanResult(); |