From f5f6b1b113bb39a268948c19a39833d3ff839d32 Mon Sep 17 00:00:00 2001 From: Todd Volkert Date: Tue, 14 Jul 2015 11:19:48 -0700 Subject: Add "show additional permissions" screen to app permissions for TV. This also cleans up some code: 1) Factor out isTelevision into Utils.isTelevision() and call it where we were previously inlining that code 2) Make AppPermissionsFragment work better with config changes and screen rotation changes (the extra screen wasn't working at all with such changes) b/22045242 Change-Id: I937eaa67f19f44b5e1a76a58e3fdd799ae36e73b --- .../permission/ui/AppPermissionsFragment.java | 169 ++++++++++++--------- .../permission/ui/GrantPermissionsActivity.java | 7 +- .../permission/ui/ManagePermissionsFragment.java | 6 +- .../permission/ui/PermissionAppsFragment.java | 4 +- .../permission/ui/PermissionsFrameFragment.java | 5 +- .../permission/ui/SettingsWithHeader.java | 5 +- .../packageinstaller/permission/utils/Utils.java | 6 + 7 files changed, 111 insertions(+), 91 deletions(-) (limited to 'src/com/android') diff --git a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java index e942ab60..eed23f94 100644 --- a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java @@ -21,7 +21,6 @@ import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; -import android.app.FragmentTransaction; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -75,33 +74,49 @@ public final class AppPermissionsFragment extends SettingsWithHeader private boolean mShowLegacyPermissions; public static AppPermissionsFragment newInstance(String packageName) { - AppPermissionsFragment instance = new AppPermissionsFragment(); + return setPackageName(new AppPermissionsFragment(), packageName); + } + + private static T setPackageName(T fragment, String packageName) { Bundle arguments = new Bundle(); arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName); - instance.setArguments(arguments); - return instance; + fragment.setArguments(arguments); + return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setLoading(true /* loading */, false /* animate */); - mHasConfirmedRevoke = false; setHasOptionsMenu(true); final ActionBar ab = getActivity().getActionBar(); if (ab != null) { ab.setDisplayHomeAsUpEnabled(true); } + + String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + Activity activity = getActivity(); + PackageInfo packageInfo = getPackageInfo(activity, packageName); + if (packageInfo == null) { + Toast.makeText(activity, R.string.app_not_found_dlg_title, Toast.LENGTH_LONG).show(); + activity.finish(); + return; + } + + mAppPermissions = new AppPermissions(activity, packageInfo, null, true, new Runnable() { + @Override + public void run() { + getActivity().finish(); + } + }); + mAppPermissions.refresh(); + loadPreferences(); } @Override public void onResume() { super.onResume(); - final ActionBar ab = getActivity().getActionBar(); - if (ab != null) { - ab.setTitle(R.string.app_permissions); - } - updateUi(); + setPreferencesCheckedState(); } @Override @@ -114,17 +129,17 @@ public final class AppPermissionsFragment extends SettingsWithHeader case R.id.toggle_legacy_permissions: { mShowLegacyPermissions = !mShowLegacyPermissions; - bindPermissionsUi(); + loadPreferences(); return true; } case MENU_ALL_PERMS: { Fragment frag = AllAppPermissionsFragment.newInstance( getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(android.R.id.content, frag); - ft.addToBackStack("AllPerms"); - ft.commit(); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack("AllPerms") + .commit(); return true; } } @@ -134,7 +149,9 @@ public final class AppPermissionsFragment extends SettingsWithHeader @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - bindUi(); + if (mAppPermissions != null) { + bindUi(this, mAppPermissions.getPackageInfo()); + } } @Override @@ -154,54 +171,41 @@ public final class AppPermissionsFragment extends SettingsWithHeader } } - private void bindUi() { - String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); - - final Activity activity = getActivity(); - PackageInfo packageInfo = getPackageInfo(packageName); - if (packageInfo == null) { - Toast.makeText(activity, R.string.app_not_found_dlg_title, Toast.LENGTH_LONG) - .show(); - activity.finish(); - return; - } - final PackageManager pm = activity.getPackageManager(); + private static void bindUi(SettingsWithHeader fragment, PackageInfo packageInfo) { + Activity activity = fragment.getActivity(); + PackageManager pm = activity.getPackageManager(); ApplicationInfo appInfo = packageInfo.applicationInfo; - final Drawable icon = appInfo.loadIcon(pm); - final CharSequence label = appInfo.loadLabel(pm); Intent infoIntent = null; - if (!getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) { + if (!activity.getIntent().getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) { infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - .setData(Uri.fromParts("package", packageName, null)); + .setData(Uri.fromParts("package", packageInfo.packageName, null)); } - setHeader(icon, label, infoIntent); - final ViewGroup rootView = (ViewGroup) getView(); - final ImageView iconView = (ImageView) rootView.findViewById(R.id.lb_icon); + Drawable icon = appInfo.loadIcon(pm); + CharSequence label = appInfo.loadLabel(pm); + fragment.setHeader(icon, label, infoIntent); + + ActionBar ab = activity.getActionBar(); + 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); } - final TextView titleView = (TextView) rootView.findViewById(R.id.lb_title); + 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); + TextView breadcrumbView = (TextView) rootView.findViewById(R.id.lb_breadcrumb); if (breadcrumbView != null) { breadcrumbView.setText(label); } - - mAppPermissions = new AppPermissions(activity, packageInfo, null, true, - new Runnable() { - @Override - public void run() { - getActivity().finish(); - } - }); - - bindPermissionsUi(); } - private void bindPermissionsUi() { + private void loadPreferences() { Context context = getPreferenceManager().getContext(); if (context == null) { return; @@ -219,8 +223,16 @@ public final class AppPermissionsFragment extends SettingsWithHeader extraPerms.setTitle(R.string.additional_permissions); for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) { - final boolean isPlatformPermission = group.getDeclaringPackage().equals(Utils.OS_PKG); - if (!Utils.shouldShowPermission(group, mShowLegacyPermissions)) { + if (!Utils.shouldShowPermission(group, true /* showLegacy */)) { + continue; + } + + boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG); + boolean isLegacy = isPlatform && !Utils.isModernPermissionGroup(group.getName()); + boolean isTelevision = Utils.isTelevision(context); + + if (isLegacy && !mShowLegacyPermissions && !isTelevision) { + // Television shows legacy on the extra screen continue; } @@ -239,7 +251,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader preference.setEnabled(!group.isPolicyFixed()); preference.setChecked(group.areRuntimePermissionsGranted()); - if (isPlatformPermission) { + if (isPlatform && (!isLegacy || !isTelevision)) { screen.addPreference(preference); } else { if (mExtraScreen == null) { @@ -254,11 +266,12 @@ public final class AppPermissionsFragment extends SettingsWithHeader @Override public boolean onPreferenceClick(Preference preference) { AdditionalPermissionsFragment frag = new AdditionalPermissionsFragment(); + setPackageName(frag, getArguments().getString(Intent.EXTRA_PACKAGE_NAME)); frag.setTargetFragment(AppPermissionsFragment.this, 0); - FragmentTransaction ft = getFragmentManager().beginTransaction(); - ft.replace(android.R.id.content, frag); - ft.addToBackStack("AdditionalPerms"); - ft.commit(); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, frag) + .addToBackStack(null) + .commit(); return true; } }); @@ -342,23 +355,20 @@ public final class AppPermissionsFragment extends SettingsWithHeader } } - private void updateUi() { - mAppPermissions.refresh(); - - updatePrefs(getPreferenceScreen()); + private void setPreferencesCheckedState() { + setPreferencesCheckedState(getPreferenceScreen()); if (mExtraScreen != null) { - updatePrefs(mExtraScreen); + setPreferencesCheckedState(mExtraScreen); } } - private void updatePrefs(PreferenceScreen screen) { - final int preferenceCount = screen.getPreferenceCount(); + private void setPreferencesCheckedState(PreferenceScreen screen) { + int preferenceCount = screen.getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { Preference preference = screen.getPreference(i); if (preference instanceof SwitchPreference) { SwitchPreference switchPref = (SwitchPreference) preference; - AppPermissionGroup group = mAppPermissions - .getPermissionGroup(switchPref.getKey()); + AppPermissionGroup group = mAppPermissions.getPermissionGroup(switchPref.getKey()); if (group != null) { switchPref.setChecked(group.areRuntimePermissionsGranted()); } @@ -366,26 +376,39 @@ public final class AppPermissionsFragment extends SettingsWithHeader } } - private PackageInfo getPackageInfo(String packageName) { + private static PackageInfo getPackageInfo(Activity activity, String packageName) { try { - return getActivity().getPackageManager().getPackageInfo( + return activity.getPackageManager().getPackageInfo( packageName, PackageManager.GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { - Log.i(LOG_TAG, "No package:" + getActivity().getCallingPackage(), e); + Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e); return null; } } public static class AdditionalPermissionsFragment extends SettingsWithHeader { + AppPermissionsFragment mOuterFragment; + @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - AppPermissionsFragment target = (AppPermissionsFragment) getTargetFragment(); - setPreferenceScreen(target.mExtraScreen); - // Copy the header. - setHeader(target.mIcon, target.mLabel, target.mInfoIntent); + public void onCreate(Bundle savedInstanceState) { + mOuterFragment = (AppPermissionsFragment) getTargetFragment(); + super.onCreate(savedInstanceState); + setHeader(mOuterFragment.mIcon, mOuterFragment.mLabel, mOuterFragment.mInfoIntent); setHasOptionsMenu(true); } + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferenceScreen(mOuterFragment.mExtraScreen); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); + bindUi(this, getPackageInfo(getActivity(), packageName)); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -396,4 +419,4 @@ public final class AppPermissionsFragment extends SettingsWithHeader return super.onOptionsItemSelected(item); } } -} \ No newline at end of file +} diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java index 4a733160..cc96bec9 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java @@ -18,8 +18,6 @@ package com.android.packageinstaller.permission.ui; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.content.res.Configuration.UI_MODE_TYPE_MASK; -import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION; import android.app.Activity; import android.app.admin.DevicePolicyManager; @@ -36,7 +34,6 @@ import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.util.ArrayMap; import android.util.Log; -import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.Window; @@ -47,6 +44,7 @@ import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.model.Permission; import com.android.packageinstaller.permission.utils.SafetyNetLogger; +import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.List; @@ -73,8 +71,7 @@ public class GrantPermissionsActivity extends Activity setTitle(R.string.permission_request_title); - int uiMode = getResources().getConfiguration().uiMode & UI_MODE_TYPE_MASK; - if (uiMode == UI_MODE_TYPE_TELEVISION) { + if (Utils.isTelevision(this)) { mViewHandler = new GrantPermissionsTvViewHandler(this).setResultListener(this); } else { mViewHandler = new GrantPermissionsDefaultViewHandler(this).setResultListener(this); diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java index 9cea63af..60d8a678 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java @@ -21,7 +21,6 @@ import android.app.FragmentTransaction; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.preference.Preference; @@ -180,8 +179,7 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment List groups = mPermissions.getGroups(); PreferenceScreen screen = getPreferenceScreen(); - int uiModeType = getResources().getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK; - boolean isTelevision = uiModeType == Configuration.UI_MODE_TYPE_TELEVISION; + boolean isTelevision = Utils.isTelevision(context); // 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. @@ -249,7 +247,7 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment frag.setTargetFragment(ManagePermissionsFragment.this, 0); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(android.R.id.content, frag); - ft.addToBackStack("AdditionalPerms"); + ft.addToBackStack(null); ft.commit(); return true; } diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java index 33462aef..54ddde3d 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java @@ -23,7 +23,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; -import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v14.preference.SwitchPreference; @@ -187,8 +186,7 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple return; } - int uiModeType = getResources().getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK; - boolean isTelevision = uiModeType == Configuration.UI_MODE_TYPE_TELEVISION; + boolean isTelevision = Utils.isTelevision(context); PreferenceScreen screen = getPreferenceScreen(); ArraySet preferencesToRemove = new ArraySet<>(); diff --git a/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java index e6b18944..a494732d 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java @@ -1,7 +1,6 @@ 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; @@ -17,6 +16,7 @@ import android.view.animation.AnimationUtils; import android.widget.TextView; import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; public abstract class PermissionsFrameFragment extends PreferenceFragment { @@ -113,8 +113,7 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { @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) { + if (Utils.isTelevision(getContext())) { mGridView = (VerticalGridView) inflater.inflate( R.layout.leanback_preferences_list, parent, false); mGridView.setWindowAlignmentOffset(0); diff --git a/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java b/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java index 4135af97..7b58fed1 100644 --- a/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java +++ b/src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java @@ -17,7 +17,6 @@ package com.android.packageinstaller.permission.ui; import android.content.Intent; -import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; @@ -28,6 +27,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.packageinstaller.R; +import com.android.packageinstaller.permission.utils.Utils; public abstract class SettingsWithHeader extends PermissionsFrameFragment implements OnClickListener { @@ -42,8 +42,7 @@ public abstract class SettingsWithHeader extends PermissionsFrameFragment Bundle 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) { + if (!Utils.isTelevision(getContext())) { mHeader = inflater.inflate(R.layout.header, root, false); getPreferencesContainer().addView(mHeader, 0); updateHeader(); diff --git a/src/com/android/packageinstaller/permission/utils/Utils.java b/src/com/android/packageinstaller/permission/utils/Utils.java index 940e3597..422fdae1 100644 --- a/src/com/android/packageinstaller/permission/utils/Utils.java +++ b/src/com/android/packageinstaller/permission/utils/Utils.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.graphics.drawable.Drawable; @@ -142,4 +143,9 @@ public class Utils { return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0 && !launcherPkgs.contains(info.packageName); } + + public static boolean isTelevision(Context context) { + int uiMode = context.getResources().getConfiguration().uiMode; + return (uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION; + } } -- cgit v1.2.3