Merge changes from topic "wifi_transport_info_stage_1"
* changes: WifiInfo: Add equals implementation Convert WifiInfo to TransportInfo
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user