Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2011 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.voicemail.common.ui;
     18 
     19 import android.app.Activity;
     20 import android.app.AlertDialog;
     21 import android.app.Dialog;
     22 import android.os.Bundle;
     23 
     24 /**
     25  * Uses an {@link Activity} to show Dialogs.
     26  * <p>
     27  * Instantiate this class inside your Activity.
     28  *
     29  * <pre class="code">
     30  * private final DialogHelperImpl mDialogHelper = new DialogHelperImpl(this);
     31  * </pre>
     32  * <p>
     33  * Override your Activity's onCreateDialog(int, Bundle) method, as follows:
     34  *
     35  * <pre class="code">
     36  * &#064;Override
     37  * protected Dialog onCreateDialog(int id, Bundle bundle) {
     38  *     return mDialogHelper.handleOnCreateDialog(id, bundle);
     39  * }
     40  * </pre>
     41  * <p>
     42  * Now you can pass mDialogHelper around as a {@link DialogHelper} interface, and code that wants to
     43  * show a Dialog can call a method like this:
     44  *
     45  * <pre class="code">
     46  * mDialogHelper.showErrorMessageDialog(&quot;An exception occurred!&quot;, e);
     47  * </pre>
     48  * <p>
     49  * If you want more flexibility, and want to mix this implementation with your own dialogs, then you
     50  * should do something like this in your Activity:
     51  *
     52  * <pre class="code">
     53  * &#064;Override
     54  * protected Dialog onCreateDialog(int id, Bundle bundle) {
     55  *     switch (id) {
     56  *         case ID_MY_OTHER_DIALOG:
     57  *             return new AlertDialog.Builder(this)
     58  *                     .setTitle(&quot;something&quot;)
     59  *                     .create();
     60  *         default:
     61  *             return mDialogHelper.handleOnCreateDialog(id, bundle);
     62  *     }
     63  * }
     64  * </pre>
     65  *
     66  * Just be careful that you don't pick any IDs that conflict with those used by this class (which
     67  * are documented in the public static final fields).
     68  */
     69 public class DialogHelperImpl implements DialogHelper {
     70     public static final int DIALOG_ID_EXCEPTION = 88953588;
     71 
     72     private static final String KEY_EXCEPTION = "exception";
     73     private static final String KEY_TITLE = "title";
     74 
     75     private final Activity mActivity;
     76 
     77     public DialogHelperImpl(Activity activity) {
     78         mActivity = activity;
     79     }
     80 
     81     @Override
     82     public void showErrorMessageDialog(int titleId, Exception exception) {
     83         showErrorMessageDialog(mActivity.getString(titleId), exception);
     84     }
     85 
     86     @Override
     87     public void showErrorMessageDialog(String title, Exception exception) {
     88         Bundle bundle = new Bundle();
     89         bundle.putString(KEY_TITLE, title);
     90         bundle.putSerializable(KEY_EXCEPTION, exception);
     91         mActivity.showDialog(DIALOG_ID_EXCEPTION, bundle);
     92     }
     93 
     94     /**
     95      * You should call this method from your Activity's onCreateDialog(int, Bundle) method.
     96      */
     97     public Dialog handleOnCreateDialog(int id, Bundle args) {
     98         if (id == DIALOG_ID_EXCEPTION) {
     99             Exception exception = (Exception) args.getSerializable(KEY_EXCEPTION);
    100             String title = args.getString(KEY_TITLE);
    101             return new AlertDialog.Builder(mActivity)
    102                     .setTitle(title)
    103                     .setMessage(convertExceptionToErrorMessage(exception))
    104                     .setCancelable(true)
    105                     .create();
    106         }
    107         return null;
    108     }
    109 
    110     private String convertExceptionToErrorMessage(Exception exception) {
    111         StringBuilder sb = new StringBuilder().append(exception.getClass().getSimpleName());
    112         if (exception.getMessage() != null) {
    113             sb.append("\n");
    114             sb.append(exception.getMessage());
    115         }
    116         return sb.toString();
    117     }
    118 }
    119