OSDN Git Service

Dynamic summary text for network/connected device screen.
authorFan Zhang <zhfan@google.com>
Tue, 16 May 2017 23:58:43 +0000 (16:58 -0700)
committerFan Zhang <zhfan@google.com>
Thu, 18 May 2017 16:52:43 +0000 (09:52 -0700)
Change-Id: I3254c63b7c241e2de9251b3c2d2a0106fb049ece
Fix: 36768218
Test: make RunSettingsRoboTests

AndroidManifest.xml
res/values/strings.xml
src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
src/com/android/settings/network/NetworkDashboardFragment.java
tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java

index 970ee76..b04c8ab 100644 (file)
                 android:value="com.android.settings.category.ia.homepage"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.network.NetworkDashboardFragment"/>
-            <meta-data android:name="com.android.settings.summary"
-                android:resource="@string/network_dashboard_summary"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
                 android:value="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"/>
             <meta-data android:name="com.android.settings.category"
                 android:value="com.android.settings.category.ia.homepage"/>
-            <meta-data android:name="com.android.settings.summary"
-                android:resource="@string/connected_devices_dashboard_summary"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
index 6b12237..a3e0678 100644 (file)
 
     <!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
     <string name="network_dashboard_title">Network &amp; Internet</string>
-    <!-- Summary for Network and Internet settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
-    <string name="network_dashboard_summary">Wi-Fi, mobile, data usage, hotspot</string>
+    <!-- Summary for Network and Internet settings, explaining it contains mobile network setting [CHAR LIMIT=NONE]-->
+    <string name="network_dashboard_summary_mobile">mobile</string>
+    <!-- Summary for Network and Internet settings, explaining it contains network data usage setting [CHAR LIMIT=NONE]-->
+    <string name="network_dashboard_summary_data_usage">data usage</string>
+    <!-- Summary for Network and Internet settings, explaining it contains hotspot (tethering) setting [CHAR LIMIT=NONE]-->
+    <string name="network_dashboard_summary_hotspot">hotspot</string>
+
     <!-- Title for setting tile leading to Connected devices settings [CHAR LIMIT=40]-->
     <string name="connected_devices_dashboard_title">Connected devices</string>
     <!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
     <string name="connected_devices_dashboard_summary">Bluetooth, Cast, NFC</string>
+    <!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="connected_devices_dashboard_no_nfc_summary">Bluetooth, Cast</string>
     <!-- Title for setting tile leading to Apps & Notification settings [CHAR LIMIT=40]-->
     <string name="app_and_notification_dashboard_title">Apps &amp; notifications</string>
     <!-- Summary for Apps & Notification settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
index cc519a7..6b172c2 100644 (file)
  */
 package com.android.settings.connecteddevice;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.provider.SearchIndexableResource;
+import android.support.annotation.VisibleForTesting;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -25,6 +27,7 @@ import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController;
 import com.android.settings.bluetooth.Utils;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.deviceinfo.UsbBackend;
 import com.android.settings.nfc.NfcPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -67,13 +70,50 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
         lifecycle.addObserver(mUsbPrefController);
         controllers.add(mUsbPrefController);
         final BluetoothMasterSwitchPreferenceController bluetoothPreferenceController =
-            new BluetoothMasterSwitchPreferenceController(
-                context, Utils.getLocalBtManager(context));
+                new BluetoothMasterSwitchPreferenceController(
+                        context, Utils.getLocalBtManager(context));
         lifecycle.addObserver(bluetoothPreferenceController);
         controllers.add(bluetoothPreferenceController);
         return controllers;
     }
 
+    @VisibleForTesting
+    static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+        private final NfcPreferenceController mNfcPreferenceController;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+            mNfcPreferenceController = new NfcPreferenceController(context);
+        }
+
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                if (mNfcPreferenceController.isAvailable()) {
+                    mSummaryLoader.setSummary(this,
+                            mContext.getString(R.string.connected_devices_dashboard_summary));
+                } else {
+                    mSummaryLoader.setSummary(this, mContext.getString(
+                            R.string.connected_devices_dashboard_no_nfc_summary));
+                }
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
     /**
      * For Search.
      */
index d567971..869cef9 100644 (file)
  */
 package com.android.settings.network;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.Context;
 import android.provider.SearchIndexableResource;
