Show L2-connected Network Request

NetworkRequestEntries are only created at L3 connection, but this means
we don't show network requests in the middle of connection in the
network specifier dialog. Make sure we create NetworkRequestEntries
based on L2 connected data (via WIFI_NETWORK_STATE_CHANGED) so the
network specifier dialog shows the connection progress.

Bug: 292064115
Test: atest WifiPickerTrackerTest, manually verify network specifier
dialog shows connection progress.

Change-Id: I7e4dede9230d3472b9ba165e694fa15fd5212e2d
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
index 51e5e57..a27c5b5 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java
@@ -382,6 +382,7 @@
         if (primaryWifiInfo == null || networkInfo == null) {
             return;
         }
+        conditionallyCreateConnectedWifiEntry(primaryWifiInfo);
         for (WifiEntry entry : getAllWifiEntries()) {
             entry.onPrimaryWifiInfoChanged(primaryWifiInfo, networkInfo);
         }
@@ -1140,14 +1141,18 @@
             // thread times out waiting for driver restart and returns an empty list of networks.
             updateWifiConfigurations(mWifiManager.getPrivilegedConfiguredNetworks());
         }
+        // Create a WifiEntry for the current connection if there are no scan results yet.
+        conditionallyCreateConnectedWifiEntry(Utils.getWifiInfo(capabilities));
         for (WifiEntry entry : getAllWifiEntries()) {
             entry.onNetworkCapabilitiesChanged(network, capabilities);
         }
-        // Create a WifiEntry for the current connection if there are no scan results yet.
-        conditionallyCreateConnectedStandardWifiEntry(network, capabilities);
-        conditionallyCreateConnectedSuggestedWifiEntry(network, capabilities);
-        conditionallyCreateConnectedPasspointWifiEntry(network, capabilities);
-        conditionallyCreateConnectedNetworkRequestEntry(network, capabilities);
+    }
+
+    private void conditionallyCreateConnectedWifiEntry(@NonNull WifiInfo wifiInfo) {
+        conditionallyCreateConnectedStandardWifiEntry(wifiInfo);
+        conditionallyCreateConnectedSuggestedWifiEntry(wifiInfo);
+        conditionallyCreateConnectedPasspointWifiEntry(wifiInfo);
+        conditionallyCreateConnectedNetworkRequestEntry(wifiInfo);
     }
 
     /**
@@ -1155,11 +1160,9 @@
      * created if there is no existing entry, or the existing entry doesn't match WifiInfo.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedNetworkRequestEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
+    private void conditionallyCreateConnectedNetworkRequestEntry(@NonNull WifiInfo wifiInfo) {
         final List<WifiConfiguration> matchingConfigs = new ArrayList<>();
 
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
         if (wifiInfo != null) {
             for (int i = 0; i < mNetworkRequestConfigCache.size(); i++) {
                 final List<WifiConfiguration> configs = mNetworkRequestConfigCache.valueAt(i);
@@ -1182,7 +1185,6 @@
             mNetworkRequestEntry.updateConfig(matchingConfigs);
             updateNetworkRequestEntryScans(mScanResultUpdater.getScanResults());
         }
-        mNetworkRequestEntry.onNetworkCapabilitiesChanged(network, capabilities);
     }
 
     /**
@@ -1190,9 +1192,7 @@
      * network yet, create and cache a new StandardWifiEntry for it.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedStandardWifiEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
+    private void conditionallyCreateConnectedStandardWifiEntry(@NonNull WifiInfo wifiInfo) {
         if (wifiInfo == null || wifiInfo.isPasspointAp() || wifiInfo.isOsuAp()) {
             return;
         }
@@ -1216,7 +1216,6 @@
             final StandardWifiEntry connectedEntry =
                     new StandardWifiEntry(mInjector, mMainHandler, entryKey, configs,
                             null, mWifiManager, false /* forSavedNetworksPage */);
-            connectedEntry.onNetworkCapabilitiesChanged(network, capabilities);
             mStandardWifiEntryCache.add(connectedEntry);
             return;
         }
@@ -1227,9 +1226,7 @@
      * yet, create and cache a new StandardWifiEntry for it.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedSuggestedWifiEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
+    private void conditionallyCreateConnectedSuggestedWifiEntry(@NonNull WifiInfo wifiInfo) {
         if (wifiInfo == null || wifiInfo.isPasspointAp() || wifiInfo.isOsuAp()) {
             return;
         }
@@ -1248,7 +1245,6 @@
             final StandardWifiEntry connectedEntry =
                     new StandardWifiEntry(mInjector, mMainHandler, entryKey, configs,
                             null, mWifiManager, false /* forSavedNetworksPage */);
-            connectedEntry.onNetworkCapabilitiesChanged(network, capabilities);
             mSuggestedWifiEntryCache.add(connectedEntry);
             return;
         }
@@ -1259,9 +1255,7 @@
      * yet, create and cache a new StandardWifiEntry for it.
      */
     @WorkerThread
-    private void conditionallyCreateConnectedPasspointWifiEntry(
-            @NonNull Network network, @NonNull NetworkCapabilities capabilities) {
-        WifiInfo wifiInfo = Utils.getWifiInfo(capabilities);
+    private void conditionallyCreateConnectedPasspointWifiEntry(@NonNull WifiInfo wifiInfo) {
         if (wifiInfo == null || !wifiInfo.isPasspointAp()) {
             return;
         }
@@ -1288,7 +1282,6 @@
                     cachedWifiConfig, mWifiManager,
                     false /* forSavedNetworksPage */);
         }
-        connectedEntry.onNetworkCapabilitiesChanged(network, capabilities);
         mPasspointWifiEntryCache.put(connectedEntry.getKey(), connectedEntry);
     }
 
diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
index 8a96052..73d2f0f 100644
--- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
+++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java
@@ -612,12 +612,47 @@
 
         // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected.
         verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
-//        assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
+        assertThat(wifiPickerTracker.getWifiEntries()).isEmpty();
         assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry);
         assertThat(entry.isPrimaryNetwork()).isTrue();
     }
 
     /**
+     * Tests that an L2 connected network request (i.e. from NETWORK_STATE_CHANGED) will correctly
+     * be returned in getConnectedEntry().
+     */
+    @Test
+    public void testGetConnectedEntry_networkRequestL2Connected_returnsConnectedEntry() {
+        final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker();
+        final WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"ssid\"";
+        config.networkId = 1;
+        config.fromWifiNetworkSpecifier = true;
+        when(mMockWifiManager.getPrivilegedConfiguredNetworks())
+                .thenReturn(Collections.singletonList(config));
+        wifiPickerTracker.onStart();
+        mTestLooper.dispatchAll();
+        verify(mMockContext).registerReceiver(
+                mBroadcastReceiverCaptor.capture(), any(), any(), any());
+        verify(mMockConnectivityManager).registerNetworkCallback(
+                any(), mNetworkCallbackCaptor.capture(), any());
+
+        // Simulate an L2 connected network that's still authenticating.
+        when(mMockWifiInfo.getNetworkId()).thenReturn(1);
+        when(mMockWifiInfo.getRssi()).thenReturn(-50);
+        NetworkInfo mockNetworkInfo = mock(NetworkInfo.class);
+        when(mockNetworkInfo.getDetailedState())
+                .thenReturn(NetworkInfo.DetailedState.AUTHENTICATING);
+        Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo);
+        mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged);
+
+        // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected.
+        verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged();
+        assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull();
+    }
+
+    /**
      * Tests that connecting to a network will update getConnectedEntry() to return the connected
      * WifiEntry if the framework times out and gives us an empty list of configs.
      */