Check for Data Usage intent before populating "Data Usage" summary.

On some devices, data usage is not available; thus, it is possible that
ACTION_DATA_USAGE_SETTINGS has no matching activity. If no matching
activity is found, we should not populate "data usage" in the summary
field.

Bug: 111398942
Test: Manual check. I see that data usage is no longer visible on
devices without Data Usage activity.
Test: make RunSettingsRoboTests

Change-Id: I838206b76497c6550ef4826ad19e605cd32906ee
This commit is contained in:
Ben Lin
2018-09-05 00:57:41 -07:00
parent 7f050853c1
commit 3210396de9
2 changed files with 47 additions and 5 deletions

View File

@@ -15,12 +15,15 @@
*/ */
package com.android.settings.network; package com.android.settings.network;
import static android.provider.Settings.ACTION_DATA_USAGE_SETTINGS;
import static com.android.settings.network.MobilePlanPreferenceController import static com.android.settings.network.MobilePlanPreferenceController
.MANAGE_MOBILE_PLAN_DIALOG_ID; .MANAGE_MOBILE_PLAN_DIALOG_ID;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.icu.text.ListFormatter; import android.icu.text.ListFormatter;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.text.BidiFormatter; import android.text.BidiFormatter;
@@ -45,6 +48,7 @@ import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.BooleanSupplier;
import java.util.List; import java.util.List;
@SearchIndexable @SearchIndexable
@@ -158,24 +162,32 @@ public class NetworkDashboardFragment extends DashboardFragment implements
private final WifiMasterSwitchPreferenceController mWifiPreferenceController; private final WifiMasterSwitchPreferenceController mWifiPreferenceController;
private final MobileNetworkPreferenceController mMobileNetworkPreferenceController; private final MobileNetworkPreferenceController mMobileNetworkPreferenceController;
private final TetherPreferenceController mTetherPreferenceController; private final TetherPreferenceController mTetherPreferenceController;
private final BooleanSupplier mHasDataUsageActivity;
public SummaryProvider(Context context, SummaryLoader summaryLoader) { public SummaryProvider(Context context, SummaryLoader summaryLoader) {
this(context, summaryLoader, this(context, summaryLoader,
new WifiMasterSwitchPreferenceController(context, null), new WifiMasterSwitchPreferenceController(context, null),
new MobileNetworkPreferenceController(context), new MobileNetworkPreferenceController(context),
new TetherPreferenceController(context, null /* lifecycle */)); new TetherPreferenceController(context, null /* lifecycle */),
() -> {
final Intent intent = new Intent(ACTION_DATA_USAGE_SETTINGS);
final PackageManager pm = context.getPackageManager();
return intent.resolveActivity(pm) != null;
});
} }
@VisibleForTesting(otherwise = VisibleForTesting.NONE) @VisibleForTesting(otherwise = VisibleForTesting.NONE)
SummaryProvider(Context context, SummaryLoader summaryLoader, SummaryProvider(Context context, SummaryLoader summaryLoader,
WifiMasterSwitchPreferenceController wifiPreferenceController, WifiMasterSwitchPreferenceController wifiPreferenceController,
MobileNetworkPreferenceController mobileNetworkPreferenceController, MobileNetworkPreferenceController mobileNetworkPreferenceController,
TetherPreferenceController tetherPreferenceController) { TetherPreferenceController tetherPreferenceController,
BooleanSupplier hasDataUsageActivity) {
mContext = context; mContext = context;
mSummaryLoader = summaryLoader; mSummaryLoader = summaryLoader;
mWifiPreferenceController = wifiPreferenceController; mWifiPreferenceController = wifiPreferenceController;
mMobileNetworkPreferenceController = mobileNetworkPreferenceController; mMobileNetworkPreferenceController = mobileNetworkPreferenceController;
mTetherPreferenceController = tetherPreferenceController; mTetherPreferenceController = tetherPreferenceController;
mHasDataUsageActivity = hasDataUsageActivity;
} }
@@ -198,7 +210,7 @@ public class NetworkDashboardFragment extends DashboardFragment implements
if (mMobileNetworkPreferenceController.isAvailable() && !TextUtils.isEmpty(mobileSummary)) { if (mMobileNetworkPreferenceController.isAvailable() && !TextUtils.isEmpty(mobileSummary)) {
summaries.add(mobileSummary); summaries.add(mobileSummary);
} }
if (!TextUtils.isEmpty(dataUsageSummary)) { if (!TextUtils.isEmpty(dataUsageSummary) && mHasDataUsageActivity.getAsBoolean()) {
summaries.add(dataUsageSummary); summaries.add(dataUsageSummary);
} }
if (mTetherPreferenceController.isAvailable() && !TextUtils.isEmpty(hotspotSummary)) { if (mTetherPreferenceController.isAvailable() && !TextUtils.isEmpty(hotspotSummary)) {

View File

@@ -79,7 +79,7 @@ public class NetworkDashboardFragmentTest {
final SummaryLoader.SummaryProvider provider = final SummaryLoader.SummaryProvider provider =
new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader, new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
wifiPreferenceController, mobileNetworkPreferenceController, wifiPreferenceController, mobileNetworkPreferenceController,
tetherPreferenceController); tetherPreferenceController, () -> true);
provider.setListening(false); provider.setListening(false);
@@ -107,7 +107,7 @@ public class NetworkDashboardFragmentTest {
final SummaryLoader.SummaryProvider provider = final SummaryLoader.SummaryProvider provider =
new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader, new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
wifiPreferenceController, mobileNetworkPreferenceController, wifiPreferenceController, mobileNetworkPreferenceController,
tetherPreferenceController); tetherPreferenceController, () -> true);
provider.setListening(false); provider.setListening(false);
@@ -121,4 +121,34 @@ public class NetworkDashboardFragmentTest {
verify(summaryLoader).setSummary(provider, "Wi\u2011Fi and data usage"); verify(summaryLoader).setSummary(provider, "Wi\u2011Fi and data usage");
} }
@Test
public void summaryProviderSetListening_noDataUsageActivity_shouldReturnNoDataUsageSummary() {
final WifiMasterSwitchPreferenceController wifiPreferenceController =
mock(WifiMasterSwitchPreferenceController.class);
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,
wifiPreferenceController, mobileNetworkPreferenceController,
tetherPreferenceController, () -> false);
provider.setListening(false);
verifyZeroInteractions(summaryLoader);
when(wifiPreferenceController.isAvailable()).thenReturn(true);
when(mobileNetworkPreferenceController.isAvailable()).thenReturn(true);
when(tetherPreferenceController.isAvailable()).thenReturn(true);
provider.setListening(true);
verify(summaryLoader).setSummary(provider, "Wi\u2011Fi, mobile, and hotspot");
}
} }