From d76b48bec014fc254c6f4312cdc1d3a914ced605 Mon Sep 17 00:00:00 2001 From: Quang Luong Date: Thu, 30 Apr 2020 19:45:40 -0700 Subject: [WifiTrackerLib] Passpoint R2 expiration handling in picker Passpoint R2 subscriptions which are expired will now show "Tap to renew subscription and connect" in their wifi picker summaries. Tapping on these entries will open an OSU flow to renew the subscription. Bug: 150384136 Test: manually install an expired profile and verify OSU flow works from the picker Change-Id: I88e7b1f9607b7e4f68bf03d12999b1f9080c1efd --- .../com/android/wifitrackerlib/OsuWifiEntry.java | 18 +++++++- .../android/wifitrackerlib/PasspointWifiEntry.java | 52 ++++++++++++++++++---- .../android/wifitrackerlib/WifiPickerTracker.java | 32 ++++++++++--- 3 files changed, 85 insertions(+), 17 deletions(-) (limited to 'libs') diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java index 16e55fb96..c6cd574d0 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/OsuWifiEntry.java @@ -61,6 +61,7 @@ class OsuWifiEntry extends WifiEntry { @NonNull private final Context mContext; @NonNull private OsuProvider mOsuProvider; private String mOsuStatusString; + private boolean mIsAlreadyProvisioned = false; /** * Create n OsuWifiEntry with the associated OsuProvider @@ -92,8 +93,13 @@ class OsuWifiEntry extends WifiEntry { @Override public String getSummary(boolean concise) { // TODO(b/70983952): Add verbose summary - return mOsuStatusString != null - ? mOsuStatusString : mContext.getString(R.string.tap_to_sign_up); + if (mOsuStatusString != null) { + return mOsuStatusString; + } else if (isAlreadyProvisioned()) { + return mContext.getString(R.string.tap_to_renew_subscription_and_connect); + } else { + return mContext.getString(R.string.tap_to_sign_up); + } } @Override @@ -308,6 +314,14 @@ class OsuWifiEntry extends WifiEntry { return mOsuProvider; } + boolean isAlreadyProvisioned() { + return mIsAlreadyProvisioned; + } + + void setAlreadyProvisioned(boolean isAlreadyProvisioned) { + mIsAlreadyProvisioned = isAlreadyProvisioned; + } + class OsuWifiEntryProvisioningCallback extends ProvisioningCallback { @Override @MainThread public void onProvisioningFailure(int status) { diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java index ebabadef3..2c0134d5a 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/PasspointWifiEntry.java @@ -62,7 +62,7 @@ import java.util.StringJoiner; * WifiEntry representation of a subscribed Passpoint network, uniquely identified by FQDN. */ @VisibleForTesting -public class PasspointWifiEntry extends WifiEntry { +public class PasspointWifiEntry extends WifiEntry implements WifiEntry.WifiEntryCallback { static final String KEY_PREFIX = "PasspointWifiEntry:"; private final Object mLock = new Object(); @@ -81,6 +81,7 @@ public class PasspointWifiEntry extends WifiEntry { @Nullable private WifiConfiguration mWifiConfig; private @Security int mSecurity = SECURITY_EAP; private boolean mIsRoaming = false; + private OsuWifiEntry mOsuWifiEntry; protected long mSubscriptionExpirationTimeInMillis; @@ -142,6 +143,18 @@ public class PasspointWifiEntry extends WifiEntry { return mKey; } + @Override + @ConnectedState + public int getConnectedState() { + if (isExpired()) { + if (super.getConnectedState() == CONNECTED_STATE_DISCONNECTED + && mOsuWifiEntry != null) { + return mOsuWifiEntry.getConnectedState(); + } + } + return super.getConnectedState(); + } + @Override public String getTitle() { return mFriendlyName; @@ -149,13 +162,15 @@ public class PasspointWifiEntry extends WifiEntry { @Override public String getSummary(boolean concise) { - if (isExpired()) { - return mContext.getString(R.string.wifi_passpoint_expired); - } - StringJoiner sj = new StringJoiner(mContext.getString(R.string.summary_separator)); - if (getConnectedState() == CONNECTED_STATE_DISCONNECTED) { + if (isExpired()) { + if (mOsuWifiEntry != null) { + sj.add(mOsuWifiEntry.getSummary()); + } else { + sj.add(mContext.getString(R.string.wifi_passpoint_expired)); + } + } else if (getConnectedState() == CONNECTED_STATE_DISCONNECTED) { String disconnectDescription = getDisconnectedStateDescription(mContext, this); if (TextUtils.isEmpty(disconnectDescription)) { if (concise) { @@ -257,7 +272,6 @@ public class PasspointWifiEntry extends WifiEntry { @Override @Security public int getSecurity() { - // TODO(b/70983952): Fill this method in return mSecurity; } @@ -280,7 +294,6 @@ public class PasspointWifiEntry extends WifiEntry { @Override public boolean isSuggestion() { - // TODO(b/70983952): Fill this method in when passpoint suggestions are in return mWifiConfig != null && mWifiConfig.fromWifiNetworkSuggestion; } @@ -296,12 +309,23 @@ public class PasspointWifiEntry extends WifiEntry { @Override public boolean canConnect() { + if (isExpired()) { + return mOsuWifiEntry != null && mOsuWifiEntry.canConnect(); + } + return mLevel != WIFI_LEVEL_UNREACHABLE && getConnectedState() == CONNECTED_STATE_DISCONNECTED && mWifiConfig != null; } @Override public void connect(@Nullable ConnectCallback callback) { + if (isExpired()) { + if (mOsuWifiEntry != null) { + mOsuWifiEntry.connect(callback); + return; + } + } + mConnectCallback = callback; if (mWifiConfig == null) { @@ -593,4 +617,16 @@ public class PasspointWifiEntry extends WifiEntry { String getNetworkSelectionDescription() { return Utils.getNetworkSelectionDescription(mWifiConfig); } + + /** Pass a reference to a matching OsuWifiEntry for expiration handling */ + void setOsuWifiEntry(OsuWifiEntry osuWifiEntry) { + mOsuWifiEntry = osuWifiEntry; + mOsuWifiEntry.setListener(this); + } + + /** Callback for updates to the linked OsuWifiEntry */ + @Override + public void onUpdated() { + notifyOnUpdated(); + } } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java index 751e8b9b7..2b433bb76 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java @@ -348,7 +348,8 @@ public class WifiPickerTracker extends BaseWifiTracker { mWifiEntries.addAll(mPasspointWifiEntryCache.values().stream().filter(entry -> entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList())); mWifiEntries.addAll(mOsuWifiEntryCache.values().stream().filter(entry -> - entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED).collect(toList())); + entry.getConnectedState() == CONNECTED_STATE_DISCONNECTED + && !entry.isAlreadyProvisioned()).collect(toList())); Collections.sort(mWifiEntries); if (isVerboseLoggingEnabled()) { Log.v(TAG, "Connected WifiEntry: " + mConnectedWifiEntry); @@ -500,9 +501,9 @@ public class WifiPickerTracker extends BaseWifiTracker { Map> osuProviderToScans = mWifiManager.getMatchingOsuProviders(scanResults); - Set alreadyProvisioned = - mWifiManager.getMatchingPasspointConfigsForOsuProviders(osuProviderToScans.keySet()) - .keySet(); + Map osuProviderToPasspointConfig = + mWifiManager.getMatchingPasspointConfigsForOsuProviders( + osuProviderToScans.keySet()); // Update each OsuWifiEntry with new scans (or empty scans). for (OsuWifiEntry entry : mOsuWifiEntryCache.values()) { entry.updateScanResultInfo(osuProviderToScans.remove(entry.getOsuProvider())); @@ -516,10 +517,27 @@ public class WifiPickerTracker extends BaseWifiTracker { mOsuWifiEntryCache.put(osuProviderToOsuWifiEntryKey(provider), newEntry); } - // Remove entries that are now unreachable or already provisioned + // Pass a reference of each OsuWifiEntry to any matching provisioned PasspointWifiEntries + // for expiration handling. + mOsuWifiEntryCache.values().forEach(osuEntry -> { + PasspointConfiguration provisionedConfig = + osuProviderToPasspointConfig.get(osuEntry.getOsuProvider()); + if (provisionedConfig == null) { + osuEntry.setAlreadyProvisioned(false); + return; + } + osuEntry.setAlreadyProvisioned(true); + PasspointWifiEntry provisionedEntry = mPasspointWifiEntryCache.get( + uniqueIdToPasspointWifiEntryKey(provisionedConfig.getUniqueId())); + if (provisionedEntry == null) { + return; + } + provisionedEntry.setOsuWifiEntry(osuEntry); + }); + + // Remove entries that are now unreachable mOsuWifiEntryCache.entrySet() - .removeIf(entry -> entry.getValue().getLevel() == WIFI_LEVEL_UNREACHABLE - || alreadyProvisioned.contains(entry.getValue().getOsuProvider())); + .removeIf(entry -> entry.getValue().getLevel() == WIFI_LEVEL_UNREACHABLE); } @WorkerThread -- cgit v1.2.3