1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package android.support.v7.preference;
18
19import android.content.Context;
20import android.content.res.TypedArray;
21import android.graphics.drawable.Drawable;
22import android.support.v4.content.ContextCompat;
23import android.support.v4.content.res.TypedArrayUtils;
24import android.util.AttributeSet;
25import android.view.View;
26
27/**
28 * A base class for {@link Preference} objects that are
29 * dialog-based. These preferences will, when clicked, open a dialog showing the
30 * actual preference controls.
31 *
32 * @attr name android:dialogTitle
33 * @attr name android:dialogMessage
34 * @attr name android:dialogIcon
35 * @attr name android:dialogLayout
36 * @attr name android:positiveButtonText
37 * @attr name android:negativeButtonText
38 */
39public abstract class DialogPreference extends Preference {
40
41    public interface TargetFragment {
42        Preference findPreference(CharSequence key);
43    }
44
45    private CharSequence mDialogTitle;
46    private CharSequence mDialogMessage;
47    private Drawable mDialogIcon;
48    private CharSequence mPositiveButtonText;
49    private CharSequence mNegativeButtonText;
50    private int mDialogLayoutResId;
51
52    public DialogPreference(
53            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
54        super(context, attrs, defStyleAttr, defStyleRes);
55
56        final TypedArray a = context.obtainStyledAttributes(attrs,
57                R.styleable.DialogPreference, defStyleAttr, defStyleRes);
58
59        mDialogTitle = TypedArrayUtils.getString(a, R.styleable.DialogPreference_dialogTitle,
60                R.styleable.DialogPreference_android_dialogTitle);
61        if (mDialogTitle == null) {
62            // Fall back on the regular title of the preference
63            // (the one that is seen in the list)
64            mDialogTitle = getTitle();
65        }
66
67        mDialogMessage = TypedArrayUtils.getString(a, R.styleable.DialogPreference_dialogMessage,
68                R.styleable.DialogPreference_android_dialogMessage);
69
70        mDialogIcon = TypedArrayUtils.getDrawable(a, R.styleable.DialogPreference_dialogIcon,
71                R.styleable.DialogPreference_android_dialogIcon);
72
73        mPositiveButtonText = TypedArrayUtils.getString(a,
74                R.styleable.DialogPreference_positiveButtonText,
75                R.styleable.DialogPreference_android_positiveButtonText);
76
77        mNegativeButtonText = TypedArrayUtils.getString(a,
78                R.styleable.DialogPreference_negativeButtonText,
79                R.styleable.DialogPreference_android_negativeButtonText);
80
81        mDialogLayoutResId = TypedArrayUtils.getResourceId(a,
82                R.styleable.DialogPreference_dialogLayout,
83                R.styleable.DialogPreference_android_dialogLayout, 0);
84
85        a.recycle();
86    }
87
88    public DialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
89        this(context, attrs, defStyleAttr, 0);
90    }
91
92    public DialogPreference(Context context, AttributeSet attrs) {
93        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.dialogPreferenceStyle,
94                android.R.attr.dialogPreferenceStyle));
95    }
96
97    public DialogPreference(Context context) {
98        this(context, null);
99    }
100
101    /**
102     * Sets the title of the dialog. This will be shown on subsequent dialogs.
103     *
104     * @param dialogTitle The title.
105     */
106    public void setDialogTitle(CharSequence dialogTitle) {
107        mDialogTitle = dialogTitle;
108    }
109
110    /**
111     * @see #setDialogTitle(CharSequence)
112     * @param dialogTitleResId The dialog title as a resource.
113     */
114    public void setDialogTitle(int dialogTitleResId) {
115        setDialogTitle(getContext().getString(dialogTitleResId));
116    }
117
118    /**
119     * Returns the title to be shown on subsequent dialogs.
120     * @return The title.
121     */
122    public CharSequence getDialogTitle() {
123        return mDialogTitle;
124    }
125
126    /**
127     * Sets the message of the dialog. This will be shown on subsequent dialogs.
128     * <p>
129     * This message forms the content View of the dialog and conflicts with
130     * list-based dialogs, for example. If setting a custom View on a dialog via
131     * {@link #setDialogLayoutResource(int)}, include a text View with ID
132     * {@link android.R.id#message} and it will be populated with this message.
133     *
134     * @param dialogMessage The message.
135     */
136    public void setDialogMessage(CharSequence dialogMessage) {
137        mDialogMessage = dialogMessage;
138    }
139
140    /**
141     * @see #setDialogMessage(CharSequence)
142     * @param dialogMessageResId The dialog message as a resource.
143     */
144    public void setDialogMessage(int dialogMessageResId) {
145        setDialogMessage(getContext().getString(dialogMessageResId));
146    }
147
148    /**
149     * Returns the message to be shown on subsequent dialogs.
150     * @return The message.
151     */
152    public CharSequence getDialogMessage() {
153        return mDialogMessage;
154    }
155
156    /**
157     * Sets the icon of the dialog. This will be shown on subsequent dialogs.
158     *
159     * @param dialogIcon The icon, as a {@link Drawable}.
160     */
161    public void setDialogIcon(Drawable dialogIcon) {
162        mDialogIcon = dialogIcon;
163    }
164
165    /**
166     * Sets the icon (resource ID) of the dialog. This will be shown on
167     * subsequent dialogs.
168     *
169     * @param dialogIconRes The icon, as a resource ID.
170     */
171    public void setDialogIcon(int dialogIconRes) {
172        mDialogIcon = ContextCompat.getDrawable(getContext(), dialogIconRes);
173    }
174
175    /**
176     * Returns the icon to be shown on subsequent dialogs.
177     * @return The icon, as a {@link Drawable}.
178     */
179    public Drawable getDialogIcon() {
180        return mDialogIcon;
181    }
182
183    /**
184     * Sets the text of the positive button of the dialog. This will be shown on
185     * subsequent dialogs.
186     *
187     * @param positiveButtonText The text of the positive button.
188     */
189    public void setPositiveButtonText(CharSequence positiveButtonText) {
190        mPositiveButtonText = positiveButtonText;
191    }
192
193    /**
194     * @see #setPositiveButtonText(CharSequence)
195     * @param positiveButtonTextResId The positive button text as a resource.
196     */
197    public void setPositiveButtonText(int positiveButtonTextResId) {
198        setPositiveButtonText(getContext().getString(positiveButtonTextResId));
199    }
200
201    /**
202     * Returns the text of the positive button to be shown on subsequent
203     * dialogs.
204     *
205     * @return The text of the positive button.
206     */
207    public CharSequence getPositiveButtonText() {
208        return mPositiveButtonText;
209    }
210
211    /**
212     * Sets the text of the negative button of the dialog. This will be shown on
213     * subsequent dialogs.
214     *
215     * @param negativeButtonText The text of the negative button.
216     */
217    public void setNegativeButtonText(CharSequence negativeButtonText) {
218        mNegativeButtonText = negativeButtonText;
219    }
220
221    /**
222     * @see #setNegativeButtonText(CharSequence)
223     * @param negativeButtonTextResId The negative button text as a resource.
224     */
225    public void setNegativeButtonText(int negativeButtonTextResId) {
226        setNegativeButtonText(getContext().getString(negativeButtonTextResId));
227    }
228
229    /**
230     * Returns the text of the negative button to be shown on subsequent
231     * dialogs.
232     *
233     * @return The text of the negative button.
234     */
235    public CharSequence getNegativeButtonText() {
236        return mNegativeButtonText;
237    }
238
239    /**
240     * Sets the layout resource that is inflated as the {@link View} to be shown
241     * as the content View of subsequent dialogs.
242     *
243     * @param dialogLayoutResId The layout resource ID to be inflated.
244     * @see #setDialogMessage(CharSequence)
245     */
246    public void setDialogLayoutResource(int dialogLayoutResId) {
247        mDialogLayoutResId = dialogLayoutResId;
248    }
249
250    /**
251     * Returns the layout resource that is used as the content View for
252     * subsequent dialogs.
253     *
254     * @return The layout resource.
255     */
256    public int getDialogLayoutResource() {
257        return mDialogLayoutResId;
258    }
259
260    @Override
261    protected void onClick() {
262        getPreferenceManager().showDialog(this);
263    }
264
265}
266