diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 970ee76c7f0..b04c8ab1367 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -166,8 +166,6 @@
android:value="com.android.settings.category.ia.homepage"/>
-
@@ -193,8 +191,6 @@
android:value="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"/>
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6b12237d98d..a3e0678d01b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6273,12 +6273,19 @@
Network & Internet
-
- Wi-Fi, mobile, data usage, hotspot
+
+ mobile
+
+ data usage
+
+ hotspot
+
Connected devices
Bluetooth, Cast, NFC
+
+ Bluetooth, Cast
Apps & notifications
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index cc519a7260b..6b172c27907 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -15,9 +15,11 @@
*/
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.
*/
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index d567971c3d7..869cef9e3d0 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -15,10 +15,12 @@
*/
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
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
index e79284564a6..742157074d2 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
@@ -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 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 keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+ final List 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 keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
+ final List 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);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
index d1c32078838..e7f4968a1ee 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
@@ -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