Merge "Show Location restriction without the Settings item"
This commit is contained in:
committed by
Android (Google) Code Review
commit
b0afc2a0dc
@@ -31,8 +31,8 @@
|
|||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:id="@+id/app_restrictions_pref"
|
android:id="@+id/app_restrictions_pref"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:paddingStart="@*android:dimen/preference_item_padding_side"
|
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||||
android:paddingEnd="?android:attr/scrollbarSize"
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
android:background="?android:attr/selectableItemBackground" >
|
android:background="?android:attr/selectableItemBackground" >
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@@ -5460,10 +5460,10 @@
|
|||||||
<string name="app_restrictions_custom_label">Set app restrictions</string>
|
<string name="app_restrictions_custom_label">Set app restrictions</string>
|
||||||
<!-- Summary for app entries that are controlled by another entry [CHAR LIMIT=none] -->
|
<!-- Summary for app entries that are controlled by another entry [CHAR LIMIT=none] -->
|
||||||
<string name="user_restrictions_controlled_by">Controlled by <xliff:g id="app">%1$s</xliff:g></string>
|
<string name="user_restrictions_controlled_by">Controlled by <xliff:g id="app">%1$s</xliff:g></string>
|
||||||
<!-- Summary for apps that aren't supported in limited users [CHAR LIMIT=none] -->
|
|
||||||
<string name="app_not_supported_in_limited">This app is not supported in restricted profiles</string>
|
|
||||||
<!-- Summary text for apps that are allowed to access accounts from the primary user [CHAR LIMIT=none] -->
|
<!-- Summary text for apps that are allowed to access accounts from the primary user [CHAR LIMIT=none] -->
|
||||||
<string name="app_sees_restricted_accounts">This app can access your accounts</string>
|
<string name="app_sees_restricted_accounts">This app can access your accounts</string>
|
||||||
|
<!-- Summary for a case when app entries that are controlled by another entry and app can access user accounts [CHAR LIMIT=none] -->
|
||||||
|
<string name="app_sees_restricted_accounts_and_controlled_by">This app can access your accounts. Controlled by <xliff:g id="app">%1$s</xliff:g></string>
|
||||||
|
|
||||||
<!-- Restrictions title for configuring wifi and mobile [CHAR LIMIT=35] -->
|
<!-- Restrictions title for configuring wifi and mobile [CHAR LIMIT=35] -->
|
||||||
<string name="restriction_wifi_config_title">Wi\u2011Fi and Mobile</string>
|
<string name="restriction_wifi_config_title">Wi\u2011Fi and Mobile</string>
|
||||||
|
@@ -50,9 +50,9 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
|
import android.view.ViewGroup;
|
||||||
import android.view.inputmethod.InputMethodInfo;
|
import android.view.inputmethod.InputMethodInfo;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
@@ -180,16 +180,6 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
return immutable;
|
return immutable;
|
||||||
}
|
}
|
||||||
|
|
||||||
RestrictionEntry getRestriction(String key) {
|
|
||||||
if (restrictions == null) return null;
|
|
||||||
for (RestrictionEntry entry : restrictions) {
|
|
||||||
if (entry.getKey().equals(key)) {
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<RestrictionEntry> getRestrictions() {
|
ArrayList<RestrictionEntry> getRestrictions() {
|
||||||
return restrictions;
|
return restrictions;
|
||||||
}
|
}
|
||||||
@@ -654,25 +644,16 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
mAppList.removeAll();
|
mAppList.removeAll();
|
||||||
Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
|
Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
|
||||||
final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0);
|
final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0);
|
||||||
int i = 0;
|
|
||||||
for (SelectableAppInfo app : mVisibleApps) {
|
for (SelectableAppInfo app : mVisibleApps) {
|
||||||
String packageName = app.packageName;
|
String packageName = app.packageName;
|
||||||
if (packageName == null) continue;
|
if (packageName == null) continue;
|
||||||
final boolean isSettingsApp = packageName.equals(context.getPackageName());
|
final boolean isSettingsApp = packageName.equals(context.getPackageName());
|
||||||
AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
|
AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
|
||||||
final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
|
final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
|
||||||
p.setIcon(app.icon != null ? app.icon.mutate() : null);
|
if (isSettingsApp) {
|
||||||
p.setChecked(false);
|
addLocationAppRestrictionsPreference(app, p);
|
||||||
p.setTitle(app.activityName);
|
continue;
|
||||||
if (app.masterEntry != null) {
|
|
||||||
p.setSummary(context.getString(R.string.user_restrictions_controlled_by,
|
|
||||||
app.masterEntry.activityName));
|
|
||||||
}
|
}
|
||||||
p.setKey(getKeyForPackage(packageName));
|
|
||||||
p.setSettingsEnabled((hasSettings || isSettingsApp) && app.masterEntry == null);
|
|
||||||
p.setPersistent(false);
|
|
||||||
p.setOnPreferenceChangeListener(this);
|
|
||||||
p.setOnPreferenceClickListener(this);
|
|
||||||
PackageInfo pi = null;
|
PackageInfo pi = null;
|
||||||
try {
|
try {
|
||||||
pi = ipm.getPackageInfo(packageName,
|
pi = ipm.getPackageInfo(packageName,
|
||||||
@@ -683,44 +664,41 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
if (pi == null) {
|
if (pi == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (mRestrictedProfile && isAppUnsupportedInRestrictedProfile(pi)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
p.setIcon(app.icon != null ? app.icon.mutate() : null);
|
||||||
|
p.setChecked(false);
|
||||||
|
p.setTitle(app.activityName);
|
||||||
|
p.setKey(getKeyForPackage(packageName));
|
||||||
|
p.setSettingsEnabled(hasSettings && app.masterEntry == null);
|
||||||
|
p.setPersistent(false);
|
||||||
|
p.setOnPreferenceChangeListener(this);
|
||||||
|
p.setOnPreferenceClickListener(this);
|
||||||
|
p.setSummary(getPackageSummary(pi, app));
|
||||||
if (pi.requiredForAllUsers || isPlatformSigned(pi)) {
|
if (pi.requiredForAllUsers || isPlatformSigned(pi)) {
|
||||||
p.setChecked(true);
|
p.setChecked(true);
|
||||||
p.setImmutable(true);
|
p.setImmutable(true);
|
||||||
// If the app is required and has no restrictions, skip showing it
|
// If the app is required and has no restrictions, skip showing it
|
||||||
if (!hasSettings && !isSettingsApp) continue;
|
if (!hasSettings) continue;
|
||||||
// Get and populate the defaults, since the user is not going to be
|
// Get and populate the defaults, since the user is not going to be
|
||||||
// able to toggle this app ON (it's ON by default and immutable).
|
// able to toggle this app ON (it's ON by default and immutable).
|
||||||
// Only do this for restricted profiles, not single-user restrictions
|
// Only do this for restricted profiles, not single-user restrictions
|
||||||
// Also don't do this for slave icons
|
// Also don't do this for slave icons
|
||||||
if (hasSettings && app.masterEntry == null) {
|
if (app.masterEntry == null) {
|
||||||
requestRestrictionsForApp(packageName, p, false);
|
requestRestrictionsForApp(packageName, p, false);
|
||||||
}
|
}
|
||||||
} else if (!mNewUser && isAppEnabledForUser(pi)) {
|
} else if (!mNewUser && isAppEnabledForUser(pi)) {
|
||||||
p.setChecked(true);
|
p.setChecked(true);
|
||||||
}
|
}
|
||||||
if (mRestrictedProfile
|
|
||||||
&& pi.requiredAccountType != null && pi.restrictedAccountType == null) {
|
|
||||||
p.setChecked(false);
|
|
||||||
p.setImmutable(true);
|
|
||||||
p.setSummary(R.string.app_not_supported_in_limited);
|
|
||||||
}
|
|
||||||
if (mRestrictedProfile && pi.restrictedAccountType != null) {
|
|
||||||
p.setSummary(R.string.app_sees_restricted_accounts);
|
|
||||||
}
|
|
||||||
if (app.masterEntry != null) {
|
if (app.masterEntry != null) {
|
||||||
p.setImmutable(true);
|
p.setImmutable(true);
|
||||||
p.setChecked(mSelectedPackages.get(packageName));
|
p.setChecked(mSelectedPackages.get(packageName));
|
||||||
}
|
}
|
||||||
mAppList.addPreference(p);
|
p.setOrder(MAX_APP_RESTRICTIONS * (mAppList.getPreferenceCount() + 2));
|
||||||
if (isSettingsApp) {
|
addToAppList(p, packageName);
|
||||||
p.setOrder(MAX_APP_RESTRICTIONS * 1);
|
|
||||||
} else {
|
|
||||||
p.setOrder(MAX_APP_RESTRICTIONS * (i + 2));
|
|
||||||
}
|
|
||||||
mSelectedPackages.put(packageName, p.isChecked());
|
|
||||||
mAppListChanged = true;
|
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
mAppListChanged = true;
|
||||||
// If this is the first time for a new profile, install/uninstall default apps for profile
|
// If this is the first time for a new profile, install/uninstall default apps for profile
|
||||||
// to avoid taking the hit in onPause(), which can cause race conditions on user switch.
|
// to avoid taking the hit in onPause(), which can cause race conditions on user switch.
|
||||||
if (mNewUser && mFirstTime) {
|
if (mNewUser && mFirstTime) {
|
||||||
@@ -729,6 +707,52 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getPackageSummary(PackageInfo pi, SelectableAppInfo app) {
|
||||||
|
// Check for 3 cases:
|
||||||
|
// - Slave entry that can see primary user accounts
|
||||||
|
// - Slave entry that cannot see primary user accounts
|
||||||
|
// - Master entry that can see primary user accounts
|
||||||
|
// Otherwise no summary is returned
|
||||||
|
if (app.masterEntry != null) {
|
||||||
|
if (mRestrictedProfile && pi.restrictedAccountType != null) {
|
||||||
|
return getString(R.string.app_sees_restricted_accounts_and_controlled_by,
|
||||||
|
app.masterEntry.activityName);
|
||||||
|
}
|
||||||
|
return getString(R.string.user_restrictions_controlled_by,
|
||||||
|
app.masterEntry.activityName);
|
||||||
|
} else if (pi.restrictedAccountType != null) {
|
||||||
|
return getString(R.string.app_sees_restricted_accounts);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isAppUnsupportedInRestrictedProfile(PackageInfo pi) {
|
||||||
|
return pi.requiredAccountType != null && pi.restrictedAccountType == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addLocationAppRestrictionsPreference(SelectableAppInfo app,
|
||||||
|
AppRestrictionsPreference p) {
|
||||||
|
String packageName = app.packageName;
|
||||||
|
p.setIcon(R.drawable.ic_settings_location);
|
||||||
|
p.setKey(getKeyForPackage(packageName));
|
||||||
|
ArrayList<RestrictionEntry> restrictions = RestrictionUtils.getRestrictions(
|
||||||
|
getActivity(), mUser);
|
||||||
|
RestrictionEntry locationRestriction = restrictions.get(0);
|
||||||
|
p.setTitle(locationRestriction.getTitle());
|
||||||
|
p.setRestrictions(restrictions);
|
||||||
|
p.setSummary(locationRestriction.getDescription());
|
||||||
|
p.setChecked(locationRestriction.getSelectedState());
|
||||||
|
p.setPersistent(false);
|
||||||
|
p.setOnPreferenceClickListener(this);
|
||||||
|
p.setOrder(MAX_APP_RESTRICTIONS);
|
||||||
|
addToAppList(p, packageName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addToAppList(AppRestrictionsPreference p, String packageName) {
|
||||||
|
mSelectedPackages.put(packageName, p.isChecked());
|
||||||
|
mAppList.addPreference(p);
|
||||||
|
}
|
||||||
|
|
||||||
private String getKeyForPackage(String packageName) {
|
private String getKeyForPackage(String packageName) {
|
||||||
return PKG_PREFIX + packageName;
|
return PKG_PREFIX + packageName;
|
||||||
}
|
}
|
||||||
@@ -772,6 +796,12 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
} else if (!pref.isImmutable()) {
|
} else if (!pref.isImmutable()) {
|
||||||
pref.setChecked(!pref.isChecked());
|
pref.setChecked(!pref.isChecked());
|
||||||
final String packageName = pref.getKey().substring(PKG_PREFIX.length());
|
final String packageName = pref.getKey().substring(PKG_PREFIX.length());
|
||||||
|
// Settings/Location is handled as a top-level entry
|
||||||
|
if (packageName.equals(getActivity().getPackageName())) {
|
||||||
|
pref.restrictions.get(0).setSelectedState(pref.isChecked());
|
||||||
|
RestrictionUtils.setRestrictions(getActivity(), pref.restrictions, mUser);
|
||||||
|
return;
|
||||||
|
}
|
||||||
mSelectedPackages.put(packageName, pref.isChecked());
|
mSelectedPackages.put(packageName, pref.isChecked());
|
||||||
if (pref.isChecked() && pref.hasSettings
|
if (pref.isChecked() && pref.hasSettings
|
||||||
&& pref.restrictions == null) {
|
&& pref.restrictions == null) {
|
||||||
@@ -822,13 +852,9 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (packageName.equals(getActivity().getPackageName())) {
|
mUserManager.setApplicationRestrictions(packageName,
|
||||||
RestrictionUtils.setRestrictions(getActivity(), restrictions, mUser);
|
RestrictionUtils.restrictionsToBundle(restrictions),
|
||||||
} else {
|
mUser);
|
||||||
mUserManager.setApplicationRestrictions(packageName,
|
|
||||||
RestrictionUtils.restrictionsToBundle(restrictions),
|
|
||||||
mUser);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -850,14 +876,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
removeRestrictionsForApp(preference);
|
removeRestrictionsForApp(preference);
|
||||||
} else {
|
} else {
|
||||||
String packageName = preference.getKey().substring(PKG_PREFIX.length());
|
String packageName = preference.getKey().substring(PKG_PREFIX.length());
|
||||||
if (packageName.equals(getActivity().getPackageName())) {
|
requestRestrictionsForApp(packageName, preference, true /*invoke if custom*/);
|
||||||
// Settings, fake it by using user restrictions
|
|
||||||
ArrayList<RestrictionEntry> restrictions = RestrictionUtils.getRestrictions(
|
|
||||||
getActivity(), mUser);
|
|
||||||
onRestrictionsReceived(preference, packageName, restrictions);
|
|
||||||
} else {
|
|
||||||
requestRestrictionsForApp(packageName, preference, true /*invoke if custom*/);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
preference.setPanelOpen(!preference.isPanelOpen());
|
preference.setPanelOpen(!preference.isPanelOpen());
|
||||||
}
|
}
|
||||||
@@ -979,9 +998,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
|
|||||||
((MultiSelectListPreference)p).setEntryValues(entry.getChoiceValues());
|
((MultiSelectListPreference)p).setEntryValues(entry.getChoiceValues());
|
||||||
((MultiSelectListPreference)p).setEntries(entry.getChoiceEntries());
|
((MultiSelectListPreference)p).setEntries(entry.getChoiceEntries());
|
||||||
HashSet<String> set = new HashSet<String>();
|
HashSet<String> set = new HashSet<String>();
|
||||||
for (String s : entry.getAllSelectedStrings()) {
|
Collections.addAll(set, entry.getAllSelectedStrings());
|
||||||
set.add(s);
|
|
||||||
}
|
|
||||||
((MultiSelectListPreference)p).setValues(set);
|
((MultiSelectListPreference)p).setValues(set);
|
||||||
((MultiSelectListPreference)p).setDialogTitle(entry.getTitle());
|
((MultiSelectListPreference)p).setDialogTitle(entry.getTitle());
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user