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

Commit c2ef27fa authored by Felipe Leme's avatar Felipe Leme
Browse files

Handle blacklisted apps on Data Saver whitelist.

When user blacklists an app for background data access, the
"Unrestricted data access" list should not display the whitelist toggle
option, but rather explain background access is turned off and offer the
option to open the app's data usage screen to turn it back on.

It still does not handle changed received by DataSaverBackend, so the UI
will be stale when the user removes a blacklist and navigates back to
the list.

BUG: 27481520

Change-Id: I9d0fa9f0180a69ce9bd1417921bf89ec3ba31f01
parent bd068163
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -7243,6 +7243,9 @@
    <!-- Button that leads to list of apps with unrestricted data access [CHAR LIMIT=60] -->
    <string name="unrestricted_data_saver">Unrestricted data access</string>
    <!-- Description of message shown when app is blacklisted for background data access [CHAR LIMIT=NONE] -->
    <string name="restrict_background_blacklisted">Background data is turned off</string>
    <!-- Summary for the Data Saver feature being on [CHAR LIMIT=NONE] -->
    <string name="data_saver_on">On</string>
+11 −4
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ import android.webkit.IWebViewUpdateService;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
@@ -81,6 +82,7 @@ import com.android.settings.AppHeader;
import com.android.settings.DeviceAdminAdd;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback;
import com.android.settings.datausage.AppDataUsage;
@@ -741,14 +743,19 @@ public class InstalledAppDetails extends AppInfoBase
    }

    private void startAppInfoFragment(Class<?> fragment, CharSequence title) {
        startAppInfoFragment(fragment, title, this, mAppEntry);
    }

    public static void startAppInfoFragment(Class<?> fragment, CharSequence title,
            SettingsPreferenceFragment caller, AppEntry appEntry) {
        // start new fragment to display extended information
        Bundle args = new Bundle();
        args.putString(ARG_PACKAGE_NAME, mAppEntry.info.packageName);
        args.putInt(ARG_PACKAGE_UID, mAppEntry.info.uid);
        args.putString(ARG_PACKAGE_NAME, appEntry.info.packageName);
        args.putInt(ARG_PACKAGE_UID, appEntry.info.uid);
        args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true);

        SettingsActivity sa = (SettingsActivity) getActivity();
        sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT);
        SettingsActivity sa = (SettingsActivity) caller.getActivity();
        sa.startPreferencePanel(fragment.getName(), args, -1, title, caller, SUB_INFO_FRAGMENT);
    }

    /*
+2 −12
Original line number Diff line number Diff line
@@ -216,7 +216,8 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (preference == mRestrictBackground) {
            setAppRestrictBackground(!(Boolean) newValue);
            mDataSaverBackend.setIsBlacklisted(mAppItem.key, mPackageName, !(Boolean) newValue);
            updatePrefs();        // TODO: should have been notified by NPMS instead
            return true;
        } else if (preference == mUnrestrictedData) {
            mDataSaverBackend.setIsWhitelisted(mAppItem.key, mPackageName, (Boolean) newValue);
@@ -287,17 +288,6 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
        return (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0;
    }

    private void setAppRestrictBackground(boolean restrictBackground) {
        final int uid = mAppItem.key;
        services.mPolicyManager.setUidPolicy(
                uid, restrictBackground ? POLICY_REJECT_METERED_BACKGROUND : POLICY_NONE);
        updatePrefs();        // TODO: should have been notified by NPMS instead
        if (restrictBackground) {
            MetricsLogger.action(getContext(),
                    MetricsEvent.ACTION_DATA_SAVER_BLACKLIST, mPackageName);
        }
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
+7 −3
Original line number Diff line number Diff line
@@ -37,20 +37,24 @@ public class AppStateDataUsageBridge extends AppStateBaseBridge {
        final int N = apps.size();
        for (int i = 0; i < N; i++) {
            AppEntry app = apps.get(i);
            app.extraInfo = new DataUsageState(mDataSaverBackend.isWhitelisted(app.info.uid));
            app.extraInfo = new DataUsageState(mDataSaverBackend.isWhitelisted(app.info.uid),
                    mDataSaverBackend.isBlacklisted(app.info.uid));
        }
    }

    @Override
    protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
        app.extraInfo = new DataUsageState(mDataSaverBackend.isWhitelisted(uid));
        app.extraInfo = new DataUsageState(mDataSaverBackend.isWhitelisted(uid),
                mDataSaverBackend.isBlacklisted(uid));
    }

    public static class DataUsageState {
        public boolean isDataSaverWhitelisted;
        public boolean isDataSaverBlacklisted;

        public DataUsageState(boolean isDataSaverWhitelisted) {
        public DataUsageState(boolean isDataSaverWhitelisted, boolean isDataSaverBlacklisted) {
            this.isDataSaverWhitelisted = isDataSaverWhitelisted;
            this.isDataSaverBlacklisted = isDataSaverBlacklisted;
        }
    }
}
+35 −1
Original line number Diff line number Diff line
@@ -29,6 +29,9 @@ import com.android.internal.logging.MetricsProto.MetricsEvent;

import java.util.ArrayList;

import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;

public class DataSaverBackend {

    private static final String TAG = "DataSaverBackend";
@@ -40,6 +43,7 @@ public class DataSaverBackend {
    private final INetworkPolicyManager mIPolicyManager;
    private final ArrayList<Listener> mListeners = new ArrayList<>();
    private SparseBooleanArray mWhitelist;
    private SparseBooleanArray mBlacklist;

    // TODO: Staticize into only one.
    public DataSaverBackend(Context context) {
@@ -121,6 +125,35 @@ public class DataSaverBackend {
        }
    }

    public void refreshBlacklist() {
        loadBlacklist();
    }

    public void setIsBlacklisted(int uid, String packageName, boolean blacklisted) {
        mPolicyManager.setUidPolicy(
                uid, blacklisted ? POLICY_REJECT_METERED_BACKGROUND : POLICY_NONE);
        if (blacklisted) {
            MetricsLogger.action(mContext, MetricsEvent.ACTION_DATA_SAVER_BLACKLIST, packageName);
        }
    }

    public boolean isBlacklisted(int uid) {
        if (mBlacklist == null) {
            loadBlacklist();
        }
        return mBlacklist.get(uid);
    }

    private void loadBlacklist() {
        mBlacklist = new SparseBooleanArray();
        try {
            for (int uid : mIPolicyManager.getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND)) {
                mBlacklist.put(uid, true);
            }
        } catch (RemoteException e) {
        }
    }

    private void handleRestrictBackgroundChanged(boolean isDataSaving) {
        for (int i = 0; i < mListeners.size(); i++) {
            mListeners.get(i).onDataSaverChanged(isDataSaving);
@@ -129,7 +162,8 @@ public class DataSaverBackend {

    private final INetworkPolicyListener mPolicyListener = new INetworkPolicyListener.Stub() {
        @Override
        public void onUidRulesChanged(int i, int i1) throws RemoteException {
        public void onUidRulesChanged(int uid, int uidRules) throws RemoteException {
            // TODO: update UI accordingly
        }

        @Override
Loading