summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt2
-rw-r--r--wifi/api/current.txt2
-rw-r--r--wifi/api/system-current.txt3
-rw-r--r--wifi/api/system-lint-baseline.txt2
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java16
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java70
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSuggestion.java62
-rw-r--r--wifi/tests/src/android/net/wifi/WifiConfigurationTest.java4
-rw-r--r--wifi/tests/src/android/net/wifi/WifiInfoTest.java12
-rw-r--r--wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java86
10 files changed, 258 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt
index 572867fc94d4..e24df4204af4 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -31894,6 +31894,7 @@ package android.net.wifi {
method @Nullable public String getSsid();
method public int getSubscriptionId();
method public boolean isAppInteractionRequired();
+ method public boolean isCarrierMerged();
method public boolean isCredentialSharedWithUser();
method public boolean isEnhancedOpen();
method public boolean isHiddenSsid();
@@ -31909,6 +31910,7 @@ package android.net.wifi {
ctor public WifiNetworkSuggestion.Builder();
method @NonNull public android.net.wifi.WifiNetworkSuggestion build();
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierMerged(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCredentialSharedWithUser(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedMacRandomizationEnabled(boolean);
diff --git a/wifi/api/current.txt b/wifi/api/current.txt
index f418eb6fc74b..911f2fbc6afa 100644
--- a/wifi/api/current.txt
+++ b/wifi/api/current.txt
@@ -505,6 +505,7 @@ package android.net.wifi {
method @Nullable public String getSsid();
method public int getSubscriptionId();
method public boolean isAppInteractionRequired();
+ method public boolean isCarrierMerged();
method public boolean isCredentialSharedWithUser();
method public boolean isEnhancedOpen();
method public boolean isHiddenSsid();
@@ -520,6 +521,7 @@ package android.net.wifi {
ctor public WifiNetworkSuggestion.Builder();
method @NonNull public android.net.wifi.WifiNetworkSuggestion build();
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
+ method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierMerged(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCredentialSharedWithUser(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired(boolean);
method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedMacRandomizationEnabled(boolean);
diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt
index 5eef6f80ac16..1d2bed8a6fd9 100644
--- a/wifi/api/system-current.txt
+++ b/wifi/api/system-current.txt
@@ -345,6 +345,7 @@ package android.net.wifi {
field @Deprecated public static final int RECENT_FAILURE_REFUSED_TEMPORARILY = 1002; // 0x3ea
field @Deprecated public boolean allowAutojoin;
field @Deprecated public int carrierId;
+ field @Deprecated public boolean carrierMerged;
field @Deprecated public String creatorName;
field @Deprecated public int creatorUid;
field @Deprecated public boolean fromWifiNetworkSpecifier;
@@ -426,8 +427,10 @@ package android.net.wifi {
method @Nullable public String getRequestingPackageName();
method public double getRetriedTxPacketsPerSecond();
method public int getScore();
+ method public int getSubscriptionId();
method public double getSuccessfulRxPacketsPerSecond();
method public double getSuccessfulTxPacketsPerSecond();
+ method public boolean isCarrierMerged();
method public boolean isEphemeral();
method public boolean isOemPaid();
method public boolean isOemPrivate();
diff --git a/wifi/api/system-lint-baseline.txt b/wifi/api/system-lint-baseline.txt
index a5f3f7c08fa4..9a3b66a30425 100644
--- a/wifi/api/system-lint-baseline.txt
+++ b/wifi/api/system-lint-baseline.txt
@@ -7,5 +7,7 @@ MissingNullability: android.net.wifi.rtt.RangingRequest.Builder#addResponder(and
+MutableBareField: android.net.wifi.WifiConfiguration#carrierMerged:
+
MutableBareField: android.net.wifi.WifiConfiguration#subscriptionId:
Bare field subscriptionId must be marked final, or moved behind accessors if mutable
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index e1e9757e0f6c..84cd8184289b 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -1053,6 +1053,15 @@ public class WifiConfiguration implements Parcelable {
public boolean oemPrivate;
/**
+ * Indicate whether or not the network is a carrier merged network.
+ * This bit can only be used by suggestion network, see
+ * {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)}
+ * @hide
+ */
+ @SystemApi
+ public boolean carrierMerged;
+
+ /**
* True if this Wifi configuration is created from a {@link WifiNetworkSuggestion},
* false otherwise.
*
@@ -2283,6 +2292,7 @@ public class WifiConfiguration implements Parcelable {
trusted = true; // Networks are considered trusted by default.
oemPaid = false;
oemPrivate = false;
+ carrierMerged = false;
fromWifiNetworkSuggestion = false;
fromWifiNetworkSpecifier = false;
meteredHint = false;
@@ -2407,12 +2417,13 @@ public class WifiConfiguration implements Parcelable {
if (this.trusted) sbuf.append(" trusted");
if (this.oemPaid) sbuf.append(" oemPaid");
if (this.oemPrivate) sbuf.append(" oemPrivate");
+ if (this.carrierMerged) sbuf.append(" carrierMerged");
if (this.fromWifiNetworkSuggestion) sbuf.append(" fromWifiNetworkSuggestion");
if (this.fromWifiNetworkSpecifier) sbuf.append(" fromWifiNetworkSpecifier");
if (this.meteredHint) sbuf.append(" meteredHint");
if (this.useExternalScores) sbuf.append(" useExternalScores");
if (this.validatedInternetAccess || this.ephemeral || this.trusted || this.oemPaid
- || this.oemPrivate || this.fromWifiNetworkSuggestion
+ || this.oemPrivate || this.carrierMerged || this.fromWifiNetworkSuggestion
|| this.fromWifiNetworkSpecifier || this.meteredHint || this.useExternalScores) {
sbuf.append("\n");
}
@@ -2980,6 +2991,7 @@ public class WifiConfiguration implements Parcelable {
trusted = source.trusted;
oemPaid = source.oemPaid;
oemPrivate = source.oemPrivate;
+ carrierMerged = source.carrierMerged;
fromWifiNetworkSuggestion = source.fromWifiNetworkSuggestion;
fromWifiNetworkSpecifier = source.fromWifiNetworkSpecifier;
meteredHint = source.meteredHint;
@@ -3062,6 +3074,7 @@ public class WifiConfiguration implements Parcelable {
dest.writeInt(trusted ? 1 : 0);
dest.writeInt(oemPaid ? 1 : 0);
dest.writeInt(oemPrivate ? 1 : 0);
+ dest.writeInt(carrierMerged ? 1 : 0);
dest.writeInt(fromWifiNetworkSuggestion ? 1 : 0);
dest.writeInt(fromWifiNetworkSpecifier ? 1 : 0);
dest.writeInt(meteredHint ? 1 : 0);
@@ -3141,6 +3154,7 @@ public class WifiConfiguration implements Parcelable {
config.trusted = in.readInt() != 0;
config.oemPaid = in.readInt() != 0;
config.oemPrivate = in.readInt() != 0;
+ config.carrierMerged = in.readInt() != 0;
config.fromWifiNetworkSuggestion = in.readInt() != 0;
config.fromWifiNetworkSpecifier = in.readInt() != 0;
config.meteredHint = in.readInt() != 0;
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 774c043136e7..6bd1ce54dc5b 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -25,8 +25,10 @@ import android.net.NetworkInfo.DetailedState;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
+import android.telephony.SubscriptionManager;
import android.text.TextUtils;
+import com.android.modules.utils.build.SdkLevel;
import com.android.net.module.util.Inet4AddressUtils;
import java.net.Inet4Address;
@@ -169,6 +171,11 @@ public class WifiInfo implements Parcelable {
private boolean mOemPrivate;
/**
+ * Whether the network is a carrier merged network.
+ */
+ private boolean mCarrierMerged;
+
+ /**
* OSU (Online Sign Up) AP for Passpoint R2.
*/
private boolean mOsuAp;
@@ -190,6 +197,11 @@ public class WifiInfo implements Parcelable {
private String mRequestingPackageName;
/**
+ * Identify which Telephony subscription provides this network.
+ */
+ private int mSubscriptionId;
+
+ /**
* Running total count of lost (not ACKed) transmitted unicast data packets.
* @hide
*/
@@ -315,6 +327,7 @@ public class WifiInfo implements Parcelable {
mRssi = INVALID_RSSI;
mLinkSpeed = LINK_SPEED_UNKNOWN;
mFrequency = -1;
+ mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
/** @hide */
@@ -335,11 +348,13 @@ public class WifiInfo implements Parcelable {
setTrusted(false);
setOemPaid(false);
setOemPrivate(false);
+ setCarrierMerged(false);
setOsuAp(false);
setRequestingPackageName(null);
setFQDN(null);
setProviderFriendlyName(null);
setPasspointUniqueId(null);
+ setSubscriptionId(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
txBad = 0;
txSuccess = 0;
rxSuccess = 0;
@@ -373,11 +388,13 @@ public class WifiInfo implements Parcelable {
mTrusted = source.mTrusted;
mOemPaid = source.mOemPaid;
mOemPrivate = source.mOemPrivate;
+ mCarrierMerged = source.mCarrierMerged;
mRequestingPackageName =
source.mRequestingPackageName;
mOsuAp = source.mOsuAp;
mFqdn = source.mFqdn;
mProviderFriendlyName = source.mProviderFriendlyName;
+ mSubscriptionId = source.mSubscriptionId;
txBad = source.txBad;
txRetries = source.txRetries;
txSuccess = source.txSuccess;
@@ -753,6 +770,9 @@ public class WifiInfo implements Parcelable {
*/
@SystemApi
public boolean isOemPaid() {
+ if (!SdkLevel.isAtLeastS()) {
+ throw new UnsupportedOperationException();
+ }
return mOemPaid;
}
@@ -768,9 +788,33 @@ public class WifiInfo implements Parcelable {
*/
@SystemApi
public boolean isOemPrivate() {
+ if (!SdkLevel.isAtLeastS()) {
+ throw new UnsupportedOperationException();
+ }
return mOemPrivate;
}
+ /**
+ * {@hide}
+ */
+ public void setCarrierMerged(boolean carrierMerged) {
+ mCarrierMerged = carrierMerged;
+ }
+
+ /**
+ * Returns true if the current Wifi network is a carrier merged network, false otherwise.
+ * @see WifiNetworkSuggestion.Builder#setCarrierMerged(boolean).
+ * {@hide}
+ */
+ @SystemApi
+ public boolean isCarrierMerged() {
+ if (!SdkLevel.isAtLeastS()) {
+ throw new UnsupportedOperationException();
+ }
+ return mCarrierMerged;
+ }
+
+
/** {@hide} */
public void setOsuAp(boolean osuAp) {
mOsuAp = osuAp;
@@ -839,6 +883,28 @@ public class WifiInfo implements Parcelable {
return mRequestingPackageName;
}
+ /** {@hide} */
+ public void setSubscriptionId(int subId) {
+ mSubscriptionId = subId;
+ }
+
+ /**
+ * If this network is provisioned by a carrier, returns subscription Id corresponding to the
+ * associated SIM on the device. If this network is not provisioned by a carrier, returns
+ * {@link android.telephony.SubscriptionManager#INVALID_SUBSCRIPTION_ID}
+ *
+ * @see WifiNetworkSuggestion.Builder#setSubscriptionId(int)
+ * @see android.telephony.SubscriptionInfo#getSubscriptionId()
+ * {@hide}
+ */
+ @SystemApi
+ public int getSubscriptionId() {
+ if (!SdkLevel.isAtLeastS()) {
+ throw new UnsupportedOperationException();
+ }
+ return mSubscriptionId;
+ }
+
/** @hide */
@UnsupportedAppUsage
@@ -1010,6 +1076,7 @@ public class WifiInfo implements Parcelable {
dest.writeInt(mTrusted ? 1 : 0);
dest.writeInt(mOemPaid ? 1 : 0);
dest.writeInt(mOemPrivate ? 1 : 0);
+ dest.writeInt(mCarrierMerged ? 1 : 0);
dest.writeInt(score);
dest.writeLong(txSuccess);
dest.writeDouble(mSuccessfulTxPacketsPerSecond);
@@ -1028,6 +1095,7 @@ public class WifiInfo implements Parcelable {
dest.writeInt(mMaxSupportedTxLinkSpeed);
dest.writeInt(mMaxSupportedRxLinkSpeed);
dest.writeString(mPasspointUniqueId);
+ dest.writeInt(mSubscriptionId);
}
/** Implement the Parcelable interface {@hide} */
@@ -1057,6 +1125,7 @@ public class WifiInfo implements Parcelable {
info.mTrusted = in.readInt() != 0;
info.mOemPaid = in.readInt() != 0;
info.mOemPrivate = in.readInt() != 0;
+ info.mCarrierMerged = in.readInt() != 0;
info.score = in.readInt();
info.txSuccess = in.readLong();
info.mSuccessfulTxPacketsPerSecond = in.readDouble();
@@ -1075,6 +1144,7 @@ public class WifiInfo implements Parcelable {
info.mMaxSupportedTxLinkSpeed = in.readInt();
info.mMaxSupportedRxLinkSpeed = in.readInt();
info.mPasspointUniqueId = in.readString();
+ info.mSubscriptionId = in.readInt();
return info;
}
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
index 61831ea9c502..bd9a10308bae 100644
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
@@ -187,6 +187,11 @@ public final class WifiNetworkSuggestion implements Parcelable {
private boolean mIsNetworkOemPrivate;
/**
+ * Whether this network is a carrier merged network.
+ */
+ private boolean mIsCarrierMerged;
+
+ /**
* Whether this network will use enhanced MAC randomization.
*/
private boolean mIsEnhancedMacRandomizationEnabled;
@@ -214,6 +219,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
mIsNetworkUntrusted = false;
mIsNetworkOemPaid = false;
mIsNetworkOemPrivate = false;
+ mIsCarrierMerged = false;
mPriorityGroup = 0;
mIsEnhancedMacRandomizationEnabled = false;
mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -775,6 +781,34 @@ public final class WifiNetworkSuggestion implements Parcelable {
return this;
}
+ /**
+ * Specifies whether the suggestion represents a carrier merged network. A carrier merged
+ * Wi-Fi network is treated as part of the mobile carrier network. Such configuration may
+ * impact the user interface and data usage accounting.
+ * <p>
+ * <li>A suggestion marked as carrier merged must be metered enterprise network with a valid
+ * subscription Id set.
+ * @see #setIsMetered(boolean)
+ * @see #setSubscriptionId(int)
+ * @see #setWpa2EnterpriseConfig(WifiEnterpriseConfig)
+ * @see #setWpa3Enterprise192BitModeConfig(WifiEnterpriseConfig)
+ * @see #setWpa3EnterpriseStandardModeConfig(WifiEnterpriseConfig)
+ * @see #setPasspointConfig(PasspointConfiguration)
+ * </li>
+ * <li>If not set, defaults to false (i.e. not a carrier merged network.)</li>
+ * </p>
+ * @param isCarrierMerged Boolean indicating whether the network is treated a carrier
+ * merged network (if true) or non-merged network (if false);
+ * @return Instance of {@link Builder} to enable chaining of the builder method.
+ */
+ public @NonNull Builder setCarrierMerged(boolean isCarrierMerged) {
+ if (!SdkLevel.isAtLeastS()) {
+ throw new UnsupportedOperationException();
+ }
+ mIsCarrierMerged = isCarrierMerged;
+ return this;
+ }
+
private void setSecurityParamsInWifiConfiguration(
@NonNull WifiConfiguration configuration) {
if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
@@ -843,6 +877,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
wifiConfiguration.trusted = !mIsNetworkUntrusted;
wifiConfiguration.oemPaid = mIsNetworkOemPaid;
wifiConfiguration.oemPrivate = mIsNetworkOemPrivate;
+ wifiConfiguration.carrierMerged = mIsCarrierMerged;
wifiConfiguration.macRandomizationSetting = mIsEnhancedMacRandomizationEnabled
? WifiConfiguration.RANDOMIZATION_ENHANCED
: WifiConfiguration.RANDOMIZATION_PERSISTENT;
@@ -877,6 +912,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
wifiConfiguration.trusted = !mIsNetworkUntrusted;
wifiConfiguration.oemPaid = mIsNetworkOemPaid;
wifiConfiguration.oemPrivate = mIsNetworkOemPrivate;
+ wifiConfiguration.carrierMerged = mIsCarrierMerged;
wifiConfiguration.subscriptionId = mSubscriptionId;
mPasspointConfiguration.setCarrierId(mCarrierId);
mPasspointConfiguration.setSubscriptionId(mSubscriptionId);
@@ -1004,6 +1040,14 @@ public final class WifiNetworkSuggestion implements Parcelable {
}
mIsSharedWithUser = false;
}
+ if (mIsCarrierMerged) {
+ if (mSubscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ || mMeteredOverride != WifiConfiguration.METERED_OVERRIDE_METERED
+ || !isEnterpriseSuggestion()) {
+ throw new IllegalStateException("A carrier merged network must be a metered, "
+ + "enterprise network with valid subscription Id");
+ }
+ }
return new WifiNetworkSuggestion(
wifiConfiguration,
mPasspointConfiguration,
@@ -1013,8 +1057,15 @@ public final class WifiNetworkSuggestion implements Parcelable {
mIsInitialAutojoinEnabled,
mPriorityGroup);
}
+
+ private boolean isEnterpriseSuggestion() {
+ return !(mWpa2EnterpriseConfig == null && mWpa3EnterpriseConfig == null
+ && mWapiEnterpriseConfig == null && mPasspointConfiguration == null);
+ }
}
+
+
/**
* Network configuration for the provided network.
* @hide
@@ -1172,6 +1223,7 @@ public final class WifiNetworkSuggestion implements Parcelable {
.append(", isUnTrusted=").append(!wifiConfiguration.trusted)
.append(", isOemPaid=").append(wifiConfiguration.oemPaid)
.append(", isOemPrivate=").append(wifiConfiguration.oemPrivate)
+ .append(", isCarrierMerged").append(wifiConfiguration.carrierMerged)
.append(", priorityGroup=").append(priorityGroup)
.append(" ]");
return sb.toString();
@@ -1291,6 +1343,16 @@ public final class WifiNetworkSuggestion implements Parcelable {
}
/**
+ * @see Builder#setCarrierMerged(boolean)
+ */
+ public boolean isCarrierMerged() {
+ if (!SdkLevel.isAtLeastS()) {
+ throw new UnsupportedOperationException();
+ }
+ return wifiConfiguration.carrierMerged;
+ }
+
+ /**
* Get the WifiEnterpriseConfig, or null if unset.
* @see Builder#setWapiEnterpriseConfig(WifiEnterpriseConfig)
* @see Builder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
index c88132493e67..c25374695463 100644
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
@@ -75,6 +75,7 @@ public class WifiConfigurationTest {
config.trusted = false;
config.oemPaid = true;
config.oemPrivate = true;
+ config.carrierMerged = true;
config.updateIdentifier = "1234";
config.fromWifiNetworkSpecifier = true;
config.fromWifiNetworkSuggestion = true;
@@ -101,6 +102,7 @@ public class WifiConfigurationTest {
assertTrue(reconfig.fromWifiNetworkSuggestion);
assertTrue(reconfig.oemPaid);
assertTrue(reconfig.oemPrivate);
+ assertTrue(reconfig.carrierMerged);
Parcel parcelWW = Parcel.obtain();
reconfig.writeToParcel(parcelWW, 0);
@@ -116,6 +118,7 @@ public class WifiConfigurationTest {
config.trusted = false;
config.oemPaid = true;
config.oemPrivate = true;
+ config.carrierMerged = true;
config.updateIdentifier = "1234";
config.fromWifiNetworkSpecifier = true;
config.fromWifiNetworkSuggestion = true;
@@ -134,6 +137,7 @@ public class WifiConfigurationTest {
assertTrue(reconfig.fromWifiNetworkSuggestion);
assertTrue(reconfig.oemPaid);
assertTrue(reconfig.oemPrivate);
+ assertTrue(reconfig.carrierMerged);
}
@Test
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
index c6faf66140e2..33438ed9008e 100644
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import android.os.Parcel;
+import android.telephony.SubscriptionManager;
import androidx.test.filters.SmallTest;
@@ -50,6 +51,7 @@ public class WifiInfoTest {
private static final int TEST_RSSI = -60;
private static final int TEST_NETWORK_ID = 5;
private static final int TEST_NETWORK_ID2 = 6;
+ private static final int TEST_SUB_ID = 1;
/**
* Verify parcel write/read with WifiInfo.
@@ -64,6 +66,7 @@ public class WifiInfoTest {
writeWifiInfo.setTrusted(true);
writeWifiInfo.setOemPaid(true);
writeWifiInfo.setOemPrivate(true);
+ writeWifiInfo.setCarrierMerged(true);
writeWifiInfo.setOsuAp(true);
writeWifiInfo.setFQDN(TEST_FQDN);
writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
@@ -71,6 +74,7 @@ public class WifiInfoTest {
writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
writeWifiInfo.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
writeWifiInfo.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
+ writeWifiInfo.setSubscriptionId(TEST_SUB_ID);
Parcel parcel = Parcel.obtain();
writeWifiInfo.writeToParcel(parcel, 0);
@@ -86,6 +90,7 @@ public class WifiInfoTest {
assertTrue(readWifiInfo.isTrusted());
assertTrue(readWifiInfo.isOemPaid());
assertTrue(readWifiInfo.isOemPrivate());
+ assertTrue(readWifiInfo.isCarrierMerged());
assertTrue(readWifiInfo.isOsuAp());
assertTrue(readWifiInfo.isPasspointAp());
assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getRequestingPackageName());
@@ -96,6 +101,7 @@ public class WifiInfoTest {
readWifiInfo.getMaxSupportedTxLinkSpeedMbps());
assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS,
readWifiInfo.getMaxSupportedRxLinkSpeedMbps());
+ assertEquals(TEST_SUB_ID, readWifiInfo.getSubscriptionId());
}
@Test
@@ -108,6 +114,7 @@ public class WifiInfoTest {
writeWifiInfo.setTrusted(true);
writeWifiInfo.setOemPaid(true);
writeWifiInfo.setOemPrivate(true);
+ writeWifiInfo.setCarrierMerged(true);
writeWifiInfo.setOsuAp(true);
writeWifiInfo.setFQDN(TEST_FQDN);
writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
@@ -115,6 +122,7 @@ public class WifiInfoTest {
writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
writeWifiInfo.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
writeWifiInfo.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
+ writeWifiInfo.setSubscriptionId(TEST_SUB_ID);
WifiInfo readWifiInfo = new WifiInfo(writeWifiInfo);
@@ -125,6 +133,7 @@ public class WifiInfoTest {
assertTrue(readWifiInfo.isTrusted());
assertTrue(readWifiInfo.isOemPaid());
assertTrue(readWifiInfo.isOemPrivate());
+ assertTrue(readWifiInfo.isCarrierMerged());
assertTrue(readWifiInfo.isOsuAp());
assertTrue(readWifiInfo.isPasspointAp());
assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getRequestingPackageName());
@@ -135,6 +144,7 @@ public class WifiInfoTest {
readWifiInfo.getMaxSupportedTxLinkSpeedMbps());
assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS,
readWifiInfo.getMaxSupportedRxLinkSpeedMbps());
+ assertEquals(TEST_SUB_ID, readWifiInfo.getSubscriptionId());
}
/**
@@ -154,6 +164,8 @@ public class WifiInfoTest {
assertEquals(-1, wifiInfo.getNetworkId());
assertFalse(wifiInfo.isOemPaid());
assertFalse(wifiInfo.isOemPrivate());
+ assertFalse(wifiInfo.isCarrierMerged());
+ assertEquals(SubscriptionManager.INVALID_SUBSCRIPTION_ID, wifiInfo.getSubscriptionId());
}
/**
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
index 870ff0a26d58..643a78c38f91 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
@@ -1414,4 +1414,90 @@ public class WifiNetworkSuggestionTest {
.setIsInitialAutojoinEnabled(false)
.build();
}
+
+ /**
+ * Validate {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)} set the
+ * correct value to the WifiConfiguration.
+ */
+ @Test
+ public void testSetCarrierMergedNetwork() {
+ assumeTrue(SdkLevel.isAtLeastS());
+
+ WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+ enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+ enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
+ enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
+ WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+ .setSsid(TEST_SSID)
+ .setSubscriptionId(1)
+ .setWpa2EnterpriseConfig(enterpriseConfig)
+ .setCarrierMerged(true)
+ .setIsMetered(true)
+ .build();
+ assertTrue(suggestion.isCarrierMerged());
+ assertTrue(suggestion.wifiConfiguration.carrierMerged);
+ }
+
+ /**
+ * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+ * when set both {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)}
+ * to true on a network is not metered.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testSetCarrierMergedNetworkOnUnmeteredNetworkFail() {
+ assumeTrue(SdkLevel.isAtLeastS());
+
+ WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+ enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+ enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
+ enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
+ new WifiNetworkSuggestion.Builder()
+ .setSsid(TEST_SSID)
+ .setSubscriptionId(1)
+ .setWpa2EnterpriseConfig(enterpriseConfig)
+ .setCarrierMerged(true)
+ .build();
+ }
+
+ /**
+ * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+ * when set both {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)}
+ * to true on a network which {@link WifiNetworkSuggestion.Builder#setSubscriptionId(int)}
+ * is not set with a valid sub id.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testSetCarrierMergedNetworkWithoutValidSubscriptionIdFail() {
+ assumeTrue(SdkLevel.isAtLeastS());
+
+ WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
+ enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
+ enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
+ enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
+ WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+ .setSsid(TEST_SSID)
+ .setWpa2EnterpriseConfig(enterpriseConfig)
+ .setCarrierMerged(true)
+ .setIsMetered(true)
+ .build();
+ assertTrue(suggestion.isCarrierMerged());
+ }
+
+ /**
+ * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
+ * when set both {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} (boolean)}
+ * to true on a non enterprise network.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testSetCarrierMergedNetworkWithNonEnterpriseNetworkFail() {
+ assumeTrue(SdkLevel.isAtLeastS());
+
+ WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
+ .setSsid(TEST_SSID)
+ .setSubscriptionId(1)
+ .setWpa2Passphrase(TEST_PRESHARED_KEY)
+ .setCarrierMerged(true)
+ .setIsMetered(true)
+ .build();
+ assertTrue(suggestion.isCarrierMerged());
+ }
}