Show "Forget" button for ephemeral networks.

- Move forget button preference handling logic to
WifiDetailPreferenceController
- Remove unnecessary updateInfo call in onResume since
NETWORK_STATE_CHANGED_ACTION is a sticky broadcast
- Populate network state fields and set up initial wifi state
when the Preference is displayed instead of waiting for onResume

Bug: 37751816
Test: m RunSettingsRoboTests && manually tested on device
Change-Id: I509013c72a0d26fc9a3feca564d92a0ab8414d1e
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 341daa1..dd1e4a4 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -15,6 +15,9 @@
  */
 package com.android.settings.wifi.details;
 
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
 import android.app.Fragment;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -28,8 +31,8 @@
 import android.net.Network;
 import android.net.NetworkBadging;
 import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
 import android.net.NetworkInfo;
+import android.net.NetworkRequest;
 import android.net.NetworkUtils;
 import android.net.RouteInfo;
 import android.net.wifi.WifiConfiguration;
@@ -41,19 +44,21 @@
 import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.util.Log;
-import android.widget.Button;
 import android.view.View;
+import android.widget.Button;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.PreferenceController;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.core.lifecycle.LifecycleObserver;
 import com.android.settings.core.lifecycle.events.OnPause;
 import com.android.settings.core.lifecycle.events.OnResume;
-import com.android.settings.wifi.WifiDetailPreference;
 import com.android.settings.vpn2.ConnectivityManagerWrapper;
+import com.android.settings.wifi.WifiDetailPreference;
 import com.android.settingslib.wifi.AccessPoint;
 
 import java.net.Inet4Address;
@@ -63,9 +68,6 @@
 import java.util.List;
 import java.util.StringJoiner;
 
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
-
 /**
  * Controller for logic pertaining to displaying Wifi information for the
  * {@link WifiNetworkDetailsFragment}.
@@ -115,10 +117,12 @@
     private final WifiConfiguration mWifiConfig;
     private WifiInfo mWifiInfo;
     private final WifiManager mWifiManager;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
 
     // UI elements - in order of appearance
     private Preference mConnectionDetailPref;
     private LayoutPreference mButtonsPref;
+    private Button mForgetButton;
     private Button mSignInButton;
     private WifiDetailPreference mSignalStrengthPref;
     private WifiDetailPreference mLinkSpeedPref;
@@ -129,8 +133,8 @@
     private WifiDetailPreference mGatewayPref;
     private WifiDetailPreference mSubnetPref;
     private WifiDetailPreference mDnsPref;
-    private PreferenceCategory mIpv6AddressCategory;
 
+    private PreferenceCategory mIpv6AddressCategory;
     private final IntentFilter mFilter;
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
@@ -179,7 +183,8 @@
             Fragment fragment,
             Handler handler,
             Lifecycle lifecycle,
-            WifiManager wifiManager) {
+            WifiManager wifiManager,
+            MetricsFeatureProvider metricsFeatureProvider) {
         super(context);
 
         mAccessPoint = accessPoint;
@@ -187,11 +192,10 @@
         mConnectivityManagerWrapper = connectivityManagerWrapper;
         mFragment = fragment;
         mHandler = handler;
-        mNetworkInfo = accessPoint.getNetworkInfo();
-        mRssi = accessPoint.getRssi();
         mSignalStr = context.getResources().getStringArray(R.array.wifi_signal);
         mWifiConfig = accessPoint.getConfig();
         mWifiManager = wifiManager;
+        mMetricsFeatureProvider = metricsFeatureProvider;
 
         mFilter = new IntentFilter();
         mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
@@ -241,22 +245,18 @@
                 (PreferenceCategory) screen.findPreference(KEY_IPV6_ADDRESS_CATEGORY);
 
         mSecurityPref.setDetailText(mAccessPoint.getSecurityString(false /* concise */));
-    }
-
-    public WifiInfo getWifiInfo() {
-        return mWifiInfo;
+        mForgetButton = (Button) mButtonsPref.findViewById(R.id.left_button);
+        mForgetButton.setText(R.string.forget);
+        mForgetButton.setOnClickListener(view -> forgetNetwork());
+        updateInfo();
     }
 
     @Override
     public void onResume() {
         mConnectivityManagerWrapper.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
                 mHandler);
