diff options
author | Roshan Pius <rpius@google.com> | 2020-12-23 19:37:10 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-12-23 19:37:10 +0000 |
commit | e126101fe62a85c6381156bbd7906772519fdeba (patch) | |
tree | 9c5cfba0332f850316af9c1a093f3f5ca775475a /wifi | |
parent | 6e5544622231066f3d849d7ffd15ce7f1a1994ee (diff) | |
parent | 3653444d0256c9c5fc560bb269f302281a32d749 (diff) |
Merge changes from topic "wifi_transport_info_stage_1"
* changes:
WifiInfo: Add equals implementation
Convert WifiInfo to TransportInfo
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/api/current.txt | 4 | ||||
-rw-r--r-- | wifi/api/system-current.txt | 2 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiInfo.java | 97 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiManager.java | 52 | ||||
-rw-r--r-- | wifi/tests/src/android/net/wifi/WifiInfoTest.java | 81 |
5 files changed, 226 insertions, 10 deletions
diff --git a/wifi/api/current.txt b/wifi/api/current.txt index 53c3b33d9845..28224cf4ef2d 100644 --- a/wifi/api/current.txt +++ b/wifi/api/current.txt @@ -264,7 +264,7 @@ package android.net.wifi { field public static final int SIM = 5; // 0x5 } - public class WifiInfo implements android.os.Parcelable { + public class WifiInfo implements android.os.Parcelable android.net.TransportInfo { method public int describeContents(); method public String getBSSID(); method public static android.net.NetworkInfo.DetailedState getDetailedStateOf(android.net.wifi.SupplicantState); @@ -315,7 +315,7 @@ package android.net.wifi { method @Deprecated public boolean disconnect(); method @Deprecated public boolean enableNetwork(int, boolean); method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks(); - method public android.net.wifi.WifiInfo getConnectionInfo(); + method @Deprecated public android.net.wifi.WifiInfo getConnectionInfo(); method public android.net.DhcpInfo getDhcpInfo(); method public int getMaxNumberOfNetworkSuggestionsPerApp(); method @IntRange(from=0) public int getMaxSignalLevel(); diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt index 07793c1eb02a..afc39b97501f 100644 --- a/wifi/api/system-current.txt +++ b/wifi/api/system-current.txt @@ -401,7 +401,7 @@ package android.net.wifi { method public static void registerServiceWrappers(); } - public class WifiInfo implements android.os.Parcelable { + public class WifiInfo implements android.os.Parcelable android.net.TransportInfo { method public double getLostTxPacketsPerSecond(); method @Nullable public String getRequestingPackageName(); method public double getRetriedTxPacketsPerSecond(); diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java index 53883674e058..74370827f9e9 100644 --- a/wifi/java/android/net/wifi/WifiInfo.java +++ b/wifi/java/android/net/wifi/WifiInfo.java @@ -22,11 +22,13 @@ import android.annotation.Nullable; import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.NetworkInfo.DetailedState; +import android.net.TransportInfo; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import com.android.modules.utils.build.SdkLevel; import com.android.net.module.util.Inet4AddressUtils; import java.net.Inet4Address; @@ -34,12 +36,21 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.EnumMap; import java.util.Locale; +import java.util.Objects; /** * Describes the state of any Wi-Fi connection that is active or * is in the process of being set up. + * + * In the connected state, access to location sensitive fields requires + * the same permissions as {@link WifiManager#getScanResults}. If such access is not allowed, + * {@link #getSSID} will return {@link WifiManager#UNKNOWN_SSID} and + * {@link #getBSSID} will return {@code "02:00:00:00:00:00"}. + * {@link #getNetworkId()} will return {@code -1}. + * {@link #getPasspointFqdn()} will return null. + * {@link #getPasspointProviderFriendlyName()} will return null. */ -public class WifiInfo implements Parcelable { +public class WifiInfo implements TransportInfo, Parcelable { private static final String TAG = "WifiInfo"; /** * This is the map described in the Javadoc comment above. The positions @@ -1048,4 +1059,88 @@ public class WifiInfo implements Parcelable { public @Nullable String getPasspointUniqueId() { return mPasspointUniqueId; } + + @Override + public boolean equals(Object that) { + if (this == that) return true; + + // Potential API behavior change, so don't change behavior on older devices. + if (!SdkLevel.isAtLeastS()) return false; + + if (!(that instanceof WifiInfo)) return false; + + WifiInfo thatWifiInfo = (WifiInfo) that; + return Objects.equals(mWifiSsid, thatWifiInfo.mWifiSsid) + && Objects.equals(mBSSID, thatWifiInfo.mBSSID) + && Objects.equals(mNetworkId, thatWifiInfo.mNetworkId) + && Objects.equals(mRssi, thatWifiInfo.mRssi) + && Objects.equals(mSupplicantState, thatWifiInfo.mSupplicantState) + && Objects.equals(mLinkSpeed, thatWifiInfo.mLinkSpeed) + && Objects.equals(mTxLinkSpeed, thatWifiInfo.mTxLinkSpeed) + && Objects.equals(mRxLinkSpeed, thatWifiInfo.mRxLinkSpeed) + && Objects.equals(mFrequency, thatWifiInfo.mFrequency) + && Objects.equals(mIpAddress, thatWifiInfo.mIpAddress) + && Objects.equals(mMacAddress, thatWifiInfo.mMacAddress) + && Objects.equals(mMeteredHint, thatWifiInfo.mMeteredHint) + && Objects.equals(mEphemeral, thatWifiInfo.mEphemeral) + && Objects.equals(mTrusted, thatWifiInfo.mTrusted) + && Objects.equals(mRequestingPackageName, thatWifiInfo.mRequestingPackageName) + && Objects.equals(mOsuAp, thatWifiInfo.mOsuAp) + && Objects.equals(mFqdn, thatWifiInfo.mFqdn) + && Objects.equals(mProviderFriendlyName, thatWifiInfo.mProviderFriendlyName) + && Objects.equals(txBad, thatWifiInfo.txBad) + && Objects.equals(txRetries, thatWifiInfo.txRetries) + && Objects.equals(txSuccess, thatWifiInfo.txSuccess) + && Objects.equals(rxSuccess, thatWifiInfo.rxSuccess) + && Objects.equals(mLostTxPacketsPerSecond, thatWifiInfo.mLostTxPacketsPerSecond) + && Objects.equals(mTxRetriedTxPacketsPerSecond, + thatWifiInfo.mTxRetriedTxPacketsPerSecond) + && Objects.equals(mSuccessfulTxPacketsPerSecond, + thatWifiInfo.mSuccessfulTxPacketsPerSecond) + && Objects.equals(mSuccessfulRxPacketsPerSecond, + thatWifiInfo.mSuccessfulRxPacketsPerSecond) + && Objects.equals(score, thatWifiInfo.score) + && Objects.equals(mWifiStandard, thatWifiInfo.mWifiStandard) + && Objects.equals(mMaxSupportedTxLinkSpeed, thatWifiInfo.mMaxSupportedTxLinkSpeed) + && Objects.equals(mMaxSupportedRxLinkSpeed, thatWifiInfo.mMaxSupportedRxLinkSpeed) + && Objects.equals(mPasspointUniqueId, thatWifiInfo.mPasspointUniqueId); + } + + @Override + public int hashCode() { + // Potential API behavior change, so don't change behavior on older devices. + if (!SdkLevel.isAtLeastS()) return System.identityHashCode(this); + + return Objects.hash(mWifiSsid, + mBSSID, + mNetworkId, + mRssi, + mSupplicantState, + mLinkSpeed, + mTxLinkSpeed, + mRxLinkSpeed, + mFrequency, + mIpAddress, + mMacAddress, + mMeteredHint, + mEphemeral, + mTrusted, + mRequestingPackageName, + mOsuAp, + mFqdn, + mProviderFriendlyName, + txBad, + txRetries, + txSuccess, + rxSuccess, + mLostTxPacketsPerSecond, + mTxRetriedTxPacketsPerSecond, + mSuccessfulTxPacketsPerSecond, + mSuccessfulRxPacketsPerSecond, + score, + mWifiStandard, + mMaxSupportedTxLinkSpeed, + mMaxSupportedRxLinkSpeed, + mPasspointUniqueId); + } } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index ccf8a80665aa..9844e4b3ec7f 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -36,9 +36,11 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.ParceledListSlice; import android.net.ConnectivityManager; +import android.net.ConnectivityManager.NetworkCallback; import android.net.DhcpInfo; import android.net.MacAddress; import android.net.Network; +import android.net.NetworkCapabilities; import android.net.NetworkStack; import android.net.wifi.hotspot2.IProvisioningCallback; import android.net.wifi.hotspot2.OsuProvider; @@ -2744,15 +2746,53 @@ public class WifiManager { /** * Return dynamic information about the current Wi-Fi connection, if any is active. * <p> - * In the connected state, access to the SSID and BSSID requires - * the same permissions as {@link #getScanResults}. If such access is not allowed, - * {@link WifiInfo#getSSID} will return {@link #UNKNOWN_SSID} and - * {@link WifiInfo#getBSSID} will return {@code "02:00:00:00:00:00"}. - * {@link WifiInfo#getPasspointFqdn()} will return null. - * {@link WifiInfo#getPasspointProviderFriendlyName()} will return null. * * @return the Wi-Fi information, contained in {@link WifiInfo}. + * + * @deprecated Starting with {@link Build.VERSION_CODES#S}, WifiInfo retrieval is moved to + * {@link ConnectivityManager} API surface. WifiInfo is attached in + * {@link NetworkCapabilities#getTransportInfo()} which is available via callback in + * {@link NetworkCallback#onCapabilitiesChanged(Network, NetworkCapabilities)} or on-demand from + * {@link ConnectivityManager#getNetworkCapabilities(Network)}. + * + *</p> + * Usage example: + * <pre>{@code + * final NetworkRequest request = + * new NetworkRequest.Builder() + * .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + * .build(); + * final ConnectivityManager connectivityManager = + * context.getSystemService(ConnectivityManager.class); + * final NetworkCallback networkCallback = new NetworkCallback() { + * ... + * {@literal @}Override + * void onAvailable(Network network) {} + * + * {@literal @}Override + * void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { + * WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo(); + * } + * // etc. + * }; + * connectivityManager.requestNetwork(request, networkCallback); // For request + * connectivityManager.registerNetworkCallback(request, networkCallback); // For listen + * }</pre> + * <p> + * <b>Compatibility Note:</b> + * <li>Apps can continue using this API, however newer features + * such as ability to mask out location sensitive data in WifiInfo will not be supported + * via this API. </li> + * <li>On devices supporting concurrent connections (indicated via + * {@link #isMultiStaConcurrencySupported()}), this API will return the details + * of the internet providing connection (if any) to all apps, except for the apps that triggered + * the creation of the concurrent connection. For such apps, this API will return the details of + * the connection they created. For ex: apps using {@link WifiNetworkSpecifier} will + * will trigger a concurrent connection on supported devices and hence this API will provide + * details of their peer to peer connection (not the internet providing connection). </li> + * </p> */ + @Deprecated public WifiInfo getConnectionInfo() { try { return mService.getConnectionInfo(mContext.getOpPackageName(), diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java index 311bbc41b8fe..9787cc05ea24 100644 --- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java +++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java @@ -17,6 +17,7 @@ package android.net.wifi; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; @@ -25,6 +26,8 @@ import android.os.Parcel; import androidx.test.filters.SmallTest; +import com.android.modules.utils.build.SdkLevel; + import org.junit.Test; import java.nio.charset.StandardCharsets; @@ -148,4 +151,82 @@ public class WifiInfoTest { assertEquals(TEST_RSSI, info2.getRssi()); assertEquals(TEST_NETWORK_ID2, info2.getNetworkId()); } + + @Test + public void testWifiInfoEquals() throws Exception { + WifiInfo.Builder builder = new WifiInfo.Builder() + .setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8)) + .setBssid(TEST_BSSID) + .setRssi(TEST_RSSI) + .setNetworkId(TEST_NETWORK_ID); + + WifiInfo info1 = builder.build(); + WifiInfo info2 = builder.build(); + if (SdkLevel.isAtLeastS()) { + assertEquals(info1, info2); + } else { + assertNotEquals(info1, info2); + } + + info1.setTrusted(false); + // Same behavior pre-S & post-S. + assertNotEquals(info1, info2); + + info2.setTrusted(false); + if (SdkLevel.isAtLeastS()) { + assertEquals(info1, info2); + } else { + assertNotEquals(info1, info2); + } + + info1.setSSID(WifiSsid.createFromHex(null)); + // Same behavior pre-S & post-S. + assertNotEquals(info1, info2); + + info2.setSSID(WifiSsid.createFromHex(null)); + if (SdkLevel.isAtLeastS()) { + assertEquals(info1, info2); + } else { + assertNotEquals(info1, info2); + } + } + + @Test + public void testWifiInfoHashcode() throws Exception { + WifiInfo.Builder builder = new WifiInfo.Builder() + .setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8)) + .setBssid(TEST_BSSID) + .setRssi(TEST_RSSI) + .setNetworkId(TEST_NETWORK_ID); + + WifiInfo info1 = builder.build(); + WifiInfo info2 = builder.build(); + if (SdkLevel.isAtLeastS()) { + assertEquals(info1.hashCode(), info2.hashCode()); + } else { + assertNotEquals(info1.hashCode(), info2.hashCode()); + } + + info1.setTrusted(false); + // Same behavior pre-S & post-S. + assertNotEquals(info1.hashCode(), info2.hashCode()); + + info2.setTrusted(false); + if (SdkLevel.isAtLeastS()) { + assertEquals(info1.hashCode(), info2.hashCode()); + } else { + assertNotEquals(info1.hashCode(), info2.hashCode()); + } + + info1.setSSID(WifiSsid.createFromHex(null)); + // Same behavior pre-S & post-S. + assertNotEquals(info1.hashCode(), info2.hashCode()); + + info2.setSSID(WifiSsid.createFromHex(null)); + if (SdkLevel.isAtLeastS()) { + assertEquals(info1.hashCode(), info2.hashCode()); + } else { + assertNotEquals(info1.hashCode(), info2.hashCode()); + } + } } |