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