From 0b57abfdec91e55ef1d1356baeb187d672b666b3 Mon Sep 17 00:00:00 2001 From: Sam Mortimer Date: Tue, 26 May 2020 20:53:59 -0700 Subject: [PATCH] Settings: Add support for allowing/disallowing apps on restricted networks *) Add option to disable all network traffic in app data usage settings. *) Disable the existing background data and unrestricted data usage options when all network traffic is disabled. Change-Id: I0aaf5703d6dd5d6e6ec3cda3940f28833fe052ea --- res/values/cm_strings.xml | 4 ++ res/xml/app_data_usage.xml | 5 ++ .../settings/datausage/AppDataUsage.java | 51 ++++++++++++++----- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index ab2fa9d86e4..62668ef80fb 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -60,6 +60,10 @@ Navigation hint Show navigation hint bar at the bottom of the screen + + Allow network access + Enable network usage + Scramble layout Scramble PIN layout when unlocking device diff --git a/res/xml/app_data_usage.xml b/res/xml/app_data_usage.xml index 3135f597368..013088ab822 100644 --- a/res/xml/app_data_usage.xml +++ b/res/xml/app_data_usage.xml @@ -42,6 +42,11 @@ android:title="@string/data_usage_app_settings" settings:controller="com.android.settings.datausage.AppDataUsageAppSettingsController" /> + + mPackages = new ArraySet<>(); + private RestrictedSwitchPreference mRestrictAll; private RestrictedSwitchPreference mRestrictBackground; private Drawable mIcon; @@ -147,6 +151,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mIcon = uidDetail.icon; mLabel = uidDetail.label; removePreference(KEY_UNRESTRICTED_DATA); + removePreference(KEY_RESTRICT_ALL); removePreference(KEY_RESTRICT_BACKGROUND); } else { if (mPackages.size() != 0) { @@ -161,6 +166,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC } use(AppDataUsageAppSettingsController.class).init(mPackages, userId); } + mRestrictAll = findPreference(KEY_RESTRICT_ALL); + mRestrictAll.setOnPreferenceChangeListener(this); mRestrictBackground = findPreference(KEY_RESTRICT_BACKGROUND); mRestrictBackground.setOnPreferenceChangeListener(this); mUnrestrictedData = findPreference(KEY_UNRESTRICTED_DATA); @@ -177,6 +184,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mPackageName = context.getPackageName(); removePreference(KEY_UNRESTRICTED_DATA); + removePreference(KEY_RESTRICT_ALL); removePreference(KEY_RESTRICT_BACKGROUND); } @@ -219,6 +227,17 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mDataSaverBackend.setIsDenylisted(mAppItem.key, mPackageName, !(Boolean) newValue); updatePrefs(); return true; + } else if (preference == mRestrictAll) { + Set uids = + ConnectivitySettingsManager.getUidsAllowedOnRestrictedNetworks(mContext); + if (!(Boolean) newValue) { + uids.remove(mAppItem.key); + } else { + uids.add(mAppItem.key); + } + ConnectivitySettingsManager.setUidsAllowedOnRestrictedNetworks(mContext, uids); + updatePrefs(); + return true; } else if (preference == mUnrestrictedData) { mDataSaverBackend.setIsAllowlisted(mAppItem.key, mPackageName, (Boolean) newValue); return true; @@ -238,7 +257,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC @VisibleForTesting void updatePrefs() { - updatePrefs(getAppRestrictBackground(), getUnrestrictData()); + updatePrefs(getAppRestrictBackground(), getUnrestrictData(), getAppRestrictAll()); } @VisibleForTesting @@ -279,7 +298,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC } } - private void updatePrefs(boolean restrictBackground, boolean unrestrictData) { + private void updatePrefs(boolean restrictBackground, boolean unrestrictData, + boolean restrictAll) { if (!isSimHardwareVisible(mContext)) { return; } @@ -287,18 +307,20 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC final EnforcedAdmin admin = RestrictedLockUtilsInternal .checkIfMeteredDataUsageUserControlDisabled(mContext, mPackageName, UserHandle.getUserId(mAppItem.key)); + if (mRestrictAll != null) { + mRestrictAll.setChecked(!restrictAll); + } if (mRestrictBackground != null) { - mRestrictBackground.setChecked(!restrictBackground); mRestrictBackground.setDisabledByAdmin(admin); + mRestrictBackground.setEnabled(!mRestrictBackground.isDisabledByAdmin() && + !restrictAll); + mRestrictBackground.setChecked(!restrictBackground && !restrictAll); } if (mUnrestrictedData != null) { - if (restrictBackground) { - mUnrestrictedData.setVisible(false); - } else { - mUnrestrictedData.setVisible(true); - mUnrestrictedData.setChecked(unrestrictData); - mUnrestrictedData.setDisabledByAdmin(admin); - } + mUnrestrictedData.setDisabledByAdmin(admin); + mUnrestrictedData.setEnabled(!mUnrestrictedData.isDisabledByAdmin() && + !restrictBackground && !restrictAll); + mUnrestrictedData.setChecked(unrestrictData && !restrictBackground && !restrictAll); } } @@ -316,6 +338,11 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC && DynamicDenylistManager.getInstance(mContext).isInManualDenylist(uid); } + private boolean getAppRestrictAll() { + return !ConnectivitySettingsManager.getUidsAllowedOnRestrictedNetworks(mContext) + .contains(mAppItem.key); + } + private boolean getUnrestrictData() { if (mDataSaverBackend != null) { return mDataSaverBackend.isAllowlisted(mAppItem.key); @@ -365,14 +392,14 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC @Override public void onAllowlistStatusChanged(int uid, boolean isAllowlisted) { if (mAppItem.uids.get(uid, false)) { - updatePrefs(getAppRestrictBackground(), isAllowlisted); + updatePrefs(getAppRestrictBackground(), isAllowlisted, getAppRestrictAll()); } } @Override public void onDenylistStatusChanged(int uid, boolean isDenylisted) { if (mAppItem.uids.get(uid, false)) { - updatePrefs(isDenylisted, getUnrestrictData()); + updatePrefs(isDenylisted, getUnrestrictData(), getAppRestrictAll()); } } }