From: Fan Zhang Date: Tue, 16 May 2017 23:58:43 +0000 (-0700) Subject: Dynamic summary text for network/connected device screen. X-Git-Tag: android-x86-9.0-r1~1063^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=7c3a87ebd3a5a3805758bb246ee5f6af17c627a0;p=android-x86%2Fpackages-apps-Settings.git Dynamic summary text for network/connected device screen. Change-Id: I3254c63b7c241e2de9251b3c2d2a0106fb049ece Fix: 36768218 Test: make RunSettingsRoboTests --- diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 970ee76c7f..b04c8ab136 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 6b12237d98..a3e0678d01 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 cc519a7260..6b172c2790 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 d567971c3d..869cef9e3d 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 e79284564a..742157074d 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 d1c3207883..e7f4968a1e 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