From d569195299f1cbfcff10b3f77804ca2eaa1be3ae Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Wed, 28 Jun 2017 19:07:02 -0700 Subject: [PATCH] Use EntityHeaderController in WifiDetailPreferenceController. Switch to the Entity header to bring parity in design of WifiNetworkDetailsFragment and other Settings pages. Bug: b/37252029 Test: make -j40 RunSettingsRoboTests Change-Id: Ib11f3d37eac4dca08fa61eef67910cd328682bac --- res/layout/connection_detail_pref.xml | 51 ---------------- res/xml/wifi_network_details_fragment.xml | 9 +-- .../WifiDetailPreferenceController.java | 41 +++++++++---- .../WifiDetailPreferenceControllerTest.java | 59 ++++++++++++++----- 4 files changed, 77 insertions(+), 83 deletions(-) delete mode 100644 res/layout/connection_detail_pref.xml diff --git a/res/layout/connection_detail_pref.xml b/res/layout/connection_detail_pref.xml deleted file mode 100644 index 182f2cb9ef6..00000000000 --- a/res/layout/connection_detail_pref.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml index f9926cafd28..64e61b196b5 100644 --- a/res/xml/wifi_network_details_fragment.xml +++ b/res/xml/wifi_network_details_fragment.xml @@ -18,10 +18,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res/com.android.settings" > - - + signIntoNetwork()); @@ -262,14 +260,29 @@ public class WifiDetailPreferenceController extends PreferenceController impleme mDnsPref = (WifiDetailPreference) screen.findPreference(KEY_DNS_PREF); mIpv6Category = (PreferenceCategory) screen.findPreference(KEY_IPV6_CATEGORY); - mIpv6AddressPref = (Preference) screen.findPreference(KEY_IPV6_ADDRESSES_PREF); + mIpv6AddressPref = screen.findPreference(KEY_IPV6_ADDRESSES_PREF); mSecurityPref.setDetailText(mAccessPoint.getSecurityString(false /* concise */)); - mForgetButton = (Button) mButtonsPref.findViewById(R.id.forget_button); + mForgetButton = mButtonsPref.findViewById(R.id.forget_button); mForgetButton.setText(R.string.forget); mForgetButton.setOnClickListener(view -> forgetNetwork()); } + private void setupEntityHeader(PreferenceScreen screen) { + LayoutPreference headerPref = (LayoutPreference) screen.findPreference(KEY_HEADER); + mEntityHeaderController = + EntityHeaderController.newInstance( + mFragment.getActivity(), mFragment, + headerPref.findViewById(R.id.entity_header)); + + ImageView iconView = headerPref.findViewById(R.id.entity_header_icon); + iconView.setBackground( + mContext.getDrawable(R.drawable.ic_settings_widget_background)); + iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + + mEntityHeaderController.setLabel(mAccessPoint.getSsidStr()); + } + @Override public void onResume() { // Ensure mNetwork is set before any callbacks above are delivered, since our @@ -348,7 +361,8 @@ public class WifiDetailPreferenceController extends PreferenceController impleme private void refreshNetworkState() { mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo); - mConnectionDetailPref.setTitle(mAccessPoint.getSettingsSummary()); + mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary()) + .done(mFragment.getActivity(), true /* rebind */); } private void refreshRssiViews() { @@ -357,7 +371,8 @@ public class WifiDetailPreferenceController extends PreferenceController impleme Drawable wifiIcon = NetworkBadging.getWifiIcon( iconSignalLevel, NetworkBadging.BADGING_NONE, mContext.getTheme()).mutate(); - mConnectionDetailPref.setIcon(wifiIcon); + wifiIcon.setTint(Utils.getColorAccent(mContext)); + mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(), true /* rebind */); Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate(); wifiIconDark.setTint(mContext.getResources().getColor( 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 d4c64022f7c..dc360e857aa 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.wifi.details; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doNothing; @@ -52,14 +53,17 @@ import android.support.v7.preference.PreferenceScreen; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; +import android.widget.ImageView; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.LayoutPreference; import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settings.vpn2.ConnectivityManagerWrapperImpl; +import com.android.settings.widget.EntityHeaderController; import com.android.settings.wifi.WifiDetailPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.wifi.AccessPoint; @@ -84,7 +88,8 @@ import java.util.List; import java.util.stream.Collectors; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = ShadowEntityHeaderController.class) public class WifiDetailPreferenceControllerTest { private static final int LEVEL = 1; @@ -108,7 +113,12 @@ public class WifiDetailPreferenceControllerTest { @Mock private WifiManager mockWifiManager; @Mock private MetricsFeatureProvider mockMetricsFeatureProvider; - @Mock private Preference mockConnectionDetailPref; + @Mock (answer = Answers.RETURNS_DEEP_STUBS) + private EntityHeaderController mockHeaderController; + @Mock (answer = Answers.RETURNS_DEEP_STUBS) + private LayoutPreference mockHeaderLayoutPreference; + @Mock private ImageView mockHeaderIcon; + @Mock private LayoutPreference mockButtonsPref; @Mock private Button mockSignInButton; @Mock private WifiDetailPreference mockSignalStrengthPref; @@ -214,6 +224,12 @@ public class WifiDetailPreferenceControllerTest { when(mockFragment.getActivity()).thenReturn(mockActivity); + ShadowEntityHeaderController.setUseMock(mockHeaderController); + // builder pattern + when(mockHeaderController.setRecyclerView(mockFragment.getListView(), mLifecycle)) + .thenReturn(mockHeaderController); + when(mockHeaderController.setSummary(anyString())).thenReturn(mockHeaderController); + setupMockedPreferenceScreen(); mController = newWifiDetailPreferenceController(); } @@ -233,8 +249,11 @@ public class WifiDetailPreferenceControllerTest { private void setupMockedPreferenceScreen() { when(mockScreen.getPreferenceManager().getContext()).thenReturn(mContext); - when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_CONNECTION_DETAIL_PREF)) - .thenReturn(mockConnectionDetailPref); + when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_HEADER)) + .thenReturn(mockHeaderLayoutPreference); + when(mockHeaderLayoutPreference.findViewById(R.id.entity_header_icon)) + .thenReturn(mockHeaderIcon); + when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_BUTTONS_PREF)) .thenReturn(mockButtonsPref); when(mockButtonsPref.findViewById(R.id.forget_button)) @@ -316,23 +335,33 @@ public class WifiDetailPreferenceControllerTest { } @Test - public void connectionDetailPref_shouldHaveIconSet() { + public void entityHeader_shouldHaveIconSet() { Drawable expectedIcon = NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme()); displayAndResume(); - verify(mockConnectionDetailPref).setIcon(expectedIcon); + verify(mockHeaderController).setIcon(expectedIcon); } @Test - public void connectionDetailPref_shouldHaveTitleSet() { + public void entityHeader_shouldHaveLabelSetToSsid() { + String label = "ssid"; + when(mockAccessPoint.getSsidStr()).thenReturn(label); + + displayAndResume(); + + verify(mockHeaderController).setLabel(label); + } + + @Test + public void entityHeader_shouldHaveSummarySet() { String summary = "summary"; when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); displayAndResume(); - verify(mockConnectionDetailPref).setTitle(summary); + verify(mockHeaderController).setSummary(summary); } @Test @@ -531,33 +560,33 @@ public class WifiDetailPreferenceControllerTest { String summary = "Connected, no Internet"; when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); - InOrder inOrder = inOrder(mockConnectionDetailPref); + InOrder inOrder = inOrder(mockHeaderController); displayAndResume(); - inOrder.verify(mockConnectionDetailPref).setTitle(summary); + inOrder.verify(mockHeaderController).setSummary(summary); // Check that an irrelevant capability update does not update the access point summary, as // doing so could cause unnecessary jank... summary = "Connected"; when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); updateNetworkCapabilities(nc); - inOrder.verify(mockConnectionDetailPref, never()).setTitle(any()); + inOrder.verify(mockHeaderController, never()).setSummary(any(CharSequence.class)); // ... but that if the network validates, then we do refresh. nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); updateNetworkCapabilities(nc); - inOrder.verify(mockConnectionDetailPref).setTitle(summary); + inOrder.verify(mockHeaderController).setSummary(summary); summary = "Connected, no Internet"; when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); // Another irrelevant update won't cause the UI to refresh... updateNetworkCapabilities(nc); - inOrder.verify(mockConnectionDetailPref, never()).setTitle(any()); + inOrder.verify(mockHeaderController, never()).setSummary(any(CharSequence.class)); // ... but if the network is no longer validated, then we display "connected, no Internet". nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); updateNetworkCapabilities(nc); - inOrder.verify(mockConnectionDetailPref).setTitle(summary); + inOrder.verify(mockHeaderController).setSummary(summary); } @Test