diff options
author | Keyvan Amiri <keyvana@google.com> | 2016-04-13 22:49:55 -0700 |
---|---|---|
committer | Keyvan Amiri <keyvana@google.com> | 2016-04-14 11:25:13 -0700 |
commit | b22473b280b2b893167ffaae24e9b1c43d343a3f (patch) | |
tree | 909c57d46c739e13221714eec4b895721fc15eae /src | |
parent | 68aee0afc31a0971e817e882d9e71abcc5833e81 (diff) | |
download | android_packages_apps_PackageInstaller-b22473b280b2b893167ffaae24e9b1c43d343a3f.tar.gz android_packages_apps_PackageInstaller-b22473b280b2b893167ffaae24e9b1c43d343a3f.tar.bz2 android_packages_apps_PackageInstaller-b22473b280b2b893167ffaae24e9b1c43d343a3f.zip |
Reworked permission UI on TV into the new side-panel leanback style
Reworked all the permission UIs on TV to mesh with the rest of the
settings rendered as leanback-styled side panels with title bars.
The permissions consist of the following components:
* Each individual app permission listing
** Listing of all the permissions together with the apps using
those permissions
Bug: 27344882
Bug: 22481180
Change-Id: I4ab05efd9a4ea6fab7971b89f13d65591a2be8ee
Diffstat (limited to 'src')
9 files changed, 103 insertions, 160 deletions
diff --git a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java index 7ff01fb8..3716293e 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/AppPermissionsFragment.java @@ -177,20 +177,6 @@ public final class AppPermissionsFragment extends SettingsWithHeader if (ab != null) { ab.setTitle(R.string.app_permissions); } - - ViewGroup rootView = (ViewGroup) fragment.getView(); - ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); - if (iconView != null) { - iconView.setImageDrawable(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(label); - } } private void loadPreferences() { diff --git a/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java index f5d7020e..8994cf5d 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java @@ -124,23 +124,6 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment if (context == null || 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 = context.getDrawable(R.drawable.ic_lock); - icon.setTint(context.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() { diff --git a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java index 25689006..1502fcbc 100644 --- a/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/handheld/PermissionAppsFragment.java @@ -155,22 +155,6 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple if (ab != null) { ab.setTitle(fragment.getString(R.string.permission_title, label)); } - - final ViewGroup rootView = (ViewGroup) fragment.getView(); - 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 - iconView.setBackground(icon); - } - final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); - if (titleView != null) { - titleView.setText(label); - } - final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); - if (breadcrumbView != null) { - breadcrumbView.setText(R.string.app_permissions); - } } private void setOnPermissionsLoadedListener(Callback callback) { diff --git a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java index db99538c..7a40856f 100644 --- a/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java @@ -139,7 +139,7 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) .setData(Uri.fromParts("package", mPackageInfo.packageName, null)); } - setHeader(icon, label, infoIntent); + setHeader(icon, label, infoIntent, null); if (mPackageInfo.requestedPermissions != null) { for (int i = 0; i < mPackageInfo.requestedPermissions.length; i++) { diff --git a/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java index 53b23a21..7b2ff566 100644 --- a/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/AppPermissionsFragment.java @@ -28,25 +28,27 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.v14.preference.SwitchPreference; +import android.support.v17.leanback.widget.VerticalGridView; 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.support.v7.preference.PreferenceViewHolder; +import android.support.v7.widget.RecyclerView; import android.util.Log; 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.TextView; import android.widget.Toast; - import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; @@ -103,6 +105,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader return; } + mAppPermissions = new AppPermissions(activity, packageInfo, null, true, new Runnable() { @Override public void run() { @@ -176,25 +179,18 @@ public final class AppPermissionsFragment extends SettingsWithHeader Drawable icon = appInfo.loadIcon(pm); CharSequence label = appInfo.loadLabel(pm); - fragment.setHeader(icon, label, infoIntent); + fragment.setHeader(icon, label, infoIntent, fragment.getString( + R.string.app_permissions_decor_title)); + } - ActionBar ab = activity.getActionBar(); - if (ab != null) { - ab.setTitle(R.string.app_permissions); - } + @Override + protected void updateHeader() { - ViewGroup rootView = (ViewGroup) fragment.getView(); - ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); - if (iconView != null) { - iconView.setImageDrawable(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(label); + super.updateHeader(); + Preference headerLineTwo = getPreferenceScreen().findPreference(HEADER_PREFERENCE_KEY); + if (headerLineTwo != null) { + headerLineTwo.setTitle(mLabel); + headerLineTwo.setIcon(mIcon); } } @@ -207,6 +203,22 @@ public final class AppPermissionsFragment extends SettingsWithHeader PreferenceScreen screen = getPreferenceScreen(); screen.removeAll(); + // Setting the second-line header that contains the app banner icon and its name. + // The styling used is the same as a leanback preference with a customized background color. + Preference headerLineTwo = new Preference(context) { + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + holder.itemView.setBackgroundColor( + getResources().getColor(R.color.lb_header_banner_color)); + } + }; + headerLineTwo.setKey(HEADER_PREFERENCE_KEY); + headerLineTwo.setSelectable(false); + headerLineTwo.setTitle(mLabel); + headerLineTwo.setIcon(mIcon); + screen.addPreference(headerLineTwo); + if (mExtraScreen != null) { mExtraScreen.removeAll(); } @@ -379,7 +391,8 @@ public final class AppPermissionsFragment extends SettingsWithHeader public void onCreate(Bundle savedInstanceState) { mOuterFragment = (AppPermissionsFragment) getTargetFragment(); super.onCreate(savedInstanceState); - setHeader(mOuterFragment.mIcon, mOuterFragment.mLabel, mOuterFragment.mInfoIntent); + setHeader(mOuterFragment.mIcon, mOuterFragment.mLabel, mOuterFragment.mInfoIntent, + null); setHasOptionsMenu(true); } diff --git a/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java index 81550337..fd84edd7 100644 --- a/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/ManagePermissionsFragment.java @@ -42,7 +42,7 @@ import com.android.packageinstaller.util.Utils; import java.util.List; -public final class ManagePermissionsFragment extends PermissionsFrameFragment +public final class ManagePermissionsFragment extends SettingsWithHeader implements PermissionGroups.PermissionsGroupsChangeCallback, OnPreferenceClickListener { private static final String LOG_TAG = "ManagePermissionsFragment"; @@ -117,30 +117,15 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - bindPermissionUi(getActivity(), getView()); + bindPermissionUi(this, getView()); } - private static void bindPermissionUi(@Nullable Context context, @Nullable View rootView) { - if (context == null || rootView == null) { + private static void bindPermissionUi(SettingsWithHeader fragment, @Nullable View rootView) { + if (fragment == null || 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 = context.getDrawable(R.drawable.ic_lock); - icon.setTint(context.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); - } + fragment.setHeader(null, null, null, fragment.getString( + R.string.manage_permissions_decor_title)); } private void updatePermissionsUi() { @@ -227,7 +212,7 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment } } - public static class AdditionalPermissionsFragment extends PermissionsFrameFragment { + public static class AdditionalPermissionsFragment extends SettingsWithHeader { @Override public void onCreate(Bundle icicle) { setLoading(true /* loading */, false /* animate */); @@ -255,7 +240,15 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - bindPermissionUi(getActivity(), getView()); + bindPermissionUi(this, getView()); + } + + private static void bindPermissionUi(SettingsWithHeader fragment, @Nullable View rootView) { + if (fragment == null || rootView == null) { + return; + } + fragment.setHeader(null, null, null, + fragment.getString(R.string.additional_permissions_decor_title)); } @Override diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java index 5a3346fc..4fde4756 100644 --- a/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionAppsFragment.java @@ -15,6 +15,7 @@ */ package com.android.packageinstaller.permission.ui.television; +import android.annotation.Nullable; import android.app.ActionBar; import android.app.AlertDialog; import android.app.Fragment; @@ -53,7 +54,7 @@ import com.android.packageinstaller.util.Utils; import java.util.ArrayList; import java.util.List; -public final class PermissionAppsFragment extends PermissionsFrameFragment implements Callback, +public final class PermissionAppsFragment extends SettingsWithHeader implements Callback, OnPreferenceChangeListener { private static final int MENU_SHOW_SYSTEM = Menu.FIRST; @@ -150,29 +151,12 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple bindUi(this, mPermissionApps); } - private static void bindUi(Fragment fragment, PermissionApps permissionApps) { + private static void bindUi(SettingsWithHeader fragment, PermissionApps permissionApps) { final Drawable icon = permissionApps.getIcon(); final CharSequence label = permissionApps.getLabel(); - final ActionBar ab = fragment.getActivity().getActionBar(); - if (ab != null) { - ab.setTitle(fragment.getString(R.string.permission_title, label)); - } - final ViewGroup rootView = (ViewGroup) fragment.getView(); - 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 - iconView.setBackground(icon); - } - final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); - if (titleView != null) { - titleView.setText(label); - } - final TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); - if (breadcrumbView != null) { - breadcrumbView.setText(R.string.app_permissions); - } + fragment.setHeader(null, null, null, + fragment.getString(R.string.permission_apps_decor_title, label)); } private void setOnPermissionsLoadedListener(Callback callback) { @@ -397,7 +381,7 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple } } - public static class SystemAppsFragment extends PermissionsFrameFragment implements Callback { + public static class SystemAppsFragment extends SettingsWithHeader implements Callback { PermissionAppsFragment mOuterFragment; @Override @@ -424,6 +408,14 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple bindUi(this, permissionApps); } + + private static void bindUi(SettingsWithHeader fragment, PermissionApps permissionApps) { + final CharSequence label = permissionApps.getLabel(); + fragment.setHeader(null, null, null, + fragment.getString(R.string.system_apps_decor_title, label)); + } + + @Override public void onPermissionsLoaded(PermissionApps permissionApps) { setPreferenceScreen(); diff --git a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java index 2c7b91e9..953cde4e 100644 --- a/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java +++ b/src/com/android/packageinstaller/permission/ui/television/PermissionsFrameFragment.java @@ -22,7 +22,6 @@ 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; @@ -30,18 +29,19 @@ import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.TextView; - import com.android.packageinstaller.DeviceUtils; import com.android.packageinstaller.R; public abstract class PermissionsFrameFragment extends PreferenceFragment { - private static final float WINDOW_ALIGNMENT_OFFSET_PERCENT = 50; + // Key identifying the preference used on TV as the extra header in a permission fragment. + // This is to distinguish it from the rest of the preferences + protected static final String HEADER_PREFERENCE_KEY = "HeaderPreferenceKey"; private ViewGroup mPreferencesContainer; - // TV-specific instance variables - @Nullable private VerticalGridView mGridView; + // TV-specific instance variable + @Nullable private RecyclerView mGridView; private View mLoadingView; private ViewGroup mPrefsView; @@ -132,18 +132,13 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { @Override public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, - Bundle savedInstanceState) { - if (DeviceUtils.isTelevision(getContext())) { - 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); - } + Bundle savedInstanceState) { + VerticalGridView verticalGridView = (VerticalGridView) inflater.inflate( + R.layout.leanback_preferences_list, parent, false); + verticalGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_BOTH_EDGE); + verticalGridView.setFocusScrollStrategy(VerticalGridView.FOCUS_SCROLL_ALIGNED); + mGridView = verticalGridView; + return mGridView; } @Override @@ -154,7 +149,7 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { final TextView emptyView = (TextView) getView().findViewById(R.id.no_permissions); onSetEmptyText(emptyView); final RecyclerView recyclerView = getListView(); - adapter.registerAdapterDataObserver(new AdapterDataObserver() { + adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { checkEmpty(); @@ -171,18 +166,20 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { } private void checkEmpty() { - boolean isEmpty = adapter.getItemCount() == 0; + boolean isEmpty = isPreferenceListEmpty(); emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE); - recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE); + recyclerView.setVisibility(isEmpty && adapter.getItemCount() == 0 ? + View.GONE : View.VISIBLE); if (!isEmpty && mGridView != null) { mGridView.requestFocus(); } } }); - boolean isEmpty = adapter.getItemCount() == 0; + boolean isEmpty = isPreferenceListEmpty(); emptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE); - recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE); + recyclerView.setVisibility(isEmpty && adapter.getItemCount() == 0 ? + View.GONE : View.VISIBLE); if (!isEmpty && mGridView != null) { mGridView.requestFocus(); } @@ -191,6 +188,13 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { return adapter; } + private boolean isPreferenceListEmpty() { + PreferenceScreen screen = getPreferenceScreen(); + return screen.getPreferenceCount() == 0 || ( + screen.getPreferenceCount() == 1 && + (screen.findPreference(HEADER_PREFERENCE_KEY) != null)); + } + /** * Hook for subclasses to change the default text of the empty view. * Base implementation leaves the default empty view text. @@ -200,4 +204,3 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { protected void onSetEmptyText(TextView textView) { } } - diff --git a/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java index a401426d..06f7c142 100644 --- a/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java +++ b/src/com/android/packageinstaller/permission/ui/television/SettingsWithHeader.java @@ -25,7 +25,6 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; - import com.android.packageinstaller.DeviceUtils; import com.android.packageinstaller.R; @@ -36,50 +35,40 @@ public abstract class SettingsWithHeader extends PermissionsFrameFragment protected Intent mInfoIntent; protected Drawable mIcon; protected CharSequence mLabel; + protected CharSequence mDecorTitle; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup root = (ViewGroup) super.onCreateView(inflater, container, savedInstanceState); - if (!DeviceUtils.isTelevision(getContext())) { - mHeader = inflater.inflate(R.layout.header, root, false); - getPreferencesContainer().addView(mHeader, 0); - updateHeader(); - } + mHeader = inflater.inflate(R.layout.header, root, false); + getPreferencesContainer().addView(mHeader, 0); + updateHeader(); return root; } - public void setHeader(Drawable icon, CharSequence label, Intent infoIntent) { + public void setHeader(Drawable icon, CharSequence label, Intent infoIntent, + CharSequence decorTitle) { mIcon = icon; mLabel = label; mInfoIntent = infoIntent; + mDecorTitle = decorTitle; updateHeader(); } - private void updateHeader() { - if (mHeader != null) { - final ImageView appIcon = (ImageView) mHeader.findViewById(R.id.icon); - appIcon.setImageDrawable(mIcon); - - final TextView appName = (TextView) mHeader.findViewById(R.id.name); - appName.setText(mLabel); + public View getHeader() { + return mHeader; + } - final View info = mHeader.findViewById(R.id.info); - if (mInfoIntent == null) { - info.setVisibility(View.GONE); - } else { - info.setVisibility(View.VISIBLE); - info.setClickable(true); - info.setOnClickListener(this); - } - } + protected void updateHeader() { + final TextView decorTitle = (TextView) mHeader.findViewById(R.id.decor_title); + decorTitle.setText(mDecorTitle); } @Override public void onClick(View v) { getActivity().startActivity(mInfoIntent); } - } |