1/*
2 * Copyright (C) 2009 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.android.videoeditor;
18
19import android.app.AlertDialog;
20import android.content.Context;
21import android.content.DialogInterface;
22import android.content.DialogInterface.OnCancelListener;
23import android.content.DialogInterface.OnClickListener;
24import android.text.Editable;
25import android.text.InputFilter;
26import android.text.InputType;
27import android.text.TextWatcher;
28import android.view.LayoutInflater;
29import android.view.View;
30import android.view.WindowManager;
31import android.widget.Button;
32import android.widget.EditText;
33
34/**
35 * Utility class for creating various alert dialogs.
36 * It contains only static methods and cannot be instantiated.
37 */
38public class AlertDialogs {
39
40    private AlertDialogs() {}
41
42    /**
43     * Creates an alert dialog box.
44     *
45     * @param context The context
46     * @param title The title string
47     * @param iconId The icon id
48     * @param content The content string
49     * @param positive The positive button text
50     * @param positiveListener The positive listener
51     * @param negative The negative button text
52     * @param negativeListener The negative listener
53     * @param cancelListener The cancel listener
54     * @param cancelable true if cancelable
55     */
56    public static AlertDialog createAlert(Context context, String title, int iconId,
57            String content, String positive, OnClickListener positiveListener, String negative,
58            OnClickListener negativeListener, OnCancelListener cancelListener,
59            boolean cancelable) {
60        final AlertDialog.Builder builder = new AlertDialog.Builder(context);
61        builder.setTitle(title);
62        if (iconId != 0) {
63            builder.setIcon(context.getResources().getDrawable(iconId));
64        }
65        builder.setMessage(content);
66        builder.setPositiveButton(positive, positiveListener);
67        builder.setNegativeButton(negative, negativeListener);
68        builder.setOnCancelListener(cancelListener);
69        builder.setCancelable(cancelable);
70
71        final AlertDialog dialog = builder.create();
72        dialog.setCanceledOnTouchOutside(true);
73        return dialog;
74    }
75
76    /**
77     * Creates a dialog with one edit text.
78     *
79     * @param context The context
80     * @param title The title of the dialog
81     * @param text The text shown in the edit box
82     * @param positiveButtonText The positive button text
83     * @param positiveListener The positive button listener
84     * @param negativeButtonText The negative button text
85     * @param negativeListener The negative button listener
86     * @param cancelListener The cancel listener
87     * @param inputType Input type
88     * @param maxChars The maximum number of characters
89     * @param hint hint text to be shown in the edit box
90     *
91     * @return The created dialog
92     */
93    public static AlertDialog createEditDialog(Context context, String title, String text,
94            String positiveButtonText, DialogInterface.OnClickListener positiveListener,
95            String negativeButtonText, DialogInterface.OnClickListener negativeListener,
96            DialogInterface.OnCancelListener cancelListener, int inputType, int maxChars,
97            String hint) {
98        final AlertDialog.Builder builder = new AlertDialog.Builder(context);
99        final LayoutInflater vi = (LayoutInflater) context.getSystemService(
100                Context.LAYOUT_INFLATER_SERVICE);
101        final View myView = vi.inflate(R.layout.edit_one_dialog_view, null);
102        builder.setView(myView);
103
104        // Set the text or hint if they are available.
105        final EditText textInput = (EditText) myView.findViewById(R.id.text_1);
106        if (title != null) builder.setTitle(title);
107        if (text != null) {
108            textInput.setText(text);
109            textInput.setSelection(0, text.length());
110        }
111        if (hint != null) textInput.setHint(hint);
112
113        if (maxChars > 0) {
114            final InputFilter[] filters = new InputFilter[1];
115            filters[0] = new InputFilter.LengthFilter(maxChars);
116            textInput.setFilters(filters);
117        }
118
119        if (inputType != InputType.TYPE_NULL) {
120            textInput.setInputType(inputType);
121        }
122
123        // Setup the positive button listener
124        builder.setPositiveButton(positiveButtonText, positiveListener);
125        builder.setNegativeButton(negativeButtonText, negativeListener);
126        builder.setOnCancelListener(cancelListener);
127        final AlertDialog dialog = builder.create();
128        dialog.setCanceledOnTouchOutside(true);
129        textInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
130
131            @Override
132            public void onFocusChange(View v, boolean hasFocus) {
133                if (hasFocus) {
134                    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
135                }
136            }
137        });
138        textInput.addTextChangedListener(new TextWatcher() {
139            Button mPositiveButton;
140
141            @Override
142            public void onTextChanged(CharSequence s, int start, int before, int count) {
143            }
144
145            @Override
146            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
147            }
148
149            @Override
150            public void afterTextChanged(Editable s) {
151                if (mPositiveButton == null) {
152                    mPositiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
153                }
154                mPositiveButton.setEnabled(s.toString().trim().length() > 0);
155            }
156        });
157
158        return dialog;
159    }
160}
161