Listen to INetworkPolicyManager events and update UI accordingly.
BUG: 27481520 Change-Id: I09c4c586188d754ddd3ac3dcb3903217842ea0a5
This commit is contained in:
@@ -54,7 +54,8 @@ import com.android.settingslib.net.UidDetailProvider;
|
|||||||
import static android.net.NetworkPolicyManager.POLICY_NONE;
|
import static android.net.NetworkPolicyManager.POLICY_NONE;
|
||||||
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
|
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_APP_ITEM = "app_item";
|
||||||
public static final String ARG_NETWORK_TEMPLATE = "network_template";
|
public static final String ARG_NETWORK_TEMPLATE = "network_template";
|
||||||
@@ -207,17 +208,23 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
|||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
mDataSaverBackend.addListener(this);
|
||||||
mPolicy = services.mPolicyEditor.getPolicy(mTemplate);
|
mPolicy = services.mPolicyEditor.getPolicy(mTemplate);
|
||||||
getLoaderManager().restartLoader(LOADER_CHART_DATA,
|
getLoaderManager().restartLoader(LOADER_CHART_DATA,
|
||||||
ChartDataLoader.buildArgs(mTemplate, mAppItem), mChartDataCallbacks);
|
ChartDataLoader.buildArgs(mTemplate, mAppItem), mChartDataCallbacks);
|
||||||
updatePrefs();
|
updatePrefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
mDataSaverBackend.remListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
if (preference == mRestrictBackground) {
|
if (preference == mRestrictBackground) {
|
||||||
mDataSaverBackend.setIsBlacklisted(mAppItem.key, mPackageName, !(Boolean) newValue);
|
mDataSaverBackend.setIsBlacklisted(mAppItem.key, mPackageName, !(Boolean) newValue);
|
||||||
updatePrefs(); // TODO: should have been notified by NPMS instead
|
|
||||||
return true;
|
return true;
|
||||||
} else if (preference == mUnrestrictedData) {
|
} else if (preference == mUnrestrictedData) {
|
||||||
mDataSaverBackend.setIsWhitelisted(mAppItem.key, mPackageName, (Boolean) newValue);
|
mDataSaverBackend.setIsWhitelisted(mAppItem.key, mPackageName, (Boolean) newValue);
|
||||||
@@ -238,15 +245,19 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updatePrefs() {
|
private void updatePrefs() {
|
||||||
|
updatePrefs(getAppRestrictBackground(), getUnrestrictData());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updatePrefs(boolean restrictBackground, boolean unrestrictData) {
|
||||||
if (mRestrictBackground != null) {
|
if (mRestrictBackground != null) {
|
||||||
mRestrictBackground.setChecked(!getAppRestrictBackground());
|
mRestrictBackground.setChecked(!restrictBackground);
|
||||||
}
|
}
|
||||||
if (mUnrestrictedData != null) {
|
if (mUnrestrictedData != null) {
|
||||||
if (getAppRestrictBackground()) {
|
if (restrictBackground) {
|
||||||
mUnrestrictedData.setVisible(false);
|
mUnrestrictedData.setVisible(false);
|
||||||
} else {
|
} else {
|
||||||
mUnrestrictedData.setVisible(true);
|
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;
|
return (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean getUnrestrictData() {
|
||||||
|
return mDataSaverBackend.isWhitelisted(mAppItem.key);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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() {
|
private final INetworkPolicyListener mPolicyListener = new INetworkPolicyListener.Stub() {
|
||||||
@Override
|
@Override
|
||||||
public void onUidRulesChanged(int uid, int uidRules) throws RemoteException {
|
public void onUidRulesChanged(final int uid, int uidRules) throws RemoteException {
|
||||||
// TODO: update UI accordingly
|
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
|
@Override
|
||||||
@@ -183,5 +219,7 @@ public class DataSaverBackend {
|
|||||||
|
|
||||||
public interface Listener {
|
public interface Listener {
|
||||||
void onDataSaverChanged(boolean isDataSaving);
|
void onDataSaverChanged(boolean isDataSaving);
|
||||||
|
void onWhitelistStatusChanged(int uid, boolean isWhitelisted);
|
||||||
|
void onBlacklistStatusChanged(int uid, boolean isBlacklisted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -44,4 +44,12 @@ public class DataSaverPreference extends Preference implements DataSaverBackend.
|
|||||||
public void onDataSaverChanged(boolean isDataSaving) {
|
public void onDataSaverChanged(boolean isDataSaving) {
|
||||||
setSummary(isDataSaving ? R.string.data_saver_on : R.string.data_saver_off);
|
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) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -99,6 +99,14 @@ public class DataSaverSummary extends SettingsPreferenceFragment
|
|||||||
mSwitchBar.setChecked(isDataSaving);
|
mSwitchBar.setChecked(isDataSaving);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onExtraInfoUpdated() {
|
public void onExtraInfoUpdated() {
|
||||||
if (!isAdded()) {
|
if (!isAdded()) {
|
||||||
|
@@ -41,7 +41,8 @@ import com.android.settingslib.applications.ApplicationsState.AppFilter;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
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 int MENU_SHOW_SYSTEM = Menu.FIRST + 42;
|
||||||
private static final String EXTRA_SHOW_SYSTEM = "show_system";
|
private static final String EXTRA_SHOW_SYSTEM = "show_system";
|
||||||
@@ -214,7 +215,7 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AccessPreference extends SwitchPreference {
|
private class AccessPreference extends SwitchPreference implements DataSaverBackend.Listener {
|
||||||
private final AppEntry mEntry;
|
private final AppEntry mEntry;
|
||||||
private final DataUsageState mState;
|
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
|
@Override
|
||||||
protected void onClick() {
|
protected void onClick() {
|
||||||
if (mState.isDataSaverBlacklisted) {
|
if (mState.isDataSaverBlacklisted) {
|
||||||
@@ -246,17 +259,13 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
|||||||
// Sets UI state based on whitelist/blacklist status.
|
// Sets UI state based on whitelist/blacklist status.
|
||||||
private void setState() {
|
private void setState() {
|
||||||
setTitle(mEntry.label);
|
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) {
|
if (mState != null) {
|
||||||
setChecked(mState.isDataSaverWhitelisted);
|
setChecked(mState.isDataSaverWhitelisted);
|
||||||
if (mState.isDataSaverBlacklisted) {
|
if (mState.isDataSaverBlacklisted) {
|
||||||
setSummary(R.string.restrict_background_blacklisted);
|
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)
|
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);
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user