Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90ab4ba5 authored by Sam Mortimer's avatar Sam Mortimer Committed by Michael Bestas
Browse files

Settings: Add support for per app network isolation

Change-Id: I0aaf5703d6dd5d6e6ec3cda3940f28833fe052ea
parent fd3152aa
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -112,6 +112,8 @@
    <string name="app_notification_sound_timeout_value_30_minutes">30 minutes</string>

    <!-- Per-app data restrictions -->
    <string name="data_usage_app_restrict_all">Allow network access</string>
    <string name="data_usage_app_restrict_all_summary">Enable network usage</string>
    <string name="data_usage_app_restrict_mobile">Mobile data</string>
    <string name="data_usage_app_restrict_mobile_summary">Enable usage of mobile data</string>
    <string name="data_usage_app_restrict_vpn">VPN data</string>
+5 −0
Original line number Diff line number Diff line
@@ -55,6 +55,11 @@
            android:key="app_settings"
            android:title="@string/data_usage_app_settings" />

        <com.android.settingslib.RestrictedSwitchPreference
            android:key="restrict_all"
            android:title="@string/data_usage_app_restrict_all"
            android:summary="@string/data_usage_app_restrict_all_summary" />

        <com.android.settingslib.RestrictedSwitchPreference
            android:key="restrict_wifi"
            android:title="@string/data_usage_app_restrict_wifi"
+55 −11
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@

package com.android.settings.datausage;

import static android.net.NetworkPolicyManager.POLICY_REJECT_ALL;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.POLICY_REJECT_CELLULAR;
import static android.net.NetworkPolicyManager.POLICY_REJECT_VPN;
@@ -73,6 +74,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
    private static final String KEY_FOREGROUND_USAGE = "foreground_usage";
    private static final String KEY_BACKGROUND_USAGE = "background_usage";
    private static final String KEY_APP_SETTINGS = "app_settings";
    private static final String KEY_RESTRICT_ALL = "restrict_all";
    private static final String KEY_RESTRICT_BACKGROUND = "restrict_background";
    private static final String KEY_RESTRICT_CELLULAR = "restrict_cellular";
    private static final String KEY_RESTRICT_VPN = "restrict_vpn";
@@ -90,6 +92,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
    private Preference mForegroundUsage;
    private Preference mBackgroundUsage;
    private Preference mAppSettings;
    private RestrictedSwitchPreference mRestrictAll;
    private RestrictedSwitchPreference mRestrictBackground;
    private RestrictedSwitchPreference mRestrictCellular;
    private RestrictedSwitchPreference mRestrictVpn;
@@ -165,6 +168,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);
                removePreference(KEY_RESTRICT_CELLULAR);
                removePreference(KEY_RESTRICT_VPN);
@@ -180,6 +184,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
                    } catch (PackageManager.NameNotFoundException e) {
                    }
                }
                mRestrictAll = findPreference(KEY_RESTRICT_ALL);
                mRestrictAll.setOnPreferenceChangeListener(this);
                mRestrictBackground = findPreference(KEY_RESTRICT_BACKGROUND);
                mRestrictBackground.setOnPreferenceChangeListener(this);
                mRestrictCellular = findPreference(KEY_RESTRICT_CELLULAR);
@@ -227,6 +233,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC

            removePreference(KEY_UNRESTRICTED_DATA);
            removePreference(KEY_APP_SETTINGS);
            removePreference(KEY_RESTRICT_ALL);
            removePreference(KEY_RESTRICT_BACKGROUND);
            removePreference(KEY_RESTRICT_CELLULAR);
            removePreference(KEY_RESTRICT_VPN);
@@ -260,6 +267,10 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
            mDataSaverBackend.setIsBlacklisted(mAppItem.key, mPackageName, !(Boolean) newValue);
            updatePrefs();
            return true;
        } else if (preference == mRestrictAll) {
            setAppRestrictAll(!(Boolean) newValue);
            updatePrefs();
            return true;
        } else if (preference == mRestrictCellular) {
            setAppRestrictCellular(!(Boolean) newValue);
            updatePrefs();
@@ -303,7 +314,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
    @VisibleForTesting
    void updatePrefs() {
        updatePrefs(getAppRestrictBackground(), getUnrestrictData(),
                getAppRestrictCellular(), getAppRestrictVpn(), getAppRestrictWifi());
                getAppRestrictCellular(), getAppRestrictVpn(), getAppRestrictWifi(),
                getAppRestrictAll());
    }

    @VisibleForTesting
