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

Commit 85c63f34 authored by Felipe Leme's avatar Felipe Leme
Browse files

Listen to INetworkPolicyManager events and update UI accordingly.

BUG: 27481520

Change-Id: I09c4c586188d754ddd3ac3dcb3903217842ea0a5
parent ed74511c
Loading
Loading
Loading
Loading
+39 −5
Original line number Diff line number Diff line
@@ -54,7 +54,8 @@ import com.android.settingslib.net.UidDetailProvider;
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;

public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener {
public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener,
        DataSaverBackend.Listener {

    public static final String ARG_APP_ITEM = "app_item";
    public static final String ARG_NETWORK_TEMPLATE = "network_template";
@@ -207,17 +208,23 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
    @Override
    public void onResume() {
        super.onResume();
        mDataSaverBackend.addListener(this);
        mPolicy = services.mPolicyEditor.getPolicy(mTemplate);
        getLoaderManager().restartLoader(LOADER_CHART_DATA,
                ChartDataLoader.buildArgs(mTemplate, mAppItem), mChartDataCallbacks);
        updatePrefs();
    }

    @Override
    public void onPause() {
        super.onPause();
        mDataSaverBackend.remListener(this);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (preference == mRestrictBackground) {
            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);
@@ -238,15 +245,19 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
    }

    private void updatePrefs() {
        updatePrefs(getAppRestrictBackground(), getUnrestrictData());
    }

    private void updatePrefs(boolean restrictBackground, boolean unrestrictData) {
        if (mRestrictBackground != null) {
            mRestrictBackground.setChecked(!getAppRestrictBackground());
            mRestrictBackground.setChecked(!restrictBackground);
        }
        if (mUnrestrictedData != null) {
            if (getAppRestrictBackground()) {
            if (restrictBackground) {
                mUnrestrictedData.setVisible(false);
            } else {
                mUnrestrictedData.setVisible(true);
                mUnrestrictedData.setChecked(mDataSaverBackend.isWhitelisted(mAppItem.key));
                mUnrestrictedData.setChecked(unrestrictData);
            }
        }
    }
@@ -288,6 +299,10 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
        return (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0;
    }

    private boolean getUnrestrictData() {
        return mDataSaverBackend.isWhitelisted(mAppItem.key);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
@@ -368,4 +383,23 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
            }
        }
    }

    @Override
    public void onDataSaverChanged(boolean isDataSaving) {

    }

    @Override
    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
        if (mAppItem.uids.get(uid, false)) {
            updatePrefs(getAppRestrictBackground(), isWhitelisted);
        }
    }

    @Override
    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
        if (mAppItem.uids.get(uid, false)) {
            updatePrefs(isBlacklisted, getUnrestrictData());
        }
    }
}
+40 −2
Original line number Diff line number Diff line
@@ -160,10 +160,46 @@ public class DataSaverBackend {
        }
    }

    private void handleWhitelistChanged(int uid, boolean isWhitelisted) {
        for (int i = 0; i < mListeners.size(); i++) {
            mListeners.get(i).onWhitelistStatusChanged(uid, isWhitelisted);
        }
    }

    private void handleBlacklistChanged(int uid, boolean isBlacklisted) {
        for (int i = 0; i < mListeners.size(); i++) {
            mListeners.get(i).onBlacklistStatusChanged(uid, isBlacklisted);
        }
    }

    private final INetworkPolicyListener mPolicyListener = new INetworkPolicyListener.Stub() {
        @Override
        public void onUidRulesChanged(int uid, int uidRules) throws RemoteException {
            // TODO: update UI accordingly
        public void onUidRulesChanged(final int uid, int uidRules) throws RemoteException {
            if (mBlacklist == null) {
                loadBlacklist();
            }
            final boolean isBlacklisted = uidRules == POLICY_REJECT_METERED_BACKGROUND;
            mBlacklist.put(uid, isBlacklisted);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleBlacklistChanged(uid, isBlacklisted);
                }
            });
        }

        @Override
        public void onRestrictBackgroundWhitelistChanged(final int uid, final boolean whitelisted) {
            if (mWhitelist == null) {
                loadWhitelist();
            }
            mWhitelist.put(uid, whitelisted);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    handleWhitelistChanged(uid, whitelisted);
                }
            });
        }

        @Override