-        mNetwork = mWifiManager.getCurrentNetwork();
-        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
-        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
-
-        updateInfo();
-
+        // updateInfo() will be called during registration because NETWORK_STATE_CHANGED_ACTION is
+        // a sticky broadcast.
         mContext.registerReceiver(mReceiver, mFilter);
     }
 
@@ -265,11 +265,16 @@
         mNetwork = null;
         mLinkProperties = null;
         mNetworkCapabilities = null;
+        mNetworkInfo = null;
+        mWifiInfo = null;
         mContext.unregisterReceiver(mReceiver);
         mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
     }
 
     private void updateInfo() {
+        mNetwork = mWifiManager.getCurrentNetwork();
+        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
+        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
         mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
         mWifiInfo = mWifiManager.getConnectionInfo();
         if (mNetwork == null || mNetworkInfo == null || mWifiInfo == null) {
@@ -277,6 +282,9 @@
             return;
         }
 
+        // Update whether the forgot button should be displayed.
+        mForgetButton.setVisibility(canForgetNetwork() ? View.VISIBLE : View.INVISIBLE);
+
         refreshNetworkState();
 
         // Update Connection Header icon and Signal Strength Preference
@@ -307,6 +315,8 @@
         mFrequencyPref.setDetailText(band);
 
         updateIpLayerInfo();
+        mButtonsPref.setVisible(mForgetButton.getVisibility() == View.VISIBLE
+                || mSignInButton.getVisibility() == View.VISIBLE);
     }
 
     private void exitActivity() {
@@ -422,7 +432,7 @@
     /**
      * Returns whether the network represented by this preference can be forgotten.
      */
-    public boolean canForgetNetwork() {
+    private boolean canForgetNetwork() {
         return mWifiInfo != null && mWifiInfo.isEphemeral() || mWifiConfig != null;
     }
 
@@ -437,7 +447,7 @@
     /**
      * Forgets the wifi network associated with this preference.
      */
-    public void forgetNetwork() {
+    private void forgetNetwork() {
         if (mWifiInfo != null && mWifiInfo.isEphemeral()) {
             mWifiManager.disableEphemeralNetwork(mWifiInfo.getSSID());
         } else if (mWifiConfig != null) {
@@ -447,6 +457,8 @@
                 mWifiManager.forget(mWifiConfig.networkId, null /* action listener */);
             }
         }
+        mMetricsFeatureProvider.action(
+                mFragment.getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
         mFragment.getActivity().finish();
     }
 }
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index fe16cdb..664ac7f 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -17,17 +17,13 @@
 
 import android.content.Context;
 import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.NetworkRequest;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
-import android.widget.Button;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
-import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
@@ -46,7 +42,6 @@
     private static final String TAG = "WifiNetworkDetailsFrg";
 
     private AccessPoint mAccessPoint;
-    private Button mForgetButton;
     private WifiDetailPreferenceController mWifiDetailPreferenceController;
 
     @Override
@@ -56,26 +51,6 @@
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        // Header Title set automatically from launching Preference
-
-        LayoutPreference buttonsPreference = ((LayoutPreference) findPreference(
-                WifiDetailPreferenceController.KEY_BUTTONS_PREF));
-        buttonsPreference.setVisible(mWifiDetailPreferenceController.canForgetNetwork());
-
-        mForgetButton = (Button) buttonsPreference.findViewById(R.id.left_button);
-        mForgetButton.setText(R.string.forget);
-        mForgetButton.setOnClickListener(view -> forgetNetwork());
-    }
-
-    private void forgetNetwork() {
-        mMetricsFeatureProvider.action(getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
-        mWifiDetailPreferenceController.forgetNetwork();
-    }
-
-    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.WIFI_NETWORK_DETAILS;
     }
@@ -100,7 +75,8 @@
                 this,
                 new Handler(Looper.getMainLooper()),  // UI thread.
                 getLifecycle(),
-                context.getSystemService(WifiManager.class));
+                context.getSystemService(WifiManager.class),
+                mMetricsFeatureProvider);
 
         ArrayList<PreferenceController> controllers = new ArrayList(1);
         controllers.add(mWifiDetailPreferenceController);
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 b9dde37..208c157 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -52,14 +52,15 @@
 import android.view.View.OnClickListener;
 import android.widget.Button;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.LayoutPreference;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.wifi.WifiDetailPreference;
