diff options
-rw-r--r-- | res/layout/preference.xml | 79 | ||||
-rw-r--r-- | res/layout/preference_app.xml | 79 | ||||
-rwxr-xr-x | res/values/styles.xml | 8 | ||||
-rw-r--r-- | res/values/themes.xml | 5 | ||||
-rw-r--r-- | src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java | 81 | ||||
-rw-r--r-- | src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java | 1 |
6 files changed, 218 insertions, 35 deletions
diff --git a/res/layout/preference.xml b/res/layout/preference.xml new file mode 100644 index 00000000..4f941f79 --- /dev/null +++ b/res/layout/preference.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- Based off frameworks/base/core/res/res/layout/preference_material.xml + except that this has the negative margin on the image removed + and has a set icon size (and some padding to realign). --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:gravity="center_vertical" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:background="?android:attr/activatedBackgroundIndicator" + android:clipToPadding="false"> + + <LinearLayout + android:id="@*android:id/icon_frame" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="start|center_vertical" + android:orientation="horizontal" + android:paddingEnd="32dp" + android:paddingTop="4dp" + android:paddingBottom="4dp"> + <com.android.internal.widget.PreferenceImageView + android:id="@android:id/icon" + android:layout_width="24dp" + android:layout_height="24dp" + android:scaleType="fitCenter" /> + </LinearLayout> + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:paddingTop="16dp" + android:paddingBottom="16dp"> + + <TextView android:id="@android:id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceListItem" + android:ellipsize="marquee" /> + + <TextView android:id="@android:id/summary" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@android:id/title" + android:layout_alignStart="@android:id/title" + android:textAppearance="?android:attr/textAppearanceListItemSecondary" + android:textColor="?android:attr/textColorSecondary" + android:maxLines="10" /> + + </RelativeLayout> + + <!-- Preference should place its actual preference widget here. --> + <LinearLayout android:id="@android:id/widget_frame" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="end|center_vertical" + android:paddingStart="16dp" + android:orientation="vertical" /> + +</LinearLayout> diff --git a/res/layout/preference_app.xml b/res/layout/preference_app.xml new file mode 100644 index 00000000..8dc8464e --- /dev/null +++ b/res/layout/preference_app.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- Based off frameworks/base/core/res/res/layout/preference_material.xml + except that this has the negative margin on the image removed + and has a set icon size (and some padding to align). --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:gravity="center_vertical" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:background="?android:attr/activatedBackgroundIndicator" + android:clipToPadding="false"> + + <LinearLayout + android:id="@*android:id/icon_frame" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="start|center_vertical" + android:orientation="horizontal" + android:paddingEnd="20dp" + android:paddingTop="4dp" + android:paddingBottom="4dp"> + <com.android.internal.widget.PreferenceImageView + android:id="@android:id/icon" + android:layout_width="36dp" + android:layout_height="36dp" + android:scaleType="fitCenter" /> + </LinearLayout> + + <RelativeLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:paddingTop="16dp" + android:paddingBottom="16dp"> + + <TextView android:id="@android:id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceListItem" + android:ellipsize="marquee" /> + + <TextView android:id="@android:id/summary" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@android:id/title" + android:layout_alignStart="@android:id/title" + android:textAppearance="?android:attr/textAppearanceListItemSecondary" + android:textColor="?android:attr/textColorSecondary" + android:maxLines="10" /> + + </RelativeLayout> + + <!-- Preference should place its actual preference widget here. --> + <LinearLayout android:id="@android:id/widget_frame" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:gravity="end|center_vertical" + android:paddingStart="16dp" + android:orientation="vertical" /> + +</LinearLayout> diff --git a/res/values/styles.xml b/res/values/styles.xml index c67f043a..888f9d02 100755 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -26,4 +26,12 @@ <style name="Theme.Header.Settings" parent="@android:style/Theme.Material.Settings"> </style> + + <style name="Preference"> + <item name="android:layout">@layout/preference</item> + </style> + + <style name="ActionBar" parent="@android:style/Widget.Material.ActionBar.Solid"> + <item name="android:contentInsetStart">72dp</item> + </style> </resources> diff --git a/res/values/themes.xml b/res/values/themes.xml index 9e8f0298..83ca6ebb 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -16,7 +16,10 @@ --> <resources> - <style name="Settings" parent="@android:style/Theme.Material.Settings" /> + <style name="Settings" parent="@android:style/Theme.Material.Settings"> + <item name="android:actionBarStyle">@style/ActionBar</item> + <item name="@*android:preferenceStyle">@style/Preference</item> + </style> <style name="GrantPermissions" parent="@android:style/Theme.Material.DayNight.Dialog.NoActionBar" /> diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java index 24f2c9e1..2122ad26 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java @@ -20,8 +20,6 @@ import android.app.Activity; import android.app.FragmentTransaction; import android.content.ActivityNotFoundException; import android.content.Intent; -import android.content.res.Resources; -import android.content.res.Resources.Theme; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; @@ -31,13 +29,12 @@ import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.View; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.PermissionApps; +import com.android.packageinstaller.permission.model.PermissionApps.PmCache; import com.android.packageinstaller.permission.model.PermissionGroup; import com.android.packageinstaller.permission.model.PermissionGroups; -import com.android.packageinstaller.permission.model.PermissionApps.PmCache; import com.android.packageinstaller.permission.utils.Utils; import java.util.List; @@ -48,6 +45,8 @@ public final class ManagePermissionsFragment extends PreferenceFragment private static final String OS_PKG = "android"; + private static final String EXTRA_PREFS_KEY = "extra_prefs_key"; + private PermissionGroups mPermissions; private PreferenceScreen mExtraScreen; @@ -147,11 +146,6 @@ public final class ManagePermissionsFragment extends PreferenceFragment if (screen == null) { screen = getPreferenceManager().createPreferenceScreen(activity); setPreferenceScreen(screen); - } else { - screen.removeAll(); - if (mExtraScreen != null) { - mExtraScreen.removeAll(); - } } // Use this to speed up getting the info for all of the PermissionApps below. @@ -164,13 +158,29 @@ public final class ManagePermissionsFragment extends PreferenceFragment continue; } - final Preference preference = new Preference(activity); - preference.setOnPreferenceClickListener(this); - preference.setKey(group.getName()); - preference.setIcon(Utils.applyTint(getContext(), group.getIcon(), - android.R.attr.colorControlNormal)); - preference.setTitle(group.getLabel()); - preference.setPersistent(false); + Preference preference = findPreference(group.getName()); + if (preference == null && mExtraScreen != null) { + preference = mExtraScreen.findPreference(group.getName()); + } + if (preference == null) { + preference = new Preference(activity, null); + preference.setOnPreferenceClickListener(this); + preference.setKey(group.getName()); + preference.setIcon(Utils.applyTint(activity, group.getIcon(), + android.R.attr.colorControlNormal)); + preference.setTitle(group.getLabel()); + preference.setPersistent(false); + if (group.getDeclaringPackage().equals(OS_PKG)) { + screen.addPreference(preference); + } else { + if (mExtraScreen == null) { + mExtraScreen = getPreferenceManager().createPreferenceScreen(activity); + } + mExtraScreen.addPreference(preference); + } + } + final Preference finalPref = preference; + new PermissionApps(getContext(), group.getName(), new PermissionApps.Callback() { @Override public void onPermissionsLoaded(PermissionApps permissionApps) { @@ -179,23 +189,16 @@ public final class ManagePermissionsFragment extends PreferenceFragment } int granted = permissionApps.getGrantedCount(); int total = permissionApps.getTotalCount(); - preference.setSummary(getString(R.string.app_permissions_group_summary, + finalPref.setSummary(getString(R.string.app_permissions_group_summary, granted, total)); } }, cache).refresh(false); - - if (group.getDeclaringPackage().equals(OS_PKG)) { - screen.addPreference(preference); - } else { - if (mExtraScreen == null) { - mExtraScreen = getPreferenceManager().createPreferenceScreen(activity); - } - mExtraScreen.addPreference(preference); - } } - if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0) { + if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0 + && screen.findPreference(EXTRA_PREFS_KEY) == null) { Preference extraScreenPreference = new Preference(activity); + extraScreenPreference.setKey(EXTRA_PREFS_KEY); extraScreenPreference.setIcon(R.drawable.ic_toc); extraScreenPreference.setTitle(R.string.additional_permissions); extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @@ -216,20 +219,30 @@ public final class ManagePermissionsFragment extends PreferenceFragment } } - public static class AdditionalPermissionsFragment extends SettingsWithHeader { + public static class AdditionalPermissionsFragment extends PreferenceFragment { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + getActivity().setTitle(R.string.additional_permissions); setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen); + setHasOptionsMenu(true); } @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - Resources resources = getResources(); - Theme theme = getActivity().getTheme(); - setHeader(resources.getDrawable(R.drawable.ic_toc, theme), - getString(R.string.additional_permissions), null); + public void onDestroy() { + getActivity().setTitle(R.string.app_permissions); + super.onDestroy(); } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getFragmentManager().popBackStack(); + return true; + } + return super.onOptionsItemSelected(item); + } + } } diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java index eb56e754..3c05c463 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java @@ -195,6 +195,7 @@ public final class PermissionAppsFragment extends PreferenceFragment implements } if (pref == null) { pref = new SwitchPreference(context); + pref.setLayoutResource(R.layout.preference_app); pref.setOnPreferenceChangeListener(this); pref.setKey(app.getKey()); pref.setIcon(app.getIcon()); |