blob: 1d471f2dd24e61115530f8136b67774fc3f024e2 [file] [log] [blame]
/*
* Copyright (C) 2016 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.permissioncontroller.permission.ui.auto;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.ALLOW_ALWAYS_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.ALLOW_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.ALLOW_FOREGROUND_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.DENY_AND_DONT_ASK_AGAIN_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.DENY_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.NO_UPGRADE_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.NO_UPGRADE_OT_AND_DONT_ASK_AGAIN_BUTTON;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.NO_UPGRADE_OT_BUTTON;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import com.android.car.ui.AlertDialogBuilder;
import com.android.car.ui.recyclerview.CarUiContentListItem;
import com.android.car.ui.recyclerview.CarUiListItem;
import com.android.car.ui.recyclerview.CarUiListItemAdapter;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.ui.GrantPermissionsViewHandler;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
/**
* A {@link GrantPermissionsViewHandler} that is specific for the auto use-case. In this case, the
* permissions dialog is displayed using car-ui-lib {@link AlertDialogBuilder}
*/
public class GrantPermissionsAutoViewHandler implements GrantPermissionsViewHandler {
private static final String ARG_GROUP_NAME = "ARG_GROUP_NAME";
private static final String ARG_GROUP_COUNT = "ARG_GROUP_COUNT";
private static final String ARG_GROUP_INDEX = "ARG_GROUP_INDEX";
private static final String ARG_GROUP_ICON = "ARG_GROUP_ICON";
private static final String ARG_GROUP_MESSAGE = "ARG_GROUP_MESSAGE";
private static final String ARG_GROUP_DETAIL_MESSAGE = "ARG_GROUP_DETAIL_MESSAGE";
private static final String ARG_BUTTON_VISIBILITIES = "ARG_BUTTON_VISIBILITIES";
private final Context mContext;
private ResultListener mResultListener;
private AlertDialog mDialog;
private String mGroupName;
private int mGroupCount;
private int mGroupIndex;
private Icon mGroupIcon;
private CharSequence mGroupMessage;
private CharSequence mDetailMessage;
private boolean[] mButtonVisibilities;
public GrantPermissionsAutoViewHandler(Context context, String appPackageName) {
mContext = context;
}
@Override
public GrantPermissionsViewHandler setResultListener(ResultListener listener) {
mResultListener = listener;
return this;
}
@Override
public View createView() {
// We will use a system dialog instead of a locally defined view.
return new View(mContext);
}
@Override
public void updateWindowAttributes(WindowManager.LayoutParams outLayoutParams) {
// Nothing to do
}
@Override
public void updateUi(String groupName, int groupCount, int groupIndex, Icon icon,
CharSequence message, CharSequence detailMessage, boolean[] buttonVisibilities) {
mGroupName = groupName;
mGroupCount = groupCount;
mGroupIndex = groupIndex;
mGroupIcon = icon;
mGroupMessage = message;
mDetailMessage = detailMessage;
mButtonVisibilities = buttonVisibilities;
update();
}
private void update() {
if (mDialog != null) {
mDialog.setOnDismissListener(null);
mDialog.dismiss();
mDialog = null;
}
AlertDialogBuilder builder = new AlertDialogBuilder(mContext)
.setTitle(mGroupMessage)
.setSubtitle(mDetailMessage)
.setNegativeButton(R.string.grant_dialog_button_dismiss, (dialog, which) ->
dialog.dismiss())
.setOnDismissListener((dialog) -> {
mDialog = null;
mResultListener.onPermissionGrantResult(mGroupName, DENIED);
});
if (mGroupIcon != null) {
builder.setIcon(mGroupIcon.loadDrawable(mContext));
}
List<CarUiListItem> itemList = new ArrayList<>();
// Don't show the allow one time button as per automotive design decisions
createListItem(itemList, R.string.grant_dialog_button_allow,
GRANTED_ALWAYS, ALLOW_BUTTON);
createListItem(itemList, R.string.grant_dialog_button_allow_always,
GRANTED_ALWAYS, ALLOW_ALWAYS_BUTTON);
createListItem(itemList, R.string.grant_dialog_button_allow_foreground,
GRANTED_FOREGROUND_ONLY, ALLOW_FOREGROUND_BUTTON);
createListItem(itemList, R.string.grant_dialog_button_deny,
DENIED, DENY_BUTTON);
createListItem(itemList, R.string.grant_dialog_button_deny_and_dont_ask_again,
DENIED_DO_NOT_ASK_AGAIN, DENY_AND_DONT_ASK_AGAIN_BUTTON);
// It seems even on phone the same strings are used for "no upgrade" and
// "no upgrade don't ask again"
createListItem(itemList, R.string.grant_dialog_button_no_upgrade, DENIED,
NO_UPGRADE_BUTTON, NO_UPGRADE_OT_BUTTON);
createListItem(itemList, R.string.grant_dialog_button_no_upgrade, DENIED_DO_NOT_ASK_AGAIN,
NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON, NO_UPGRADE_OT_AND_DONT_ASK_AGAIN_BUTTON);
builder.setAdapter(new CarUiListItemAdapter(itemList));
mDialog = builder.create();
mDialog.show();
}
private void createListItem(List<CarUiListItem> list,
int stringId, @Result int result, int... indices) {
// Check that at least one of the indices is shown.
if (IntStream.of(indices)
.mapToObj(i -> i >= 0 && i < mButtonVisibilities.length && mButtonVisibilities[i])
.noneMatch(b -> b)) {
return;
}
CarUiContentListItem item = new CarUiContentListItem(CarUiContentListItem.Action.NONE);
item.setTitle(mContext.getString(stringId));
item.setOnItemClickedListener(i -> {
mDialog.setOnDismissListener(null);
mDialog.dismiss();
mDialog = null;
mResultListener.onPermissionGrantResult(mGroupName, result);
});
list.add(item);
}
@Override
public void saveInstanceState(Bundle arguments) {
arguments.putString(ARG_GROUP_NAME, mGroupName);
arguments.putInt(ARG_GROUP_COUNT, mGroupCount);
arguments.putInt(ARG_GROUP_INDEX, mGroupIndex);
arguments.putParcelable(ARG_GROUP_ICON, mGroupIcon);
arguments.putCharSequence(ARG_GROUP_MESSAGE, mGroupMessage);
arguments.putCharSequence(ARG_GROUP_DETAIL_MESSAGE, mDetailMessage);
arguments.putBooleanArray(ARG_BUTTON_VISIBILITIES, mButtonVisibilities);
}
@Override
public void loadInstanceState(Bundle savedInstanceState) {
mGroupName = savedInstanceState.getString(ARG_GROUP_NAME);
mGroupMessage = savedInstanceState.getCharSequence(ARG_GROUP_MESSAGE);
mGroupIcon = savedInstanceState.getParcelable(ARG_GROUP_ICON);
mGroupCount = savedInstanceState.getInt(ARG_GROUP_COUNT);
mGroupIndex = savedInstanceState.getInt(ARG_GROUP_INDEX);
mDetailMessage = savedInstanceState.getCharSequence(ARG_GROUP_DETAIL_MESSAGE);
mButtonVisibilities = savedInstanceState.getBooleanArray(ARG_BUTTON_VISIBILITIES);
update();
}
@Override
public void onBackPressed() {
if (mDialog != null) {
mDialog.dismiss();
} else if (mResultListener != null) {
mResultListener.onPermissionGrantResult(mGroupName, DENIED);
}
}
}