Add policy transparency for metered data related settings.

With API Dpm.setMeteredDataDisabled, admins can restrict some
packages from accessing metered data and when admin does restrict
packages, user settings to enable usage of mobile data in background or
allow unrestricted access during data saver mode are not relevant. Add
policy transparency to these settings so that user knows that admin
disabled them.

Bug: 63700027
Test: make RunSettingsRoboTests
Test: manual
Change-Id: I450f7a91356ed8fb33f464620c73fa9407a1ff83
This commit is contained in:
Sudheer Shanka
2018-01-23 01:46:53 -08:00
parent adb949da4c
commit b8b2e51e8d
6 changed files with 267 additions and 21 deletions

View File

@@ -14,6 +14,8 @@
package com.android.settings.datausage;
import static com.android.settingslib.RestrictedLockUtils.checkIfMeteredDataRestricted;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
@@ -37,6 +39,8 @@ import com.android.settings.core.FeatureFlags;
import com.android.settings.datausage.AppStateDataUsageBridge.DataUsageState;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.AppSwitchPreference;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedPreferenceHelper;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.applications.ApplicationsState.AppFilter;
@@ -172,6 +176,8 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
preference.setOnPreferenceChangeListener(this);
getPreferenceScreen().addPreference(preference);
} else {
preference.setDisabledByAdmin(checkIfMeteredDataRestricted(getContext(),
entry.info.packageName, UserHandle.getUserId(entry.info.uid)));
preference.reuse();
}
preference.setOrder(i);
@@ -242,16 +248,22 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
return app != null && UserHandle.isApp(app.info.uid);
}
private class AccessPreference extends AppSwitchPreference
@VisibleForTesting
class AccessPreference extends AppSwitchPreference
implements DataSaverBackend.Listener {
private final AppEntry mEntry;
private final DataUsageState mState;
private final RestrictedPreferenceHelper mHelper;
public AccessPreference(final Context context, AppEntry entry) {
super(context);
setWidgetLayoutResource(R.layout.restricted_switch_widget);
mHelper = new RestrictedPreferenceHelper(context, this, null);
mEntry = entry;
mState = (DataUsageState) mEntry.extraInfo;
mEntry.ensureLabel(getContext());
setDisabledByAdmin(checkIfMeteredDataRestricted(context, entry.info.packageName,
UserHandle.getUserId(entry.info.uid)));
setState();
if (mEntry.icon != null) {
setIcon(mEntry.icon);
@@ -291,12 +303,21 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
}
}
@Override
public void performClick() {
if (!mHelper.performClick()) {
super.performClick();
}
}
// Sets UI state based on whitelist/blacklist status.
private void setState() {
setTitle(mEntry.label);
if (mState != null) {
setChecked(mState.isDataSaverWhitelisted);
if (mState.isDataSaverBlacklisted) {
if (isDisabledByAdmin()) {
setSummary(R.string.disabled_by_admin);
} else if (mState.isDataSaverBlacklisted) {
setSummary(R.string.restrict_background_blacklisted);
} else {
setSummary("");
@@ -323,10 +344,21 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
}
});
}
holder.findViewById(android.R.id.widget_frame)
.setVisibility(mState != null && mState.isDataSaverBlacklisted
? View.INVISIBLE : View.VISIBLE);
final boolean disabledByAdmin = isDisabledByAdmin();
final View widgetFrame = holder.findViewById(android.R.id.widget_frame);
if (disabledByAdmin) {
widgetFrame.setVisibility(View.VISIBLE);
} else {
widgetFrame.setVisibility(mState != null && mState.isDataSaverBlacklisted
? View.INVISIBLE : View.VISIBLE);
}
super.onBindViewHolder(holder);
mHelper.onBindViewHolder(holder);
holder.findViewById(R.id.restricted_icon).setVisibility(
disabledByAdmin ? View.VISIBLE : View.GONE);
holder.findViewById(android.R.id.switch_widget).setVisibility(
disabledByAdmin ? View.GONE : View.VISIBLE);
}
@Override
@@ -348,6 +380,19 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
reuse();
}
}
public void setDisabledByAdmin(EnforcedAdmin admin) {
mHelper.setDisabledByAdmin(admin);
}
public boolean isDisabledByAdmin() {
return mHelper.isDisabledByAdmin();
}
@VisibleForTesting
public AppEntry getEntryForTest() {
return mEntry;
}
}
}