OSDN Git Service

Show Location restriction without the Settings item
authorFyodor Kupolov <fkupolov@google.com>
Tue, 23 Dec 2014 23:55:17 +0000 (15:55 -0800)
committerFyodor Kupolov <fkupolov@google.com>
Thu, 15 Jan 2015 19:58:19 +0000 (11:58 -0800)
In App & content access page for restricted profiles, Location restriction
should be shown without its parent element.

Also fixed an issue when app summary may be incomplete.

Bug:15761405,17182612
Change-Id: Ia298cf581413d124d25608f825f97a9e64baf479

res/layout/user_info_header.xml
res/values/strings.xml
src/com/android/settings/users/AppRestrictionsFragment.java

index 35cc466..d6ab6d2 100644 (file)
@@ -31,8 +31,8 @@
         android:layout_weight="1"
         android:id="@+id/app_restrictions_pref"
         android:gravity="center_vertical"
-        android:paddingStart="@*android:dimen/preference_item_padding_side"
-        android:paddingEnd="?android:attr/scrollbarSize"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
         android:background="?android:attr/selectableItemBackground" >
         <LinearLayout
             android:layout_width="wrap_content"
index 2e1477a..f6baf88 100644 (file)
     <string name="app_restrictions_custom_label">Set app restrictions</string>
     <!-- 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>
-    <!-- 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] -->
     <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] -->
     <string name="restriction_wifi_config_title">Wi\u2011Fi and Mobile</string>
index 206ed95..6d4bed1 100644 (file)
@@ -50,9 +50,9 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.ViewGroup;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
-import android.view.ViewGroup;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.Switch;
@@ -180,16 +180,6 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
             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() {
             return restrictions;
         }
@@ -654,25 +644,16 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
         mAppList.removeAll();
         Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
         final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0);
-        int i = 0;
         for (SelectableAppInfo app : mVisibleApps) {
             String packageName = app.packageName;
             if (packageName == null) continue;
             final boolean isSettingsApp = packageName.equals(context.getPackageName());
             AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
             final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
-            p.setIcon(app.icon != null ? app.icon.mutate() : null);
-            p.setChecked(false);
-            p.setTitle(app.activityName);
-            if (app.masterEntry != null) {
-                p.setSummary(context.getString(R.string.user_restrictions_controlled_by,
-                        app.masterEntry.activityName));
+            if (isSettingsApp) {
+                addLocationAppRestrictionsPreference(app, p);
+                continue;
             }
-            p.setKey(getKeyForPackage(packageName));
-            p.setSettingsEnabled((hasSettings || isSettingsApp) && app.masterEntry == null);
-            p.setPersistent(false);
-            p.setOnPreferenceChangeListener(this);
-            p.setOnPreferenceClickListener(this);
             PackageInfo pi = null;
             try {
                 pi = ipm.getPackageInfo(packageName,
@@ -683,44 +664,41 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
             if (pi == null) {
                 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)) {
                 p.setChecked(true);
                 p.setImmutable(true);
                 // 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
                 // able to toggle this app ON (it's ON by default and immutable).
                 // Only do this for restricted profiles, not single-user restrictions
                 // Also don't do this for slave icons
-                if (hasSettings && app.masterEntry == null) {
+                if (app.masterEntry == null) {
                     requestRestrictionsForApp(packageName, p, false);
                 }
             } else if (!mNewUser && isAppEnabledForUser(pi)) {
                 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) {
                 p.setImmutable(true);
                 p.setChecked(mSelectedPackages.get(packageName));
             }
-            mAppList.addPreference(p);
-            if (isSettingsApp) {
-                p.setOrder(MAX_APP_RESTRICTIONS * 1);
-            } else {
-                p.setOrder(MAX_APP_RESTRICTIONS * (i + 2));
-            }
-            mSelectedPackages.put(packageName, p.isChecked());
-            mAppListChanged = true;
-            i++;
+            p.setOrder(MAX_APP_RESTRICTIONS * (mAppList.getPreferenceCount() + 2));
+            addToAppList(p, packageName);
         }
+        mAppListChanged = true;
         // 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.
         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) {
         return PKG_PREFIX + packageName;
     }
@@ -772,6 +796,12 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
             } else if (!pref.isImmutable()) {
                 pref.setChecked(!pref.isChecked());
                 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());
                 if (pref.isChecked() && pref.hasSettings
                         && pref.restrictions == null) {
@@ -822,13 +852,9 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
                         default:
                             continue;
                         }
-                        if (packageName.equals(getActivity().getPackageName())) {
-                            RestrictionUtils.setRestrictions(getActivity(), restrictions, mUser);
-                        } else {
-                            mUserManager.setApplicationRestrictions(packageName,
-                                    RestrictionUtils.restrictionsToBundle(restrictions),
-                                    mUser);
-                        }
+                        mUserManager.setApplicationRestrictions(packageName,
+                                RestrictionUtils.restrictionsToBundle(restrictions),
+                                mUser);
                         break;
                     }
                 }
@@ -850,14 +876,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
                 removeRestrictionsForApp(preference);
             } else {
                 String packageName = preference.getKey().substring(PKG_PREFIX.length());
-                if (packageName.equals(getActivity().getPackageName())) {
-                    // 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*/);
-                }
+                requestRestrictionsForApp(packageName, preference, true /*invoke if custom*/);
             }
             preference.setPanelOpen(!preference.isPanelOpen());
         }
@@ -979,9 +998,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
                 ((MultiSelectListPreference)p).setEntryValues(entry.getChoiceValues());
                 ((MultiSelectListPreference)p).setEntries(entry.getChoiceEntries());
                 HashSet<String> set = new HashSet<String>();
-                for (String s : entry.getAllSelectedStrings()) {
-                    set.add(s);
-                }
+                Collections.addAll(set, entry.getAllSelectedStrings());
                 ((MultiSelectListPreference)p).setValues(set);
                 ((MultiSelectListPreference)p).setDialogTitle(entry.getTitle());
                 break;