blob: 933f1b38b0560b4bbd4d1fadfd564f59e217e7dd [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 androidx.wear.ble.view;
import android.annotation.TargetApi;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import androidx.annotation.StyleRes;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Space;
import android.widget.TextView;
import com.android.permissioncontroller.R;
/**
* A dialog to display a title, a message, and/or an icon with a positive and a negative button.
*
* <p>The buttons are hidden away unless there is a listener attached to the button. Since there's
* no click listener attached by default, the buttons are hidden be default.
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class AcceptDenyDialog extends Dialog {
/** Icon at the top of the dialog. */
protected ImageView mIcon;
/** Title at the top of the dialog. */
protected TextView mTitle;
/** Message content of the dialog. */
protected TextView mMessage;
/** Panel containing the buttons. */
protected View mButtonPanel;
/** Positive button in the button panel. */
protected ImageButton mPositiveButton;
/** Negative button in the button panel. */
protected ImageButton mNegativeButton;
/**
* Click listener for the positive button. Positive button should hide if this is <code>null
* </code>.
*/
protected DialogInterface.OnClickListener mPositiveButtonListener;
/**
* Click listener for the negative button. Negative button should hide if this is <code>null
* </code>.
*/
protected DialogInterface.OnClickListener mNegativeButtonListener;
/** Spacer between the positive and negative button. Hidden if one button is hidden. */
protected View mSpacer;
private final View.OnClickListener mButtonHandler = (v) -> {
if (v == mPositiveButton && mPositiveButtonListener != null) {
mPositiveButtonListener.onClick(this, DialogInterface.BUTTON_POSITIVE);
dismiss();
} else if (v == mNegativeButton && mNegativeButtonListener != null) {
mNegativeButtonListener.onClick(this, DialogInterface.BUTTON_NEGATIVE);
dismiss();
}
};
public AcceptDenyDialog(Context context) {
this(context, 0 /* use default context theme */);
}
public AcceptDenyDialog(Context context, @StyleRes int themeResId) {
super(context, themeResId);
setContentView(R.layout.accept_deny_dialog);
mTitle = (TextView) findViewById(android.R.id.title);
mMessage = (TextView) findViewById(android.R.id.message);
mIcon = (ImageView) findViewById(android.R.id.icon);
mPositiveButton = (ImageButton) findViewById(android.R.id.button1);
mPositiveButton.setOnClickListener(mButtonHandler);
mNegativeButton = (ImageButton) findViewById(android.R.id.button2);
mNegativeButton.setOnClickListener(mButtonHandler);
mSpacer = (Space) findViewById(R.id.spacer);
mButtonPanel = findViewById(R.id.buttonPanel);
}
public ImageButton getButton(int whichButton) {
switch (whichButton) {
case DialogInterface.BUTTON_POSITIVE:
return mPositiveButton;
case DialogInterface.BUTTON_NEGATIVE:
return mNegativeButton;
default:
return null;
}
}
public void setIcon(Drawable icon) {
mIcon.setVisibility(icon == null ? View.GONE : View.VISIBLE);
mIcon.setImageDrawable(icon);
}
/**
* @param resId the resourceId of the drawable to use as the icon or 0 if you don't want an icon.
*/
public void setIcon(int resId) {
mIcon.setVisibility(resId == 0 ? View.GONE : View.VISIBLE);
mIcon.setImageResource(resId);
}
/** @param message the content message text of the dialog. */
public void setMessage(CharSequence message) {
mMessage.setText(message);
mMessage.setVisibility(message == null ? View.GONE : View.VISIBLE);
}
/** @param title the title text of the dialog. */
@Override
public void setTitle(CharSequence title) {
mTitle.setText(title);
}
/**
* Sets a click listener for a button.
*
* <p>Will hide button bar if all buttons are hidden (i.e. their click listeners are <code>null
* </code>).
*
* @param whichButton {@link DialogInterface.BUTTON_POSITIVE} or {@link
* DialogInterface.BUTTON_NEGATIVE}
* @param listener the listener to set for the button. Hide button if <code>null</code>.
*/
public void setButton(int whichButton, DialogInterface.OnClickListener listener) {
switch (whichButton) {
case DialogInterface.BUTTON_POSITIVE:
mPositiveButtonListener = listener;
break;
case DialogInterface.BUTTON_NEGATIVE:
mNegativeButtonListener = listener;
break;
default:
return;
}
mSpacer.setVisibility(mPositiveButtonListener == null || mNegativeButtonListener == null
? View.GONE : View.INVISIBLE);
mPositiveButton.setVisibility(
mPositiveButtonListener == null ? View.GONE : View.VISIBLE);
mNegativeButton.setVisibility(
mNegativeButtonListener == null ? View.GONE : View.VISIBLE);
mButtonPanel.setVisibility(
mPositiveButtonListener == null && mNegativeButtonListener == null
? View.GONE : View.VISIBLE);
}
/**
* Convenience method for <code>setButton(DialogInterface.BUTTON_POSITIVE, listener)</code>.
*
* @param listener the listener for the positive button.
*/
public void setPositiveButton(DialogInterface.OnClickListener listener) {
setButton(DialogInterface.BUTTON_POSITIVE, listener);
}
/**
* Convenience method for <code>setButton(DialogInterface.BUTTON_NEGATIVE, listener)</code>.
*
* @param listener the listener for the positive button.
*/
public void setNegativeButton(DialogInterface.OnClickListener listener) {
setButton(DialogInterface.BUTTON_NEGATIVE, listener);
}
}