1 /*
2  * Copyright (C) 2007 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 
17 package com.example.android.apis.app;
18 
19 import android.app.Activity;
20 import android.app.AlertDialog;
21 import android.app.Dialog;
22 import android.app.ProgressDialog;
23 import android.content.DialogInterface;
24 import android.os.Bundle;
25 import android.os.Handler;
26 import android.os.Message;
27 import android.util.Log;
28 import android.view.LayoutInflater;
29 import android.view.View;
30 import android.view.View.OnClickListener;
31 import android.widget.Button;
32 import android.widget.Toast;
33 import android.database.Cursor;
34 import android.provider.ContactsContract;
35 
36 import com.example.android.apis.R;
37 
38 /**
39  * Example of how to use an {@link android.app.AlertDialog}.
40  * <h3>AlertDialogSamples</h3>
41 
42 <p>This demonstrates the different ways the AlertDialog can be used.</p>
43 
44 <h4>Demo</h4>
45 App/Dialog/Alert Dialog
46 
47 <h4>Source files</h4>
48  * <table class="LinkTable">
49  *         <tr>
50  *             <td >src/com.example.android.apis/app/AlertDialogSamples.java</td>
51  *             <td >The Alert Dialog Samples implementation</td>
52  *         </tr>
53  *         <tr>
54  *             <td >/res/any/layout/alert_dialog.xml</td>
55  *             <td >Defines contents of the screen</td>
56  *         </tr>
57  * </table>
58  */
59 public class AlertDialogSamples extends Activity {
60     private static final String TAG = "AlertDialogSamples";
61     private static final int DIALOG_YES_NO_MESSAGE = 1;
62     private static final int DIALOG_YES_NO_LONG_MESSAGE = 2;
63     private static final int DIALOG_LIST = 3;
64     private static final int DIALOG_PROGRESS = 4;
65     private static final int DIALOG_SINGLE_CHOICE = 5;
66     private static final int DIALOG_MULTIPLE_CHOICE = 6;
67     private static final int DIALOG_TEXT_ENTRY = 7;
68     private static final int DIALOG_MULTIPLE_CHOICE_CURSOR = 8;
69     private static final int DIALOG_YES_NO_ULTRA_LONG_MESSAGE = 9;
70     private static final int DIALOG_YES_NO_OLD_SCHOOL_MESSAGE = 10;
71     private static final int DIALOG_YES_NO_HOLO_LIGHT_MESSAGE = 11;
72     private static final int DIALOG_YES_NO_DEFAULT_LIGHT_MESSAGE = 12;
73     private static final int DIALOG_YES_NO_DEFAULT_DARK_MESSAGE = 13;
74     private static final int DIALOG_PROGRESS_SPINNER = 14;
75 
76     private static final int MAX_PROGRESS = 100;
77 
78     private ProgressDialog mProgressSpinnerDialog;
79     private ProgressDialog mProgressDialog;
80     private int mProgress;
81     private Handler mProgressHandler;
82 
83     @Override
onCreateDialog(int id)84     protected Dialog onCreateDialog(int id) {
85         switch (id) {
86         case DIALOG_YES_NO_MESSAGE:
87             return new AlertDialog.Builder(AlertDialogSamples.this)
88                 .setTitle(R.string.alert_dialog_two_buttons_title)
89                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
90                     public void onClick(DialogInterface dialog, int whichButton) {
91 
92                         /* User clicked OK so do some stuff */
93                     }
94                 })
95                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
96                     public void onClick(DialogInterface dialog, int whichButton) {
97 
98                         /* User clicked Cancel so do some stuff */
99                     }
100                 })
101                 .create();
102         case DIALOG_YES_NO_OLD_SCHOOL_MESSAGE:
103             return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_TRADITIONAL)
104                 .setIconAttribute(android.R.attr.alertDialogIcon)
105                 .setTitle(R.string.alert_dialog_two_buttons_title)
106                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
107                     public void onClick(DialogInterface dialog, int whichButton) {
108                     }
109                 })
110                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
111                     public void onClick(DialogInterface dialog, int whichButton) {
112                     }
113                 })
114                 .create();
115         case DIALOG_YES_NO_HOLO_LIGHT_MESSAGE:
116             return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_HOLO_LIGHT)
117                 .setIconAttribute(android.R.attr.alertDialogIcon)
118                 .setTitle(R.string.alert_dialog_two_buttons_title)
119                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
120                     public void onClick(DialogInterface dialog, int whichButton) {
121                     }
122                 })
123                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
124                     public void onClick(DialogInterface dialog, int whichButton) {
125                     }
126                 })
127                 .create();
128         case DIALOG_YES_NO_DEFAULT_LIGHT_MESSAGE:
129             return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT)
130                 .setTitle(R.string.alert_dialog_two_buttons_title)
131                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
132                     public void onClick(DialogInterface dialog, int whichButton) {
133                     }
134                 })
135                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
136                     public void onClick(DialogInterface dialog, int whichButton) {
137                     }
138                 })
139                 .create();
140         case DIALOG_YES_NO_DEFAULT_DARK_MESSAGE:
141             return new AlertDialog.Builder(AlertDialogSamples.this, AlertDialog.THEME_DEVICE_DEFAULT_DARK)
142                 .setTitle(R.string.alert_dialog_two_buttons_title)
143                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
144                     public void onClick(DialogInterface dialog, int whichButton) {
145                     }
146                 })
147                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
148                     public void onClick(DialogInterface dialog, int whichButton) {
149                     }
150                 })
151                 .create();
152         case DIALOG_YES_NO_LONG_MESSAGE:
153             return new AlertDialog.Builder(AlertDialogSamples.this)
154                 .setTitle(R.string.alert_dialog_two_buttons_msg)
155                 .setMessage(R.string.alert_dialog_two_buttons2_msg)
156                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
157                     public void onClick(DialogInterface dialog, int whichButton) {
158 
159                         /* User clicked OK so do some stuff */
160                     }
161                 })
162                 .setNeutralButton(R.string.alert_dialog_something, new DialogInterface.OnClickListener() {
163                     public void onClick(DialogInterface dialog, int whichButton) {
164 
165                         /* User clicked Something so do some stuff */
166                     }
167                 })
168                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
169                     public void onClick(DialogInterface dialog, int whichButton) {
170 
171                         /* User clicked Cancel so do some stuff */
172                     }
173                 })
174                 .create();
175         case DIALOG_YES_NO_ULTRA_LONG_MESSAGE:
176             return new AlertDialog.Builder(AlertDialogSamples.this)
177                 .setTitle(R.string.alert_dialog_two_buttons_msg)
178                 .setMessage(R.string.alert_dialog_two_buttons2ultra_msg)
179                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
180                     public void onClick(DialogInterface dialog, int whichButton) {
181 
182                         /* User clicked OK so do some stuff */
183                     }
184                 })
185                 .setNeutralButton(R.string.alert_dialog_something, new DialogInterface.OnClickListener() {
186                     public void onClick(DialogInterface dialog, int whichButton) {
187 
188                         /* User clicked Something so do some stuff */
189                     }
190                 })
191                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
192                     public void onClick(DialogInterface dialog, int whichButton) {
193 
194                         /* User clicked Cancel so do some stuff */
195                     }
196                 })
197                 .create();
198         case DIALOG_LIST:
199             return new AlertDialog.Builder(AlertDialogSamples.this)
200                 .setTitle(R.string.select_dialog)
201                 .setItems(R.array.select_dialog_items, new DialogInterface.OnClickListener() {
202                     public void onClick(DialogInterface dialog, int which) {
203 
204                         /* User clicked so do some stuff */
205                         String[] items = getResources().getStringArray(R.array.select_dialog_items);
206                         new AlertDialog.Builder(AlertDialogSamples.this)
207                                 .setMessage("You selected: " + which + " , " + items[which])
208                                 .show();
209                     }
210                 })
211                 .create();
212         case DIALOG_PROGRESS:
213             mProgressDialog = new ProgressDialog(AlertDialogSamples.this);
214             mProgressDialog.setTitle(R.string.select_dialog);
215             mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
216             mProgressDialog.setMax(MAX_PROGRESS);
217             mProgressDialog.setButton(DialogInterface.BUTTON_POSITIVE,
218                     getText(R.string.alert_dialog_hide), new DialogInterface.OnClickListener() {
219                 public void onClick(DialogInterface dialog, int whichButton) {
220 
221                     /* User clicked Yes so do some stuff */
222                 }
223             });
224             mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
225                     getText(R.string.alert_dialog_cancel), new DialogInterface.OnClickListener() {
226                 public void onClick(DialogInterface dialog, int whichButton) {
227 
228                     /* User clicked No so do some stuff */
229                 }
230             });
231             return mProgressDialog;
232         case DIALOG_PROGRESS_SPINNER:
233             mProgressSpinnerDialog = new ProgressDialog(AlertDialogSamples.this);
234             mProgressSpinnerDialog.setTitle(R.string.select_dialog);
235             mProgressSpinnerDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
236             return mProgressSpinnerDialog;
237         case DIALOG_SINGLE_CHOICE:
238             return new AlertDialog.Builder(AlertDialogSamples.this)
239                 .setTitle(R.string.alert_dialog_single_choice)
240                 .setSingleChoiceItems(R.array.select_dialog_items2, 0, new DialogInterface.OnClickListener() {
241                     public void onClick(DialogInterface dialog, int whichButton) {
242 
243                         /* User clicked on a radio button do some stuff */
244                     }
245                 })
246                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
247                     public void onClick(DialogInterface dialog, int whichButton) {
248 
249                         /* User clicked Yes so do some stuff */
250                     }
251                 })
252                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
253                     public void onClick(DialogInterface dialog, int whichButton) {
254 
255                         /* User clicked No so do some stuff */
256                     }
257                 })
258                .create();
259         case DIALOG_MULTIPLE_CHOICE:
260             return new AlertDialog.Builder(AlertDialogSamples.this)
261                 .setTitle(R.string.alert_dialog_multi_choice)
262                 .setMultiChoiceItems(R.array.select_dialog_items3,
263                         new boolean[]{false, true, false, true, false, false, false},
264                         new DialogInterface.OnMultiChoiceClickListener() {
265                             public void onClick(DialogInterface dialog, int whichButton,
266                                     boolean isChecked) {
267 
268                                 /* User clicked on a check box do some stuff */
269                             }
270                         })
271                 .setPositiveButton(R.string.alert_dialog_ok,
272                         new DialogInterface.OnClickListener() {
273                     public void onClick(DialogInterface dialog, int whichButton) {
274 
275                         /* User clicked Yes so do some stuff */
276                     }
277                 })
278                 .setNegativeButton(R.string.alert_dialog_cancel,
279                         new DialogInterface.OnClickListener() {
280                     public void onClick(DialogInterface dialog, int whichButton) {
281 
282                         /* User clicked No so do some stuff */
283                     }
284                 })
285                .create();
286         case DIALOG_MULTIPLE_CHOICE_CURSOR:
287             String[] projection = new String[] {
288                     ContactsContract.Contacts._ID,
289                     ContactsContract.Contacts.DISPLAY_NAME,
290                     ContactsContract.Contacts.SEND_TO_VOICEMAIL
291             };
292             Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
293                     projection, null, null, null);
294             return new AlertDialog.Builder(AlertDialogSamples.this)
295                 .setTitle(R.string.alert_dialog_multi_choice_cursor)
296                 .setMultiChoiceItems(cursor,
297                         ContactsContract.Contacts.SEND_TO_VOICEMAIL,
298                         ContactsContract.Contacts.DISPLAY_NAME,
299                         new DialogInterface.OnMultiChoiceClickListener() {
300                             public void onClick(DialogInterface dialog, int whichButton,
301                                     boolean isChecked) {
302                                 Toast.makeText(AlertDialogSamples.this,
303                                         "Readonly Demo Only - Data will not be updated",
304                                         Toast.LENGTH_SHORT).show();
305                             }
306                         })
307                .create();
308         case DIALOG_TEXT_ENTRY:
309             // This example shows how to add a custom layout to an AlertDialog
310             LayoutInflater factory = LayoutInflater.from(this);
311             final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
312             return new AlertDialog.Builder(AlertDialogSamples.this)
313                 .setTitle(R.string.alert_dialog_text_entry)
314                 .setView(textEntryView)
315                 .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
316                     public void onClick(DialogInterface dialog, int whichButton) {
317 
318                         /* User clicked OK so do some stuff */
319                     }
320                 })
321                 .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
322                     public void onClick(DialogInterface dialog, int whichButton) {
323 
324                         /* User clicked cancel so do some stuff */
325                     }
326                 })
327                 .create();
328         }
329         return null;
330     }
331 
332     /**
333      * Initialization of the Activity after it is first created.  Must at least
334      * call {@link android.app.Activity#setContentView(int)} to
335      * describe what is to be displayed in the screen.
336      */
337     @Override
338 	protected void onCreate(Bundle savedInstanceState) {
339         super.onCreate(savedInstanceState);
340 
341         setContentView(R.layout.alert_dialog);
342 
343         /* Display a text message with yes/no buttons and handle each message as well as the cancel action */
344         Button twoButtonsTitle = (Button) findViewById(R.id.two_buttons);
345         twoButtonsTitle.setOnClickListener(new OnClickListener() {
346             public void onClick(View v) {
347                 showDialog(DIALOG_YES_NO_MESSAGE);
348             }
349         });
350 
351         /* Display a long text message with yes/no buttons and handle each message as well as the cancel action */
352         Button twoButtons2Title = (Button) findViewById(R.id.two_buttons2);
353         twoButtons2Title.setOnClickListener(new OnClickListener() {
354             public void onClick(View v) {
355                 showDialog(DIALOG_YES_NO_LONG_MESSAGE);
356             }
357         });
358 
359 
360         /* Display an ultra long text message with yes/no buttons and handle each message as well as the cancel action */
361         Button twoButtons2UltraTitle = (Button) findViewById(R.id.two_buttons2ultra);
362         twoButtons2UltraTitle.setOnClickListener(new OnClickListener() {
363             public void onClick(View v) {
364                 showDialog(DIALOG_YES_NO_ULTRA_LONG_MESSAGE);
365             }
366         });
367 
368 
369         /* Display a list of items */
370         Button selectButton = (Button) findViewById(R.id.select_button);
371         selectButton.setOnClickListener(new OnClickListener() {
372             public void onClick(View v) {
373                 showDialog(DIALOG_LIST);
374             }
375         });
376 
377         /* Display a custom progress bar */
378         Button progressButton = (Button) findViewById(R.id.progress_button);
379         progressButton.setOnClickListener(new OnClickListener() {
380             public void onClick(View v) {
381                 showDialog(DIALOG_PROGRESS);
382                 mProgress = 0;
383                 mProgressDialog.setProgress(0);
384                 mProgressHandler.sendEmptyMessage(0);
385             }
386         });
387 
388         /* Display a custom progress bar */
389         Button progressSpinnerButton = (Button) findViewById(R.id.progress_spinner_button);
390         progressSpinnerButton.setOnClickListener(new OnClickListener() {
391             public void onClick(View v) {
392                 showDialog(DIALOG_PROGRESS_SPINNER);
393             }
394         });
395 
396         /* Display a radio button group */
397         Button radioButton = (Button) findViewById(R.id.radio_button);
398         radioButton.setOnClickListener(new OnClickListener() {
399             public void onClick(View v) {
400                 showDialog(DIALOG_SINGLE_CHOICE);
401             }
402         });
403 
404         /* Display a list of checkboxes */
405         Button checkBox = (Button) findViewById(R.id.checkbox_button);
406         checkBox.setOnClickListener(new OnClickListener() {
407             public void onClick(View v) {
408                 showDialog(DIALOG_MULTIPLE_CHOICE);
409             }
410         });
411 
412         /* Display a list of checkboxes, backed by a cursor */
413         Button checkBox2 = (Button) findViewById(R.id.checkbox_button2);
414         checkBox2.setOnClickListener(new OnClickListener() {
415             public void onClick(View v) {
416                 showDialog(DIALOG_MULTIPLE_CHOICE_CURSOR);
417             }
418         });
419 
420         /* Display a text entry dialog */
421         Button textEntry = (Button) findViewById(R.id.text_entry_button);
422         textEntry.setOnClickListener(new OnClickListener() {
423             public void onClick(View v) {
424                 showDialog(DIALOG_TEXT_ENTRY);
425             }
426         });
427 
428         /* Two points, in the traditional theme */
429         Button twoButtonsOldSchoolTitle = (Button) findViewById(R.id.two_buttons_old_school);
430         twoButtonsOldSchoolTitle.setOnClickListener(new OnClickListener() {
431             public void onClick(View v) {
432                 showDialog(DIALOG_YES_NO_OLD_SCHOOL_MESSAGE);
433             }
434         });
435 
436         /* Two points, in the light holographic theme */
437         Button twoButtonsHoloLightTitle = (Button) findViewById(R.id.two_buttons_holo_light);
438         twoButtonsHoloLightTitle.setOnClickListener(new OnClickListener() {
439             public void onClick(View v) {
440                 showDialog(DIALOG_YES_NO_HOLO_LIGHT_MESSAGE);
441             }
442         });
443 
444         /* Two points, in the light default theme */
445         Button twoButtonsDefaultLightTitle = (Button) findViewById(R.id.two_buttons_default_light);
446         twoButtonsDefaultLightTitle.setOnClickListener(new OnClickListener() {
447             public void onClick(View v) {
448                 showDialog(DIALOG_YES_NO_DEFAULT_LIGHT_MESSAGE);
449             }
450         });
451 
452         /* Two points, in the dark default theme */
453         Button twoButtonsDefaultDarkTitle = (Button) findViewById(R.id.two_buttons_default_dark);
454         twoButtonsDefaultDarkTitle.setOnClickListener(new OnClickListener() {
455             public void onClick(View v) {
456                 showDialog(DIALOG_YES_NO_DEFAULT_DARK_MESSAGE);
457             }
458         });
459 
460         mProgressHandler = new Handler() {
461             @Override
462             public void handleMessage(Message msg) {
463                 super.handleMessage(msg);
464                 if (mProgress >= MAX_PROGRESS) {
465                     mProgressDialog.dismiss();
466                 } else {
467                     mProgress++;
468                     mProgressDialog.incrementProgressBy(1);
469                     mProgressHandler.sendEmptyMessageDelayed(0, 100);
470                 }
471             }
472         };
473     }
474 
475     @Override
476     public void onEnterAnimationComplete() {
477         Log.i(TAG, "onEnterAnimationComplete");
478     }
479 }
480