/*
* Copyright (C) 2007 The Android Open Source 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.tencent.tws.assistant.app;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Message;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ListAdapter;
import com.tencent.tws.assistant.widget.AdapterView;
import com.tencent.tws.assistant.widget.ListView;
import com.tencent.tws.sharelib.R;
/**
* A subclass of Dialog that can display one, two or three buttons. If you only want to display a String in
* this dialog box, use the setMessage() method. If you want to display a more complex view, look up the
* FrameLayout called "custom" and add your view to it:
*
* <pre>
* FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
* fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT));
* </pre>
*
* <p>
* The AlertDialog class takes care of automatically setting
* {@link WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM}
* for you based on whether any views in the dialog return true from {@link View#onCheckIsTextEditor()
* View.onCheckIsTextEditor()}. Generally you want this set for a Dialog without text editors, so that it will
* be placed on top of the current input method UI. You can modify this behavior by forcing the flag to your
* desired mode after calling {@link #onCreate}.
*
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>
* For more information about creating dialogs, read the <a href="{@docRoot}
* guide/topics/ui/dialogs.html">Dialogs</a> developer guide.
* </p>
* </div>
*/
public class AlertDialog extends TwsDialog implements DialogInterface {
private AlertController mAlert;
private static boolean mIsContextMenu = false;
public static enum ButtonColor {
BTN_NORMAL, BTN_RED, BTN_BLUE;
}
// tws-start add bottom button colors::2014-10-21
public static final int BOTTOM_BUTTON_COLOR_BLACK = 0;
public static final int BOTTOM_BUTTON_COLOR_RED = 1;
public static final int BOTTOM_BUTTON_COLOR_BLUE = 2;
public static final int BOTTOM_BUTTON_COLOR_DEFAULT = BOTTOM_BUTTON_COLOR_BLACK;
// tws-end add bottom button colors::2014-10-21
/**
* Special theme constant for {@link #AlertDialog(Context, int)}: use the traditional (pre-Holo) alert
* dialog theme.
*/
public static final int THEME_TRADITIONAL = 1;
/**
* Special theme constant for {@link #AlertDialog(Context, int)}: use the holographic alert theme with a
* dark background.
*/
public static final int THEME_HOLO_DARK = 2;
/**
* Special theme constant for {@link #AlertDialog(Context, int)}: use the holographic alert theme with a
* light background.
*/
public static final int THEME_HOLO_LIGHT = 3;
/**
* Special theme constant for {@link #AlertDialog(Context, int)}: use the device's default alert theme
* with a dark background.
*/
public static final int THEME_DEVICE_DEFAULT_DARK = 4;
/**
* Special theme constant for {@link #AlertDialog(Context, int)}: use the device's default alert theme
* with a dark background.
*/
public static final int THEME_DEVICE_DEFAULT_LIGHT = 5;
protected AlertDialog(Context context) {
this(context, resolveDialogTheme(context, 0));
}
/**
* Construct an AlertDialog that uses an explicit theme. The actual style that an AlertDialog uses is a
* private implementation, however you can here supply either the name of an attribute in the theme from
* which to get the dialog's style (such as {@link android.R.attr#alertDialogTheme} or one of the
* constants {@link #THEME_TRADITIONAL}, {@link #THEME_HOLO_DARK}, or {@link #THEME_HOLO_LIGHT}.
*/
protected AlertDialog(Context context, int theme) {
this(context, theme, true);
}
AlertDialog(Context context, int theme, boolean createContextWrapper) {
super(context, resolveDialogTheme(context, theme), createContextWrapper);
getWindow().alwaysReadCloseOnTouchAttr();
mAlert = new AlertController(getContext(), this, getWindow());
mAlert.mIsContextMenu = mIsContextMenu;
}
protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, resolveDialogTheme(context, 0));
getWindow().alwaysReadCloseOnTouchAttr();
setCancelable(cancelable);
setOnCancelListener(cancelListener);
mAlert = new AlertController(context, this, getWindow());
mAlert.mIsContextMenu = mIsContextMenu;
}
// tws-start bottom dialog::2014-10-2
public AlertDialog(Context context, int theme, boolean createContextWrapper, boolean isBottomDialog) {
super(context, resolveDialogTheme(context, theme), createContextWrapper, isBottomDialog);
getWindow().alwaysReadCloseOnTouchAttr();
mAlert = new AlertController(context, this, getWindow(), isBottomDialog);
mAlert.mIsContextMenu = mIsContextMenu;
}
public AlertDialog(Context context, boolean isBottomDialog) {
this(context, 0, true, isBottomDialog);
}
// tws-end bottom dialog::2014-10-2
static int resolveDialogTheme(Context context, int resid) {
mIsContextMenu = false;
if (resid == R.style.Theme_tws_Second_Dialog_Alert_Context) {
mIsContextMenu = true;
return resid;
} else if (resid == R.style.Theme_tws_Second_Dialog_Transparent) {
return resid;
} else if (resid == R.style.Theme_tws_Second_Dialog_TotalTransparent) {
return resid;
} else if (resid == R.style.Theme_tws_Second_Dialog_Alert_RadioBlue) {
return resid;
}
// tws-start bottom dialog::2014-10-2
else if (resid == R.style.Theme_tws_Second_Dialog_Bottom) {
return resid;
}
// tws-end bottom dialog::2014-10-2
else if (resid == 0) {
return R.style.Theme_tws_Second_Dialog_Alert;
} else {
return resid;
}
}
/**
* Gets one of the buttons used in the dialog.
* <p>
* If a button does not exist in the dialog, null will be returned.
*
* @param whichButton
* The identifier of the button that should be returned. For example, this can be
* {@link DialogInterface#BUTTON_POSITIVE}.
* @return The button from the dialog, or null if a button does not exist.
*/
public Button getButton(int whichButton) {
return mAlert.getButton(whichButton);
}
/**
* Gets the list view used in the dialog.
*
* @return The {@link ListView} from the dialog.
*/
public ListView getListView() {
return mAlert.getListView();
}
@Override
public void setTitle(CharSequence title) {
super.setTitle(title);
mAlert.setTitle(title);
}
@Override
public void setTitleTextSize(float size) {
mAlert.setTitleTextSize(size);
}
@Override
public void setTitleTextColor(int color) {
mAlert.setTitleTextColor(color);
}
/**
* @see Builder#setCustomTitle(View)
*/
public void setCustomTitle(View customTitleView) {
mAlert.setCustomTitle(customTitleView);
}
public void setMessage(CharSequence message) {
mAlert.setMessage(message);
}
/**
* Set the view to display in that dialog.
*/
public void setView(View view) {
mAlert.setView(view);
}
/**
* Set the view to display in that dialog, specifying the spacing to appear around that view.
*
* @param view
* The view to show in the content area of the dialog
* @param viewSpacingLeft
* Extra space to appear to the left of {@code view}
* @param viewSpacingTop
* Extra space to appear above {@code view}
* @param viewSpacingRight
* Extra space to appear to the right of {@code view}
* @param viewSpacingBottom
* Extra space to appear below {@code view}
*/
public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight,
int viewSpacingBottom) {
mAlert.setView(view, viewSpacingLeft, viewSpacingTop, viewSpacingRight, viewSpacingBottom);
}
/**
* Set a message to be sent when a button is pressed.
*
* @param whichButton
* Which button to set the message for, can be one of {@link DialogInterface#BUTTON_POSITIVE},
* {@link DialogInterface#BUTTON_NEGATIVE}, or {@link DialogInterface#BUTTON_NEUTRAL}
* @param text
* The text to display in positive button.
* @param msg
* The {@link Message} to be sent when clicked.
*/
public void setButton(int whichButton, CharSequence text, Message msg) {
mAlert.setButton(whichButton, text, null, msg);
setCanceledOnTouchOutside(false);
}
public void setButton(ButtonColor buttonColor, int whichButton, CharSequence text, Message msg) {
mAlert.setButton(buttonColor, whichButton, text, null, msg);
setCanceledOnTouchOutside(false);
}
public void setButton(ButtonColor buttonColor, int whichButton, CharSequence text,
OnClickListener listener) {
mAlert.setButton(buttonColor, whichButton, text, listener, null);
setCanceledOnTouchOutside(false);
}
/**
* Set a listener to be invoked when the positive button of the dialog is pressed.
*
* @param whichButton
* Which button to set the listener on, can be one of {@link DialogInterface#BUTTON_POSITIVE},
* {@link DialogInterface#BUTTON_NEGATIVE}, or {@link DialogInterface#BUTTON_NEUTRAL}
* @param text
* The text to display in positive button.
* @param listener
* The {@link DialogInterface.OnClickListener} to use.
*/
public void setButton(int whichButton, CharSequence text, OnClickListener listener) {
mAlert.setButton(whichButton, text, listener, null);
setCanceledOnTouchOutside(false);
}
/**
* @deprecated Use {@link #setButton(int, CharSequence, Message)} with
* {@link DialogInterface#BUTTON_POSITIVE}.
*/
@Deprecated
public void setButton(CharSequence text, Message msg) {
setButton(BUTTON_POSITIVE, text, msg);
}
/**
* @deprecated Use {@link #setButton(int, CharSequence, Message)} with
* {@link DialogInterface#BUTTON_NEGATIVE}.
*/
@Deprecated
public void setButton2(CharSequence text, Message msg) {
setButton(BUTTON_NEGATIVE, text, msg);
}
/**
* @deprecated Use {@link #setButton(int, CharSequence, Message)} with
* {@link DialogInterface#BUTTON_NEUTRAL}.
*/
@Deprecated
public void setButton3(CharSequence text, Message msg) {
setButton(BUTTON_NEUTRAL, text, msg);
}
/**
* Set a listener to be invoked when button 1 of the dialog is pressed.
*
* @param text
* The text to display in button 1.
* @param listener
* The {@link DialogInterface.OnClickListener} to use.
* @deprecated Use {@link #setButton(int, CharSequence, android.content.DialogInterface.OnClickListener)}
* with {@link DialogInterface#BUTTON_POSITIVE}
*/
@Deprecated
public void setButton(CharSequence text, final OnClickListener listener) {
setButton(BUTTON_POSITIVE, text, listener);
}
/**
* Set a listener to be invoked when button 2 of the dialog is pressed.
*
* @param text
* The text to display in button 2.
* @param listener
* The {@link DialogInterface.OnClickListener} to use.
* @deprecated Use {@link #setButton(int, CharSequence, android.content.DialogInterface.OnClickListener)}
* with {@link DialogInterface#BUTTON_NEGATIVE}
*/
@Deprecated
public void setButton2(CharSequence text, final OnClickListener listener) {
setButton(BUTTON_NEGATIVE, text, listener);
}
/**
* Set a listener to be invoked when button 3 of the dialog is pressed.
*
* @param text
* The text to display in button 3.
* @param listener
* The {@link DialogInterface.OnClickListener} to use.
* @deprecated Use {@link #setButton(int, CharSequence, android.content.DialogInterface.OnClickListener)}
* with {@link DialogInterface#BUTTON_POSITIVE}
*/
@Deprecated
public void setButton3(CharSequence text, final OnClickListener listener) {
setButton(BUTTON_NEUTRAL, text, listener);
}
// tws-start bottom dialog::2014-10-14
public void setBottomButtons(int bottomButtonItemsId, final OnClickListener onClickListener) {
mAlert.setBottomButtons(bottomButtonItemsId, onClickListener);
}
public void setBottomButtons(CharSequence[] bottomButtonItems, final OnClickListener onClickListener) {
mAlert.setBottomButtons(bottomButtonItems, onClickListener);
}
public void setBottomButtons(int bottomButtonItemsId, int[] bottomButtonColorItems,
final OnClickListener onClickListener) {
mAlert.setBottomButtons(bottomButtonItemsId, bottomButtonColorItems, onClickListener);
}
public void setBottomButtons(CharSequence[] bottomButtonItems, int[] bottomButtonColorItems,
final OnClickListener onClickListener) {
mAlert.setBottomButtons(bottomButtonItems, bottomButtonColorItems, onClickListener);
}
public void setBottomButtonVisible(boolean isVisible) {
mAlert.setBottomButtonVisible(isVisible);
}
// tws-end bottom dialog::2014-10-14
/**
* Set resId to 0 if you don't want an icon.
*
* @param resId
* the resourceId of the drawable to use as the icon or 0 if you don't want an icon.
*/
public void setIcon(int resId) {
mAlert.setIcon(resId);
}
public void setIcon(Drawable icon) {
mAlert.setIcon(icon);
}
/**
* Set an icon as supplied by a theme attribute. e.g. android.R.attr.alertDialogIcon
*
* @param attrId
* ID of a theme attribute that points to a drawable resource.
*/
public void setIconAttribute(int attrId) {
TypedValue out = new TypedValue();
getContext().getTheme().resolveAttribute(attrId, out, true);
mAlert.setIcon(out.resourceId);
}
public void setInverseBackgroundForced(boolean forceInverseBackground) {
mAlert.setInverseBackgroundForced(forceInverseBackground);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAlert.installContent();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mAlert.onKeyDown(keyCode, event))
return true;
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (mAlert.onKeyUp(keyCode, event))
return true;
return super.onKeyUp(keyCode, event);
}
public static class Builder {
private final AlertController.AlertParams P;
private int mTheme;
/**
* Constructor using a context for this builder and the {@link AlertDialog} it creates.
*/
public Builder(Context context) {
this(context, resolveDialogTheme(context, 0));
}
/**
* Constructor using a context and theme for this builder and the {@link AlertDialog} it creates. The
* actual theme that an AlertDialog uses is a private implementation, however you can here supply
* either the name of an attribute in the theme from which to get the dialog's style (such as
* {@link android.R.attr#alertDialogTheme} or one of the constants
* {@link AlertDialog#THEME_TRADITIONAL AlertDialog.THEME_TRADITIONAL},
* {@link AlertDialog#THEME_HOLO_DARK AlertDialog.THEME_HOLO_DARK}, or
* {@link AlertDialog#THEME_HOLO_LIGHT AlertDialog.THEME_HOLO_LIGHT}.
*/
public Builder(Context context, int theme) {
this(context, false, theme);
}
// tws-start bottom dialog::2014-10-2
public Builder(Context context, boolean isBottomDialog) {
this(context, isBottomDialog, resolveDialogTheme(context,
R.style.Theme_tws_Second_Dialog_Bottom));
}
public Builder(Context context, boolean isBottomDialog, int theme) {
P = new AlertController.AlertParams(new ContextThemeWrapper(context, resolveDialogTheme(context,
theme)));
mTheme = theme;
}
// tws-end bottom dialog::2014-10-2
/**
* Returns a {@link Context} with the appropriate theme for dialogs created by this Builder.
* Applications should use this Context for obtaining LayoutInflaters for inflating views that will be
* used in the resulting dialogs, as it will cause views to be inflated with the correct theme.
*
* @return A Context for built Dialogs.
*/
public Context getContext() {
return P.mContext;
}
/**
* Set the title using the given resource id.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setTitle(int titleId) {
P.mTitle = P.mContext.getText(titleId);
return this;
}
/**
* Set the title displayed in the {@link Dialog}.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setTitle(CharSequence title) {
P.mTitle = title;
return this;
}
/**
* Set the title using the custom view {@code customTitleView}. The methods {@link #setTitle(int)} and
* {@link #setIcon(int)} should be sufficient for most titles, but this is provided if the title needs
* more customization. Using this will replace the title and icon set via the other methods.
*
* @param customTitleView
* The custom view to use as the title.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setCustomTitle(View customTitleView) {
P.mCustomTitleView = customTitleView;
return this;
}
/**
* Set the message to display using the given resource id.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMessage(int messageId) {
P.mMessage = P.mContext.getText(messageId);
return this;
}
/**
* Set the message to display.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMessage(CharSequence message) {
P.mMessage = message;
return this;
}
/**
* Set the resource id of the {@link Drawable} to be used in the title.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setIcon(int iconId) {
P.mIconId = iconId;
return this;
}
/**
* Set the {@link Drawable} to be used in the title.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setIcon(Drawable icon) {
P.mIcon = icon;
return this;
}
/**
* Set an icon as supplied by a theme attribute. e.g. android.R.attr.alertDialogIcon
*
* @param attrId
* ID of a theme attribute that points to a drawable resource.
*/
public Builder setIconAttribute(int attrId) {
TypedValue out = new TypedValue();
P.mContext.getTheme().resolveAttribute(attrId, out, true);
P.mIconId = out.resourceId;
return this;
}
/**
* Set a listener to be invoked when the positive button of the dialog is pressed.
*
* @param textId
* The resource id of the text to display in the positive button
* @param listener
* The {@link DialogInterface.OnClickListener} to use.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setPositiveButton(int textId, final OnClickListener listener) {
return setPositiveButton(ButtonColor.BTN_NORMAL, P.mContext.getText(textId), listener);
}
public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {
return setPositiveButton(ButtonColor.BTN_NORMAL, text, listener);
}
public Builder setPositiveButton(ButtonColor buttonColor, int textId, final OnClickListener listener) {
return setPositiveButton(buttonColor, P.mContext.getText(textId), listener);
}
public Builder setPositiveButton(ButtonColor buttonColor, CharSequence text,
final OnClickListener listener) {
P.mPositiveButtonText = text;
P.mPositiveButtonListener = listener;
P.mPositiveColor = buttonColor;
P.mCanceOutWindow = false;
return this;
}
public Builder setNegativeButton(int textId, final OnClickListener listener) {
return setNegativeButton(ButtonColor.BTN_NORMAL, P.mContext.getText(textId), listener);
}
public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {
return setNegativeButton(ButtonColor.BTN_NORMAL, text, listener);
}
public Builder setNegativeButton(ButtonColor buttonColor, int textId, final OnClickListener listener) {
return setNegativeButton(buttonColor, P.mContext.getText(textId), listener);
}
public Builder setNegativeButton(ButtonColor buttonColor, CharSequence text,
final OnClickListener listener) {
P.mNegativeButtonText = text;
P.mNegativeButtonListener = listener;
P.mNegativeColor = buttonColor;
P.mCanceOutWindow = false;
return this;
}
public Builder setNeutralButton(int textId, final OnClickListener listener) {
return setNeutralButton(ButtonColor.BTN_NORMAL, P.mContext.getText(textId), listener);
}
public Builder setNeutralButton(CharSequence text, final OnClickListener listener) {
return setNeutralButton(ButtonColor.BTN_NORMAL, text, listener);
}
public Builder setNeutralButton(ButtonColor buttonColor, int textId, final OnClickListener listener) {
return setNeutralButton(buttonColor, P.mContext.getText(textId), listener);
}
public Builder setNeutralButton(ButtonColor buttonColor, CharSequence text,
final OnClickListener listener) {
P.mNeutralButtonText = text;
P.mNeutralButtonListener = listener;
P.mNeutralColor = buttonColor;
P.mCanceOutWindow = false;
return this;
}
/**
* Sets whether the dialog is cancelable or not. Default is true.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setCancelable(boolean cancelable) {
P.mCancelable = cancelable;
return this;
}
/**
* Sets the callback that will be called if the dialog is canceled.
*
* @see #setCancelable(boolean)
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setOnCancelListener(OnCancelListener onCancelListener) {
P.mOnCancelListener = onCancelListener;
return this;
}
/**
* Sets the callback that will be called if a key is dispatched to the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setOnKeyListener(OnKeyListener onKeyListener) {
P.mOnKeyListener = onKeyListener;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. This should be an array type i.e. R.array.foo
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setItems(int itemsId, final OnClickListener listener) {
P.mItems = P.mContext.getResources().getTextArray(itemsId);
P.mOnClickListener = listener;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setItems(CharSequence[] items, final OnClickListener listener) {
P.mItems = items;
P.mOnClickListener = listener;
return this;
}
// tws-start bottom dialog::2014-10-1
public Builder setBottomButtonItems(int itemsId, final OnClickListener listener) {
P.mBottomButtonItems = P.mContext.getResources().getTextArray(itemsId);
P.mBottomButtonOnClickListener = listener;
return this;
}
public Builder setBottomButtonItems(CharSequence[] items, final OnClickListener listener) {
P.mBottomButtonItems = items;
P.mBottomButtonOnClickListener = listener;
return this;
}
public Builder setBottomButtonCursor(final Cursor cursor, final OnClickListener listener,
String labelColumn) {
P.mBottomButtonCursor = cursor;
P.mBottomButtonLabelColumn = labelColumn;
P.mBottomButtonOnClickListener = listener;
return this;
}
public Builder setBottomButtonAdapter(final ListAdapter adapter, final OnClickListener listener) {
P.mBottomButtonAdapter = adapter;
P.mBottomButtonOnClickListener = listener;
return this;
}
public Builder setBottomButtonMultiChoiceItems(int itemsId, boolean[] checkedItems,
final OnMultiChoiceClickListener listener) {
P.mBottomButtonItems = P.mContext.getResources().getTextArray(itemsId);
P.mBottomButtonOnCheckboxClickListener = listener;
P.mBottomButtonCheckedItems = checkedItems;
P.mIsBottomButtonMultiChoice = true;
return this;
}
public Builder setBottomButtonMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,
final OnMultiChoiceClickListener listener) {
P.mBottomButtonItems = items;
P.mBottomButtonOnCheckboxClickListener = listener;
P.mBottomButtonCheckedItems = checkedItems;
P.mIsBottomButtonMultiChoice = true;
return this;
}
public Builder setBottomButtonMultiChoiceItems(Cursor cursor, String isCheckedColumn,
String labelColumn, final OnMultiChoiceClickListener listener) {
P.mBottomButtonCursor = cursor;
P.mBottomButtonOnCheckboxClickListener = listener;
P.mIsBottomButtonCheckedColumn = isCheckedColumn;
P.mBottomButtonLabelColumn = labelColumn;
P.mIsBottomButtonMultiChoice = true;
return this;
}
public Builder setBottomButtonSingleChoiceItems(int itemsId, int checkedItem,
final OnClickListener listener) {
P.mBottomButtonItems = P.mContext.getResources().getTextArray(itemsId);
P.mBottomButtonOnClickListener = listener;
P.mBottomButtonCheckedItem = checkedItem;
P.mIsBottomButtonSingleChoice = true;
return this;
}
public Builder setBottomButtonSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,
final OnClickListener listener) {
P.mBottomButtonCursor = cursor;
P.mBottomButtonOnClickListener = listener;
P.mBottomButtonCheckedItem = checkedItem;
P.mBottomButtonLabelColumn = labelColumn;
P.mIsBottomButtonSingleChoice = true;
return this;
}
public Builder setBottomButtonSingleChoiceItems(CharSequence[] items, int checkedItem,
final OnClickListener listener) {
P.mBottomButtonItems = items;
P.mBottomButtonOnClickListener = listener;
P.mBottomButtonCheckedItem = checkedItem;
P.mIsBottomButtonSingleChoice = true;
return this;
}
public Builder setBottomButtonSingleChoiceItems(ListAdapter adapter, int checkedItem,
final OnClickListener listener) {
P.mBottomButtonAdapter = adapter;
P.mBottomButtonOnClickListener = listener;
P.mBottomButtonCheckedItem = checkedItem;
P.mIsBottomButtonSingleChoice = true;
return this;
}
public Builder setBottomButtonColorItems(int[] items) {
P.mBottomButtonColorItems = items;
return this;
}
// tws-end bottom dialog::2014-10-1
/**
* Set a list of items, which are supplied by the given {@link ListAdapter}, to be displayed in the
* dialog as the content, you will be notified of the selected item via the supplied listener.
*
* @param adapter
* The {@link ListAdapter} to supply the list of items
* @param listener
* The listener that will be called when an item is clicked.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setAdapter(final ListAdapter adapter, final OnClickListener listener) {
P.mAdapter = adapter;
P.mOnClickListener = listener;
return this;
}
/**
* Set a list of items, which are supplied by the given {@link Cursor}, to be displayed in the dialog
* as the content, you will be notified of the selected item via the supplied listener.
*
* @param cursor
* The {@link Cursor} to supply the list of items
* @param listener
* The listener that will be called when an item is clicked.
* @param labelColumn
* The column name on the cursor containing the string to display in the label.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setCursor(final Cursor cursor, final OnClickListener listener, String labelColumn) {
P.mCursor = cursor;
P.mLabelColumn = labelColumn;
P.mOnClickListener = listener;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. This should be an array type, e.g. R.array.foo. The list
* will have a check mark displayed to the right of the text for each checked item. Clicking on an
* item in the list will not dismiss the dialog. Clicking on a button will dismiss the dialog.
*
* @param itemsId
* the resource id of an array i.e. R.array.foo
* @param checkedItems
* specifies which items are checked. It should be null in which case no items are checked.
* If non null it must be exactly the same length as the array of items.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMultiChoiceItems(int itemsId, boolean[] checkedItems,
final OnMultiChoiceClickListener listener) {
P.mItems = P.mContext.getResources().getTextArray(itemsId);
P.mOnCheckboxClickListener = listener;
P.mCheckedItems = checkedItems;
P.mIsMultiChoice = true;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. The list will have a check mark displayed to the right of
* the text for each checked item. Clicking on an item in the list will not dismiss the dialog.
* Clicking on a button will dismiss the dialog.
*
* @param items
* the text of the items to be displayed in the list.
* @param checkedItems
* specifies which items are checked. It should be null in which case no items are checked.
* If non null it must be exactly the same length as the array of items.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,
final OnMultiChoiceClickListener listener) {
P.mItems = items;
P.mOnCheckboxClickListener = listener;
P.mCheckedItems = checkedItems;
P.mIsMultiChoice = true;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. The list will have a check mark displayed to the right of
* the text for each checked item. Clicking on an item in the list will not dismiss the dialog.
* Clicking on a button will dismiss the dialog.
*
* @param cursor
* the cursor used to provide the items.
* @param isCheckedColumn
* specifies the column name on the cursor to use to determine whether a checkbox is
* checked or not. It must return an integer value where 1 means checked and 0 means
* unchecked.
* @param labelColumn
* The column name on the cursor containing the string to display in the label.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,
final OnMultiChoiceClickListener listener) {
P.mCursor = cursor;
P.mOnCheckboxClickListener = listener;
P.mIsCheckedColumn = isCheckedColumn;
P.mLabelColumn = labelColumn;
P.mIsMultiChoice = true;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. This should be an array type i.e. R.array.foo The list
* will have a check mark displayed to the right of the text for the checked item. Clicking on an item
* in the list will not dismiss the dialog. Clicking on a button will dismiss the dialog.
*
* @param itemsId
* the resource id of an array i.e. R.array.foo
* @param checkedItem
* specifies which item is checked. If -1 no items are checked.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setSingleChoiceItems(int itemsId, int checkedItem, final OnClickListener listener) {
P.mItems = P.mContext.getResources().getTextArray(itemsId);
P.mOnClickListener = listener;
P.mCheckedItem = checkedItem;
P.mIsSingleChoice = true;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. The list will have a check mark displayed to the right of
* the text for the checked item. Clicking on an item in the list will not dismiss the dialog.
* Clicking on a button will dismiss the dialog.
*
* @param cursor
* the cursor to retrieve the items from.
* @param checkedItem
* specifies which item is checked. If -1 no items are checked.
* @param labelColumn
* The column name on the cursor containing the string to display in the label.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,
final OnClickListener listener) {
P.mCursor = cursor;
P.mOnClickListener = listener;
P.mCheckedItem = checkedItem;
P.mLabelColumn = labelColumn;
P.mIsSingleChoice = true;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. The list will have a check mark displayed to the right of
* the text for the checked item. Clicking on an item in the list will not dismiss the dialog.
* Clicking on a button will dismiss the dialog.
*
* @param items
* the items to be displayed.
* @param checkedItem
* specifies which item is checked. If -1 no items are checked.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem,
final OnClickListener listener) {
P.mItems = items;
P.mOnClickListener = listener;
P.mCheckedItem = checkedItem;
P.mIsSingleChoice = true;
return this;
}
/**
* Set a list of items to be displayed in the dialog as the content, you will be notified of the
* selected item via the supplied listener. The list will have a check mark displayed to the right of
* the text for the checked item. Clicking on an item in the list will not dismiss the dialog.
* Clicking on a button will dismiss the dialog.
*
* @param adapter
* The {@link ListAdapter} to supply the list of items
* @param checkedItem
* specifies which item is checked. If -1 no items are checked.
* @param listener
* notified when an item on the list is clicked. The dialog will not be dismissed when an
* item is clicked. It will only be dismissed if clicked on a button, if no buttons are
* supplied it's up to the user to dismiss the dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem,
final OnClickListener listener) {
P.mAdapter = adapter;
P.mOnClickListener = listener;
P.mCheckedItem = checkedItem;
P.mIsSingleChoice = true;
return this;
}
/**
* Sets a listener to be invoked when an item in the list is selected.
*
* @param listener
* The listener to be invoked.
* @see AdapterView#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener)
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setOnItemSelectedListener(final AdapterView.OnItemSelectedListener listener) {
P.mOnItemSelectedListener = listener;
return this;
}
/**
* Set a custom view to be the contents of the Dialog. If the supplied view is an instance of a
* {@link ListView} the light background will be used.
*
* @param view
* The view to use as the contents of the Dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setView(View view) {
P.mView = view;
P.mViewSpacingSpecified = false;
return this;
}
/**
* Set a custom view to be the contents of the Dialog, specifying the spacing to appear around that
* view. If the supplied view is an instance of a {@link ListView} the light background will be used.
*
* @param view
* The view to use as the contents of the Dialog.
* @param viewSpacingLeft
* Spacing between the left edge of the view and the dialog frame
* @param viewSpacingTop
* Spacing between the top edge of the view and the dialog frame
* @param viewSpacingRight
* Spacing between the right edge of the view and the dialog frame
* @param viewSpacingBottom
* Spacing between the bottom edge of the view and the dialog frame
* @return This Builder object to allow for chaining of calls to set methods
*
*
* This is currently hidden because it seems like people should just be able to put padding
* around the view.
* @hide
*/
public Builder setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight,
int viewSpacingBottom) {
P.mView = view;
P.mViewSpacingSpecified = true;
P.mViewSpacingLeft = viewSpacingLeft;
P.mViewSpacingTop = viewSpacingTop;
P.mViewSpacingRight = viewSpacingRight;
P.mViewSpacingBottom = viewSpacingBottom;
return this;
}
/**
* Sets the Dialog to use the inverse background, regardless of what the contents is.
*
* @param useInverseBackground
* Whether to use the inverse background
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setInverseBackgroundForced(boolean useInverseBackground) {
P.mForceInverseBackground = useInverseBackground;
return this;
}
/**
* @hide
*/
public Builder setRecycleOnMeasureEnabled(boolean enabled) {
P.mRecycleOnMeasure = enabled;
return this;
}
/**
* Creates a {@link AlertDialog} with the arguments supplied to this builder. It does not
* {@link Dialog#show()} the dialog. This allows the user to do any extra processing before displaying
* the dialog. Use {@link #show()} if you don't have any other processing to do and want this to be
* created and displayed.
*/
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
P.apply(dialog.mAlert);
dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
dialog.setCanceledOnTouchOutside(P.mCanceOutWindow);
}
dialog.setOnCancelListener(P.mOnCancelListener);
if (P.mOnKeyListener != null) {
dialog.setOnKeyListener(P.mOnKeyListener);
}
return dialog;
}
/**
* Creates a {@link AlertDialog} with the arguments supplied to this builder and {@link Dialog#show()}
* 's the dialog.
*/
private AlertDialog mAlertDialog = null;
public AlertDialog show() {
if(null == mAlertDialog){
mAlertDialog = create();
}
mAlertDialog.show();
return mAlertDialog;
}
// tws-start bottom dialog::2014-10-2
public AlertDialog create(boolean isBottomDialog) {
final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false, isBottomDialog);
P.apply(dialog.mAlert);
dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
dialog.setCanceledOnTouchOutside(P.mCanceOutWindow);
}
dialog.setOnCancelListener(P.mOnCancelListener);
if (P.mOnKeyListener != null) {
dialog.setOnKeyListener(P.mOnKeyListener);
}
return dialog;
}
public AlertDialog show(boolean isBottomDialog) {
AlertDialog dialog = create(isBottomDialog);
dialog.show();
return dialog;
}
// tws-end bottom dialog::2014-10-2
/*tws-start::add for dialog out window touch state::braind::20120327*/
boolean twsCheckButtonListener(AlertController.AlertParams P, AlertDialog dialog) {
boolean bRet = true;
if (P.mNegativeButtonListener != null || P.mPositiveButtonListener != null
|| P.mNeutralButtonListener != null) {
bRet = false;
}
return bRet;
}
public Builder setListHeight(int height) {
P.mListViewHeight = height;
return this;
}
/*tws-end::add for dialog out window touch state::braind::20120327*/
}
public void setBottomButtonsStartAnimation(boolean enable){
mAlert.setBottomButtonsStartAnimation(enable);
}
public ListView getBottomButtons(){
return mAlert.getBottomButtons();
}
}