Support for Venue URL and friendly name from Network agent
Extend CaptivePortalData with a member to hold the venue friendly name. If CaptivePortalData is initialized by both the network agent and Capport, merge the two objects to include the venue friendly name and prioritize the venue URL from the network agent. Bug: 162783305 Test: atest ConnectivityServiceTest Test: atest CtsNetTestCasesLatestSdk:CaptivePortalDataTest Test: End-to-end test Change-Id: I4fdf356be42237c5b6c0ae5bacfd3cec4726861b
This commit is contained in:
@@ -39,9 +39,11 @@ public final class CaptivePortalData implements Parcelable {
|
||||
private final long mByteLimit;
|
||||
private final long mExpiryTimeMillis;
|
||||
private final boolean mCaptive;
|
||||
private final String mVenueFriendlyName;
|
||||
|
||||
private CaptivePortalData(long refreshTimeMillis, Uri userPortalUrl, Uri venueInfoUrl,
|
||||
boolean isSessionExtendable, long byteLimit, long expiryTimeMillis, boolean captive) {
|
||||
boolean isSessionExtendable, long byteLimit, long expiryTimeMillis, boolean captive,
|
||||
String venueFriendlyName) {
|
||||
mRefreshTimeMillis = refreshTimeMillis;
|
||||
mUserPortalUrl = userPortalUrl;
|
||||
mVenueInfoUrl = venueInfoUrl;
|
||||
@@ -49,11 +51,12 @@ public final class CaptivePortalData implements Parcelable {
|
||||
mByteLimit = byteLimit;
|
||||
mExpiryTimeMillis = expiryTimeMillis;
|
||||
mCaptive = captive;
|
||||
mVenueFriendlyName = venueFriendlyName;
|
||||
}
|
||||
|
||||
private CaptivePortalData(Parcel p) {
|
||||
this(p.readLong(), p.readParcelable(null), p.readParcelable(null), p.readBoolean(),
|
||||
p.readLong(), p.readLong(), p.readBoolean());
|
||||
p.readLong(), p.readLong(), p.readBoolean(), p.readString());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -70,6 +73,7 @@ public final class CaptivePortalData implements Parcelable {
|
||||
dest.writeLong(mByteLimit);
|
||||
dest.writeLong(mExpiryTimeMillis);
|
||||
dest.writeBoolean(mCaptive);
|
||||
dest.writeString(mVenueFriendlyName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,6 +87,7 @@ public final class CaptivePortalData implements Parcelable {
|
||||
private long mBytesRemaining = -1;
|
||||
private long mExpiryTime = -1;
|
||||
private boolean mCaptive;
|
||||
private String mVenueFriendlyName;
|
||||
|
||||
/**
|
||||
* Create an empty builder.
|
||||
@@ -100,7 +105,8 @@ public final class CaptivePortalData implements Parcelable {
|
||||
.setSessionExtendable(data.mIsSessionExtendable)
|
||||
.setBytesRemaining(data.mByteLimit)
|
||||
.setExpiryTime(data.mExpiryTimeMillis)
|
||||
.setCaptive(data.mCaptive);
|
||||
.setCaptive(data.mCaptive)
|
||||
.setVenueFriendlyName(data.mVenueFriendlyName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,13 +172,23 @@ public final class CaptivePortalData implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the venue friendly name.
|
||||
*/
|
||||
@NonNull
|
||||
public Builder setVenueFriendlyName(@Nullable String venueFriendlyName) {
|
||||
mVenueFriendlyName = venueFriendlyName;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new {@link CaptivePortalData}.
|
||||
*/
|
||||
@NonNull
|
||||
public CaptivePortalData build() {
|
||||
return new CaptivePortalData(mRefreshTime, mUserPortalUrl, mVenueInfoUrl,
|
||||
mIsSessionExtendable, mBytesRemaining, mExpiryTime, mCaptive);
|
||||
mIsSessionExtendable, mBytesRemaining, mExpiryTime, mCaptive,
|
||||
mVenueFriendlyName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,6 +248,14 @@ public final class CaptivePortalData implements Parcelable {
|
||||
return mCaptive;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the venue friendly name
|
||||
*/
|
||||
@Nullable
|
||||
public String getVenueFriendlyName() {
|
||||
return mVenueFriendlyName;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static final Creator<CaptivePortalData> CREATOR = new Creator<CaptivePortalData>() {
|
||||
@Override
|
||||
@@ -248,7 +272,7 @@ public final class CaptivePortalData implements Parcelable {
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mRefreshTimeMillis, mUserPortalUrl, mVenueInfoUrl,
|
||||
mIsSessionExtendable, mByteLimit, mExpiryTimeMillis, mCaptive);
|
||||
mIsSessionExtendable, mByteLimit, mExpiryTimeMillis, mCaptive, mVenueFriendlyName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -261,7 +285,8 @@ public final class CaptivePortalData implements Parcelable {
|
||||
&& mIsSessionExtendable == other.mIsSessionExtendable
|
||||
&& mByteLimit == other.mByteLimit
|
||||
&& mExpiryTimeMillis == other.mExpiryTimeMillis
|
||||
&& mCaptive == other.mCaptive;
|
||||
&& mCaptive == other.mCaptive
|
||||
&& Objects.equals(mVenueFriendlyName, other.mVenueFriendlyName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -274,6 +299,7 @@ public final class CaptivePortalData implements Parcelable {
|
||||
+ ", byteLimit: " + mByteLimit
|
||||
+ ", expiryTime: " + mExpiryTimeMillis
|
||||
+ ", captive: " + mCaptive
|
||||
+ ", venueFriendlyName: " + mVenueFriendlyName
|
||||
+ "}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2969,7 +2969,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
case EVENT_CAPPORT_DATA_CHANGED: {
|
||||
final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
|
||||
if (nai == null) break;
|
||||
handleCaptivePortalDataUpdate(nai, (CaptivePortalData) msg.obj);
|
||||
handleCapportApiDataUpdate(nai, (CaptivePortalData) msg.obj);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3304,9 +3304,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
|
||||
}
|
||||
|
||||
private void handleCaptivePortalDataUpdate(@NonNull final NetworkAgentInfo nai,
|
||||
private void handleCapportApiDataUpdate(@NonNull final NetworkAgentInfo nai,
|
||||
@Nullable final CaptivePortalData data) {
|
||||
nai.captivePortalData = data;
|
||||
nai.capportApiData = data;
|
||||
// CaptivePortalData will be merged into LinkProperties from NetworkAgentInfo
|
||||
handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
|
||||
}
|
||||
@@ -6149,6 +6149,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
private void processLinkPropertiesFromAgent(NetworkAgentInfo nai, LinkProperties lp) {
|
||||
lp.ensureDirectlyConnectedRoutes();
|
||||
nai.clatd.setNat64PrefixFromRa(lp.getNat64Prefix());
|
||||
nai.networkAgentPortalData = lp.getCaptivePortalData();
|
||||
}
|
||||
|
||||
private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties newLp,
|
||||
@@ -6192,9 +6193,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
|
||||
updateWakeOnLan(newLp);
|
||||
|
||||
// Captive portal data is obtained from NetworkMonitor and stored in NetworkAgentInfo,
|
||||
// it is not contained in LinkProperties sent from NetworkAgents so needs to be merged here.
|
||||
newLp.setCaptivePortalData(networkAgent.captivePortalData);
|
||||
// Captive portal data is obtained from NetworkMonitor and stored in NetworkAgentInfo.
|
||||
// It is not always contained in the LinkProperties sent from NetworkAgents, and if it
|
||||
// does, it needs to be merged here.
|
||||
newLp.setCaptivePortalData(mergeCaptivePortalData(networkAgent.networkAgentPortalData,
|
||||
networkAgent.capportApiData));
|
||||
|
||||
// TODO - move this check to cover the whole function
|
||||
if (!Objects.equals(newLp, oldLp)) {
|
||||
@@ -6214,6 +6217,57 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
mKeepaliveTracker.handleCheckKeepalivesStillValid(networkAgent);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param naData captive portal data from NetworkAgent
|
||||
* @param apiData captive portal data from capport API
|
||||
*/
|
||||
@Nullable
|
||||
private CaptivePortalData mergeCaptivePortalData(CaptivePortalData naData,
|
||||
CaptivePortalData apiData) {
|
||||
if (naData == null || apiData == null) {
|
||||
return naData == null ? apiData : naData;
|
||||
}
|
||||
final CaptivePortalData.Builder captivePortalBuilder =
|
||||
new CaptivePortalData.Builder(naData);
|
||||
|
||||
if (apiData.isCaptive()) {
|
||||
captivePortalBuilder.setCaptive(true);
|
||||
}
|
||||
if (apiData.isSessionExtendable()) {
|
||||
captivePortalBuilder.setSessionExtendable(true);
|
||||
}
|
||||
if (apiData.getExpiryTimeMillis() >= 0 || apiData.getByteLimit() >= 0) {
|
||||
// Expiry time, bytes remaining, refresh time all need to come from the same source,
|
||||
// otherwise data would be inconsistent. Prefer the capport API info if present,
|
||||
// as it can generally be refreshed more often.
|
||||
captivePortalBuilder.setExpiryTime(apiData.getExpiryTimeMillis());
|
||||
captivePortalBuilder.setBytesRemaining(apiData.getByteLimit());
|
||||
captivePortalBuilder.setRefreshTime(apiData.getRefreshTimeMillis());
|
||||
} else if (naData.getExpiryTimeMillis() < 0 && naData.getByteLimit() < 0) {
|
||||
// No source has time / bytes remaining information: surface the newest refresh time
|
||||
// for other fields
|
||||
captivePortalBuilder.setRefreshTime(
|
||||
Math.max(naData.getRefreshTimeMillis(), apiData.getRefreshTimeMillis()));
|
||||
}
|
||||
|
||||
// Prioritize the user portal URL from the network agent.
|
||||
if (apiData.getUserPortalUrl() != null && (naData.getUserPortalUrl() == null
|
||||
|| TextUtils.isEmpty(naData.getUserPortalUrl().toSafeString()))) {
|
||||
captivePortalBuilder.setUserPortalUrl(apiData.getUserPortalUrl());
|
||||
}
|
||||
// Prioritize the venue information URL from the network agent.
|
||||
if (apiData.getVenueInfoUrl() != null && (naData.getVenueInfoUrl() == null
|
||||
|| TextUtils.isEmpty(naData.getVenueInfoUrl().toSafeString()))) {
|
||||
captivePortalBuilder.setVenueInfoUrl(apiData.getVenueInfoUrl());
|
||||
|
||||
// Note that venue friendly name can only come from the network agent because it is not
|
||||
// in use in RFC8908. However, if using the Capport venue URL, make sure that the
|
||||
// friendly name is not set from the network agent.
|
||||
captivePortalBuilder.setVenueFriendlyName(null);
|
||||
}
|
||||
return captivePortalBuilder.build();
|
||||
}
|
||||
|
||||
private void wakeupModifyInterface(String iface, NetworkCapabilities caps, boolean add) {
|
||||
// Marks are only available on WiFi interfaces. Checking for
|
||||
// marks on unsupported interfaces is harmless.
|
||||
|
||||
@@ -175,13 +175,18 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
|
||||
// Set to true when partial connectivity was detected.
|
||||
public boolean partialConnectivity;
|
||||
|
||||
// Captive portal info of the network, if any.
|
||||
// Captive portal info of the network from RFC8908, if any.
|
||||
// Obtained by ConnectivityService and merged into NetworkAgent-provided information.
|
||||
public CaptivePortalData captivePortalData;
|
||||
public CaptivePortalData capportApiData;
|
||||
|
||||
// The UID of the remote entity that created this Network.
|
||||
public final int creatorUid;
|
||||
|
||||
// Network agent portal info of the network, if any. This information is provided from
|
||||
// non-RFC8908 sources, such as Wi-Fi Passpoint, which can provide information such as Venue
|
||||
// URL, Terms & Conditions URL, and network friendly name.
|
||||
public CaptivePortalData networkAgentPortalData;
|
||||
|
||||
// Networks are lingered when they become unneeded as a result of their NetworkRequests being
|
||||
// satisfied by a higher-scoring network. so as to allow communication to wrap up before the
|
||||
// network is taken down. This usually only happens to the default network. Lingering ends with
|
||||
|
||||
@@ -41,13 +41,14 @@ class CaptivePortalDataTest {
|
||||
.setBytesRemaining(456L)
|
||||
.setExpiryTime(789L)
|
||||
.setCaptive(true)
|
||||
.setVenueFriendlyName("venue friendly name")
|
||||
.build()
|
||||
|
||||
private fun makeBuilder() = CaptivePortalData.Builder(data)
|
||||
|
||||
@Test
|
||||
fun testParcelUnparcel() {
|
||||
assertParcelSane(data, fieldCount = 7)
|
||||
assertParcelSane(data, fieldCount = 8)
|
||||
|
||||
assertParcelingIsLossless(makeBuilder().setUserPortalUrl(null).build())
|
||||
assertParcelingIsLossless(makeBuilder().setVenueInfoUrl(null).build())
|
||||
@@ -66,6 +67,8 @@ class CaptivePortalDataTest {
|
||||
assertNotEqualsAfterChange { it.setBytesRemaining(789L) }
|
||||
assertNotEqualsAfterChange { it.setExpiryTime(12L) }
|
||||
assertNotEqualsAfterChange { it.setCaptive(false) }
|
||||
assertNotEqualsAfterChange { it.setVenueFriendlyName("another friendly name") }
|
||||
assertNotEqualsAfterChange { it.setVenueFriendlyName(null) }
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -108,6 +111,11 @@ class CaptivePortalDataTest {
|
||||
assertFalse(makeBuilder().setCaptive(false).build().isCaptive)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testVenueFriendlyName() {
|
||||
assertEquals("venue friendly name", data.venueFriendlyName)
|
||||
}
|
||||
|
||||
private fun CaptivePortalData.mutate(mutator: (CaptivePortalData.Builder) -> Unit) =
|
||||
CaptivePortalData.Builder(this).apply { mutator(this) }.build()
|
||||
|
||||
|
||||
@@ -343,6 +343,11 @@ public class ConnectivityServiceTest {
|
||||
|
||||
private static final String INTERFACE_NAME = "interface";
|
||||
|
||||
private static final String TEST_VENUE_URL_NA = "https://android.com/";
|
||||
private static final String TEST_VENUE_URL_CAPPORT = "https://android.com/capport/";
|
||||
private static final String TEST_FRIENDLY_NAME = "Network friendly name";
|
||||
private static final String TEST_REDIRECT_URL = "http://example.com/firstPath";
|
||||
|
||||
private MockContext mServiceContext;
|
||||
private HandlerThread mCsHandlerThread;
|
||||
private ConnectivityService.Dependencies mDeps;
|
||||
@@ -866,7 +871,7 @@ public class ConnectivityServiceTest {
|
||||
mProbesSucceeded = probesSucceeded;
|
||||
}
|
||||
|
||||
void notifyCaptivePortalDataChanged(CaptivePortalData data) {
|
||||
void notifyCapportApiDataChanged(CaptivePortalData data) {
|
||||
try {
|
||||
mNmCallbacks.notifyCaptivePortalDataChanged(data);
|
||||
} catch (RemoteException e) {
|
||||
@@ -2003,7 +2008,7 @@ public class ConnectivityServiceTest {
|
||||
Objects.equals(expectedCapportUrl, lp.getCaptivePortalApiUrl()));
|
||||
|
||||
final CaptivePortalData expectedCapportData = sanitized ? null : capportData;
|
||||
mWiFiNetworkAgent.notifyCaptivePortalDataChanged(capportData);
|
||||
mWiFiNetworkAgent.notifyCapportApiDataChanged(capportData);
|
||||
callback.expectLinkPropertiesThat(mWiFiNetworkAgent, lp ->
|
||||
Objects.equals(expectedCapportData, lp.getCaptivePortalData()));
|
||||
defaultCallback.expectLinkPropertiesThat(mWiFiNetworkAgent, lp ->
|
||||
@@ -3041,7 +3046,7 @@ public class ConnectivityServiceTest {
|
||||
.setBytesRemaining(12345L)
|
||||
.build();
|
||||
|
||||
mWiFiNetworkAgent.notifyCaptivePortalDataChanged(testData);
|
||||
mWiFiNetworkAgent.notifyCapportApiDataChanged(testData);
|
||||
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> testData.equals(lp.getCaptivePortalData()));
|
||||
@@ -3054,6 +3059,136 @@ public class ConnectivityServiceTest {
|
||||
lp -> testData.equals(lp.getCaptivePortalData()) && lp.getMtu() == 1234);
|
||||
}
|
||||
|
||||
private TestNetworkCallback setupNetworkCallbackAndConnectToWifi() throws Exception {
|
||||
// Grant NETWORK_SETTINGS permission to be able to receive LinkProperties change callbacks
|
||||
// with sensitive (captive portal) data
|
||||
mServiceContext.setPermission(
|
||||
android.Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
|
||||
|
||||
final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
|
||||
final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
|
||||
.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build();
|
||||
mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback);
|
||||
|
||||
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
|
||||
|
||||
mWiFiNetworkAgent.connectWithCaptivePortal(TEST_REDIRECT_URL, false /* isStrictMode */);
|
||||
captivePortalCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
|
||||
return captivePortalCallback;
|
||||
}
|
||||
|
||||
private class CaptivePortalTestData {
|
||||
CaptivePortalTestData(CaptivePortalData naData, CaptivePortalData capportData,
|
||||
CaptivePortalData expectedMergedData) {
|
||||
mNaData = naData;
|
||||
mCapportData = capportData;
|
||||
mExpectedMergedData = expectedMergedData;
|
||||
}
|
||||
|
||||
public final CaptivePortalData mNaData;
|
||||
public final CaptivePortalData mCapportData;
|
||||
public final CaptivePortalData mExpectedMergedData;
|
||||
}
|
||||
|
||||
private CaptivePortalTestData setupCaptivePortalData() {
|
||||
final CaptivePortalData capportData = new CaptivePortalData.Builder()
|
||||
.setUserPortalUrl(Uri.parse(TEST_REDIRECT_URL))
|
||||
.setVenueInfoUrl(Uri.parse(TEST_VENUE_URL_CAPPORT))
|
||||
.setExpiryTime(1000000L)
|
||||
.setBytesRemaining(12345L)
|
||||
.build();
|
||||
|
||||
final CaptivePortalData naData = new CaptivePortalData.Builder()
|
||||
.setBytesRemaining(80802L)
|
||||
.setVenueInfoUrl(Uri.parse(TEST_VENUE_URL_NA))
|
||||
.setVenueFriendlyName(TEST_FRIENDLY_NAME).build();
|
||||
|
||||
final CaptivePortalData expectedMergedData = new CaptivePortalData.Builder()
|
||||
.setUserPortalUrl(Uri.parse(TEST_REDIRECT_URL))
|
||||
.setBytesRemaining(12345L)
|
||||
.setExpiryTime(1000000L)
|
||||
.setVenueInfoUrl(Uri.parse(TEST_VENUE_URL_NA))
|
||||
.setVenueFriendlyName(TEST_FRIENDLY_NAME).build();
|
||||
|
||||
return new CaptivePortalTestData(naData, capportData, expectedMergedData);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMergeCaptivePortalApiWithFriendlyNameAndVenueUrl() throws Exception {
|
||||
final TestNetworkCallback captivePortalCallback = setupNetworkCallbackAndConnectToWifi();
|
||||
final CaptivePortalTestData captivePortalTestData = setupCaptivePortalData();
|
||||
|
||||
// Baseline capport data
|
||||
mWiFiNetworkAgent.notifyCapportApiDataChanged(captivePortalTestData.mCapportData);
|
||||
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mCapportData.equals(lp.getCaptivePortalData()));
|
||||
|
||||
// Venue URL and friendly name from Network agent, confirm that API data gets precedence
|
||||
// on the bytes remaining.
|
||||
final LinkProperties linkProperties = new LinkProperties();
|
||||
linkProperties.setCaptivePortalData(captivePortalTestData.mNaData);
|
||||
mWiFiNetworkAgent.sendLinkProperties(linkProperties);
|
||||
|
||||
// Make sure that the capport data is merged
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mExpectedMergedData.equals(lp.getCaptivePortalData()));
|
||||
|
||||
// Create a new LP with no Network agent capport data
|
||||
final LinkProperties newLps = new LinkProperties();
|
||||
newLps.setMtu(1234);
|
||||
mWiFiNetworkAgent.sendLinkProperties(newLps);
|
||||
// CaptivePortalData is not lost and has the original values when LPs are received from the
|
||||
// NetworkAgent
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mCapportData.equals(lp.getCaptivePortalData())
|
||||
&& lp.getMtu() == 1234);
|
||||
|
||||
// Now send capport data only from the Network agent
|
||||
mWiFiNetworkAgent.notifyCapportApiDataChanged(null);
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> lp.getCaptivePortalData() == null);
|
||||
|
||||
newLps.setCaptivePortalData(captivePortalTestData.mNaData);
|
||||
mWiFiNetworkAgent.sendLinkProperties(newLps);
|
||||
|
||||
// Make sure that only the network agent capport data is available
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mNaData.equals(lp.getCaptivePortalData()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMergeCaptivePortalDataFromNetworkAgentFirstThenCapport() throws Exception {
|
||||
final TestNetworkCallback captivePortalCallback = setupNetworkCallbackAndConnectToWifi();
|
||||
final CaptivePortalTestData captivePortalTestData = setupCaptivePortalData();
|
||||
|
||||
// Venue URL and friendly name from Network agent, confirm that API data gets precedence
|
||||
// on the bytes remaining.
|
||||
final LinkProperties linkProperties = new LinkProperties();
|
||||
linkProperties.setCaptivePortalData(captivePortalTestData.mNaData);
|
||||
mWiFiNetworkAgent.sendLinkProperties(linkProperties);
|
||||
|
||||
// Make sure that the data is saved correctly
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mNaData.equals(lp.getCaptivePortalData()));
|
||||
|
||||
// Expected merged data: Network agent data is preferred, and values that are not used by
|
||||
// it are merged from capport data
|
||||
mWiFiNetworkAgent.notifyCapportApiDataChanged(captivePortalTestData.mCapportData);
|
||||
|
||||
// Make sure that the Capport data is merged correctly
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mExpectedMergedData.equals(lp.getCaptivePortalData()));
|
||||
|
||||
// Now set the naData to null
|
||||
linkProperties.setCaptivePortalData(null);
|
||||
mWiFiNetworkAgent.sendLinkProperties(linkProperties);
|
||||
|
||||
// Make sure that the Capport data is retained correctly
|
||||
captivePortalCallback.expectLinkPropertiesThat(mWiFiNetworkAgent,
|
||||
lp -> captivePortalTestData.mCapportData.equals(lp.getCaptivePortalData()));
|
||||
}
|
||||
|
||||
private NetworkRequest.Builder newWifiRequestBuilder() {
|
||||
return new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user