+import android.support.annotation.VisibleForTesting;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -27,7 +29,7 @@ import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.wifi.WifiMasterSwitchPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -133,6 +135,66 @@ public class NetworkDashboardFragment extends DashboardFragment implements
         return 0;
     }
 
+    @VisibleForTesting
+    static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+        private final MobileNetworkPreferenceController mMobileNetworkPreferenceController;
+        private final TetherPreferenceController mTetherPreferenceController;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            this(context, summaryLoader,
+                    new MobileNetworkPreferenceController(context),
+                    new TetherPreferenceController(context, null /* lifecycle */));
+        }
+
+        @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+        SummaryProvider(Context context, SummaryLoader summaryLoader,
+                MobileNetworkPreferenceController mobileNetworkPreferenceController,
+                TetherPreferenceController tetherPreferenceController) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+            mMobileNetworkPreferenceController = mobileNetworkPreferenceController;
+            mTetherPreferenceController = tetherPreferenceController;
+        }
+
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                String summary = mContext.getString(R.string.wifi_settings_title);
+                if (mMobileNetworkPreferenceController.isAvailable()) {
+                    final String mobileSettingSummary = mContext.getString(
+                            R.string.network_dashboard_summary_mobile);
+                    summary = mContext.getString(R.string.join_many_items_middle, summary,
+                            mobileSettingSummary);
+                }
+                final String dataUsageSettingSummary = mContext.getString(
+                        R.string.network_dashboard_summary_data_usage);
+                summary = mContext.getString(R.string.join_many_items_middle, summary,
+                        dataUsageSettingSummary);
+                if (mTetherPreferenceController.isAvailable()) {
+                    final String hotspotSettingSummary = mContext.getString(
+                            R.string.network_dashboard_summary_hotspot);
+                    summary = mContext.getString(R.string.join_many_items_middle, summary,
+                            hotspotSettingSummary);
+                }
+                mSummaryLoader.setSummary(this, summary);
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
+
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
index e792845..7421570 100644 (file)
@@ -17,12 +17,15 @@ package com.android.settings.connecteddevice;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcManager;
 import android.provider.SearchIndexableResource;
 
-import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController;
-import com.android.settings.nfc.NfcPreferenceController;
+import com.android.settings.R;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.nfc.NfcPreferenceController;
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settingslib.drawer.CategoryKey;
 
@@ -36,12 +39,17 @@ import org.robolectric.annotation.Config;
 
 import java.util.List;
 
