[WifiTrackerLib] Passpoint R2 expiration handling in network details

Allow Passpoint R2 remediation by tapping on "Connect" in the network
details page, and display "Expired" in the
display summary.

Bug: 150384136
Test: manually install expired profile and verify behavior in network
details page.

Change-Id: I8058c02a7795de3f346e205e2d9d4da4ec9192bb
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
index c6cd574..89d780e 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java
@@ -96,7 +96,8 @@
         if (mOsuStatusString != null) {
             return mOsuStatusString;
         } else if (isAlreadyProvisioned()) {
-            return mContext.getString(R.string.tap_to_renew_subscription_and_connect);
+            return concise ? mContext.getString(R.string.wifi_passpoint_expired)
+                    : mContext.getString(R.string.tap_to_renew_subscription_and_connect);
         } else {
             return mContext.getString(R.string.tap_to_sign_up);
         }
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java
index 00c786f..9bd2a59 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointNetworkDetailsTracker.java
@@ -20,6 +20,7 @@
 
 import static com.android.wifitrackerlib.PasspointWifiEntry.uniqueIdToPasspointWifiEntryKey;
 import static com.android.wifitrackerlib.WifiEntry.CONNECTED_STATE_CONNECTED;
+import static com.android.wifitrackerlib.WifiEntry.WIFI_LEVEL_UNREACHABLE;
 
 import android.content.Context;
 import android.content.Intent;
@@ -31,6 +32,7 @@
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
+import android.net.wifi.hotspot2.OsuProvider;
 import android.net.wifi.hotspot2.PasspointConfiguration;
 import android.os.Handler;
 import android.text.TextUtils;
@@ -54,6 +56,7 @@
     private static final String TAG = "PasspointNetworkDetailsTracker";
 
     private final PasspointWifiEntry mChosenEntry;
+    private OsuWifiEntry mOsuWifiEntry;
 
     PasspointNetworkDetailsTracker(@NonNull Lifecycle lifecycle,
             @NonNull Context context,
@@ -187,6 +190,43 @@
                 null /* roamingScanResults */);
     }
 
+    @WorkerThread
+    private void updateOsuWifiEntryScans(@NonNull List<ScanResult> scanResults) {
+        checkNotNull(scanResults, "Scan Result list should not be null!");
+
+        Map<OsuProvider, List<ScanResult>> osuProviderToScans =
+                mWifiManager.getMatchingOsuProviders(scanResults);
+        Map<OsuProvider, PasspointConfiguration> osuProviderToPasspointConfig =
+                mWifiManager.getMatchingPasspointConfigsForOsuProviders(
+                        osuProviderToScans.keySet());
+
+        if (mOsuWifiEntry != null) {
+            mOsuWifiEntry.updateScanResultInfo(osuProviderToScans.get(
+                    mOsuWifiEntry.getOsuProvider()));
+        } else {
+            // Create a new OsuWifiEntry to link to the chosen PasspointWifiEntry
+            for (OsuProvider provider : osuProviderToScans.keySet()) {
+                PasspointConfiguration provisionedConfig =
+                        osuProviderToPasspointConfig.get(provider);
+                if (provisionedConfig != null && TextUtils.equals(mChosenEntry.getKey(),
+                        uniqueIdToPasspointWifiEntryKey(provisionedConfig.getUniqueId()))) {
+                    mOsuWifiEntry = new OsuWifiEntry(mContext, mMainHandler, provider, mWifiManager,
+                            mWifiNetworkScoreCache, false /* forSavedNetworksPage */);
+                    mOsuWifiEntry.updateScanResultInfo(osuProviderToScans.get(provider));
+                    mOsuWifiEntry.setAlreadyProvisioned(true);
+                    mChosenEntry.setOsuWifiEntry(mOsuWifiEntry);
+                    return;
+                }
+            }
+        }
+
+        // Remove mOsuWifiEntry if it is no longer reachable
+        if (mOsuWifiEntry != null && mOsuWifiEntry.getLevel() == WIFI_LEVEL_UNREACHABLE) {
+            mChosenEntry.setOsuWifiEntry(null);
+            mOsuWifiEntry = null;
+        }
+    }
+
     /**
      * Updates the tracked entry's scan results up to the max scan age (or more, if the last scan
      * was unsuccessful). If Wifi is disabled, the tracked entry's level will be cleared.
@@ -207,7 +247,9 @@
             scanAgeWindow += mScanIntervalMillis;
         }
 
-        updatePasspointWifiEntryScans(mScanResultUpdater.getScanResults(scanAgeWindow));
+        List<ScanResult> currentScans = mScanResultUpdater.getScanResults(scanAgeWindow);
+        updatePasspointWifiEntryScans(currentScans);
+        updateOsuWifiEntryScans(currentScans);
     }
 
     /**
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
index 2c0134d..20a87e7 100644
--- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
+++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java
@@ -166,7 +166,7 @@
 
         if (isExpired()) {
             if (mOsuWifiEntry != null) {
-                sj.add(mOsuWifiEntry.getSummary());
+                sj.add(mOsuWifiEntry.getSummary(concise));
             } else {
                 sj.add(mContext.getString(R.string.wifi_passpoint_expired));
             }