summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLujiang Xue <rogerxue@google.com>2017-11-27 10:47:35 -0800
committerLujiang Xue <rogerxue@google.com>2017-12-06 11:44:34 -0800
commitbdec99c060991f5e84780bf04a0b1204b686dd50 (patch)
treed0dc3a62120fc5a986b515dcb19dfa4b5c8c9533 /src
parent32c917d0618ee38d535aa795b4060a74bd6193e6 (diff)
downloadandroid_packages_apps_PackageInstaller-bdec99c060991f5e84780bf04a0b1204b686dd50.tar.gz
android_packages_apps_PackageInstaller-bdec99c060991f5e84780bf04a0b1204b686dd50.tar.bz2
android_packages_apps_PackageInstaller-bdec99c060991f5e84780bf04a0b1204b686dd50.zip
Add Car friendly UI to handle permission request
Test: make, flash and verified Change-Id: Id9d58eda7bf73e4f4bbb0d62d669f9f8376edbf2
Diffstat (limited to 'src')
-rw-r--r--src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java25
-rw-r--r--src/com/android/packageinstaller/permission/ui/auto/AppPermissionsFragment.java236
2 files changed, 260 insertions, 1 deletions
diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
index 2e0e555f..ffef477b 100644
--- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
+++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsActivity.java
@@ -20,6 +20,7 @@ import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
+import android.view.MenuItem;
import com.android.packageinstaller.DeviceUtils;
import com.android.packageinstaller.permission.ui.handheld.ManageStandardPermissionsFragment;
@@ -38,6 +39,10 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity {
if (savedInstanceState != null) {
return;
}
+ // in automotive mode, there's no system wide back button, so need to add that
+ if (DeviceUtils.isAuto(this)) {
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ }
Fragment fragment;
String action = getIntent().getAction();
@@ -59,7 +64,10 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity {
finish();
return;
}
- if (DeviceUtils.isWear(this)) {
+ if (DeviceUtils.isAuto(this)) {
+ fragment = com.android.packageinstaller.permission.ui.auto
+ .AppPermissionsFragment.newInstance(packageName);
+ } else if (DeviceUtils.isWear(this)) {
fragment = AppPermissionsFragmentWear.newInstance(packageName);
} else if (DeviceUtils.isTelevision(this)) {
fragment = com.android.packageinstaller.permission.ui.television
@@ -102,4 +110,19 @@ public final class ManagePermissionsActivity extends OverlayTouchActivity {
getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit();
}
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // in automotive mode, there's no system wide back button, so need to add that
+ if (DeviceUtils.isAuto(this)) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ onBackPressed();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
diff --git a/src/com/android/packageinstaller/permission/ui/auto/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/auto/AppPermissionsFragment.java
new file mode 100644
index 00000000..ecc3ec6a
--- /dev/null
+++ b/src/com/android/packageinstaller/permission/ui/auto/AppPermissionsFragment.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.packageinstaller.permission.ui.auto;
+
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.support.annotation.DrawableRes;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Switch;
+import android.widget.Toast;
+
+import com.android.car.list.IconToggleLineItem;
+import com.android.car.list.TypedPagedListAdapter;
+import com.android.packageinstaller.R;
+import com.android.packageinstaller.permission.model.AppPermissionGroup;
+import com.android.packageinstaller.permission.model.AppPermissions;
+import com.android.packageinstaller.permission.utils.Utils;
+
+import java.util.ArrayList;
+
+import androidx.car.widget.PagedListView;
+
+/**
+ * Contains all permissions in a list for a given application.
+ */
+public final class AppPermissionsFragment extends Fragment{
+
+ private static final String LOG_TAG = "ManagePermsFragment";
+ public static final String EXTRA_LAYOUT = "extra_layout";
+
+ private AppPermissions mAppPermissions;
+
+ private String mPackageName;
+
+ protected PagedListView mListView;
+ protected TypedPagedListAdapter mPagedListAdapter;
+
+
+ /**
+ * Creates a new instance.
+ * @param packageName the packageName of the application that we are listing the
+ * permissions here.
+ */
+ public static AppPermissionsFragment newInstance(String packageName) {
+ AppPermissionsFragment fragment = new AppPermissionsFragment();
+ Bundle arguments = new Bundle();
+ arguments.putInt(EXTRA_LAYOUT, com.android.car.list.R.layout.list);
+ arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName);
+ fragment.setArguments(arguments);
+ return fragment;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mListView = (PagedListView) getView().findViewById(R.id.list);
+ mPagedListAdapter = new TypedPagedListAdapter(getContext(), getLineItems());
+ mListView.setAdapter(mPagedListAdapter);
+ }
+
+ protected void notifyDataSetChanged() {
+ mPagedListAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null
+ && savedInstanceState.containsKey(Intent.EXTRA_PACKAGE_NAME)) {
+ mPackageName = savedInstanceState.getString(Intent.EXTRA_PACKAGE_NAME);
+ } else if (getArguments() != null
+ && getArguments().containsKey(Intent.EXTRA_PACKAGE_NAME)) {
+ mPackageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME);
+ }
+
+ if (mPackageName == null) {
+ Log.e(LOG_TAG, "package name is missing");
+ return;
+ }
+ Activity activity = getActivity();
+ PackageInfo packageInfo = getPackageInfo(activity, mPackageName);
+ 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() {
+ activity.finish();
+ }
+ });
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(getArguments().getInt(EXTRA_LAYOUT), container, false);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mAppPermissions.refresh();
+ }
+
+ /**
+ * Gets the list of the LineItems to show up in the list
+ */
+ public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
+ ArrayList<TypedPagedListAdapter.LineItem> items = new ArrayList<>();
+ Context context = getContext();
+ if (context == null) {
+ return items;
+ }
+
+ for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) {
+ if (!Utils.shouldShowPermission(group, mAppPermissions.getPackageInfo().packageName)) {
+ continue;
+ }
+ items.add(new PermissionLineItem(group, context));
+ }
+ return items;
+ }
+
+ private static PackageInfo getPackageInfo(Activity activity, String packageName) {
+ try {
+ return activity.getPackageManager().getPackageInfo(
+ packageName, PackageManager.GET_PERMISSIONS);
+ } catch (PackageManager.NameNotFoundException e) {
+ if (Log.isLoggable(LOG_TAG, Log.INFO)) {
+ Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e);
+ }
+ return null;
+ }
+ }
+
+ private class PermissionLineItem extends IconToggleLineItem {
+ private final AppPermissionGroup mPermissionGroup;
+ private final Context mContext;
+
+ PermissionLineItem(AppPermissionGroup permissionGroup, Context context) {
+ super(permissionGroup.getLabel(), context);
+ mContext = context;
+ mPermissionGroup = permissionGroup;
+ }
+
+ @Override
+ public boolean onToggleTouched(Switch toggleSwitch, MotionEvent event) {
+ if (event.getAction() != MotionEvent.ACTION_DOWN) {
+ return true;
+ }
+ if (!isChecked()) {
+ mPermissionGroup.grantRuntimePermissions(false);
+ toggleSwitch.performClick();
+ } else {
+ final boolean grantedByDefault =
+ mPermissionGroup.hasGrantedByDefaultPermission();
+ if (grantedByDefault || !mPermissionGroup.doesSupportRuntimePermissions()) {
+ new AlertDialog.Builder(mContext)
+ .setMessage(grantedByDefault
+ ? R.string.system_warning : R.string.old_sdk_deny_warning)
+ .setNegativeButton(R.string.cancel, null /* listener */)
+ .setPositiveButton(R.string.grant_dialog_button_deny_anyway,
+ (dialog, which) -> {
+ mPermissionGroup.revokeRuntimePermissions(false);
+ toggleSwitch.performClick();
+ })
+ .show();
+ } else {
+ mPermissionGroup.revokeRuntimePermissions(false);
+ toggleSwitch.performClick();
+ }
+ }
+ return true;
+ }
+
+ @DrawableRes
+ public int getIcon() {
+ return mPermissionGroup.getIconResId();
+ }
+
+ @Override
+ public boolean isChecked() {
+ return mPermissionGroup.areRuntimePermissionsGranted();
+ }
+
+ @Override
+ public CharSequence getDesc() {
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isExpandable() {
+ return false;
+ }
+ }
+}