diff --git a/res/xml/app_data_usage.xml b/res/xml/app_data_usage.xml index e94c4ff4ca2..aacc1f6027c 100644 --- a/res/xml/app_data_usage.xml +++ b/res/xml/app_data_usage.xml @@ -51,6 +51,7 @@ 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)); diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 9e83e4cc451..1e38ad16048 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -45,6 +45,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; @@ -105,6 +106,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(); @@ -512,7 +517,8 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements @Override protected boolean isPageSearchEnabled(Context context) { - return DataUsageUtils.hasMobileData(context); + return SubscriptionUtil.isSimHardwareVisible(context) + && DataUsageUtils.hasMobileData(context); } }; diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index abcc45fdfec..fabf0596b77 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -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 createPreferenceControllers(Context context) { final Activity activity = getActivity(); final ArrayList controllers = new ArrayList<>(); + if (!isSimHardwareVisible(context)) { + return controllers; + } mSummaryController = new DataUsageSummaryPreferenceController(activity, getSettingsLifecycle(), this, DataUsageUtils.getDefaultSubscriptionId(activity)); diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 47db4f29506..e7b59a35fe5 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -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 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); diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java index 6d1081416dd..68d49fc6352 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java @@ -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); }