+import static android.content.Context.NFC_SERVICE;
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ConnectedDeviceDashboardFragmentTest {
+
     @Mock
     Context mContext;
 
@@ -65,7 +73,8 @@ public class ConnectedDeviceDashboardFragmentTest {
     @Test
     public void testSearchIndexProvider_shouldIndexResource() {
         final List<SearchIndexableResource> indexRes =
-                mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext, true /* enabled */);
+                mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext,
+                        true /* enabled */);
 
         assertThat(indexRes).isNotNull();
         assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
@@ -74,7 +83,8 @@ public class ConnectedDeviceDashboardFragmentTest {
     @Test
     public void testSearchIndexProvider_NoNfc_KeyAdded() {
         when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
-        final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+        final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+                mContext);
 
         assertThat(keys).isNotNull();
         assertThat(keys).contains(NfcPreferenceController.KEY_TOGGLE_NFC);
@@ -84,7 +94,8 @@ public class ConnectedDeviceDashboardFragmentTest {
     @Test
     public void testSearchIndexProvider_NFC_KeyNotAdded() {
         when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
-        final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+        final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+                mContext);
 
         assertThat(keys).isNotNull();
         assertThat(keys).doesNotContain(NfcPreferenceController.KEY_TOGGLE_NFC);
@@ -103,4 +114,43 @@ public class ConnectedDeviceDashboardFragmentTest {
 
         assertThat(keys).containsAllIn(niks);
     }
+
+    @Test
+    public void testSummaryProvider_hasNfc_shouldReturnNfcSummary() {
+        final NfcManager nfcManager = mock(NfcManager.class);
+        final SummaryLoader summaryLoader = mock(SummaryLoader.class);
+
+        when(mContext.getApplicationContext()).thenReturn(mContext);
+        when(mContext.getSystemService(NFC_SERVICE)).thenReturn(nfcManager);
+        when(nfcManager.getDefaultAdapter()).thenReturn(mock(NfcAdapter.class));
+
+        SummaryLoader.SummaryProvider provider =
+                new ConnectedDeviceDashboardFragment.SummaryProvider(mContext, summaryLoader);
+
+        provider.setListening(false);
+
+        verifyZeroInteractions(summaryLoader);
+
+        provider.setListening(true);
+
+        verify(mContext).getString(R.string.connected_devices_dashboard_summary);
+    }
+
+    @Test
+    public void testSummaryProvider_noNfc_shouldReturnNoNfcSummary() {
+        final SummaryLoader summaryLoader = mock(SummaryLoader.class);
+
+        when(mContext.getApplicationContext()).thenReturn(mContext);
+
+        SummaryLoader.SummaryProvider provider =
+                new ConnectedDeviceDashboardFragment.SummaryProvider(mContext, summaryLoader);
+
+        provider.setListening(false);
+
+        verifyZeroInteractions(summaryLoader);
+
+        provider.setListening(true);
+
+        verify(mContext).getString(R.string.connected_devices_dashboard_no_nfc_summary);
+    }
 }
index d1c3207..e7f4968 100644 (file)
@@ -19,15 +19,18 @@ import android.content.Context;
 import android.provider.SearchIndexableResource;
 import android.view.Menu;
 
+import com.android.settings.R;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
-import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settingslib.drawer.CategoryKey;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
@@ -38,16 +41,23 @@ import java.util.List;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class NetworkDashboardFragmentTest {
 
+    @Mock
+    private Context mContext;
+
     private NetworkDashboardFragment mFragment;
 
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
         mFragment = new NetworkDashboardFragment();
     }
 
@@ -89,4 +99,58 @@ public class NetworkDashboardFragmentTest {
 
         assertThat(keys).containsAllIn(niks);
     }
-}
+
+    @Test
+    public void testSummaryProvider_hasMobileAndHotspot_shouldReturnMobileSummary() {
+        final MobileNetworkPreferenceController mobileNetworkPreferenceController =
+                mock(MobileNetworkPreferenceController.class);
+        final TetherPreferenceController tetherPreferenceController =
+                mock(TetherPreferenceController.class);
+
+        final SummaryLoader summaryLoader = mock(SummaryLoader.class);
+        final SummaryLoader.SummaryProvider provider =
+                new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
+                        mobileNetworkPreferenceController, tetherPreferenceController);
+
+        provider.setListening(false);
+
+        verifyZeroInteractions(summaryLoader);
+
+        when(mobileNetworkPreferenceController.isAvailable()).thenReturn(true);
+        when(tetherPreferenceController.isAvailable()).thenReturn(true);
+
+        provider.setListening(true);
+
+        verify(mContext).getString(R.string.wifi_settings_title);
+        verify(mContext).getString(R.string.network_dashboard_summary_data_usage);
+        verify(mContext).getString(R.string.network_dashboard_summary_hotspot);
+        verify(mContext).getString(R.string.network_dashboard_summary_mobile);
+        verify(mContext, times(3)).getString(R.string.join_many_items_middle, null, null);
+    }
+
+    @Test
+    public void testSummaryProvider_noMobileOrHotspot_shouldReturnSimpleSummary() {
+        final MobileNetworkPreferenceController mobileNetworkPreferenceController =
+                mock(MobileNetworkPreferenceController.class);
+        final TetherPreferenceController tetherPreferenceController =
+                mock(TetherPreferenceController.class);
+
+        final SummaryLoader summaryLoader = mock(SummaryLoader.class);
+        final SummaryLoader.SummaryProvider provider =
+                new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
+                        mobileNetworkPreferenceController, tetherPreferenceController);
+
+        provider.setListening(false);
+
+        verifyZeroInteractions(summaryLoader);
+
+        when(mobileNetworkPreferenceController.isAvailable()).thenReturn(false);
+        when(tetherPreferenceController.isAvailable()).thenReturn(false);
+
+        provider.setListening(true);
+
+        verify(mContext).getString(R.string.wifi_settings_title);
+        verify(mContext).getString(R.string.network_dashboard_summary_data_usage);
+        verify(mContext).getString(R.string.join_many_items_middle, null, null);
+    }
+}
\ No newline at end of file