/*
* Copyright (C) 2012 The CyanogenMod Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cyanogenmod.filemanager.util;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.text.InputFilter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListPopupWindow;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.cyanogenmod.filemanager.R;
import com.cyanogenmod.filemanager.adapters.CheckableListAdapter;
import com.cyanogenmod.filemanager.ui.ThemeManager;
import com.cyanogenmod.filemanager.ui.ThemeManager.Theme;
import java.util.ArrayList;
import java.util.List;
/**
* A helper class with useful methods for deal with dialogs.
*/
public final class DialogHelper {
/**
* An interface to listen the selection make for the user.
*/
public interface OnSelectChoiceListener {
/**
* Method invoked when the user select an option
*
* @param choice The selected option
*/
public void onSelectChoice(int choice);
/**
* Method invoked when the user not select any option
*/
public void onNoSelectChoice();
}
/**
* Constructor of <code>DialogHelper</code>.
*/
private DialogHelper() {
super();
}
/**
* Method that creates a new warning {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The resource identifier of the message of the alert dialog
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createWarningDialog(Context context, int title, int message) {
return createWarningDialog(context, title, context.getString(message));
}
/**
* Method that creates a new warning {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The message of the alert dialog
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createWarningDialog(Context context, int title, String message) {
return createAlertDialog(
context,
0,
title,
message,
false);
}
/**
* Method that creates a new error {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The resource identifier of the message of the alert dialog
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createErrorDialog(Context context, int title, int message) {
return createErrorDialog(context, title, context.getString(message));
}
/**
* Method that creates a new error {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The message of the alert dialog
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createErrorDialog(Context context, int title, String message) {
return createAlertDialog(
context,
0,
title,
message,
false);
}
/**
* Method that creates a new {@link AlertDialog}.
*
* @param context The current context
* @param icon The icon resource
* @param title The resource identifier of the title of the alert dialog
* @param message The resource identifier of the message of the alert dialog
* @param allCaps If the title must have his text in caps or not
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createAlertDialog(
Context context, int icon, int title, int message, boolean allCaps) {
return createAlertDialog(context, icon, title, context.getString(message), allCaps);
}
/**
* Method that creates a new {@link AlertDialog}.
*
* @param context The current context
* @param icon The icon resource
* @param title The resource identifier of the title of the alert dialog
* @param message The message of the alert dialog
* @param allCaps If the title must have his text in caps or not
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createAlertDialog(
Context context, int icon, int title, String message, boolean allCaps) {
//Create the alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(createTitle(context, icon, context.getString(title), allCaps));
builder.setView(createMessage(context, message));
builder.setPositiveButton(context.getString(R.string.ok), null);
return builder.create();
}
/**
* Method that creates a new {@link AlertDialog} for choice between single options.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param options An array with the options
* @param defOption The default option
* @param onSelectChoiceListener The listener for user choice
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createSingleChoiceDialog(
Context context, int title,
String[] options, int defOption,
final OnSelectChoiceListener onSelectChoiceListener) {
//Create the alert dialog
final StringBuffer item = new StringBuffer().append(defOption);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(createTitle(context, 0, context.getString(title), false));
// Create the adapter
List<CheckableListAdapter.CheckableItem> items =
new ArrayList<CheckableListAdapter.CheckableItem>(options.length);
int cc = options.length;
for (int i = 0; i < cc; i++) {
boolean checked = (i == defOption);
items.add(new CheckableListAdapter.CheckableItem(options[i], true, checked));
}
final CheckableListAdapter adapter = new CheckableListAdapter(context, items, true);
// Create the list view and set as view
final ListView listView = new ListView(context);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
listView.setLayoutParams(params);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
item.delete(0, item.length());
item.append(position);
adapter.setSelectedItem(position);
}
});
adapter.setSelectedItem(defOption);
listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
builder.setView(listView);
// Apply the current theme
Theme theme = ThemeManager.getCurrentTheme(context);
theme.setBackgroundDrawable(context, listView, "background_drawable"); //$NON-NLS-1$
listView.setDivider(
theme.getDrawable(context, "horizontal_divider_drawable")); //$NON-NLS-1$
builder.setNegativeButton(context.getString(R.string.cancel), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onSelectChoiceListener.onNoSelectChoice();
dialog.cancel();
}
});
builder.setPositiveButton(context.getString(R.string.ok), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
onSelectChoiceListener.onSelectChoice(Integer.parseInt(item.toString()));
dialog.dismiss();
}
});
return builder.create();
}
/**
* Method that creates a new YES/NO {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The resource identifier of the message of the alert dialog
* @param onClickListener The listener where returns the button pressed
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createYesNoDialog(
Context context, int title, int message, OnClickListener onClickListener) {
return createYesNoDialog(context, title, context.getString(message), onClickListener);
}
/**
* Method that creates a new YES/NO {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The message of the alert dialog
* @param onClickListener The listener where returns the button pressed
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createYesNoDialog(
Context context, int title, String message, OnClickListener onClickListener) {
//Create the alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(
createTitle(
context,
0,
context.getString(title),
false));
builder.setView(createMessage(context, message));
AlertDialog dialog = builder.create();
dialog.setButton(
DialogInterface.BUTTON_POSITIVE, context.getString(R.string.yes), onClickListener);
dialog.setButton(
DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.no), onClickListener);
return dialog;
}
/**
* Method that creates a new YES/ALL/NO {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The resource identifier of the message of the alert dialog
* @param onClickListener The listener where returns the button pressed
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createYesNoAllDialog(
Context context, int title, int message, OnClickListener onClickListener) {
return createYesNoAllDialog(context, title, context.getString(message), onClickListener);
}
/**
* Method that creates a new YES/ALL/NO {@link AlertDialog}.
*
* @param context The current context
* @param title The resource identifier of the title of the alert dialog
* @param message The message of the alert dialog
* @param onClickListener The listener where returns the button pressed
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createYesNoAllDialog(
Context context, int title, String message, OnClickListener onClickListener) {
//Create the alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(
createTitle(
context,
0,
context.getString(title),
false));
builder.setView(createMessage(context, message));
AlertDialog dialog = builder.create();
dialog.setButton(
DialogInterface.BUTTON_POSITIVE, context.getString(R.string.yes), onClickListener);
dialog.setButton(
DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.no), onClickListener);
dialog.setButton(
DialogInterface.BUTTON_NEUTRAL, context.getString(R.string.all), onClickListener);
return dialog;
}
/**
* Method that creates a two buttons question {@link AlertDialog}.
*
* @param context The current context
* @param button1 The resource identifier of the text of the button 1 (POSITIVE)
* @param button2 The resource identifier of the text of the button 2 (NEGATIVE)
* @param title The resource id of the title of the alert dialog
* @param message The message of the alert dialog
* @param onClickListener The listener where returns the button pressed
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createTwoButtonsQuestionDialog(
Context context, int button1, int button2,
int title, String message, OnClickListener onClickListener) {
//Create the alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(
createTitle(
context,
0,
context.getString(title),
false));
builder.setView(createMessage(context, message));
AlertDialog dialog = builder.create();
dialog.setButton(
DialogInterface.BUTTON_POSITIVE, context.getString(button1), onClickListener);
dialog.setButton(
DialogInterface.BUTTON_NEGATIVE, context.getString(button2), onClickListener);
return dialog;
}
/**
* Method that creates a three buttons question {@link AlertDialog}.
*
* @param context The current context
* @param button1 The resource identifier of the text of the button 1 (POSITIVE)
* @param button2 The resource identifier of the text of the button 2 (NEUTRAL)
* @param button3 The resource identifier of the text of the button 3 (NEGATIVE)
* @param title The resource id of the title of the alert dialog
* @param message The message of the alert dialog
* @param onClickListener The listener where returns the button pressed
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createThreeButtonsQuestionDialog(
Context context, int button1, int button2, int button3,
int title, String message, OnClickListener onClickListener) {
//Create the alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(
createTitle(
context,
0,
context.getString(title),
false));
builder.setView(createMessage(context, message));
AlertDialog dialog = builder.create();
dialog.setButton(
DialogInterface.BUTTON_POSITIVE, context.getString(button1), onClickListener);
dialog.setButton(
DialogInterface.BUTTON_NEUTRAL, context.getString(button2), onClickListener);
dialog.setButton(
DialogInterface.BUTTON_NEGATIVE, context.getString(button3), onClickListener);
return dialog;
}
/**
* Method that creates a new {@link AlertDialog}.
*
* @param context The current context
* @param icon The icon resource
* @param title The resource identifier of the title of the alert dialog
* @param content The content layout
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createDialog(Context context, int icon, int title, View content) {
return createDialog(context, icon, context.getString(title), content);
}
/**
* Method that creates a new {@link AlertDialog}.
*
* @param context The current context
* @param icon The icon resource
* @param title The title of the alert dialog
* @param content The content layout
* @return AlertDialog The alert dialog reference
*/
public static AlertDialog createDialog(Context context, int icon, String title, View content) {
//Create the alert dialog
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCustomTitle(createTitle(context, icon, title, false));
builder.setView(content);
return builder.create();
}
/**
* Method that creates and returns the title of the dialog.
*
* @param context The current context
* @param icon The icon resource
* @param title The resource identifier of the title of the alert dialog
* @param allCaps If the title must have his text in caps or not
* @return The title view
*/
private static View createTitle(Context context, int icon, String title, boolean allCaps) {
//Inflate the dialog layouts
LayoutInflater li =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View lyTitle = li.inflate(R.layout.dialog_title, null);
ImageView vIcon = (ImageView)lyTitle.findViewById(R.id.dialog_title_icon);
if (icon != 0) {
vIcon.setBackgroundResource(icon);
} else {
vIcon.setVisibility(View.GONE);
}
TextView vText = (TextView)lyTitle.findViewById(R.id.dialog_title_text);
if (allCaps) {
vText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
}
vText.setText(title);
// Apply the current theme
Theme theme = ThemeManager.getCurrentTheme(context);
theme.setBackgroundDrawable(context, lyTitle, "background_drawable"); //$NON-NLS-1$
theme.setTextColor(context, vText, "dialog_text_color"); //$NON-NLS-1$
return lyTitle;
}
/**
* Method that creates and returns the title of the dialog.
*
* @param context The current context
* @param message The the message of the alert dialog
* @return The title view
*/
private static View createMessage(Context context, String message) {
//Inflate the dialog layouts
LayoutInflater li =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View lyMessage = li.inflate(
R.layout.dialog_message,
null);
TextView vMsg = (TextView)lyMessage.findViewById(R.id.dialog_message);
// Dialog need to be filled with at least two lines to fill the background dialog,
// so we add a new additional line to the message
vMsg.setText(message + "\n"); //$NON-NLS-1$
// Apply the current theme
Theme theme = ThemeManager.getCurrentTheme(context);
theme.setBackgroundDrawable(context, lyMessage, "background_drawable"); //$NON-NLS-1$
theme.setTextColor(context, vMsg, "text_color"); //$NON-NLS-1$
return lyMessage;
}
/**
* Method that creates and returns a {@list ListPopupWindow} reference.
*
* @param context The current context
* @param adapter The adapter to associate with the popup
* @param anchor The view that is used as an anchor to show the popup
* @return ListPopupWindow The {@list ListPopupWindow} reference
*/
public static ListPopupWindow createListPopupWindow(
Context context, final ListAdapter adapter, View anchor) {
final ListPopupWindow popup = new ListPopupWindow(context);
popup.setAdapter(adapter);
popup.setContentWidth(context.getResources().getDimensionPixelSize(R.dimen.popup_width));
popup.setAnchorView(anchor);
popup.setModal(true);
return popup;
}
/**
* Method that delegates the display of a dialog. This method applies the style to the
* dialog, so all dialogs of the application MUST used this method to display the dialog.
*
* @param context The current context
* @param dialog The dialog to show
*/
public static void delegateDialogShow(Context context, AlertDialog dialog) {
// Show the dialog
dialog.show();
// Apply theme
Theme theme = ThemeManager.getCurrentTheme(context);
theme.setDialogStyle(context, dialog);
}
/**
* Method that creates and display a toast dialog.
*
* @param context The context to use.
* @param msg The message to display.
* @param duration How long to display the message.
*/
public static void showToast(Context context, String msg, int duration) {
Toast.makeText(context, msg, duration).show();
}
/**
* Method that creates and display a toast dialog.
*
* @param context The context to use.
* @param msgResourceId The resource id of the string resource to use.
* @param duration How long to display the message.
*/
public static void showToast(Context context, int msgResourceId, int duration) {
showToast(context, context.getString(msgResourceId), duration);
}
}