-import com.android.settings.vpn2.ConnectivityManagerWrapper;
 import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
+import com.android.settings.wifi.WifiDetailPreference;
 import com.android.settingslib.wifi.AccessPoint;
 
 import org.junit.Before;
@@ -67,6 +68,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -103,6 +105,7 @@
     @Mock private WifiInfo mockWifiInfo;
     @Mock private WifiNetworkDetailsFragment mockFragment;
     @Mock private WifiManager mockWifiManager;
+    @Mock private MetricsFeatureProvider mockMetricsFeatureProvider;
 
     @Mock private Preference mockConnectionDetailPref;
     @Mock private LayoutPreference mockButtonsPref;
@@ -116,9 +119,12 @@
     @Mock private WifiDetailPreference mockGatewayPref;
     @Mock private WifiDetailPreference mockSubnetPref;
     @Mock private WifiDetailPreference mockDnsPref;
+    @Mock private Button mockForgetButton;
     @Mock private PreferenceCategory mockIpv6AddressCategory;
 
-    private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
+    @Captor private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
+    @Captor private ArgumentCaptor<View.OnClickListener> mForgetClickListener;
+
     private Context mContext = RuntimeEnvironment.application;
     private Lifecycle mLifecycle;
     private LinkProperties mLinkProperties;
@@ -143,12 +149,8 @@
             throw new RuntimeException(e);
         }
 
-        mCallbackCaptor = ArgumentCaptor.forClass(NetworkCallback.class);
-
         when(mockAccessPoint.getConfig()).thenReturn(mockWifiConfig);
         when(mockAccessPoint.getLevel()).thenReturn(LEVEL);
-        when(mockAccessPoint.getNetworkInfo()).thenReturn(mockNetworkInfo);
-        when(mockAccessPoint.getRssi()).thenReturn(RSSI);
         when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY);
 
         when(mockConnectivityManagerWrapper.getConnectivityManager())
@@ -157,6 +159,7 @@
                 .thenReturn(mockNetworkInfo);
         doNothing().when(mockConnectivityManagerWrapper).registerNetworkCallback(
                 any(NetworkRequest.class), mCallbackCaptor.capture(), any(Handler.class));
+        doNothing().when(mockForgetButton).setOnClickListener(mForgetClickListener.capture());
 
         when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
         when(mockWifiInfo.getRssi()).thenReturn(RSSI);
@@ -169,9 +172,8 @@
 
         when(mockFragment.getActivity()).thenReturn(mockActivity);
 
-        mController = newWifiDetailPreferenceController();
-
         setupMockedPreferenceScreen();
+        mController = newWifiDetailPreferenceController();
     }
 
     private WifiDetailPreferenceController newWifiDetailPreferenceController() {
@@ -182,7 +184,8 @@
                 mockFragment,
                 null,  // Handler
                 mLifecycle,
-                mockWifiManager);
+                mockWifiManager,
+                mockMetricsFeatureProvider);
     }
 
     private void setupMockedPreferenceScreen() {
@@ -192,6 +195,8 @@
                 .thenReturn(mockConnectionDetailPref);
         when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_BUTTONS_PREF))
                 .thenReturn(mockButtonsPref);
+        when(mockButtonsPref.findViewById(R.id.left_button))
+                .thenReturn(mockForgetButton);
         when(mockButtonsPref.findViewById(R.id.right_button))
                 .thenReturn(mockSignInButton);
         when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SIGNAL_STRENGTH_PREF))
@@ -214,30 +219,32 @@
                 .thenReturn(mockDnsPref);
         when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_IPV6_ADDRESS_CATEGORY))
                 .thenReturn(mockIpv6AddressCategory);
-
-        mController.displayPreference(mockScreen);
     }
 
     @Test
     public void isAvailable_shouldAlwaysReturnTrue() {
+        mController.displayPreference(mockScreen);
+
         assertThat(mController.isAvailable()).isTrue();
     }
 
     @Test
     public void securityPreference_stringShouldBeSet() {
+        mController.displayPreference(mockScreen);
+
         verify(mockSecurityPref).setDetailText(SECURITY);
     }
 
     @Test
