From d3d17acd9cf92ab47e7fde6cb26483d125524c54 Mon Sep 17 00:00:00 2001 From: lesl Date: Thu, 3 Dec 2020 19:52:18 +0800 Subject: wifi: Add instance identifier in SoftApInfo/WifiClient and infoList callback 1. The framework need to know the instance of the client connected to know which instance is idled. 2. The framework need to know the instance of the soft AP info. 3. Add infoList callback support for dual APs mode. AP+AP Part 5 includes: 1. Support forceClientDisconnect in dual AP mode. 2. Support dual SoftApInfo callback a. New callback onInfoListChanged b. Add instanceIdentifier in SoftApInfo but it is used only in framework. c. Add instanceIdentifier in WifiClient but it is used only in framework. Bug: 162686273 Test: FrameworksWifiApiTests Change-Id: I207831ff15a3044316556d61a72542ff35c94e74 --- wifi/java/android/net/wifi/ISoftApCallback.aidl | 6 +++++ wifi/java/android/net/wifi/SoftApInfo.java | 35 ++++++++++++++++++++++-- wifi/java/android/net/wifi/WifiClient.java | 29 ++++++++++++++++---- wifi/java/android/net/wifi/WifiManager.java | 36 +++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 7 deletions(-) (limited to 'wifi/java') diff --git a/wifi/java/android/net/wifi/ISoftApCallback.aidl b/wifi/java/android/net/wifi/ISoftApCallback.aidl index f81bcb9e06d7..a28a8fb626b1 100644 --- a/wifi/java/android/net/wifi/ISoftApCallback.aidl +++ b/wifi/java/android/net/wifi/ISoftApCallback.aidl @@ -53,6 +53,12 @@ oneway interface ISoftApCallback */ void onInfoChanged(in SoftApInfo softApInfo); + /** + * Service to manager callback providing informations of softap. + * + * @param softApInfoList is the list of the softap informations. {@link SoftApInfo} + */ + void onInfoListChanged(in List softApInfoList); /** * Service to manager callback providing capability of softap. diff --git a/wifi/java/android/net/wifi/SoftApInfo.java b/wifi/java/android/net/wifi/SoftApInfo.java index 55c2f1759952..40af118ca5c4 100644 --- a/wifi/java/android/net/wifi/SoftApInfo.java +++ b/wifi/java/android/net/wifi/SoftApInfo.java @@ -96,6 +96,10 @@ public final class SoftApInfo implements Parcelable { @Nullable private MacAddress mBssid; + /** The identifier of the AP instance which AP resides on with current info. */ + @Nullable + private String mApInstanceIdentifier; + /** * The operational mode of the AP. */ @@ -195,6 +199,28 @@ public final class SoftApInfo implements Parcelable { return mWifiStandard; } + /** + * Set the AP instance identifier. + * @hide + */ + public void setApInstanceIdentifier(@NonNull String apInstanceIdentifier) { + mApInstanceIdentifier = apInstanceIdentifier; + } + + /** + * Get the AP instance identifier. + * + * The AP instance identifier is a unique identity which can be used to + * associate the {@link SoftApInfo} to a specific {@link WifiClient} + * - see {@link WifiClient#getApInstanceIdentifier()} + * + * @hide + */ + @Nullable + public String getApInstanceIdentifier() { + return mApInstanceIdentifier; + } + /** * @hide */ @@ -204,6 +230,7 @@ public final class SoftApInfo implements Parcelable { mBandwidth = source.mBandwidth; mBssid = source.mBssid; mWifiStandard = source.mWifiStandard; + mApInstanceIdentifier = source.mApInstanceIdentifier; } } @@ -226,6 +253,7 @@ public final class SoftApInfo implements Parcelable { dest.writeInt(mBandwidth); dest.writeParcelable(mBssid, flags); dest.writeInt(mWifiStandard); + dest.writeString(mApInstanceIdentifier); } @NonNull @@ -237,6 +265,7 @@ public final class SoftApInfo implements Parcelable { info.mBandwidth = in.readInt(); info.mBssid = in.readParcelable(MacAddress.class.getClassLoader()); info.mWifiStandard = in.readInt(); + info.mApInstanceIdentifier = in.readString(); return info; } @@ -254,6 +283,7 @@ public final class SoftApInfo implements Parcelable { sbuf.append(", frequency= ").append(mFrequency); if (mBssid != null) sbuf.append(",bssid=").append(mBssid.toString()); sbuf.append(", wifiStandard= ").append(mWifiStandard); + sbuf.append(", mApInstanceIdentifier= ").append(mApInstanceIdentifier); sbuf.append("}"); return sbuf.toString(); } @@ -266,11 +296,12 @@ public final class SoftApInfo implements Parcelable { return mFrequency == softApInfo.mFrequency && mBandwidth == softApInfo.mBandwidth && Objects.equals(mBssid, softApInfo.mBssid) - && mWifiStandard == softApInfo.mWifiStandard; + && mWifiStandard == softApInfo.mWifiStandard + && Objects.equals(mApInstanceIdentifier, softApInfo.mApInstanceIdentifier); } @Override public int hashCode() { - return Objects.hash(mFrequency, mBandwidth, mBssid, mWifiStandard); + return Objects.hash(mFrequency, mBandwidth, mBssid, mWifiStandard, mApInstanceIdentifier); } } diff --git a/wifi/java/android/net/wifi/WifiClient.java b/wifi/java/android/net/wifi/WifiClient.java index 3794566f3d8f..85e2b3312b29 100644 --- a/wifi/java/android/net/wifi/WifiClient.java +++ b/wifi/java/android/net/wifi/WifiClient.java @@ -30,6 +30,9 @@ public final class WifiClient implements Parcelable { private final MacAddress mMacAddress; + /** The identifier of the AP instance which the client connected. */ + private final String mApInstanceIdentifier; + /** * The mac address of this client. */ @@ -38,15 +41,30 @@ public final class WifiClient implements Parcelable { return mMacAddress; } + /** + * Get AP instance identifier. + * + * The AP instance identifier is a unique identity which can be used to + * associate the {@link SoftApInfo} to a specific {@link WifiClient} + * - see {@link SoftApInfo#getApInstanceIdentifier()} + * @hide + */ + @NonNull + public String getApInstanceIdentifier() { + return mApInstanceIdentifier; + } + private WifiClient(Parcel in) { mMacAddress = in.readParcelable(null); + mApInstanceIdentifier = in.readString(); } /** @hide */ - public WifiClient(@NonNull MacAddress macAddress) { + public WifiClient(@NonNull MacAddress macAddress, @NonNull String apInstanceIdentifier) { Objects.requireNonNull(macAddress, "mMacAddress must not be null."); this.mMacAddress = macAddress; + this.mApInstanceIdentifier = apInstanceIdentifier; } @Override @@ -57,6 +75,7 @@ public final class WifiClient implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeParcelable(mMacAddress, flags); + dest.writeString(mApInstanceIdentifier); } @NonNull @@ -75,6 +94,7 @@ public final class WifiClient implements Parcelable { public String toString() { return "WifiClient{" + "mMacAddress=" + mMacAddress + + "mApInstanceIdentifier=" + mApInstanceIdentifier + '}'; } @@ -83,13 +103,12 @@ public final class WifiClient implements Parcelable { if (this == o) return true; if (!(o instanceof WifiClient)) return false; WifiClient client = (WifiClient) o; - return mMacAddress.equals(client.mMacAddress); + return Objects.equals(mMacAddress, client.mMacAddress) + && mApInstanceIdentifier.equals(client.mApInstanceIdentifier); } @Override public int hashCode() { - return Objects.hash(mMacAddress); + return Objects.hash(mMacAddress, mApInstanceIdentifier); } } - - diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 2b931a380f43..cc2d7ec14be3 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -3985,12 +3985,35 @@ public class WifiManager { /** * Called when information of softap changes. * + * Note: this API is only valid when the Soft AP is configured as a single AP + * - not as a bridged AP (2 Soft APs). When the Soft AP is configured as bridged AP + * this callback will not be triggered - use the + * {@link #onInfoListChanged(List)} callback in bridged AP mode. + * * @param softApInfo is the softap information. {@link SoftApInfo} */ default void onInfoChanged(@NonNull SoftApInfo softApInfo) { // Do nothing: can be updated to add SoftApInfo details (e.g. channel) to the UI. } + /** + * Called when information of softap changes. + * + * The number of the information elements in the list depends on Soft AP configuration + * and state. + * For instance, an empty list will be returned when the Soft AP is disabled. + * One information element will be returned in the list when the Soft AP is configured + * as a single AP, and two information elements will be returned in the list + * when the Soft AP is configured in bridged mode. + * + * See {@link #isBridgedApConcurrencySupported()} for the detail of the bridged AP. + * + * @param softApInfoList is the list of the softap information elements. {@link SoftApInfo} + */ + default void onInfoListChanged(@NonNull List softApInfoList) { + // Do nothing: can be updated to add SoftApInfo details (e.g. channel) to the UI. + } + /** * Called when capability of softap changes. * @@ -4070,6 +4093,19 @@ public class WifiManager { }); } + @Override + public void onInfoListChanged(List softApInfoList) { + if (mVerboseLoggingEnabled) { + Log.v(TAG, "SoftApCallbackProxy: onInfoListChange: softApInfoList=" + + softApInfoList); + } + + Binder.clearCallingIdentity(); + mExecutor.execute(() -> { + mCallback.onInfoListChanged(softApInfoList); + }); + } + @Override public void onCapabilityChanged(SoftApCapability capability) { if (mVerboseLoggingEnabled) { -- cgit v1.2.3-59-g8ed1b