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>
<!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
<string name="network_dashboard_title">Network & 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 & notifications</string>
<!-- Summary for Apps & Notification settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
*/
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;
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;
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.
*/
*/
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;
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;
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
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;
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;
@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());
@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);
@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);
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);
+ }
}
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;
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();
}
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