@@ -312,39 +324,61 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
    }

    private void updatePrefs(boolean restrictBackground, boolean unrestrictData,
            boolean restrictCellular, boolean restrictVpn, boolean restrictWifi) {
            boolean restrictCellular, boolean restrictVpn, boolean restrictWifi,
            boolean restrictAll) {
        final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted(
                mContext, mPackageName, UserHandle.getUserId(mAppItem.key));
        if (mRestrictBackground != null) {
            if (restrictCellular) {
            if (restrictCellular || restrictAll) {
                mRestrictBackground.setEnabled(false);
                mRestrictBackground.setChecked(false);
            } else {
                mRestrictBackground.setEnabled(true);
                mRestrictBackground.setChecked(!restrictBackground);
            }
                mRestrictBackground.setDisabledByAdmin(admin);
            }
        }
        if (mRestrictAll != null) {
            mRestrictAll.setChecked(!restrictAll);
        }
        if (mRestrictCellular != null) {
            if (restrictAll) {
                mRestrictCellular.setEnabled(false);
                mRestrictCellular.setChecked(false);
            } else {
                mRestrictCellular.setEnabled(true);
                mRestrictCellular.setChecked(!restrictCellular);
            }
        }
        if (mRestrictVpn != null) {
            if (restrictAll) {
                mRestrictVpn.setEnabled(false);
                mRestrictVpn.setChecked(false);
            } else {
                mRestrictVpn.setEnabled(true);
                mRestrictVpn.setChecked(!restrictVpn);
            }
        }
        if (mRestrictWifi != null) {
            if (restrictAll) {
                mRestrictWifi.setEnabled(false);
                mRestrictWifi.setChecked(false);
            } else {
                mRestrictWifi.setEnabled(true);
                mRestrictWifi.setChecked(!restrictWifi);
            }
        }
        if (mUnrestrictedData != null) {
            if (restrictCellular || restrictBackground) {
            if (restrictCellular || restrictBackground || restrictAll) {
                mUnrestrictedData.setEnabled(false);
                mUnrestrictedData.setChecked(false);
            } else {
                mUnrestrictedData.setEnabled(true);
                mUnrestrictedData.setChecked(unrestrictData);
            }
                mUnrestrictedData.setDisabledByAdmin(admin);
            }
        }
    }

    private void addUid(int uid) {
        String[] packages = mPackageManager.getPackagesForUid(uid);
@@ -378,6 +412,10 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
        return getAppRestriction(POLICY_REJECT_METERED_BACKGROUND);
    }

    private boolean getAppRestrictAll() {
        return getAppRestriction(POLICY_REJECT_ALL);
    }

    private boolean getAppRestrictCellular() {
        return getAppRestriction(POLICY_REJECT_CELLULAR);
    }
@@ -403,6 +441,10 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
        return (uidPolicy & policy) != 0;
    }

    private void setAppRestrictAll(boolean restrict) {
        setAppRestriction(POLICY_REJECT_ALL, restrict);
    }

    private void setAppRestrictCellular(boolean restrict) {
        setAppRestriction(POLICY_REJECT_CELLULAR, restrict);
    }
@@ -556,7 +598,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
        if (mAppItem.uids.get(uid, false)) {
            updatePrefs(getAppRestrictBackground(), isWhitelisted,
                    getAppRestrictCellular(), getAppRestrictVpn(), getAppRestrictWifi());
                    getAppRestrictCellular(), getAppRestrictVpn(), getAppRestrictWifi(),
                    getAppRestrictAll());
        }
    }

@@ -564,7 +607,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
        if (mAppItem.uids.get(uid, false)) {
            updatePrefs(isBlacklisted, getUnrestrictData(),
                    getAppRestrictCellular(), getAppRestrictVpn(), getAppRestrictWifi());
                    getAppRestrictCellular(), getAppRestrictVpn(), getAppRestrictWifi(),
                    getAppRestrictAll());
        }
    }
}