1a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan/* 2a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Copyright (C) 2016 The Android Open Source Project 3a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 4a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Licensed under the Apache License, Version 2.0 (the "License"); 5a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * you may not use this file except in compliance with the License. 6a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * You may obtain a copy of the License at 7a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 8a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * http://www.apache.org/licenses/LICENSE-2.0 9a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 10a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Unless required by applicable law or agreed to in writing, software 11a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * distributed under the License is distributed on an "AS IS" BASIS, 12a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * See the License for the specific language governing permissions and 14a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * limitations under the License 15a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 16a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanpackage android.support.wearable.view; 17a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 18a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.annotation.TargetApi; 19a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.app.Dialog; 20a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.content.Context; 21a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.content.DialogInterface; 22a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.graphics.drawable.Drawable; 23a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.os.Build; 24a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.support.annotation.StyleRes; 25a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.view.View; 26a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.widget.ImageButton; 27a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.widget.ImageView; 28a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.widget.Space; 29a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport android.widget.TextView; 30a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 31a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwanimport com.android.packageinstaller.R; 32a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 33a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan/** 34a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * A dialog to display a title, a message, and/or an icon with a positive and a negative button. 35a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 36a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * <p>The buttons are hidden away unless there is a listener attached to the button. Since there's 37a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * no click listener attached by default, the buttons are hidden be default. 38a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 39a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan@TargetApi(Build.VERSION_CODES.LOLLIPOP) 40931d2d25caace670b16fb83bac6721993f466489Michael Kwanpublic class AcceptDenyDialog extends Dialog { 41a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Icon at the top of the dialog. */ 42a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected ImageView mIcon; 43a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Title at the top of the dialog. */ 44a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected TextView mTitle; 45a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Message content of the dialog. */ 46a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected TextView mMessage; 47a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Panel containing the buttons. */ 48a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected View mButtonPanel; 49a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Positive button in the button panel. */ 50a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected ImageButton mPositiveButton; 51a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Negative button in the button panel. */ 52a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected ImageButton mNegativeButton; 53a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** 54a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Click listener for the positive button. Positive button should hide if this is <code>null 55a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * </code>. 56a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 57a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected DialogInterface.OnClickListener mPositiveButtonListener; 58a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** 59a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Click listener for the negative button. Negative button should hide if this is <code>null 60a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * </code>. 61a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 62a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected DialogInterface.OnClickListener mNegativeButtonListener; 63a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** Spacer between the positive and negative button. Hidden if one button is hidden. */ 64a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan protected View mSpacer; 65a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 66931d2d25caace670b16fb83bac6721993f466489Michael Kwan private final View.OnClickListener mButtonHandler = (v) -> { 67931d2d25caace670b16fb83bac6721993f466489Michael Kwan if (v == mPositiveButton && mPositiveButtonListener != null) { 68931d2d25caace670b16fb83bac6721993f466489Michael Kwan mPositiveButtonListener.onClick(this, DialogInterface.BUTTON_POSITIVE); 69931d2d25caace670b16fb83bac6721993f466489Michael Kwan dismiss(); 70931d2d25caace670b16fb83bac6721993f466489Michael Kwan } else if (v == mNegativeButton && mNegativeButtonListener != null) { 71931d2d25caace670b16fb83bac6721993f466489Michael Kwan mNegativeButtonListener.onClick(this, DialogInterface.BUTTON_NEGATIVE); 72931d2d25caace670b16fb83bac6721993f466489Michael Kwan dismiss(); 73931d2d25caace670b16fb83bac6721993f466489Michael Kwan } 74931d2d25caace670b16fb83bac6721993f466489Michael Kwan }; 75931d2d25caace670b16fb83bac6721993f466489Michael Kwan 76a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public AcceptDenyDialog(Context context) { 77a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan this(context, 0 /* use default context theme */); 78a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 79a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 80a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public AcceptDenyDialog(Context context, @StyleRes int themeResId) { 81a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan super(context, themeResId); 82a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 83a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan setContentView(R.layout.accept_deny_dialog); 84a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 85a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mTitle = (TextView) findViewById(android.R.id.title); 86a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mMessage = (TextView) findViewById(android.R.id.message); 87a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mIcon = (ImageView) findViewById(android.R.id.icon); 88a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mPositiveButton = (ImageButton) findViewById(android.R.id.button1); 89931d2d25caace670b16fb83bac6721993f466489Michael Kwan mPositiveButton.setOnClickListener(mButtonHandler); 90a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mNegativeButton = (ImageButton) findViewById(android.R.id.button2); 91931d2d25caace670b16fb83bac6721993f466489Michael Kwan mNegativeButton.setOnClickListener(mButtonHandler); 92a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mSpacer = (Space) findViewById(R.id.spacer); 93a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mButtonPanel = findViewById(R.id.buttonPanel); 94a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 95a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 96a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public ImageButton getButton(int whichButton) { 97a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan switch (whichButton) { 98a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan case DialogInterface.BUTTON_POSITIVE: 99a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan return mPositiveButton; 100a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan case DialogInterface.BUTTON_NEGATIVE: 101a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan return mNegativeButton; 102a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan default: 103a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan return null; 104a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 105a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 106a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 107a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setIcon(Drawable icon) { 108a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mIcon.setVisibility(icon == null ? View.GONE : View.VISIBLE); 109a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mIcon.setImageDrawable(icon); 110a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 111a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 112a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** 113a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * @param resId the resourceId of the drawable to use as the icon or 0 if you don't want an icon. 114a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 115a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setIcon(int resId) { 116a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mIcon.setVisibility(resId == 0 ? View.GONE : View.VISIBLE); 117a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mIcon.setImageResource(resId); 118a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 119a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 120a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** @param message the content message text of the dialog. */ 121a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setMessage(CharSequence message) { 122a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mMessage.setText(message); 123a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mMessage.setVisibility(message == null ? View.GONE : View.VISIBLE); 124a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 125a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 126a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** @param title the title text of the dialog. */ 127a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan @Override 128a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setTitle(CharSequence title) { 129a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mTitle.setText(title); 130a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 131a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 132a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** 133a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Sets a click listener for a button. 134a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 135a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * <p>Will hide button bar if all buttons are hidden (i.e. their click listeners are <code>null 136a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * </code>). 137a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 138a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * @param whichButton {@link DialogInterface.BUTTON_POSITIVE} or {@link 139a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * DialogInterface.BUTTON_NEGATIVE} 140a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * @param listener the listener to set for the button. Hide button if <code>null</code>. 141a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 142a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setButton(int whichButton, DialogInterface.OnClickListener listener) { 143a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan switch (whichButton) { 144a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan case DialogInterface.BUTTON_POSITIVE: 145a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mPositiveButtonListener = listener; 146a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan break; 147a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan case DialogInterface.BUTTON_NEGATIVE: 148a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mNegativeButtonListener = listener; 149a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan break; 150a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan default: 151a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan return; 152a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 153a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 154a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mSpacer.setVisibility(mPositiveButtonListener == null || mNegativeButtonListener == null 155a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan ? View.GONE : View.INVISIBLE); 156a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mPositiveButton.setVisibility( 157a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mPositiveButtonListener == null ? View.GONE : View.VISIBLE); 158a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mNegativeButton.setVisibility( 159a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mNegativeButtonListener == null ? View.GONE : View.VISIBLE); 160a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mButtonPanel.setVisibility( 161a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan mPositiveButtonListener == null && mNegativeButtonListener == null 162a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan ? View.GONE : View.VISIBLE); 163a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 164a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 165a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** 166a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Convenience method for <code>setButton(DialogInterface.BUTTON_POSITIVE, listener)</code>. 167a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 168a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * @param listener the listener for the positive button. 169a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 170a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setPositiveButton(DialogInterface.OnClickListener listener) { 171a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan setButton(DialogInterface.BUTTON_POSITIVE, listener); 172a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 173a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan 174a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan /** 175a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * Convenience method for <code>setButton(DialogInterface.BUTTON_NEGATIVE, listener)</code>. 176a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * 177a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan * @param listener the listener for the positive button. 178a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan */ 179a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan public void setNegativeButton(DialogInterface.OnClickListener listener) { 180a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan setButton(DialogInterface.BUTTON_NEGATIVE, listener); 181a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan } 182a5d853c3bd4e4e84872fc802decd18e9c18408d2Michael Kwan} 183