[Settings] Hide data usage when SIM support is turn OFF
Enable the UI control through configuration. Bug: 240515161 Test: local, auto test Merged-In: I5e49a2b0f2b563b426354f4d2e6e650dcc02c98b Merged-In: I4e0db5688dc1b074d43f9d77dd2f6d4cc53a353c Change-Id: I4e0db5688dc1b074d43f9d77dd2f6d4cc53a353c
This commit is contained in:
@@ -51,6 +51,7 @@
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="app_data_usage_settings_category"
|
||||
settings:isPreferenceVisible="@bool/config_show_sim_info"
|
||||
android:layout="@layout/preference_category_no_label">
|
||||
|
||||
<Preference
|
||||
|
@@ -35,6 +35,7 @@ import com.android.settings.SettingsPreferenceFragment;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.datausage.AppDataUsage;
|
||||
import com.android.settings.datausage.DataUsageUtils;
|
||||
import com.android.settings.network.SubscriptionUtil;
|
||||
import com.android.settingslib.AppItem;
|
||||
import com.android.settingslib.applications.AppUtils;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
@@ -147,7 +148,8 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle
|
||||
}
|
||||
|
||||
private static NetworkTemplate getTemplate(Context context) {
|
||||
if (DataUsageUtils.hasReadyMobileRadio(context)) {
|
||||
if (SubscriptionUtil.isSimHardwareVisible(context)
|
||||
&& DataUsageUtils.hasReadyMobileRadio(context)) {
|
||||
return new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE).setMeteredness(
|
||||
NetworkStats.METERED_YES).build();
|
||||
}
|
||||
|
@@ -45,6 +45,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.applications.AppInfoBase;
|
||||
import com.android.settings.network.SubscriptionUtil;
|
||||
import com.android.settings.widget.EntityHeaderController;
|
||||
import com.android.settingslib.AppItem;
|
||||
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||
@@ -109,6 +110,10 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
|
||||
private long mSelectedCycle;
|
||||
private boolean mIsLoading;
|
||||
|
||||
public boolean isSimHardwareVisible(Context context) {
|
||||
return SubscriptionUtil.isSimHardwareVisible(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
@@ -161,7 +166,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
|
||||
final UidDetailProvider uidDetailProvider = getUidDetailProvider();
|
||||
|
||||
if (mAppItem.key > 0) {
|
||||
if (!UserHandle.isApp(mAppItem.key)) {
|
||||
if ((!isSimHardwareVisible(mContext)) || !UserHandle.isApp(mAppItem.key)) {
|
||||
final UidDetail uidDetail = uidDetailProvider.getUidDetail(mAppItem.key, true);
|
||||
mIcon = uidDetail.icon;
|
||||
mLabel = uidDetail.label;
|
||||
@@ -328,6 +333,9 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
|
||||
}
|
||||
|
||||
private void updatePrefs(boolean restrictBackground, boolean unrestrictData) {
|
||||
if (!isSimHardwareVisible(mContext)) {
|
||||
return;
|
||||
}
|
||||
setBackPreferenceListAnimatorIfLoaded();
|
||||
final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted(
|
||||
mContext, mPackageName, UserHandle.getUserId(mAppItem.key));
|
||||
|
@@ -42,6 +42,7 @@ import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.network.SubscriptionUtil;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settingslib.NetworkPolicyEditor;
|
||||
import com.android.settingslib.net.DataUsageController;
|
||||
@@ -102,6 +103,10 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements
|
||||
super.onCreate(icicle);
|
||||
|
||||
final Context context = getContext();
|
||||
if (!SubscriptionUtil.isSimHardwareVisible(context)) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
mDataUsageController = new DataUsageController(context);
|
||||
|
||||
Bundle args = getArguments();
|
||||
@@ -498,7 +503,8 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements
|
||||
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
return DataUsageUtils.hasMobileData(context);
|
||||
return SubscriptionUtil.isSimHardwareVisible(context)
|
||||
&& DataUsageUtils.hasMobileData(context);
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -75,11 +75,19 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage
|
||||
return R.string.help_url_data_usage;
|
||||
}
|
||||
|
||||
public boolean isSimHardwareVisible(Context context) {
|
||||
return SubscriptionUtil.isSimHardwareVisible(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
Context context = getContext();
|
||||
|
||||
if (!isSimHardwareVisible(context)) {
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
enableProxySubscriptionManager(context);
|
||||
|
||||
boolean hasMobileData = DataUsageUtils.hasMobileData(context);
|
||||
@@ -137,6 +145,9 @@ public class DataUsageSummary extends DataUsageBaseFragment implements DataUsage
|
||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||
final Activity activity = getActivity();
|
||||
final ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
if (!isSimHardwareVisible(context)) {
|
||||
return controllers;
|
||||
}
|
||||
mSummaryController =
|
||||
new DataUsageSummaryPreferenceController(activity, getSettingsLifecycle(), this,
|
||||
DataUsageUtils.getDefaultSubscriptionId(activity));
|
||||
|
@@ -110,7 +110,10 @@ public class AppDataUsageTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowFragment.class)
|
||||
public void onCreate_appUid_shouldGetAppLabelFromAppInfo() throws NameNotFoundException {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
final FragmentActivity activity = spy(Robolectric.setupActivity(FragmentActivity.class));
|
||||
doReturn(mPackageManager).when(activity).getPackageManager();
|
||||
doReturn(activity).when(mFragment).getActivity();
|
||||
@@ -140,7 +143,10 @@ public class AppDataUsageTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowFragment.class)
|
||||
public void onCreate_notAppUid_shouldGetAppLabelFromUidDetailProvider() {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
ReflectionHelpers.setField(mFragment, "mDashboardFeatureProvider",
|
||||
FakeFeatureFactory.setupForTest().dashboardFeatureProvider);
|
||||
doReturn(Robolectric.setupActivity(FragmentActivity.class)).when(mFragment).getActivity();
|
||||
@@ -167,7 +173,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
|
||||
when(mFragment.getPreferenceManager())
|
||||
.thenReturn(mock(PreferenceManager.class, RETURNS_DEEP_STUBS));
|
||||
@@ -184,7 +193,10 @@ public class AppDataUsageTest {
|
||||
throws PackageManager.NameNotFoundException {
|
||||
final int fakeUserId = 100;
|
||||
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
final ArraySet<String> packages = new ArraySet<>();
|
||||
packages.add("pkg");
|
||||
final AppItem appItem = new AppItem(123456789);
|
||||
@@ -210,7 +222,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void changePreference_backgroundData_shouldUpdateUI() {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
final AppItem appItem = new AppItem(123456789);
|
||||
final RestrictedSwitchPreference pref = mock(RestrictedSwitchPreference.class);
|
||||
final DataSaverBackend dataSaverBackend = mock(DataSaverBackend.class);
|
||||
@@ -227,7 +242,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void updatePrefs_restrictedByAdmin_shouldDisablePreference() {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
final int testUid = 123123;
|
||||
final AppItem appItem = new AppItem(testUid);
|
||||
final RestrictedSwitchPreference restrictBackgroundPref
|
||||
@@ -255,7 +273,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void bindData_noAppUsageData_shouldHideCycleSpinner() {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
final SpinnerPreference cycle = mock(SpinnerPreference.class);
|
||||
ReflectionHelpers.setField(mFragment, "mCycle", cycle);
|
||||
final Preference preference = mock(Preference.class);
|
||||
@@ -271,7 +292,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void bindData_hasAppUsageData_shouldShowCycleSpinnerAndUpdateUsageSummary() {
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
final Context context = RuntimeEnvironment.application;
|
||||
ReflectionHelpers.setField(mFragment, "mContext", context);
|
||||
final long backgroundBytes = 1234L;
|
||||
@@ -300,7 +324,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void onCreateLoader_categoryApp_shouldQueryDataUsageUsingAppKey() {
|
||||
mFragment = new AppDataUsage();
|
||||
mFragment = new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
};
|
||||
final Context context = RuntimeEnvironment.application;
|
||||
final int testUid = 123123;
|
||||
final AppItem appItem = new AppItem(testUid);
|
||||
@@ -323,7 +350,10 @@ public class AppDataUsageTest {
|
||||
|
||||
@Test
|
||||
public void onCreateLoader_categoryUser_shouldQueryDataUsageUsingAssociatedUids() {
|
||||
mFragment = new AppDataUsage();
|
||||
mFragment = new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
};
|
||||
final Context context = RuntimeEnvironment.application;
|
||||
final int testUserId = 11;
|
||||
final AppItem appItem = new AppItem(testUserId);
|
||||
@@ -360,7 +390,10 @@ public class AppDataUsageTest {
|
||||
appItem.category = AppItem.CATEGORY_APP;
|
||||
appItem.addUid(uid);
|
||||
|
||||
mFragment = new AppDataUsage();
|
||||
mFragment = new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
};
|
||||
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
|
||||
ReflectionHelpers.setField(mFragment, "mCycles", testCycles);
|
||||
ReflectionHelpers.setField(mFragment, "mAppItem", appItem);
|
||||
@@ -393,7 +426,10 @@ public class AppDataUsageTest {
|
||||
builder.setStartTime(tenDaysAgo).setEndTime(now).setTotalUsage(1234L);
|
||||
data.add(builder.build());
|
||||
|
||||
mFragment = new AppDataUsage();
|
||||
mFragment = new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
};
|
||||
ReflectionHelpers.setField(mFragment, "mContext", RuntimeEnvironment.application);
|
||||
ReflectionHelpers.setField(mFragment, "mCycleAdapter", mock(CycleAdapter.class));
|
||||
ReflectionHelpers.setField(mFragment, "mSelectedCycle", tenDaysAgo);
|
||||
@@ -420,7 +456,10 @@ public class AppDataUsageTest {
|
||||
ShadowDataUsageUtils.HAS_SIM = false;
|
||||
ShadowSubscriptionManager.setDefaultDataSubscriptionId(
|
||||
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
|
||||
mFragment = spy(new AppDataUsage());
|
||||
mFragment = spy(new AppDataUsage() {
|
||||
@Override
|
||||
public boolean isSimHardwareVisible(Context context) { return true; }
|
||||
});
|
||||
doReturn(Robolectric.setupActivity(FragmentActivity.class)).when(mFragment).getActivity();
|
||||
doReturn(RuntimeEnvironment.application).when(mFragment).getContext();
|
||||
final UidDetailProvider uidDetailProvider = mock(UidDetailProvider.class);
|
||||
|
@@ -29,12 +29,15 @@ import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.usage.NetworkStatsManager;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.net.NetworkPolicyManager;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
import com.android.settings.testutils.shadow.ShadowDashboardFragment;
|
||||
import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
|
||||
import com.android.settings.testutils.shadow.ShadowUserManager;
|
||||
@@ -70,6 +73,7 @@ public class DataUsageSummaryTest {
|
||||
private NetworkStatsManager mNetworkStatsManager;
|
||||
private TelephonyManager mTelephonyManager;
|
||||
private Context mContext;
|
||||
private Resources mResources;
|
||||
private FragmentActivity mActivity;
|
||||
|
||||
/**
|
||||
@@ -84,13 +88,18 @@ public class DataUsageSummaryTest {
|
||||
ShadowUserManager.getShadow().setIsAdminUser(true);
|
||||
shadowContext.setSystemService(Context.NETWORK_POLICY_SERVICE, mNetworkPolicyManager);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
|
||||
final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(mTelephonyManager);
|
||||
shadowTelephonyManager.setTelephonyManagerForSubscriptionId(
|
||||
SubscriptionManager.INVALID_SUBSCRIPTION_ID, mTelephonyManager);
|
||||
shadowTelephonyManager.setTelephonyManagerForSubscriptionId(1, mTelephonyManager);
|
||||
mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
|
||||
|
||||
mResources = spy(mContext.getResources());
|
||||
doReturn(mResources).when(mContext).getResources();
|
||||
doReturn(true).when(mResources).getBoolean(R.bool.config_show_sim_info);
|
||||
|
||||
doReturn(mNetworkStatsManager).when(mActivity).getSystemService(NetworkStatsManager.class);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user