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
17package com.example.android.voicemail.common.ui;
18
19import android.app.Activity;
20import android.app.AlertDialog;
21import android.app.Dialog;
22import 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 */
69public 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