-    public void latestWifiInfo_shouldBeFetchedOnResume() {
-        mController.onResume();
+    public void latestWifiInfo_shouldBeFetchedInDisplayPreference() {
+        mController.displayPreference(mockScreen);
 
         verify(mockWifiManager, times(1)).getConnectionInfo();
     }
 
     @Test
-    public void latestNetworkInfo_shouldBeFetchedOnResume() {
-        mController.onResume();
+    public void latestNetworkInfo_shouldBeFetchedInDisplayPreference() {
+        mController.displayPreference(mockScreen);
 
         verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
     }
@@ -264,7 +271,7 @@
         Drawable expectedIcon =
                 NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme());
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockConnectionDetailPref).setIcon(expectedIcon);
     }
@@ -274,14 +281,14 @@
         String summary = "summary";
         when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockConnectionDetailPref).setTitle(summary);
     }
 
     @Test
     public void signalStrengthPref_shouldHaveIconSet() {
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockSignalStrengthPref).setIcon(any(Drawable.class));
     }
@@ -291,7 +298,7 @@
         String expectedStrength =
                 mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL];
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockSignalStrengthPref).setDetailText(expectedStrength);
     }
@@ -300,7 +307,7 @@
     public void linkSpeedPref_shouldHaveDetailTextSet() {
         String expectedLinkSpeed = mContext.getString(R.string.link_speed, LINK_SPEED);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed);
     }
@@ -309,14 +316,14 @@
     public void linkSpeedPref_shouldNotShowIfNotSet() {
         when(mockWifiInfo.getLinkSpeed()).thenReturn(-1);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockLinkSpeedPref).setVisible(false);
     }
 
     @Test
     public void macAddressPref_shouldHaveDetailTextSet() {
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockMacAddressPref).setDetailText(MAC_ADDRESS);
     }
@@ -327,7 +334,7 @@
 
         mLinkProperties.addLinkAddress(ipv4Address);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockIpAddressPref).setDetailText(mIpv4Address.getHostAddress());
     }
@@ -339,7 +346,7 @@
         InetAddress gateway = mIpv4Address;
         mLinkProperties.addRoute(new RouteInfo(subnet, gateway));
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockSubnetPref).setDetailText("255.255.255.0");
         verify(mockGatewayPref).setDetailText(mIpv4Address.getHostAddress());
@@ -350,7 +357,7 @@
         mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,4,4}));
         mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,8,8}));
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8");
     }
@@ -361,7 +368,7 @@
         // nor connecting and WifiStateMachine has not reached L2ConnectedState.
         when(mockWifiManager.getCurrentNetwork()).thenReturn(null);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockActivity).finish();
     }
@@ -372,7 +379,7 @@
         reset(mockIpv6AddressCategory, mockIpAddressPref, mockSubnetPref, mockGatewayPref,
                 mockDnsPref);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         verify(mockIpv6AddressCategory).setVisible(false);
         verify(mockIpAddressPref).setVisible(false);
@@ -389,27 +396,28 @@
     @Test
     public void canForgetNetwork_noNetwork() {
         when(mockAccessPoint.getConfig()).thenReturn(null);
+
         mController = newWifiDetailPreferenceController();
         mController.displayPreference(mockScreen);
-        mController.onResume();
 
-        assertThat(mController.canForgetNetwork()).isFalse();
+        verify(mockForgetButton).setVisibility(View.INVISIBLE);
     }
 
     @Test
     public void canForgetNetwork_ephemeral() {
         when(mockWifiInfo.isEphemeral()).thenReturn(true);
         when(mockAccessPoint.getConfig()).thenReturn(null);
-        mController = newWifiDetailPreferenceController();
-        mController.displayPreference(mockScreen);
-        mController.onResume();
 
-        assertThat(mController.canForgetNetwork()).isTrue();
+        mController.displayPreference(mockScreen);
+
+        verify(mockForgetButton).setVisibility(View.VISIBLE);
     }
 
     @Test
     public void canForgetNetwork_saved() {
-        assertThat(mController.canForgetNetwork()).isTrue();
+        mController.displayPreference(mockScreen);
+
+        verify(mockForgetButton).setVisibility(View.VISIBLE);
     }
 
     @Test
