summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2021-12-13 21:42:33 -0800
committerXin Li <delphij@google.com>2021-12-14 08:39:07 -0800
commit9e530dd1f7f0f10a1f3fab93b9587af49a37938a (patch)
tree8151949161a59671b19f700f7ca61da3910230c9
parent524458a8bcc0138c1b4782498fe337ab52e76566 (diff)
parent78012b2c6b7523e9716a923263142ad8ae204f26 (diff)
downloadwifi-9e530dd1f7f0f10a1f3fab93b9587af49a37938a.tar.gz
Merge Android 12 QPR1
Bug: 210511427 Merged-In: If8e12e89f16cdbc8d4ffb7def51f7c2fc587e907 Change-Id: I19ee661b6ea90a5887e9c9eae8b281effe142c19
-rw-r--r--libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java13
-rw-r--r--libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java19
-rw-r--r--libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java3
-rw-r--r--libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java16
-rw-r--r--libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java82
5 files changed, 122 insertions, 11 deletions
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java
index b0415411b..2b9bc78f7 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java
@@ -35,6 +35,7 @@ import android.net.NetworkRequest;
import android.net.NetworkScoreManager;
import android.net.ScoredNetwork;
import android.net.TransportInfo;
+import android.net.vcn.VcnTransportInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkScoreCache;
@@ -225,9 +226,15 @@ public class BaseWifiTracker implements LifecycleObserver {
}
final boolean oldWifiDefault = mIsWifiDefaultRoute;
final boolean oldCellDefault = mIsCellDefaultRoute;
- // raw Wifi or VPN-over-Wifi is default => Wifi is default.
- mIsWifiDefaultRoute = networkCapabilities.hasTransport(TRANSPORT_WIFI);
- mIsCellDefaultRoute = networkCapabilities.hasTransport(TRANSPORT_CELLULAR);
+ TransportInfo transportInfo = networkCapabilities.getTransportInfo();
+ final boolean isVcnOverWifi = transportInfo != null
+ && transportInfo instanceof VcnTransportInfo
+ && ((VcnTransportInfo) transportInfo).getWifiInfo() != null;
+ // raw Wifi or VPN-over-Wifi or VCN-over-Wifi is default => Wifi is default.
+ mIsWifiDefaultRoute = networkCapabilities.hasTransport(TRANSPORT_WIFI)
+ || isVcnOverWifi;
+ mIsCellDefaultRoute = !mIsWifiDefaultRoute
+ && networkCapabilities.hasTransport(TRANSPORT_CELLULAR);
if (mIsWifiDefaultRoute != oldWifiDefault
|| mIsCellDefaultRoute != oldCellDefault) {
if (isVerboseLoggingEnabled()) {
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java
index 5dea44c9a..1930cf919 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/MergedCarrierEntry.java
@@ -102,12 +102,27 @@ public class MergedCarrierEntry extends WifiEntry {
return getConnectedState() == CONNECTED_STATE_DISCONNECTED && !mIsCellDefaultRoute;
}
+ /**
+ * Connect to this merged carrier network and show the "Wi-Fi won't autoconnect for now" toast.
+ * @param callback callback for the connect result
+ */
@Override
public synchronized void connect(@Nullable ConnectCallback callback) {
+ connect(callback, true);
+ }
+
+ /**
+ * Connect to this merged carrier network.
+ * @param callback callback for the connect result
+ * @param showToast show the "Wi-Fi won't autoconnect for now" toast if {@code true}
+ */
+ public synchronized void connect(@Nullable ConnectCallback callback, boolean showToast) {
mConnectCallback = callback;
mWifiManager.startRestrictingAutoJoinToSubscriptionId(mSubscriptionId);
- Toast.makeText(mContext,
- R.string.wifitrackerlib_wifi_wont_autoconnect_for_now, Toast.LENGTH_SHORT).show();
+ if (showToast) {
+ Toast.makeText(mContext, R.string.wifitrackerlib_wifi_wont_autoconnect_for_now,
+ Toast.LENGTH_SHORT).show();
+ }
if (mConnectCallback != null) {
mCallbackHandler.post(() -> {
final ConnectCallback connectCallback = mConnectCallback;
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
index 6ec5d8ba3..15edf8a18 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiEntry.java
@@ -476,6 +476,7 @@ public class WifiEntry implements Comparable<WifiEntry> {
public String gateway;
public String subnetMask;
public int wifiStandard = ScanResult.WIFI_STANDARD_UNKNOWN;
+ public NetworkCapabilities networkCapabilities;
/**
* Creates an empty ConnectedInfo
@@ -495,6 +496,7 @@ public class WifiEntry implements Comparable<WifiEntry> {
gateway = other.gateway;
subnetMask = other.subnetMask;
wifiStandard = other.wifiStandard;
+ networkCapabilities = other.networkCapabilities;
}
}
@@ -952,6 +954,7 @@ public class WifiEntry implements Comparable<WifiEntry> {
if (mConnectedInfo == null) {
return;
}
+ mConnectedInfo.networkCapabilities = mNetworkCapabilities;
mIsValidated = mNetworkCapabilities != null
&& mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
notifyOnUpdated();
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
index d76a80a0a..e97aa28b6 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
@@ -500,25 +500,28 @@ public class WifiPickerTracker extends BaseWifiTracker {
private void updateSuggestedWifiEntryScans(@NonNull List<ScanResult> scanResults) {
checkNotNull(scanResults, "Scan Result list should not be null!");
+ // Get every ScanResultKey that is user shareable
+ final Set<StandardWifiEntryKey> userSharedEntryKeys =
+ mWifiManager.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(scanResults)
+ .stream()
+ .map(StandardWifiEntryKey::new)
+ .collect(Collectors.toSet());
+
// Group scans by ScanResultKey key
final Map<ScanResultKey, List<ScanResult>> scanResultsByKey = scanResults.stream()
.filter(scan -> !TextUtils.isEmpty(scan.SSID))
.collect(Collectors.groupingBy(ScanResultKey::new));
- // Iterate through current entries and update each entry's scan results
+ // Iterate through current entries and update each entry's scan results and shareability.
final Set<StandardWifiEntryKey> seenEntryKeys = new ArraySet<>();
mSuggestedWifiEntryCache.forEach(entry -> {
final StandardWifiEntryKey entryKey = entry.getStandardWifiEntryKey();
seenEntryKeys.add(entryKey);
// Update scan results if available, or set to null.
entry.updateScanResultInfo(scanResultsByKey.get(entryKey.getScanResultKey()));
+ entry.setUserShareable(userSharedEntryKeys.contains(entryKey));
});
// Create new StandardWifiEntry objects for each leftover config with scan results.
- final Set<StandardWifiEntryKey> userSharedEntryKeys =
- mWifiManager.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(scanResults)
- .stream()
- .map(StandardWifiEntryKey::new)
- .collect(Collectors.toSet());
for (StandardWifiEntryKey entryKey : mSuggestedConfigCache.keySet()) {
final ScanResultKey scanKey = entryKey.getScanResultKey();
if (seenEntryKeys.contains(entryKey)
@@ -821,6 +824,7 @@ public class WifiPickerTracker extends BaseWifiTracker {
mNetworkRequestEntry = new NetworkRequestEntry(mContext, mMainHandler, entryKey,
mWifiManager, mWifiNetworkScoreCache, false /* forSavedNetworksPage */);
mNetworkRequestEntry.updateConfig(matchingConfigs);
+ updateNetworkRequestEntryScans(mScanResultUpdater.getScanResults());
}
mNetworkRequestEntry.updateConnectionInfo(wifiInfo, networkInfo);
}
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
index 858075e1c..dd487e9f6 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
@@ -25,6 +25,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -38,6 +39,7 @@ import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkScoreManager;
+import android.net.vcn.VcnTransportInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
@@ -850,6 +852,50 @@ public class WifiPickerTrackerTest {
.count()).isEqualTo(1);
}
+ /**
+ * Tests that a suggestion entry created before scan results are available will be updated to
+ * user shareable after scans become available.
+ */
+ @Test
+ public void testGetWifiEntries_preConnectedSuggestion_becomesUserShareable() {
+ WifiConfiguration suggestionConfig = new WifiConfiguration();
+ suggestionConfig.SSID = "\"ssid\"";
+ suggestionConfig.networkId = 1;
+ suggestionConfig.creatorName = "creator";
+ suggestionConfig.carrierId = 1;
+ suggestionConfig.subscriptionId = 1;
+ suggestionConfig.fromWifiNetworkSuggestion = true;
+ // Initial entries
+ when(mMockWifiManager.getPrivilegedConfiguredNetworks()).thenReturn(
+ Arrays.asList(suggestionConfig));
+ when(mMockWifiInfo.getNetworkId()).thenReturn(suggestionConfig.networkId);
+ when(mMockWifiInfo.getRssi()).thenReturn(-50);
+ when(mMockNetworkInfo.getDetailedState()).thenReturn(NetworkInfo.DetailedState.CONNECTED);
+ final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+ wifiPickerTracker.onStart();
+ verify(mMockContext).registerReceiver(mBroadcastReceiverCaptor.capture(),
+ any(), any(), any());
+ mTestLooper.dispatchAll();
+ WifiEntry suggestionEntry = wifiPickerTracker.getConnectedWifiEntry();
+ assertThat(suggestionEntry).isNotNull();
+
+ // Update with user-shareable scan results for the suggestion
+ when(mMockWifiManager.getScanResults()).thenReturn(Collections.singletonList(
+ buildScanResult("ssid", "bssid", START_MILLIS)));
+ when(mMockWifiManager.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(any()))
+ .thenReturn(Arrays.asList(suggestionConfig));
+ mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
+ new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
+ // Disconnect from network to verify its usershareability in the picker list
+ mBroadcastReceiverCaptor.getValue().onReceive(mMockContext,
+ new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
+ mTestLooper.dispatchAll();
+
+ // Suggestion entry should be in picker list now
+ suggestionEntry = wifiPickerTracker.getWifiEntries().get(0);
+ assertThat(suggestionEntry.isSuggestion()).isTrue();
+ }
+
@Test
public void testGetConnectedEntry_alreadyConnectedToPasspoint_returnsPasspointEntry() {
final String fqdn = "fqdn";
@@ -1244,4 +1290,40 @@ public class WifiPickerTrackerTest {
// Now Wifi is default, so isDefaultNetwork returns true
assertThat(mergedCarrierEntry.isDefaultNetwork()).isTrue();
}
+
+ /**
+ * Tests that the MergedCarrierEntry is the default network when it is connected and
+ * VCN-over-Wifi is the default network.
+ */
+ @Test
+ public void testGetMergedCarrierEntry_vcnWifiIsDefault_entryIsDefaultNetwork() {
+ final int subId = 1;
+ when(mMockWifiInfo.isCarrierMerged()).thenReturn(true);
+ when(mMockWifiInfo.getSubscriptionId()).thenReturn(subId);
+ when(mMockNetworkInfo.getDetailedState()).thenReturn(NetworkInfo.DetailedState.CONNECTED);
+ final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+ wifiPickerTracker.onStart();
+ mTestLooper.dispatchAll();
+ verify(mMockContext).registerReceiver(mBroadcastReceiverCaptor.capture(),
+ any(), any(), any());
+ final Intent intent = new Intent(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
+ intent.putExtra("subscription", subId);
+ mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, intent);
+ verify(mMockConnectivityManager)
+ .registerDefaultNetworkCallback(mDefaultNetworkCallbackCaptor.capture(), any());
+ MergedCarrierEntry mergedCarrierEntry = wifiPickerTracker.getMergedCarrierEntry();
+ assertThat(mergedCarrierEntry.getConnectedState())
+ .isEqualTo(WifiEntry.CONNECTED_STATE_CONNECTED);
+ // Wifi isn't default yet, so isDefaultNetwork returns false
+ assertThat(mergedCarrierEntry.isDefaultNetwork()).isFalse();
+
+ mDefaultNetworkCallbackCaptor.getValue().onCapabilitiesChanged(mMockNetwork,
+ new NetworkCapabilities.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .setTransportInfo(new VcnTransportInfo(new WifiInfo.Builder().build()))
+ .build());
+
+ // Now VCN-over-Wifi is default, so isDefaultNetwork returns true
+ assertThat(mergedCarrierEntry.isDefaultNetwork()).isTrue();
+ }
}