summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTodd Volkert <tvolkert@google.com>2015-07-14 11:19:48 -0700
committerTodd Volkert <tvolkert@google.com>2015-07-14 12:20:32 -0700
commitf5f6b1b113bb39a268948c19a39833d3ff839d32 (patch)
tree0fab132103c53399e24642fce5e242c8631e663c /src
parentb9b20815315d35ed2d10edcbbae4913da36f4107 (diff)
downloadandroid_packages_apps_PackageInstaller-f5f6b1b113bb39a268948c19a39833d3ff839d32.tar.gz
android_packages_apps_PackageInstaller-f5f6b1b113bb39a268948c19a39833d3ff839d32.tar.bz2
android_packages_apps_PackageInstaller-f5f6b1b113bb39a268948c19a39833d3ff839d32.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java169
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java7
-rw-r--r--src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java6
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java4
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java5
-rw-r--r--src/com/android/packageinstaller/permission/ui/SettingsWithHeader.java5
-rw-r--r--src/com/android/packageinstaller/permission/utils/Utils.java6
7 files changed, 111 insertions, 91 deletions
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 extends Fragment> 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,27 +376,40 @@ 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()) {
case android.R.id.home:
@@ -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<PermissionGroup> 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<String> 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;
+ }
}