@@ -418,25 +426,31 @@
         when(mockWifiInfo.isEphemeral()).thenReturn(true);
         when(mockWifiInfo.getSSID()).thenReturn(ssid);
 
-        mController.onResume();
-
-        mController.forgetNetwork();
+        mController.displayPreference(mockScreen);
+        mForgetClickListener.getValue().onClick(null);
 
         verify(mockWifiManager).disableEphemeralNetwork(ssid);
+        verify(mockMetricsFeatureProvider)
+                .action(mockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
     }
 
     @Test
     public void forgetNetwork_saved() {
         mockWifiConfig.networkId = 5;
 
-        mController.forgetNetwork();
+        mController.displayPreference(mockScreen);
+        mForgetClickListener.getValue().onClick(null);
 
         verify(mockWifiManager).forget(mockWifiConfig.networkId, null);
+        verify(mockMetricsFeatureProvider)
+                .action(mockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
     }
 
     @Test
     public void networkStateChangedIntent_shouldRefetchInfo() {
+        mController.displayPreference(mockScreen);
         mController.onResume();
+
         verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
         verify(mockWifiManager, times(1)).getConnectionInfo();
 
@@ -448,7 +462,9 @@
 
     @Test
     public void rssiChangedIntent_shouldRefetchInfo() {
+        mController.displayPreference(mockScreen);
         mController.onResume();
+
         verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
         verify(mockWifiManager, times(1)).getConnectionInfo();
 
@@ -470,6 +486,7 @@
 
     @Test
     public void networkOnLost_shouldFinishActivity() {
+        mController.displayPreference(mockScreen);
         mController.onResume();
 
         mCallbackCaptor.getValue().onLost(mockNetwork);
@@ -483,7 +500,7 @@
 
         mLinkProperties.addLinkAddress(ipv6Address);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(Preference.class);
         verify(mockIpv6AddressCategory).addPreference(preferenceCaptor.capture());
@@ -496,7 +513,7 @@
 
         mLinkProperties.addLinkAddress(ipv6Address);
 
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(Preference.class);
         verify(mockIpv6AddressCategory).addPreference(preferenceCaptor.capture());
@@ -505,9 +522,11 @@
 
     @Test
     public void captivePortal_shouldShowSignInButton() {
-        reset(mockSignInButton);
         InOrder inOrder = inOrder(mockSignInButton);
+
+        mController.displayPreference(mockScreen);
         mController.onResume();
+
         inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE);
 
         NetworkCapabilities nc = new NetworkCapabilities();
@@ -531,11 +550,41 @@
 
     @Test
     public void testSignInButton_shouldStartCaptivePortalApp() {
-        mController.onResume();
+        mController.displayPreference(mockScreen);
 
         ArgumentCaptor<OnClickListener> captor = ArgumentCaptor.forClass(OnClickListener.class);
         verify(mockSignInButton).setOnClickListener(captor.capture());
         captor.getValue().onClick(mockSignInButton);
         verify(mockConnectivityManagerWrapper).startCaptivePortalApp(mockNetwork);
     }
+
+    @Test
+    public void signInButtonVisible_buttonPanelShouldBeVisible() {
+        when(mockSignInButton.getVisibility()).thenReturn(View.VISIBLE);
+        when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE);
+
+        mController.displayPreference(mockScreen);
+
+        verify(mockButtonsPref).setVisible(true);
+    }
+
+    @Test
+    public void forgetButtonVisible_buttonPanelShouldBeVisible() {
+        when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE);
+        when(mockForgetButton.getVisibility()).thenReturn(View.VISIBLE);
+
+        mController.displayPreference(mockScreen);
+
+        verify(mockButtonsPref).setVisible(true);
+    }
+
+    @Test
+    public void neitherButtonVisible_buttonPanelShouldBeInvisible() {
+        when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE);
+        when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE);
+
+        mController.displayPreference(mockScreen);
+
+        verify(mockButtonsPref).setVisible(false);
+    }
 }