summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTodd Volkert <tvolkert@google.com>2015-06-25 15:15:15 -0700
committerTodd Volkert <tvolkert@google.com>2015-07-01 13:24:37 -0700
commitf2736bd4fb3df44ac03385162b9f8d1bf4cb9b61 (patch)
treecfdd2b8ee8fe19cd6329442f1cb76dff456f331e
parent1cc22115a4d3862bef9ddef140a20dc968e3909a (diff)
downloadandroid_packages_apps_PackageInstaller-f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61.tar.gz
android_packages_apps_PackageInstaller-f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61.tar.bz2
android_packages_apps_PackageInstaller-f2736bd4fb3df44ac03385162b9f8d1bf4cb9b61.zip
Migrate package installer permissions fragments to preference support lib.
In order to allow for TV-friendly layouts, this migrates the permissions fragments to the preference support lib, and modifies the necessary layouts and themes to make them work on TV. b/22043727 b/22045650 b/22044940 Change-Id: Ic862effe2c126da78c304983fd06e017c3ee4472
-rw-r--r--Android.mk20
-rw-r--r--res/layout/preference_permissions.xml (renamed from res/layout/preference.xml)3
-rw-r--r--res/layout/preference_permissions_switch.xml (renamed from res/layout/preference_app.xml)3
-rw-r--r--res/values-television/themes.xml4
-rwxr-xr-xres/values/styles.xml13
-rw-r--r--res/values/themes.xml2
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionApps.java4
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionGroups.java2
-rw-r--r--src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java51
-rw-r--r--src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java98
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java35
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java130
-rw-r--r--src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java15
-rw-r--r--src/com/android/packageinstaller/permission/utils/Utils.java4
14 files changed, 242 insertions, 142 deletions
diff --git a/Android.mk b/Android.mk
index 0b2cda8b..d46c7f33 100644
--- a/Android.mk
+++ b/Android.mk
@@ -7,16 +7,26 @@ LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
src/com/android/packageinstaller/EventLogTags.logtags
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \
- android-support-v17-leanback \
- android-support-v7-recyclerview
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ android-support-v4 \
+ android-support-v7-recyclerview \
+ android-support-v7-preference \
+ android-support-v7-appcompat \
+ android-support-v14-preference \
+ android-support-v17-preference-leanback \
+ android-support-v17-leanback
LOCAL_RESOURCE_DIR := \
frameworks/support/v17/leanback/res \
+ frameworks/support/v7/preference/res \
+ frameworks/support/v14/preference/res \
+ frameworks/support/v17/preference-leanback/res \
+ frameworks/support/v7/appcompat/res \
frameworks/support/v7/recyclerview/res \
- $(LOCAL_PATH)/res \
+ $(LOCAL_PATH)/res
-LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages android.support.v17.leanback:android.support.v7.recyclerview
+LOCAL_AAPT_FLAGS := --auto-add-overlay \
+ --extra-packages android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview
LOCAL_PACKAGE_NAME := PackageInstaller
LOCAL_CERTIFICATE := platform
diff --git a/res/layout/preference.xml b/res/layout/preference_permissions.xml
index 4f941f79..536a8f3c 100644
--- a/res/layout/preference.xml
+++ b/res/layout/preference_permissions.xml
@@ -24,7 +24,8 @@
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:background="?android:attr/activatedBackgroundIndicator"
+ android:background="?android:attr/selectableItemBackground"
+ android:focusable="true"
android:clipToPadding="false">
<LinearLayout
diff --git a/res/layout/preference_app.xml b/res/layout/preference_permissions_switch.xml
index 8dc8464e..cf444d96 100644
--- a/res/layout/preference_app.xml
+++ b/res/layout/preference_permissions_switch.xml
@@ -24,7 +24,8 @@
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:background="?android:attr/activatedBackgroundIndicator"
+ android:background="?android:attr/selectableItemBackground"
+ android:focusable="true"
android:clipToPadding="false">
<LinearLayout
diff --git a/res/values-television/themes.xml b/res/values-television/themes.xml
index de4ff092..f6946f68 100644
--- a/res/values-television/themes.xml
+++ b/res/values-television/themes.xml
@@ -16,7 +16,9 @@
-->
<resources>
- <style name="Settings" parent="Theme.Leanback" />
+ <style name="Settings" parent="Theme.Leanback">
+ <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Permissions</item>
+ </style>
<style name="GrantPermissions" parent="Theme.Leanback">
<item name="android:windowIsFloating">true</item>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 888f9d02..e800b56f 100755
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -27,8 +27,17 @@
<style name="Theme.Header.Settings" parent="@android:style/Theme.Material.Settings">
</style>
- <style name="Preference">
- <item name="android:layout">@layout/preference</item>
+ <style name="PreferenceThemeOverlay.v14.Permissions">
+ <item name="preferenceStyle">@style/Preference.Permissions</item>
+ <item name="switchPreferenceStyle">@style/Preference.SwitchPreference.Permissions</item>
+ </style>
+
+ <style name="Preference.Permissions">
+ <item name="layout">@layout/preference_permissions</item>
+ </style>
+
+ <style name="Preference.SwitchPreference.Permissions">
+ <item name="layout">@layout/preference_permissions_switch</item>
</style>
<style name="ActionBar" parent="@android:style/Widget.Material.ActionBar.Solid">
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 2dbb2818..3f8f59d9 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -18,7 +18,7 @@
<resources>
<style name="Settings" parent="@android:style/Theme.Material.Settings">
<item name="android:actionBarStyle">@style/ActionBar</item>
- <item name="@*android:preferenceStyle">@style/Preference</item>
+ <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Permissions</item>
</style>
<style name="GrantPermissions"
diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java
index 417e3274..b8ba650d 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionApps.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java
@@ -22,7 +22,6 @@ import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionInfo;
-import android.graphics.LightingColorFilter;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.UserHandle;
@@ -265,8 +264,7 @@ public class PermissionApps {
} else {
mIcon = mContext.getDrawable(com.android.internal.R.drawable.ic_perm_device_info);
}
- LightingColorFilter filter = new LightingColorFilter(0, 0xffffffff);
- mIcon.setColorFilter(filter);
+ mIcon = Utils.applyTint(mContext, mIcon, android.R.attr.colorControlNormal);
}
public static class PermissionApp implements Comparable<PermissionApp> {
diff --git a/src/com/android/packageinstaller/permission/model/PermissionGroups.java b/src/com/android/packageinstaller/permission/model/PermissionGroups.java
index 62477b88..8ed3ebb0 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionGroups.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionGroups.java
@@ -158,7 +158,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
Set<String> requestedPermissions = new ArraySet<>();
for (PackageInfo installedPackage : installedPackages) {
if (installedPackage.requestedPermissions == null) {
- break;
+ continue;
}
for (String requestedPermission : installedPackage.requestedPermissions) {
requestedPermissions.add(requestedPermission);
diff --git a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
index d88b9adc..39f4cbaf 100644
--- a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
@@ -21,6 +21,7 @@ import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.FragmentTransaction;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
@@ -30,21 +31,19 @@ import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceScreen;
-import android.preference.SwitchPreference;
import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
+import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import android.support.v7.preference.PreferenceScreen;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@@ -115,21 +114,6 @@ public final class AppPermissionsFragment extends SettingsWithHeader
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container,
- false);
- ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container);
- if (prefsContainer == null) {
- prefsContainer = rootView;
- }
- prefsContainer.addView(super.onCreateView(inflater, prefsContainer, savedInstanceState));
- View emptyView = rootView.findViewById(R.id.no_permissions);
- ((ListView) rootView.findViewById(android.R.id.list)).setEmptyView(emptyView);
- return rootView;
- }
-
- @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
bindUi();
@@ -199,25 +183,19 @@ public final class AppPermissionsFragment extends SettingsWithHeader
}
private void bindPermissionsUi() {
- final Activity activity = getActivity();
-
- if (activity == null) {
+ Context context = getPreferenceManager().getContext();
+ if (context == null) {
return;
}
PreferenceScreen screen = getPreferenceScreen();
- if (screen == null) {
- screen = getPreferenceManager().createPreferenceScreen(activity);
- setPreferenceScreen(screen);
- } else {
- screen.removeAll();
- }
+ screen.removeAll();
if (mExtraScreen != null) {
mExtraScreen.removeAll();
}
- final Preference extraPerms = new Preference(activity);
+ final Preference extraPerms = new Preference(context);
extraPerms.setIcon(R.drawable.ic_toc);
extraPerms.setTitle(R.string.additional_permissions);
@@ -227,10 +205,10 @@ public final class AppPermissionsFragment extends SettingsWithHeader
continue;
}
- SwitchPreference preference = new SwitchPreference(activity);
+ SwitchPreference preference = new SwitchPreference(context);
preference.setOnPreferenceChangeListener(this);
preference.setKey(group.getName());
- Drawable icon = Utils.loadDrawable(activity.getPackageManager(),
+ Drawable icon = Utils.loadDrawable(context.getPackageManager(),
group.getIconPkg(), group.getIconResId());
preference.setIcon(Utils.applyTint(getContext(), icon,
android.R.attr.colorControlNormal));
@@ -243,7 +221,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader
screen.addPreference(preference);
} else {
if (mExtraScreen == null) {
- mExtraScreen = getPreferenceManager().createPreferenceScreen(activity);
+ mExtraScreen = getPreferenceManager().createPreferenceScreen(context);
}
mExtraScreen.addPreference(preference);
}
@@ -375,8 +353,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader
public static class AdditionalPermissionsFragment extends SettingsWithHeader {
@Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
AppPermissionsFragment target = (AppPermissionsFragment) getTargetFragment();
setPreferenceScreen(target.mExtraScreen);
// Copy the header.
diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java
index 00d30d19..ab6144be 100644
--- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java
@@ -20,23 +20,21 @@ import android.app.ActionBar;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
+import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceScreen;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import android.support.v7.preference.PreferenceScreen;
import android.util.ArraySet;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
import com.android.packageinstaller.R;
@@ -48,7 +46,7 @@ import com.android.packageinstaller.permission.utils.Utils;
import java.util.List;
-public final class ManagePermissionsFragment extends PreferenceFragment
+public final class ManagePermissionsFragment extends PermissionsFrameFragment
implements PermissionGroups.PermissionsGroupsChangeCallback, OnPreferenceClickListener {
private static final String LOG_TAG = "ManagePermissionsFragment";
@@ -146,60 +144,46 @@ public final class ManagePermissionsFragment extends PreferenceFragment
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container,
- false);
- ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container);
- if (prefsContainer == null) {
- prefsContainer = rootView;
- }
- prefsContainer.addView(super.onCreateView(inflater, prefsContainer, savedInstanceState));
- View emptyView = rootView.findViewById(R.id.no_permissions);
- ((ListView) rootView.findViewById(android.R.id.list)).setEmptyView(emptyView);
- return rootView;
- }
-
- @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- updatePermissionsUi();
- }
- private void updatePermissionsUi() {
Activity activity = getActivity();
-
if (activity == null) {
return;
}
- final ViewGroup rootView = (ViewGroup) getView();
- if (rootView != null) {
- final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon);
- if (iconView != null) {
- // Set the icon as the background instead of the image because ImageView
- // doesn't properly scale vector drawables beyond their intrinsic size
- Drawable icon = activity.getDrawable(R.drawable.ic_lock);
- icon.setTint(activity.getColor(R.color.off_white));
- iconView.setBackground(icon);
- }
- final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title);
- if (titleView != null) {
- titleView.setText(R.string.app_permissions);
- }
- final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb);
- if (breadcrumbView != null) {
- breadcrumbView.setText(R.string.app_permissions_breadcrumb);
- }
+ View rootView = getView();
+ if (rootView == null) {
+ return;
+ }
+
+ ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon);
+ if (iconView != null) {
+ // Set the icon as the background instead of the image because ImageView
+ // doesn't properly scale vector drawables beyond their intrinsic size
+ Drawable icon = activity.getDrawable(R.drawable.ic_lock);
+ icon.setTint(activity.getColor(R.color.off_white));
+ iconView.setBackground(icon);
+ }
+ TextView titleView = (TextView) rootView.findViewById(R.id.lb_title);
+ if (titleView != null) {
+ titleView.setText(R.string.app_permissions);
+ }
+ TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb);
+ if (breadcrumbView != null) {
+ breadcrumbView.setText(R.string.app_permissions_breadcrumb);
+ }
+ }
+
+ private void updatePermissionsUi() {
+ Context context = getPreferenceManager().getContext();
+ if (context == null) {
+ return;
}
List<PermissionGroup> groups = mPermissions.getGroups();
PreferenceScreen screen = getPreferenceScreen();
- if (screen == null) {
- screen = getPreferenceManager().createPreferenceScreen(activity);
- setPreferenceScreen(screen);
- }
// Use this to speed up getting the info for all of the PermissionApps below.
// Create a new one for each refresh to make sure it has fresh data.
@@ -216,10 +200,10 @@ public final class ManagePermissionsFragment extends PreferenceFragment
preference = mExtraScreen.findPreference(group.getName());
}
if (preference == null) {
- preference = new Preference(activity, null);
+ preference = new Preference(context);
preference.setOnPreferenceClickListener(this);
preference.setKey(group.getName());
- preference.setIcon(Utils.applyTint(activity, group.getIcon(),
+ preference.setIcon(Utils.applyTint(context, group.getIcon(),
android.R.attr.colorControlNormal));
preference.setTitle(group.getLabel());
// Set blank summary so that no resizing/jumping happens when the summary is loaded.
@@ -229,7 +213,7 @@ public final class ManagePermissionsFragment extends PreferenceFragment
screen.addPreference(preference);
} else {
if (mExtraScreen == null) {
- mExtraScreen = getPreferenceManager().createPreferenceScreen(activity);
+ mExtraScreen = getPreferenceManager().createPreferenceScreen(context);
}
mExtraScreen.addPreference(preference);
}
@@ -252,9 +236,10 @@ public final class ManagePermissionsFragment extends PreferenceFragment
if (mExtraScreen != null && mExtraScreen.getPreferenceCount() > 0
&& screen.findPreference(EXTRA_PREFS_KEY) == null) {
- Preference extraScreenPreference = new Preference(activity);
+ Preference extraScreenPreference = new Preference(context);
extraScreenPreference.setKey(EXTRA_PREFS_KEY);
- extraScreenPreference.setIcon(R.drawable.ic_toc);
+ extraScreenPreference.setIcon(Utils.applyTint(context, R.drawable.ic_toc,
+ android.R.attr.colorControlNormal));
extraScreenPreference.setTitle(R.string.additional_permissions);
extraScreenPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
@@ -279,7 +264,6 @@ public final class ManagePermissionsFragment extends PreferenceFragment
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getActivity().setTitle(R.string.additional_permissions);
- setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen);
setHasOptionsMenu(true);
}
@@ -299,5 +283,9 @@ public final class ManagePermissionsFragment extends PreferenceFragment
return super.onOptionsItemSelected(item);
}
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferenceScreen(((ManagePermissionsFragment) getTargetFragment()).mExtraScreen);
+ }
}
}
diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java
index ae7560e8..f749089b 100644
--- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java
@@ -24,21 +24,18 @@ import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceScreen;
-import android.preference.SwitchPreference;
+import android.support.v14.preference.SwitchPreference;
import android.support.v4.util.ArrayMap;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
+import android.support.v7.preference.PreferenceScreen;
import android.util.ArraySet;
-import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
import com.android.packageinstaller.R;
@@ -53,7 +50,7 @@ import com.android.packageinstaller.permission.utils.Utils;
import java.util.ArrayList;
import java.util.List;
-public final class PermissionAppsFragment extends PreferenceFragment implements Callback,
+public final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback,
OnPreferenceChangeListener {
private static final int MENU_SHOW_SYSTEM = Menu.FIRST;
@@ -127,19 +124,8 @@ public final class PermissionAppsFragment extends PreferenceFragment implements
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container,
- false);
- ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container);
- if (prefsContainer == null) {
- prefsContainer = rootView;
- }
- prefsContainer.addView(super.onCreateView(inflater, prefsContainer, savedInstanceState));
- TextView emptyView = (TextView) rootView.findViewById(R.id.no_permissions);
- emptyView.setText(R.string.no_apps);
- ((ListView) rootView.findViewById(android.R.id.list)).setEmptyView(emptyView);
- return rootView;
+ protected void onSetEmptyText(TextView textView) {
+ textView.setText(R.string.no_apps);
}
@Override
@@ -177,17 +163,13 @@ public final class PermissionAppsFragment extends PreferenceFragment implements
@Override
public void onPermissionsLoaded(PermissionApps permissionApps) {
- Context context = getActivity();
+ Context context = getPreferenceManager().getContext();
if (context == null) {
return;
}
PreferenceScreen preferences = getPreferenceScreen();
- if (preferences == null) {
- preferences = getPreferenceManager().createPreferenceScreen(getActivity());
- setPreferenceScreen(preferences);
- }
preferences.removeAll();
for (PermissionApp app : permissionApps.getApps()) {
if (!Utils.shouldShowPermission(app)) {
@@ -203,7 +185,6 @@ 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());
diff --git a/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java
new file mode 100644
index 00000000..2abdbd2a
--- /dev/null
+++ b/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java
@@ -0,0 +1,130 @@
+package com.android.packageinstaller.permission.ui;
+
+import android.annotation.Nullable;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.RecyclerView.AdapterDataObserver;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.android.packageinstaller.R;
+
+public abstract class PermissionsFrameFragment extends PreferenceFragment {
+
+ private static final float WINDOW_ALIGNMENT_OFFSET_PERCENT = 50;
+
+ private ViewGroup mPreferencesContainer;
+
+ // TV-specific instance variables
+ @Nullable private VerticalGridView mGridView;
+
+ /**
+ * Returns the view group that holds the preferences objects. This will
+ * only be set after {@link #onCreateView} has been called.
+ */
+ protected final ViewGroup getPreferencesContainer() {
+ return mPreferencesContainer;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container,
+ false);
+ ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container);
+ if (prefsContainer == null) {
+ prefsContainer = rootView;
+ }
+ mPreferencesContainer = (ViewGroup) super.onCreateView(
+ inflater, prefsContainer, savedInstanceState);
+ prefsContainer.addView(mPreferencesContainer);
+ return rootView;
+ }
+
+ @Override
+ public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) {
+ PreferenceScreen preferences = getPreferenceScreen();
+ if (preferences == null) {
+ preferences = getPreferenceManager().createPreferenceScreen(getActivity());
+ setPreferenceScreen(preferences);
+ }
+ }
+
+ @Override
+ public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+ Bundle savedInstanceState) {
+ int uiMode = getResources().getConfiguration().uiMode;
+ if ((uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION) {
+ mGridView = (VerticalGridView) inflater.inflate(
+ R.layout.leanback_preferences_list, parent, false);
+ mGridView.setWindowAlignmentOffset(0);
+ mGridView.setWindowAlignmentOffsetPercent(WINDOW_ALIGNMENT_OFFSET_PERCENT);
+ mGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
+ mGridView.setFocusScrollStrategy(VerticalGridView.FOCUS_SCROLL_ALIGNED);
+ return mGridView;
+ } else {
+ return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
+ }
+ }
+
+ @Override
+ protected RecyclerView.Adapter<?> onCreateAdapter(PreferenceScreen preferenceScreen) {
+ final RecyclerView.Adapter<?> adapter = super.onCreateAdapter(preferenceScreen);
+
+ if (adapter != null) {
+ final TextView emptyView = (TextView) getView().findViewById(R.id.no_permissions);
+ onSetEmptyText(emptyView);
+ final RecyclerView recyclerView = getListView();
+ adapter.registerAdapterDataObserver(new AdapterDataObserver() {
+ @Override
+ public void onChanged() {
+ checkEmpty();
+ }
+
+ @Override
+ public void onItemRangeInserted(int positionStart, int itemCount) {
+ checkEmpty();
+ }
+
+ @Override
+ public void onItemRangeRemoved(int positionStart, int itemCount) {
+ checkEmpty();
+ }
+
+ private void checkEmpty() {
+ boolean isEmpty = adapter.getItemCount() == 0;
+ emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
+ recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE);
+ if (!isEmpty && mGridView != null) {
+ mGridView.requestFocus();
+ }
+ }
+ });
+
+ boolean isEmpty = adapter.getItemCount() == 0;
+ emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
+ recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE);
+ if (!isEmpty && mGridView != null) {
+ mGridView.requestFocus();
+ }
+ }
+
+ return adapter;
+ }
+
+ /**
+ * Hook for subclasses to change the default text of the empty view.
+ * Base implementation leaves the default empty view text.
+ *
+ * @param textView the empty text view
+ */
+ protected void onSetEmptyText(TextView textView) {
+ }
+}
+
diff --git a/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java
index 74146fe6..4135af97 100644
--- a/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java
+++ b/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java
@@ -20,18 +20,17 @@ import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.preference.PreferenceFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.packageinstaller.R;
-public abstract class SettingsWithHeader extends PreferenceFragment implements OnClickListener {
+public abstract class SettingsWithHeader extends PermissionsFrameFragment
+ implements OnClickListener {
private View mHeader;
protected Intent mInfoIntent;
@@ -41,16 +40,16 @@ public abstract class SettingsWithHeader extends PreferenceFragment implements O
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- LinearLayout contentParent =
- (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);
+ ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState);
+
int uiMode = getResources().getConfiguration().uiMode;
if ((uiMode & Configuration.UI_MODE_TYPE_MASK) != Configuration.UI_MODE_TYPE_TELEVISION) {
- mHeader = inflater.inflate(R.layout.header, contentParent, false);
- contentParent.addView(mHeader, 0);
+ mHeader = inflater.inflate(R.layout.header, root, false);
+ getPreferencesContainer().addView(mHeader, 0);
updateHeader();
}
- return contentParent;
+ return root;
}
public void setHeader(Drawable icon, CharSequence label, Intent infoIntent) {
diff --git a/src/com/android/packageinstaller/permission/utils/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java
index 144ff774..940e3597 100644
--- a/src/com/android/packageinstaller/permission/utils/Utils.java
+++ b/src/com/android/packageinstaller/permission/utils/Utils.java
@@ -123,6 +123,10 @@ public class Utils {
return icon;
}
+ public static Drawable applyTint(Context context, int iconResId, int attr) {
+ return applyTint(context, context.getDrawable(iconResId), attr);
+ }
+
public static ArraySet<String> getLauncherPackages(Context context) {
ArraySet<String> launcherPkgs = new ArraySet<>();
for (ResolveInfo info :