Merge "[Wi-Fi] Support passport R1 expiration handling"
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 4496838..965b0ff 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -191,6 +191,13 @@
 
     private final IconInjector mIconInjector;
     private final IntentFilter mFilter;
+
+    // Passpoint information - cache it in case of losing these information after
+    // updateAccessPointFromScannedList(). For R2, we should update these data from
+    // WifiManager#getPasspointConfigurations() after users manage the passpoint profile.
+    private boolean mIsExpired;
+    private boolean mIsPasspointConfigurationR1;
+
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -372,6 +379,9 @@
                 updateConnectingState(STATE_FAILED);
             }
         };
+
+        mIsExpired = mAccessPoint.isExpired();
+        mIsPasspointConfigurationR1 = mAccessPoint.isPasspointConfigurationR1();
     }
 
     @Override
@@ -406,6 +416,11 @@
                 .setButton4Icon(R.drawable.ic_qrcode_24dp)
                 .setButton4OnClickListener(view -> shareNetwork());
 
+        if (isPasspointConfigurationR1Expired()) {
+            // Hide Connect button.
+            mButtonsPref.setButton3Visible(false);
+        }
+
         mSignalStrengthPref = screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
         mTxLinkSpeedPref = screen.findPreference(KEY_TX_LINK_SPEED);
         mRxLinkSpeedPref = screen.findPreference(KEY_RX_LINK_SPEED);
@@ -454,9 +469,18 @@
         if (usingDataUsageHeader(mContext)) {
             mSummaryHeaderController.updateState(mDataUsageSummaryPref);
         } else {
+            String summary;
+            if (isPasspointConfigurationR1Expired()) {
+                // Not able to get summary from AccessPoint because we may lost
+                // PasspointConfiguration information after updateAccessPointFromScannedList().
+                summary = mContext.getResources().getString(
+                        com.android.settingslib.R.string.wifi_passpoint_expired);
+            } else {
+                summary = mAccessPoint.getSettingsSummary(true /* convertSavedAsDisconnected */);
+            }
+
             mEntityHeaderController
-                    .setSummary(
-                            mAccessPoint.getSettingsSummary(true /*convertSavedAsDisconnected*/))
+                    .setSummary(summary)
                     .setRecyclerView(mFragment.getListView(), mLifecycle)
                     .done(mFragment.getActivity(), true /* rebind */);
         }
@@ -744,7 +768,7 @@
 
         boolean canForgetNetwork = canForgetNetwork();
         boolean canSignIntoNetwork = canSignIntoNetwork();
-        boolean canConnectNetwork = canConnectNetwork();
+        boolean canConnectNetwork = canConnectNetwork() && !isPasspointConfigurationR1Expired();
         boolean canShareNetwork = canShareNetwork();
 
         mButtonsPref.setButton1Visible(canForgetNetwork);
@@ -762,6 +786,10 @@
         return !mAccessPoint.isActive();
     }
 
+    private boolean isPasspointConfigurationR1Expired() {
+        return mIsPasspointConfigurationR1 && mIsExpired;
+    }
+
     private void refreshIpLayerInfo() {
         // Hide IP layer info if not a connected network.
         if (!mAccessPoint.isActive() || mNetwork == null || mLinkProperties == null) {
@@ -1109,10 +1137,15 @@
             case STATE_NOT_IN_RANGE:
             case STATE_FAILED:
             case STATE_ENABLE_WIFI_FAILED:
-                mButtonsPref.setButton3Text(R.string.wifi_connect)
-                        .setButton3Icon(R.drawable.ic_settings_wireless)
-                        .setButton3Enabled(true)
-                        .setButton3Visible(true);
+                if (isPasspointConfigurationR1Expired()) {
+                    // Hide Connect button.
+                    mButtonsPref.setButton3Visible(false);
+                } else {
+                    mButtonsPref.setButton3Text(R.string.wifi_connect)
+                            .setButton3Icon(R.drawable.ic_settings_wireless)
+                            .setButton3Enabled(true)
+                            .setButton3Visible(true);
+                }
                 break;
             default:
                 Log.e(TAG, "Invalid connect button state : " + state);
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 631880a..81ac064 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -1877,6 +1877,21 @@
         verify(mockMacAddressPref).setTitle(R.string.wifi_advanced_device_mac_address_title);
     }
 
+    @Test
+    public void entityHeader_expiredPasspointR1_shouldHandleExpiration() {
+        setUpForDisconnectedNetwork();
+        when(mockAccessPoint.isPasspoint()).thenReturn(true);
+        when(mockAccessPoint.isPasspointConfigurationR1()).thenReturn(true);
+        when(mockAccessPoint.isExpired()).thenReturn(true);
+        String expireSummary = mContext.getResources().getString(
+                com.android.settingslib.R.string.wifi_passpoint_expired);
+
+        displayAndResume();
+
+        verify(mockButtonsPref).setButton3Visible(false);
+        verify(mockHeaderController).setSummary(expireSummary);
+    }
+
     private ActionButtonsPreference createMock() {
         final ActionButtonsPreference pref = mock(ActionButtonsPreference.class);
         when(pref.setButton1Text(anyInt())).thenReturn(pref);