OSDN Git Service

Use EntityHeaderController in WifiDetailPreferenceController.
authorSundeep Ghuman <sghuman@google.com>
Thu, 29 Jun 2017 02:07:02 +0000 (19:07 -0700)
committerSundeep Ghuman <sghuman@google.com>
Wed, 5 Jul 2017 19:54:38 +0000 (12:54 -0700)
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 [deleted file]
res/xml/wifi_network_details_fragment.xml
src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java

diff --git a/res/layout/connection_detail_pref.xml b/res/layout/connection_detail_pref.xml
deleted file mode 100644 (file)
index 182f2cb..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2017 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/connection_detail_layout"
-    android:background="?android:attr/colorAccent"
-    android:layout_width="match_parent"
-    android:layout_height="144dp"
-    android:gravity="center_vertical"
-    android:orientation="horizontal">
-
-    <FrameLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:background="@drawable/ic_settings_widget_background"
-        android:layout_marginLeft="72dp"
-        android:elevation="2dp">
-
-        <ImageView
-            android:id="@android:id/icon"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"/>
-
-    </FrameLayout>
-
-    <TextView
-        android:id="@android:id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:singleLine="false"
-        android:paddingLeft="20dp"
-        android:textAppearance="@android:style/TextAppearance.Material.Medium"
-        android:textColor="@android:color/white"/>
-
-</LinearLayout>
index f9926ca..64e61b1 100644 (file)
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings" >
 
-    <!-- Connected Network Header -->
-    <Preference
-            android:key="connection_detail"
-            android:layout="@layout/connection_detail_pref"/>
+    <com.android.settings.applications.LayoutPreference
+        android:key="connection_header"
+        android:layout="@layout/settings_entity_header"
+        android:selectable="false"
+        android:order="-10000"/>
 
     <!-- General Details Category -->
     <PreferenceCategory
index 4ab0805..3540925 100644 (file)
@@ -27,7 +27,6 @@ import android.content.IntentFilter;
 import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
-import android.net.IpPrefix;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.Network;
@@ -48,14 +47,17 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
+import android.widget.ImageView;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.vpn2.ConnectivityManagerWrapper;
+import com.android.settings.widget.EntityHeaderController;
 import com.android.settings.wifi.WifiDetailPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -67,7 +69,6 @@ import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import java.util.List;
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
@@ -81,7 +82,7 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     @VisibleForTesting
-    static final String KEY_CONNECTION_DETAIL_PREF = "connection_detail";
+    static final String KEY_HEADER = "connection_header";
     @VisibleForTesting
     static final String KEY_BUTTONS_PREF = "buttons";
     @VisibleForTesting
@@ -116,7 +117,6 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
     private Network mNetwork;
     private NetworkInfo mNetworkInfo;
     private NetworkCapabilities mNetworkCapabilities;
-    private Context mPrefContext;
     private int mRssi;
     private String[] mSignalStr;
     private final WifiConfiguration mWifiConfig;
@@ -125,8 +125,8 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
     private final MetricsFeatureProvider mMetricsFeatureProvider;
 
     // UI elements - in order of appearance
-    private Preference mConnectionDetailPref;
     private LayoutPreference mButtonsPref;
+    private EntityHeaderController mEntityHeaderController;
     private Button mForgetButton;
     private Button mSignInButton;
     private WifiDetailPreference mSignalStrengthPref;
@@ -240,12 +240,10 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
 
-        mPrefContext = screen.getPreferenceManager().getContext();
-
-        mConnectionDetailPref = screen.findPreference(KEY_CONNECTION_DETAIL_PREF);
+        setupEntityHeader(screen);
 
         mButtonsPref = (LayoutPreference) screen.findPreference(KEY_BUTTONS_PREF);
-        mSignInButton = (Button) mButtonsPref.findViewById(R.id.signin_button);
+        mSignInButton = mButtonsPref.findViewById(R.id.signin_button);
         mSignInButton.setText(R.string.support_sign_in_button_text);
         mSignInButton.setOnClickListener(view -> 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(
index d4c6402..dc360e8 100644 (file)
@@ -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 entityHeader_shouldHaveLabelSetToSsid() {
+        String label = "ssid";
+        when(mockAccessPoint.getSsidStr()).thenReturn(label);
+
+        displayAndResume();
+
+        verify(mockHeaderController).setLabel(label);
     }
 
     @Test
-    public void connectionDetailPref_shouldHaveTitleSet() {
+    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