@@ -183,5 +219,7 @@ public class DataSaverBackend {

    public interface Listener {
        void onDataSaverChanged(boolean isDataSaving);
        void onWhitelistStatusChanged(int uid, boolean isWhitelisted);
        void onBlacklistStatusChanged(int uid, boolean isBlacklisted);
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -44,4 +44,12 @@ public class DataSaverPreference extends Preference implements DataSaverBackend.
    public void onDataSaverChanged(boolean isDataSaving) {
        setSummary(isDataSaving ? R.string.data_saver_on : R.string.data_saver_off);
    }

    @Override
    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
    }

    @Override
    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -99,6 +99,14 @@ public class DataSaverSummary extends SettingsPreferenceFragment
        mSwitchBar.setChecked(isDataSaving);
    }

    @Override
    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
    }

    @Override
    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
    }

    @Override
    public void onExtraInfoUpdated() {
        if (!isAdded()) {
+39 −9
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ import com.android.settingslib.applications.ApplicationsState.AppFilter;
import java.util.ArrayList;

public class UnrestrictedDataAccess extends SettingsPreferenceFragment
        implements ApplicationsState.Callbacks, AppStateBaseBridge.Callback, Preference.OnPreferenceChangeListener {
        implements ApplicationsState.Callbacks, AppStateBaseBridge.Callback,
        Preference.OnPreferenceChangeListener {

    private static final int MENU_SHOW_SYSTEM = Menu.FIRST + 42;
    private static final String EXTRA_SHOW_SYSTEM = "show_system";
@@ -214,7 +215,7 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
        return false;
    }

    private class AccessPreference extends SwitchPreference {
    private class AccessPreference extends SwitchPreference implements DataSaverBackend.Listener {
        private final AppEntry mEntry;
        private final DataUsageState mState;

@@ -229,6 +230,18 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
            }
        }

        @Override
        public void onAttached() {
            super.onAttached();
            mDataSaverBackend.addListener(this);
        }

        @Override
        public void onDetached() {
            mDataSaverBackend.remListener(this);
            super.onDetached();
        }

        @Override
        protected void onClick() {
            if (mState.isDataSaverBlacklisted) {
@@ -246,17 +259,13 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
        // Sets UI state based on whitelist/blacklist status.
        private void setState() {
            setTitle(mEntry.label);
            // TODO: state is cached, so if blacklist/whitelist changes, it's not updated.
            // For example, if the initial state is blacklisted, the user taps the preference,
            // removes the blacklist, and then taps back, the state is not refreshed.
            // The proper fix for this problem is to implement onUidRulesChanged() on
            // DataSaverBackend and update the UI accordingly.
            if (mState != null) {
                setChecked(mState.isDataSaverWhitelisted);
                if (mState.isDataSaverBlacklisted) {
                    setSummary(R.string.restrict_background_blacklisted);
                } else {
                    setSummary("");
                }
                // TODO: might need to reset summary once it listens to onUidRulesChanged()
            }
        }

@@ -280,9 +289,30 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
                });
            }
            holder.findViewById(android.R.id.widget_frame)
                    .setVisibility(mState.isDataSaverBlacklisted ? View.INVISIBLE : View.VISIBLE);
                    .setVisibility(mState != null && mState.isDataSaverBlacklisted
                            ? View.INVISIBLE : View.VISIBLE);
            super.onBindViewHolder(holder);
        }

        @Override
        public void onDataSaverChanged(boolean isDataSaving) {
        }

        @Override
        public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
            if (mState != null && mEntry.info.uid == uid) {
                mState.isDataSaverWhitelisted = isWhitelisted;
                reuse();
            }
        }

        @Override
        public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
            if (mState != null && mEntry.info.uid == uid) {
                mState.isDataSaverBlacklisted = isBlacklisted;
                reuse();
            }
        }
    }

}