Loading wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java +26 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,32 @@ public class DiscoverySessionCallback { /* empty */ } /** * Called when a discovery (publish or subscribe) operation results in a * service discovery. Called when a Subscribe service was configured with a range requirement * {@link SubscribeConfig.Builder#setMinDistanceMm(int)} and/or * {@link SubscribeConfig.Builder#setMaxDistanceMm(int)}. A discovery will only be declared * (i.e. this callback called) if the range of the publisher is within the specified distance * constraints. * * @param peerHandle An opaque handle to the peer matching our discovery operation. * @param serviceSpecificInfo The service specific information (arbitrary * byte array) provided by the peer as part of its discovery * configuration. * @param matchFilter The filter which resulted in this service discovery. For * {@link PublishConfig#PUBLISH_TYPE_UNSOLICITED}, * {@link SubscribeConfig#SUBSCRIBE_TYPE_PASSIVE} discovery sessions this is the publisher's * match filter. For {@link PublishConfig#PUBLISH_TYPE_SOLICITED}, * {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE} discovery sessions this * is the subscriber's match filter. * @param distanceMm The measured distance to the Publisher in mm. * @hide */ public void onServiceDiscoveredWithinRange(PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm) { /* empty */ } /** * Called in response to * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])} Loading wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ oneway interface IWifiAwareDiscoverySessionCallback void onSessionTerminated(int reason); void onMatch(int peerId, in byte[] serviceSpecificInfo, in byte[] matchFilter); void onMatchWithDistance(int peerId, in byte[] serviceSpecificInfo, in byte[] matchFilter, int distanceMm); void onMessageSendSuccess(int messageId); void onMessageSendFail(int messageId, int reason); Loading wifi/java/android/net/wifi/aware/PublishConfig.java +41 −15 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Objects; /** * Defines the configuration of a Aware publish session. Built using Loading Loading @@ -80,15 +81,20 @@ public final class PublishConfig implements Parcelable { /** @hide */ public final boolean mEnableTerminateNotification; /** @hide */ public final boolean mEnableRanging; /** @hide */ public PublishConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter, int publishType, int ttlSec, boolean enableTerminateNotification) { int publishType, int ttlSec, boolean enableTerminateNotification, boolean enableRanging) { mServiceName = serviceName; mServiceSpecificInfo = serviceSpecificInfo; mMatchFilter = matchFilter; mPublishType = publishType; mTtlSec = ttlSec; mEnableTerminateNotification = enableTerminateNotification; mEnableRanging = enableRanging; } @Override Loading @@ -103,7 +109,8 @@ public final class PublishConfig implements Parcelable { + (new TlvBufferUtils.TlvIterable(0, 1, mMatchFilter)).toString() + ", mMatchFilter.length=" + (mMatchFilter == null ? 0 : mMatchFilter.length) + ", mPublishType=" + mPublishType + ", mTtlSec=" + mTtlSec + ", mEnableTerminateNotification=" + mEnableTerminateNotification + "]"; + ", mEnableTerminateNotification=" + mEnableTerminateNotification + ", mEnableRanging=" + mEnableRanging + "]"; } @Override Loading @@ -119,6 +126,7 @@ public final class PublishConfig implements Parcelable { dest.writeInt(mPublishType); dest.writeInt(mTtlSec); dest.writeInt(mEnableTerminateNotification ? 1 : 0); dest.writeInt(mEnableRanging ? 1 : 0); } public static final Creator<PublishConfig> CREATOR = new Creator<PublishConfig>() { Loading @@ -135,9 +143,10 @@ public final class PublishConfig implements Parcelable { int publishType = in.readInt(); int ttlSec = in.readInt(); boolean enableTerminateNotification = in.readInt() != 0; boolean enableRanging = in.readInt() != 0; return new PublishConfig(serviceName, ssi, matchFilter, publishType, ttlSec, enableTerminateNotification); ttlSec, enableTerminateNotification, enableRanging); } }; Loading @@ -157,21 +166,14 @@ public final class PublishConfig implements Parcelable { lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter) && mPublishType == lhs.mPublishType && mTtlSec == lhs.mTtlSec && mEnableTerminateNotification == lhs.mEnableTerminateNotification; && mEnableTerminateNotification == lhs.mEnableTerminateNotification && mEnableRanging == lhs.mEnableRanging; } @Override public int hashCode() { int result = 17; result = 31 * result + Arrays.hashCode(mServiceName); result = 31 * result + Arrays.hashCode(mServiceSpecificInfo); result = 31 * result + Arrays.hashCode(mMatchFilter); result = 31 * result + mPublishType; result = 31 * result + mTtlSec; result = 31 * result + (mEnableTerminateNotification ? 1 : 0); return result; return Objects.hash(mServiceName, mServiceSpecificInfo, mMatchFilter, mPublishType, mTtlSec, mEnableTerminateNotification, mEnableRanging); } /** Loading Loading @@ -226,6 +228,7 @@ public final class PublishConfig implements Parcelable { private int mPublishType = PUBLISH_TYPE_UNSOLICITED; private int mTtlSec = 0; private boolean mEnableTerminateNotification = true; private boolean mEnableRanging = false; /** * Specify the service name of the publish session. The actual on-air Loading Loading @@ -351,13 +354,36 @@ public final class PublishConfig implements Parcelable { return this; } /** * Configure whether the publish discovery session supports ranging and allows peers to * measure distance to it. This API is used in conjunction with * {@link SubscribeConfig.Builder#setMinDistanceMm(int)} and * {@link SubscribeConfig.Builder#setMaxDistanceMm(int)} to specify a minimum and/or * maximum distance at which discovery will be triggered. * <p> * Optional. Disabled by default - i.e. any peer which attempts to measure distance to this * device will be refused. If the peer has ranging enabled (using the * {@link SubscribeConfig} APIs listed above, it will never discover this device. * * @param enable If true, ranging is supported on request of the peer. * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. * * @hide */ public Builder setRangingEnabled(boolean enable) { mEnableRanging = enable; return this; } /** * Build {@link PublishConfig} given the current requests made on the * builder. */ public PublishConfig build() { return new PublishConfig(mServiceName, mServiceSpecificInfo, mMatchFilter, mPublishType, mTtlSec, mEnableTerminateNotification); mTtlSec, mEnableTerminateNotification, mEnableRanging); } } } wifi/java/android/net/wifi/aware/SubscribeConfig.java +136 −20 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Objects; /** * Defines the configuration of a Aware subscribe session. Built using Loading Loading @@ -78,16 +79,33 @@ public final class SubscribeConfig implements Parcelable { /** @hide */ public final boolean mEnableTerminateNotification; /** @hide */ public final boolean mMinDistanceMmSet; /** @hide */ public final int mMinDistanceMm; /** @hide */ public final boolean mMaxDistanceMmSet; /** @hide */ public final int mMaxDistanceMm; /** @hide */ public SubscribeConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter, int subscribeType, int ttlSec, boolean enableTerminateNotification) { int subscribeType, int ttlSec, boolean enableTerminateNotification, boolean minDistanceMmSet, int minDistanceMm, boolean maxDistanceMmSet, int maxDistanceMm) { mServiceName = serviceName; mServiceSpecificInfo = serviceSpecificInfo; mMatchFilter = matchFilter; mSubscribeType = subscribeType; mTtlSec = ttlSec; mEnableTerminateNotification = enableTerminateNotification; mMinDistanceMm = minDistanceMm; mMinDistanceMmSet = minDistanceMmSet; mMaxDistanceMm = maxDistanceMm; mMaxDistanceMmSet = maxDistanceMmSet; } @Override Loading @@ -102,7 +120,11 @@ public final class SubscribeConfig implements Parcelable { + (new TlvBufferUtils.TlvIterable(0, 1, mMatchFilter)).toString() + ", mMatchFilter.length=" + (mMatchFilter == null ? 0 : mMatchFilter.length) + ", mSubscribeType=" + mSubscribeType + ", mTtlSec=" + mTtlSec + ", mEnableTerminateNotification=" + mEnableTerminateNotification + "]"; + ", mEnableTerminateNotification=" + mEnableTerminateNotification + ", mMinDistanceMm=" + mMinDistanceMm + ", mMinDistanceMmSet=" + mMinDistanceMmSet + ", mMaxDistanceMm=" + mMaxDistanceMm + ", mMaxDistanceMmSet=" + mMaxDistanceMmSet + "]"; } @Override Loading @@ -118,6 +140,10 @@ public final class SubscribeConfig implements Parcelable { dest.writeInt(mSubscribeType); dest.writeInt(mTtlSec); dest.writeInt(mEnableTerminateNotification ? 1 : 0); dest.writeInt(mMinDistanceMm); dest.writeInt(mMinDistanceMmSet ? 1 : 0); dest.writeInt(mMaxDistanceMm); dest.writeInt(mMaxDistanceMmSet ? 1 : 0); } public static final Creator<SubscribeConfig> CREATOR = new Creator<SubscribeConfig>() { Loading @@ -134,9 +160,14 @@ public final class SubscribeConfig implements Parcelable { int subscribeType = in.readInt(); int ttlSec = in.readInt(); boolean enableTerminateNotification = in.readInt() != 0; return new SubscribeConfig(serviceName, ssi, matchFilter, subscribeType, ttlSec, enableTerminateNotification); int minDistanceMm = in.readInt(); boolean minDistanceMmSet = in.readInt() != 0; int maxDistanceMm = in.readInt(); boolean maxDistanceMmSet = in.readInt() != 0; return new SubscribeConfig(serviceName, ssi, matchFilter, subscribeType, ttlSec, enableTerminateNotification, minDistanceMmSet, minDistanceMm, maxDistanceMmSet, maxDistanceMm); } }; Loading @@ -152,23 +183,37 @@ public final class SubscribeConfig implements Parcelable { SubscribeConfig lhs = (SubscribeConfig) o; return Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals(mServiceSpecificInfo, lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter) && mSubscribeType == lhs.mSubscribeType && mTtlSec == lhs.mTtlSec && mEnableTerminateNotification == lhs.mEnableTerminateNotification; if (!(Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals( mServiceSpecificInfo, lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter) && mSubscribeType == lhs.mSubscribeType && mTtlSec == lhs.mTtlSec && mEnableTerminateNotification == lhs.mEnableTerminateNotification && mMinDistanceMmSet == lhs.mMinDistanceMmSet && mMaxDistanceMmSet == lhs.mMaxDistanceMmSet)) { return false; } if (mMinDistanceMmSet && mMinDistanceMm != lhs.mMinDistanceMm) { return false; } if (mMaxDistanceMmSet && mMaxDistanceMm != lhs.mMaxDistanceMm) { return false; } return true; } @Override public int hashCode() { int result = 17; int result = Objects.hash(mServiceName, mServiceSpecificInfo, mMatchFilter, mSubscribeType, mTtlSec, mEnableTerminateNotification, mMinDistanceMmSet, mMaxDistanceMmSet); result = 31 * result + Arrays.hashCode(mServiceName); result = 31 * result + Arrays.hashCode(mServiceSpecificInfo); result = 31 * result + Arrays.hashCode(mMatchFilter); result = 31 * result + mSubscribeType; result = 31 * result + mTtlSec; result = 31 * result + (mEnableTerminateNotification ? 1 : 0); if (mMinDistanceMmSet) { result = Objects.hash(result, mMinDistanceMm); } if (mMaxDistanceMmSet) { result = Objects.hash(result, mMaxDistanceMm); } return result; } Loading Loading @@ -213,6 +258,17 @@ public final class SubscribeConfig implements Parcelable { "Match filter longer than supported by device characteristics"); } } if (mMinDistanceMmSet && mMinDistanceMm < 0) { throw new IllegalArgumentException("Minimum distance must be non-negative"); } if (mMaxDistanceMmSet && mMaxDistanceMm < 0) { throw new IllegalArgumentException("Maximum distance must be non-negative"); } if (mMinDistanceMmSet && mMaxDistanceMmSet && mMaxDistanceMm <= mMinDistanceMm) { throw new IllegalArgumentException( "Maximum distance must be greater than minimum distance"); } } /** Loading @@ -225,6 +281,10 @@ public final class SubscribeConfig implements Parcelable { private int mSubscribeType = SUBSCRIBE_TYPE_PASSIVE; private int mTtlSec = 0; private boolean mEnableTerminateNotification = true; private boolean mMinDistanceMmSet = false; private int mMinDistanceMm; private boolean mMaxDistanceMmSet = false; private int mMaxDistanceMm; /** * Specify the service name of the subscribe session. The actual on-air Loading Loading @@ -349,14 +409,70 @@ public final class SubscribeConfig implements Parcelable { return this; } /** * Configure the minimum distance to a discovered publisher at which to trigger a discovery * notification. I.e. discovery will only be triggered if we've found a matching publisher * (based on the other criteria in this configuration) <b>and</b> the distance to the * publisher is > the value specified in this API. * <p> * Can be used in conjunction with {@link #setMaxDistanceMm(int)} to specify a geo-fence, * i.e. discovery with min < distance < max. * <p> * If this API is called, the subscriber requires ranging. In such a case, the publisher * peer must enable ranging using * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. Otherwise discovery will * never be triggered. * * @param minDistanceMm Minimum distance, in mm, to the publisher above which to trigger * discovery. * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. * * @hide */ public Builder setMinDistanceMm(int minDistanceMm) { mMinDistanceMm = minDistanceMm; mMinDistanceMmSet = true; return this; } /** * Configure the maximum distance to a discovered publisher at which to trigger a discovery * notification. I.e. discovery will only be triggered if we've found a matching publisher * (based on the other criteria in this configuration) <b>and</b> the distance to the * publisher is < the value specified in this API. * <p> * Can be used in conjunction with {@link #setMinDistanceMm(int)} to specify a geo-fence, * i.e. discovery with min < distance < max. * <p> * If this API is called, the subscriber requires ranging. In such a case, the publisher * peer must enable ranging using * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. Otherwise discovery will * never be triggered. * * @param maxDistanceMm Maximum distance, in mm, to the publisher below which to trigger * discovery. * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. * * @hide */ public Builder setMaxDistanceMm(int maxDistanceMm) { mMaxDistanceMm = maxDistanceMm; mMaxDistanceMmSet = true; return this; } /** * Build {@link SubscribeConfig} given the current requests made on the * builder. */ public SubscribeConfig build() { return new SubscribeConfig(mServiceName, mServiceSpecificInfo, mMatchFilter, mSubscribeType, mTtlSec, mEnableTerminateNotification); mSubscribeType, mTtlSec, mEnableTerminateNotification, mMinDistanceMmSet, mMinDistanceMm, mMaxDistanceMmSet, mMaxDistanceMm); } } } wifi/java/android/net/wifi/aware/WifiAwareManager.java +37 −10 Original line number Diff line number Diff line Loading @@ -20,8 +20,8 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemService; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemService; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkRequest; Loading Loading @@ -564,6 +564,7 @@ public class WifiAwareManager { private static final int CALLBACK_MESSAGE_SEND_SUCCESS = 5; private static final int CALLBACK_MESSAGE_SEND_FAIL = 6; private static final int CALLBACK_MESSAGE_RECEIVED = 7; private static final int CALLBACK_MATCH_WITH_DISTANCE = 8; private static final String MESSAGE_BUNDLE_KEY_MESSAGE = "message"; private static final String MESSAGE_BUNDLE_KEY_MESSAGE2 = "message2"; Loading Loading @@ -618,7 +619,9 @@ public class WifiAwareManager { case CALLBACK_SESSION_TERMINATED: onProxySessionTerminated(msg.arg1); break; case CALLBACK_MATCH: { case CALLBACK_MATCH: case CALLBACK_MATCH_WITH_DISTANCE: { List<byte[]> matchFilter = null; byte[] arg = msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2); try { Loading @@ -629,9 +632,16 @@ public class WifiAwareManager { + new String(HexEncoding.encode(arg)) + "' - cannot be parsed: e=" + e); } if (msg.what == CALLBACK_MATCH) { mOriginalCallback.onServiceDiscovered(new PeerHandle(msg.arg1), msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE), matchFilter); } else { mOriginalCallback.onServiceDiscoveredWithinRange( new PeerHandle(msg.arg1), msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE), matchFilter, msg.arg2); } break; } case CALLBACK_MESSAGE_SEND_SUCCESS: Loading Loading @@ -684,20 +694,37 @@ public class WifiAwareManager { mHandler.sendMessage(msg); } @Override public void onMatch(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter) { if (VDBG) Log.v(TAG, "onMatch: peerId=" + peerId); private void onMatchCommon(int messageType, int peerId, byte[] serviceSpecificInfo, byte[] matchFilter, int distanceMm) { Bundle data = new Bundle(); data.putByteArray(MESSAGE_BUNDLE_KEY_MESSAGE, serviceSpecificInfo); data.putByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2, matchFilter); Message msg = mHandler.obtainMessage(CALLBACK_MATCH); Message msg = mHandler.obtainMessage(messageType); msg.arg1 = peerId; msg.arg2 = distanceMm; msg.setData(data); mHandler.sendMessage(msg); } @Override public void onMatch(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter) { if (VDBG) Log.v(TAG, "onMatch: peerId=" + peerId); onMatchCommon(CALLBACK_MATCH, peerId, serviceSpecificInfo, matchFilter, 0); } @Override public void onMatchWithDistance(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter, int distanceMm) { if (VDBG) { Log.v(TAG, "onMatchWithDistance: peerId=" + peerId + ", distanceMm=" + distanceMm); } onMatchCommon(CALLBACK_MATCH_WITH_DISTANCE, peerId, serviceSpecificInfo, matchFilter, distanceMm); } @Override public void onMessageSendSuccess(int messageId) { if (VDBG) Log.v(TAG, "onMessageSendSuccess"); Loading Loading
wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java +26 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,32 @@ public class DiscoverySessionCallback { /* empty */ } /** * Called when a discovery (publish or subscribe) operation results in a * service discovery. Called when a Subscribe service was configured with a range requirement * {@link SubscribeConfig.Builder#setMinDistanceMm(int)} and/or * {@link SubscribeConfig.Builder#setMaxDistanceMm(int)}. A discovery will only be declared * (i.e. this callback called) if the range of the publisher is within the specified distance * constraints. * * @param peerHandle An opaque handle to the peer matching our discovery operation. * @param serviceSpecificInfo The service specific information (arbitrary * byte array) provided by the peer as part of its discovery * configuration. * @param matchFilter The filter which resulted in this service discovery. For * {@link PublishConfig#PUBLISH_TYPE_UNSOLICITED}, * {@link SubscribeConfig#SUBSCRIBE_TYPE_PASSIVE} discovery sessions this is the publisher's * match filter. For {@link PublishConfig#PUBLISH_TYPE_SOLICITED}, * {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE} discovery sessions this * is the subscriber's match filter. * @param distanceMm The measured distance to the Publisher in mm. * @hide */ public void onServiceDiscoveredWithinRange(PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm) { /* empty */ } /** * Called in response to * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])} Loading
wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ oneway interface IWifiAwareDiscoverySessionCallback void onSessionTerminated(int reason); void onMatch(int peerId, in byte[] serviceSpecificInfo, in byte[] matchFilter); void onMatchWithDistance(int peerId, in byte[] serviceSpecificInfo, in byte[] matchFilter, int distanceMm); void onMessageSendSuccess(int messageId); void onMessageSendFail(int messageId, int reason); Loading
wifi/java/android/net/wifi/aware/PublishConfig.java +41 −15 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Objects; /** * Defines the configuration of a Aware publish session. Built using Loading Loading @@ -80,15 +81,20 @@ public final class PublishConfig implements Parcelable { /** @hide */ public final boolean mEnableTerminateNotification; /** @hide */ public final boolean mEnableRanging; /** @hide */ public PublishConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter, int publishType, int ttlSec, boolean enableTerminateNotification) { int publishType, int ttlSec, boolean enableTerminateNotification, boolean enableRanging) { mServiceName = serviceName; mServiceSpecificInfo = serviceSpecificInfo; mMatchFilter = matchFilter; mPublishType = publishType; mTtlSec = ttlSec; mEnableTerminateNotification = enableTerminateNotification; mEnableRanging = enableRanging; } @Override Loading @@ -103,7 +109,8 @@ public final class PublishConfig implements Parcelable { + (new TlvBufferUtils.TlvIterable(0, 1, mMatchFilter)).toString() + ", mMatchFilter.length=" + (mMatchFilter == null ? 0 : mMatchFilter.length) + ", mPublishType=" + mPublishType + ", mTtlSec=" + mTtlSec + ", mEnableTerminateNotification=" + mEnableTerminateNotification + "]"; + ", mEnableTerminateNotification=" + mEnableTerminateNotification + ", mEnableRanging=" + mEnableRanging + "]"; } @Override Loading @@ -119,6 +126,7 @@ public final class PublishConfig implements Parcelable { dest.writeInt(mPublishType); dest.writeInt(mTtlSec); dest.writeInt(mEnableTerminateNotification ? 1 : 0); dest.writeInt(mEnableRanging ? 1 : 0); } public static final Creator<PublishConfig> CREATOR = new Creator<PublishConfig>() { Loading @@ -135,9 +143,10 @@ public final class PublishConfig implements Parcelable { int publishType = in.readInt(); int ttlSec = in.readInt(); boolean enableTerminateNotification = in.readInt() != 0; boolean enableRanging = in.readInt() != 0; return new PublishConfig(serviceName, ssi, matchFilter, publishType, ttlSec, enableTerminateNotification); ttlSec, enableTerminateNotification, enableRanging); } }; Loading @@ -157,21 +166,14 @@ public final class PublishConfig implements Parcelable { lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter) && mPublishType == lhs.mPublishType && mTtlSec == lhs.mTtlSec && mEnableTerminateNotification == lhs.mEnableTerminateNotification; && mEnableTerminateNotification == lhs.mEnableTerminateNotification && mEnableRanging == lhs.mEnableRanging; } @Override public int hashCode() { int result = 17; result = 31 * result + Arrays.hashCode(mServiceName); result = 31 * result + Arrays.hashCode(mServiceSpecificInfo); result = 31 * result + Arrays.hashCode(mMatchFilter); result = 31 * result + mPublishType; result = 31 * result + mTtlSec; result = 31 * result + (mEnableTerminateNotification ? 1 : 0); return result; return Objects.hash(mServiceName, mServiceSpecificInfo, mMatchFilter, mPublishType, mTtlSec, mEnableTerminateNotification, mEnableRanging); } /** Loading Loading @@ -226,6 +228,7 @@ public final class PublishConfig implements Parcelable { private int mPublishType = PUBLISH_TYPE_UNSOLICITED; private int mTtlSec = 0; private boolean mEnableTerminateNotification = true; private boolean mEnableRanging = false; /** * Specify the service name of the publish session. The actual on-air Loading Loading @@ -351,13 +354,36 @@ public final class PublishConfig implements Parcelable { return this; } /** * Configure whether the publish discovery session supports ranging and allows peers to * measure distance to it. This API is used in conjunction with * {@link SubscribeConfig.Builder#setMinDistanceMm(int)} and * {@link SubscribeConfig.Builder#setMaxDistanceMm(int)} to specify a minimum and/or * maximum distance at which discovery will be triggered. * <p> * Optional. Disabled by default - i.e. any peer which attempts to measure distance to this * device will be refused. If the peer has ranging enabled (using the * {@link SubscribeConfig} APIs listed above, it will never discover this device. * * @param enable If true, ranging is supported on request of the peer. * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. * * @hide */ public Builder setRangingEnabled(boolean enable) { mEnableRanging = enable; return this; } /** * Build {@link PublishConfig} given the current requests made on the * builder. */ public PublishConfig build() { return new PublishConfig(mServiceName, mServiceSpecificInfo, mMatchFilter, mPublishType, mTtlSec, mEnableTerminateNotification); mTtlSec, mEnableTerminateNotification, mEnableRanging); } } }
wifi/java/android/net/wifi/aware/SubscribeConfig.java +136 −20 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; import java.util.Objects; /** * Defines the configuration of a Aware subscribe session. Built using Loading Loading @@ -78,16 +79,33 @@ public final class SubscribeConfig implements Parcelable { /** @hide */ public final boolean mEnableTerminateNotification; /** @hide */ public final boolean mMinDistanceMmSet; /** @hide */ public final int mMinDistanceMm; /** @hide */ public final boolean mMaxDistanceMmSet; /** @hide */ public final int mMaxDistanceMm; /** @hide */ public SubscribeConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter, int subscribeType, int ttlSec, boolean enableTerminateNotification) { int subscribeType, int ttlSec, boolean enableTerminateNotification, boolean minDistanceMmSet, int minDistanceMm, boolean maxDistanceMmSet, int maxDistanceMm) { mServiceName = serviceName; mServiceSpecificInfo = serviceSpecificInfo; mMatchFilter = matchFilter; mSubscribeType = subscribeType; mTtlSec = ttlSec; mEnableTerminateNotification = enableTerminateNotification; mMinDistanceMm = minDistanceMm; mMinDistanceMmSet = minDistanceMmSet; mMaxDistanceMm = maxDistanceMm; mMaxDistanceMmSet = maxDistanceMmSet; } @Override Loading @@ -102,7 +120,11 @@ public final class SubscribeConfig implements Parcelable { + (new TlvBufferUtils.TlvIterable(0, 1, mMatchFilter)).toString() + ", mMatchFilter.length=" + (mMatchFilter == null ? 0 : mMatchFilter.length) + ", mSubscribeType=" + mSubscribeType + ", mTtlSec=" + mTtlSec + ", mEnableTerminateNotification=" + mEnableTerminateNotification + "]"; + ", mEnableTerminateNotification=" + mEnableTerminateNotification + ", mMinDistanceMm=" + mMinDistanceMm + ", mMinDistanceMmSet=" + mMinDistanceMmSet + ", mMaxDistanceMm=" + mMaxDistanceMm + ", mMaxDistanceMmSet=" + mMaxDistanceMmSet + "]"; } @Override Loading @@ -118,6 +140,10 @@ public final class SubscribeConfig implements Parcelable { dest.writeInt(mSubscribeType); dest.writeInt(mTtlSec); dest.writeInt(mEnableTerminateNotification ? 1 : 0); dest.writeInt(mMinDistanceMm); dest.writeInt(mMinDistanceMmSet ? 1 : 0); dest.writeInt(mMaxDistanceMm); dest.writeInt(mMaxDistanceMmSet ? 1 : 0); } public static final Creator<SubscribeConfig> CREATOR = new Creator<SubscribeConfig>() { Loading @@ -134,9 +160,14 @@ public final class SubscribeConfig implements Parcelable { int subscribeType = in.readInt(); int ttlSec = in.readInt(); boolean enableTerminateNotification = in.readInt() != 0; return new SubscribeConfig(serviceName, ssi, matchFilter, subscribeType, ttlSec, enableTerminateNotification); int minDistanceMm = in.readInt(); boolean minDistanceMmSet = in.readInt() != 0; int maxDistanceMm = in.readInt(); boolean maxDistanceMmSet = in.readInt() != 0; return new SubscribeConfig(serviceName, ssi, matchFilter, subscribeType, ttlSec, enableTerminateNotification, minDistanceMmSet, minDistanceMm, maxDistanceMmSet, maxDistanceMm); } }; Loading @@ -152,23 +183,37 @@ public final class SubscribeConfig implements Parcelable { SubscribeConfig lhs = (SubscribeConfig) o; return Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals(mServiceSpecificInfo, lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter) && mSubscribeType == lhs.mSubscribeType && mTtlSec == lhs.mTtlSec && mEnableTerminateNotification == lhs.mEnableTerminateNotification; if (!(Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals( mServiceSpecificInfo, lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter) && mSubscribeType == lhs.mSubscribeType && mTtlSec == lhs.mTtlSec && mEnableTerminateNotification == lhs.mEnableTerminateNotification && mMinDistanceMmSet == lhs.mMinDistanceMmSet && mMaxDistanceMmSet == lhs.mMaxDistanceMmSet)) { return false; } if (mMinDistanceMmSet && mMinDistanceMm != lhs.mMinDistanceMm) { return false; } if (mMaxDistanceMmSet && mMaxDistanceMm != lhs.mMaxDistanceMm) { return false; } return true; } @Override public int hashCode() { int result = 17; int result = Objects.hash(mServiceName, mServiceSpecificInfo, mMatchFilter, mSubscribeType, mTtlSec, mEnableTerminateNotification, mMinDistanceMmSet, mMaxDistanceMmSet); result = 31 * result + Arrays.hashCode(mServiceName); result = 31 * result + Arrays.hashCode(mServiceSpecificInfo); result = 31 * result + Arrays.hashCode(mMatchFilter); result = 31 * result + mSubscribeType; result = 31 * result + mTtlSec; result = 31 * result + (mEnableTerminateNotification ? 1 : 0); if (mMinDistanceMmSet) { result = Objects.hash(result, mMinDistanceMm); } if (mMaxDistanceMmSet) { result = Objects.hash(result, mMaxDistanceMm); } return result; } Loading Loading @@ -213,6 +258,17 @@ public final class SubscribeConfig implements Parcelable { "Match filter longer than supported by device characteristics"); } } if (mMinDistanceMmSet && mMinDistanceMm < 0) { throw new IllegalArgumentException("Minimum distance must be non-negative"); } if (mMaxDistanceMmSet && mMaxDistanceMm < 0) { throw new IllegalArgumentException("Maximum distance must be non-negative"); } if (mMinDistanceMmSet && mMaxDistanceMmSet && mMaxDistanceMm <= mMinDistanceMm) { throw new IllegalArgumentException( "Maximum distance must be greater than minimum distance"); } } /** Loading @@ -225,6 +281,10 @@ public final class SubscribeConfig implements Parcelable { private int mSubscribeType = SUBSCRIBE_TYPE_PASSIVE; private int mTtlSec = 0; private boolean mEnableTerminateNotification = true; private boolean mMinDistanceMmSet = false; private int mMinDistanceMm; private boolean mMaxDistanceMmSet = false; private int mMaxDistanceMm; /** * Specify the service name of the subscribe session. The actual on-air Loading Loading @@ -349,14 +409,70 @@ public final class SubscribeConfig implements Parcelable { return this; } /** * Configure the minimum distance to a discovered publisher at which to trigger a discovery * notification. I.e. discovery will only be triggered if we've found a matching publisher * (based on the other criteria in this configuration) <b>and</b> the distance to the * publisher is > the value specified in this API. * <p> * Can be used in conjunction with {@link #setMaxDistanceMm(int)} to specify a geo-fence, * i.e. discovery with min < distance < max. * <p> * If this API is called, the subscriber requires ranging. In such a case, the publisher * peer must enable ranging using * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. Otherwise discovery will * never be triggered. * * @param minDistanceMm Minimum distance, in mm, to the publisher above which to trigger * discovery. * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. * * @hide */ public Builder setMinDistanceMm(int minDistanceMm) { mMinDistanceMm = minDistanceMm; mMinDistanceMmSet = true; return this; } /** * Configure the maximum distance to a discovered publisher at which to trigger a discovery * notification. I.e. discovery will only be triggered if we've found a matching publisher * (based on the other criteria in this configuration) <b>and</b> the distance to the * publisher is < the value specified in this API. * <p> * Can be used in conjunction with {@link #setMinDistanceMm(int)} to specify a geo-fence, * i.e. discovery with min < distance < max. * <p> * If this API is called, the subscriber requires ranging. In such a case, the publisher * peer must enable ranging using * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. Otherwise discovery will * never be triggered. * * @param maxDistanceMm Maximum distance, in mm, to the publisher below which to trigger * discovery. * * @return The builder to facilitate chaining * {@code builder.setXXX(..).setXXX(..)}. * * @hide */ public Builder setMaxDistanceMm(int maxDistanceMm) { mMaxDistanceMm = maxDistanceMm; mMaxDistanceMmSet = true; return this; } /** * Build {@link SubscribeConfig} given the current requests made on the * builder. */ public SubscribeConfig build() { return new SubscribeConfig(mServiceName, mServiceSpecificInfo, mMatchFilter, mSubscribeType, mTtlSec, mEnableTerminateNotification); mSubscribeType, mTtlSec, mEnableTerminateNotification, mMinDistanceMmSet, mMinDistanceMm, mMaxDistanceMmSet, mMaxDistanceMm); } } }
wifi/java/android/net/wifi/aware/WifiAwareManager.java +37 −10 Original line number Diff line number Diff line Loading @@ -20,8 +20,8 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemService; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemService; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkRequest; Loading Loading @@ -564,6 +564,7 @@ public class WifiAwareManager { private static final int CALLBACK_MESSAGE_SEND_SUCCESS = 5; private static final int CALLBACK_MESSAGE_SEND_FAIL = 6; private static final int CALLBACK_MESSAGE_RECEIVED = 7; private static final int CALLBACK_MATCH_WITH_DISTANCE = 8; private static final String MESSAGE_BUNDLE_KEY_MESSAGE = "message"; private static final String MESSAGE_BUNDLE_KEY_MESSAGE2 = "message2"; Loading Loading @@ -618,7 +619,9 @@ public class WifiAwareManager { case CALLBACK_SESSION_TERMINATED: onProxySessionTerminated(msg.arg1); break; case CALLBACK_MATCH: { case CALLBACK_MATCH: case CALLBACK_MATCH_WITH_DISTANCE: { List<byte[]> matchFilter = null; byte[] arg = msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2); try { Loading @@ -629,9 +632,16 @@ public class WifiAwareManager { + new String(HexEncoding.encode(arg)) + "' - cannot be parsed: e=" + e); } if (msg.what == CALLBACK_MATCH) { mOriginalCallback.onServiceDiscovered(new PeerHandle(msg.arg1), msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE), matchFilter); } else { mOriginalCallback.onServiceDiscoveredWithinRange( new PeerHandle(msg.arg1), msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE), matchFilter, msg.arg2); } break; } case CALLBACK_MESSAGE_SEND_SUCCESS: Loading Loading @@ -684,20 +694,37 @@ public class WifiAwareManager { mHandler.sendMessage(msg); } @Override public void onMatch(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter) { if (VDBG) Log.v(TAG, "onMatch: peerId=" + peerId); private void onMatchCommon(int messageType, int peerId, byte[] serviceSpecificInfo, byte[] matchFilter, int distanceMm) { Bundle data = new Bundle(); data.putByteArray(MESSAGE_BUNDLE_KEY_MESSAGE, serviceSpecificInfo); data.putByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2, matchFilter); Message msg = mHandler.obtainMessage(CALLBACK_MATCH); Message msg = mHandler.obtainMessage(messageType); msg.arg1 = peerId; msg.arg2 = distanceMm; msg.setData(data); mHandler.sendMessage(msg); } @Override public void onMatch(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter) { if (VDBG) Log.v(TAG, "onMatch: peerId=" + peerId); onMatchCommon(CALLBACK_MATCH, peerId, serviceSpecificInfo, matchFilter, 0); } @Override public void onMatchWithDistance(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter, int distanceMm) { if (VDBG) { Log.v(TAG, "onMatchWithDistance: peerId=" + peerId + ", distanceMm=" + distanceMm); } onMatchCommon(CALLBACK_MATCH_WITH_DISTANCE, peerId, serviceSpecificInfo, matchFilter, distanceMm); } @Override public void onMessageSendSuccess(int messageId) { if (VDBG) Log.v(TAG, "onMessageSendSuccess"); Loading