AlertController.java revision 154c2c24dc3b741bcc0d54c46d349478d24472ac
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guyimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
20076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunne
21076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunneimport com.android.internal.R;
22076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunne
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlertDialog;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
326fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guyimport android.util.AttributeSet;
333320dcd049700481c744d499feeecd1454afd4d7Adam Powellimport android.util.TypedValue;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
39076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunneimport android.view.ViewGroup.LayoutParams;
40154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viveretteimport android.view.ViewTreeObserver;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
42119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnanimport android.view.WindowInsets;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
44154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viveretteimport android.widget.AbsListView;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
46076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunneimport android.widget.AdapterView.OnItemClickListener;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ArrayAdapter;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Button;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.CheckedTextView;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.CursorAdapter;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.FrameLayout;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ImageView;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.LinearLayout;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListAdapter;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListView;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ScrollView;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SimpleCursorAdapter;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AlertController {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final DialogInterface mDialogInterface;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Window mWindow;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette    private CharSequence mTitle;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mMessage;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ListView mListView;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private View mView;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    private int mViewLayoutResId;
74ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingLeft;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingTop;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingRight;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingBottom;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mViewSpacingSpecified = false;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette    private Button mButtonPositive;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mButtonPositiveText;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Message mButtonPositiveMessage;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Button mButtonNegative;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mButtonNegativeText;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Message mButtonNegativeMessage;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Button mButtonNeutral;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mButtonNeutralText;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Message mButtonNeutralMessage;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ScrollView mScrollView;
94b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
95a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette    private int mIconId = 0;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mIcon;
97b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ImageView mIconView;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mTitleView;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mMessageView;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private View mCustomTitleView;
102b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mForceInverseBackground;
104b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ListAdapter mAdapter;
106b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mCheckedItem = -1;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mAlertDialogLayout;
1104c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    private int mButtonPanelSideLayout;
111fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mListLayout;
112fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mMultiChoiceItemLayout;
113fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mSingleChoiceItemLayout;
114fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mListItemLayout;
115fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
1164c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    private int mButtonPanelLayoutHint = AlertDialog.LAYOUT_HINT_NONE;
117b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Handler mHandler;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
120c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette    private final View.OnClickListener mButtonHandler = new View.OnClickListener() {
121c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        @Override
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onClick(View v) {
123c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final Message m;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v == mButtonPositive && mButtonPositiveMessage != null) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m = Message.obtain(mButtonPositiveMessage);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (v == mButtonNegative && mButtonNegativeMessage != null) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m = Message.obtain(mButtonNegativeMessage);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (v == mButtonNeutral && mButtonNeutralMessage != null) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m = Message.obtain(mButtonNeutralMessage);
130c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            } else {
131c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                m = null;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
133c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (m != null) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m.sendToTarget();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Post a message so we dismiss after the above handlers are executed
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialogInterface)
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .sendToTarget();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ButtonHandler extends Handler {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Button clicks have Message.what as the BUTTON{1,2,3} constant
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final int MSG_DISMISS_DIALOG = 1;
147b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private WeakReference<DialogInterface> mDialog;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ButtonHandler(DialogInterface dialog) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDialog = new WeakReference<DialogInterface>(dialog);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
157b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DialogInterface.BUTTON_POSITIVE:
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DialogInterface.BUTTON_NEGATIVE:
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DialogInterface.BUTTON_NEUTRAL:
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
163b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MSG_DISMISS_DIALOG:
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ((DialogInterface) msg.obj).dismiss();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1703320dcd049700481c744d499feeecd1454afd4d7Adam Powell    private static boolean shouldCenterSingleButton(Context context) {
1713320dcd049700481c744d499feeecd1454afd4d7Adam Powell        TypedValue outValue = new TypedValue();
1723320dcd049700481c744d499feeecd1454afd4d7Adam Powell        context.getTheme().resolveAttribute(com.android.internal.R.attr.alertDialogCenterButtons,
1733320dcd049700481c744d499feeecd1454afd4d7Adam Powell                outValue, true);
1743320dcd049700481c744d499feeecd1454afd4d7Adam Powell        return outValue.data != 0;
1753320dcd049700481c744d499feeecd1454afd4d7Adam Powell    }
1763320dcd049700481c744d499feeecd1454afd4d7Adam Powell
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AlertController(Context context, DialogInterface di, Window window) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDialogInterface = di;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = window;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler = new ButtonHandler(di);
182fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
183fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        TypedArray a = context.obtainStyledAttributes(null,
184fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.styleable.AlertDialog,
185fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.attr.alertDialogStyle, 0);
186fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
187fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mAlertDialogLayout = a.getResourceId(com.android.internal.R.styleable.AlertDialog_layout,
188fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.layout.alert_dialog);
1894c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        mButtonPanelSideLayout = a.getResourceId(
1904c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout                com.android.internal.R.styleable.AlertDialog_buttonPanelSideLayout, 0);
1914c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout
192fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mListLayout = a.getResourceId(
193fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.styleable.AlertDialog_listLayout,
194fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.layout.select_dialog);
195fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mMultiChoiceItemLayout = a.getResourceId(
196fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.styleable.AlertDialog_multiChoiceItemLayout,
197fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.layout.select_dialog_multichoice);
198fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mSingleChoiceItemLayout = a.getResourceId(
199fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.styleable.AlertDialog_singleChoiceItemLayout,
200fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.layout.select_dialog_singlechoice);
201fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mListItemLayout = a.getResourceId(
202fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.styleable.AlertDialog_listItemLayout,
203fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                com.android.internal.R.layout.select_dialog_item);
204fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
205fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        a.recycle();
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
207b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean canTextInput(View v) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v.onCheckIsTextEditor()) {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
212b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(v instanceof ViewGroup)) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
216b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewGroup vg = (ViewGroup)v;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = vg.getChildCount();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i > 0) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = vg.getChildAt(i);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (canTextInput(v)) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
226b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
229b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void installContent() {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* We use a custom title so never request a window title */
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow.requestFeature(Window.FEATURE_NO_TITLE);
2334c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        int contentView = selectContentView();
2344c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        mWindow.setContentView(contentView);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setupView();
236119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        setupDecor();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2384c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout
2394c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    private int selectContentView() {
2404c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        if (mButtonPanelSideLayout == 0) {
2414c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout            return mAlertDialogLayout;
2424c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        }
2434c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        if (mButtonPanelLayoutHint == AlertDialog.LAYOUT_HINT_SIDE) {
2444c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout            return mButtonPanelSideLayout;
2454c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        }
2464c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        // TODO: use layout hint side for long messages/lists
2474c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        return mAlertDialogLayout;
2484c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    }
249b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleView != null) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleView.setText(title);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see AlertDialog.Builder#setCustomTitle(View)
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCustomTitle(View customTitleView) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCustomTitleView = customTitleView;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
263b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMessage(CharSequence message) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessage = message;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessageView != null) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView.setText(message);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
272ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette     * Set the view resource to display in the dialog.
273ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette     */
274ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    public void setView(int layoutResId) {
275ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mView = null;
276ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewLayoutResId = layoutResId;
277ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewSpacingSpecified = false;
278ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    }
279ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
280ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    /**
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the view to display in the dialog.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setView(View view) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = view;
285ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewLayoutResId = 0;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingSpecified = false;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
288b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the view to display in the dialog along with the spacing around that view
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight,
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int viewSpacingBottom) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = view;
295ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewLayoutResId = 0;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingSpecified = true;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingLeft = viewSpacingLeft;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingTop = viewSpacingTop;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingRight = viewSpacingRight;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingBottom = viewSpacingBottom;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3044c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout     * Sets a hint for the best button panel layout.
3054c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout     */
3064c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    public void setButtonPanelLayoutHint(int layoutHint) {
3074c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        mButtonPanelLayoutHint = layoutHint;
3084c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    }
3094c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout
3104c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    /**
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets a click listener or a message to be sent when the button is clicked.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You only need to pass one of {@code listener} or {@code msg}.
313b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette     *
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param whichButton Which button, can be one of
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link DialogInterface#BUTTON_POSITIVE},
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link DialogInterface#BUTTON_NEGATIVE}, or
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link DialogInterface#BUTTON_NEUTRAL}
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The text to display in positive button.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The {@link DialogInterface.OnClickListener} to use.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param msg The {@link Message} to be sent when clicked.
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setButton(int whichButton, CharSequence text,
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DialogInterface.OnClickListener listener, Message msg) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (msg == null && listener != null) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg = mHandler.obtainMessage(whichButton, listener);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
328b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (whichButton) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_POSITIVE:
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonPositiveText = text;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonPositiveMessage = msg;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
335b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEGATIVE:
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNegativeText = text;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNegativeMessage = msg;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
340b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEUTRAL:
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNeutralText = text;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNeutralMessage = msg;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
345b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("Button does not exist");
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
352a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * Specifies the icon to display next to the alert title.
353a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     *
354a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * @param resId the resource identifier of the drawable to use as the icon,
355a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     *            or 0 for no icon
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIcon(int resId) {
358a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette        mIcon = null;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIconId = resId;
360a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIconView != null) {
362a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            if (resId != 0) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIconView.setImageResource(mIconId);
364a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            } else {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIconView.setVisibility(View.GONE);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
369a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
370a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette    /**
371a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * Specifies the icon to display next to the alert title.
372a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     *
373a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * @param icon the drawable to use as the icon or null for no icon
374a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIcon(Drawable icon) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIcon = icon;
377a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette        mIconId = 0;
378a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
379a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette        if (mIconView != null) {
380a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            if (icon != null) {
381a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                mIconView.setImageDrawable(icon);
382a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            } else {
383a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                mIconView.setVisibility(View.GONE);
384a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
388576e1dff3d40610377a763db6c9e6bf999e00987blunden    /**
389576e1dff3d40610377a763db6c9e6bf999e00987blunden     * @param attrId the attributeId of the theme-specific drawable
390576e1dff3d40610377a763db6c9e6bf999e00987blunden     * to resolve the resourceId for.
391576e1dff3d40610377a763db6c9e6bf999e00987blunden     *
392576e1dff3d40610377a763db6c9e6bf999e00987blunden     * @return resId the resourceId of the theme-specific drawable
393576e1dff3d40610377a763db6c9e6bf999e00987blunden     */
394576e1dff3d40610377a763db6c9e6bf999e00987blunden    public int getIconAttributeResId(int attrId) {
395576e1dff3d40610377a763db6c9e6bf999e00987blunden        TypedValue out = new TypedValue();
396576e1dff3d40610377a763db6c9e6bf999e00987blunden        mContext.getTheme().resolveAttribute(attrId, out, true);
397576e1dff3d40610377a763db6c9e6bf999e00987blunden        return out.resourceId;
398576e1dff3d40610377a763db6c9e6bf999e00987blunden    }
399576e1dff3d40610377a763db6c9e6bf999e00987blunden
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInverseBackgroundForced(boolean forceInverseBackground) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mForceInverseBackground = forceInverseBackground;
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
403b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ListView getListView() {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mListView;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
407b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Button getButton(int whichButton) {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (whichButton) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_POSITIVE:
4116fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy                return mButtonPositive;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEGATIVE:
4136fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy                return mButtonNegative;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEUTRAL:
4156fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy                return mButtonNeutral;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
420b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
4216fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy    @SuppressWarnings({"UnusedDeclaration"})
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
4236fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy        return mScrollView != null && mScrollView.executeKeyEvent(event);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4266fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy    @SuppressWarnings({"UnusedDeclaration"})
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
4286fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy        return mScrollView != null && mScrollView.executeKeyEvent(event);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
430119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan
431119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan    private void setupDecor() {
432119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        final View decor = mWindow.getDecorView();
433119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        final View parent = mWindow.findViewById(R.id.parentPanel);
434119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        if (parent != null && decor != null) {
435119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            decor.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
436119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                @Override
437119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) {
438119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                    if (insets.isRound()) {
439119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                        // TODO: Get the padding as a function of the window size.
440119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                        int roundOffset = mContext.getResources().getDimensionPixelOffset(
441119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                                R.dimen.alert_dialog_round_padding);
442119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                        parent.setPadding(roundOffset, roundOffset, roundOffset, roundOffset);
443119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                    }
444119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                    return insets.consumeSystemWindowInsets();
445119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan                }
446119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            });
447119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            decor.setFitsSystemWindows(true);
448119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            decor.requestApplyInsets();
449119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        }
450119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan    }
451119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setupView() {
453154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        final ViewGroup contentPanel = (ViewGroup) mWindow.findViewById(R.id.contentPanel);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setupContent(contentPanel);
455f56ed2db007f8ca8c385d16d4662f13b9a1adabcAlan Viverette        final boolean hasButtons = setupButtons();
456b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
457154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        final ViewGroup topPanel = (ViewGroup) mWindow.findViewById(R.id.topPanel);
458f56ed2db007f8ca8c385d16d4662f13b9a1adabcAlan Viverette        final TypedArray a = mContext.obtainStyledAttributes(
459f56ed2db007f8ca8c385d16d4662f13b9a1adabcAlan Viverette                null, R.styleable.AlertDialog, R.attr.alertDialogStyle, 0);
460f56ed2db007f8ca8c385d16d4662f13b9a1adabcAlan Viverette        final boolean hasTitle = setupTitle(topPanel);
461b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
462f56ed2db007f8ca8c385d16d4662f13b9a1adabcAlan Viverette        final View buttonPanel = mWindow.findViewById(R.id.buttonPanel);
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!hasButtons) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buttonPanel.setVisibility(View.GONE);
465d044ad97a8ac1f62c572c7e42c77e960441d8d02Adam Powell            final View spacer = mWindow.findViewById(R.id.textSpacerNoButtons);
466d044ad97a8ac1f62c572c7e42c77e960441d8d02Adam Powell            if (spacer != null) {
467d044ad97a8ac1f62c572c7e42c77e960441d8d02Adam Powell                spacer.setVisibility(View.VISIBLE);
468d044ad97a8ac1f62c572c7e42c77e960441d8d02Adam Powell            }
469ef57575887bde74ef09e9f21aae6b02f9c8163c7Dianne Hackborn            mWindow.setCloseOnTouchOutsideIfNotSet(true);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
472ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        final FrameLayout customPanel = (FrameLayout) mWindow.findViewById(R.id.customPanel);
473ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        final View customView;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
475ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customView = mView;
476ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        } else if (mViewLayoutResId != 0) {
477ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            final LayoutInflater inflater = LayoutInflater.from(mContext);
478ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customView = inflater.inflate(mViewLayoutResId, customPanel, false);
479ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        } else {
480ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customView = null;
481ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        }
482ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
483c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final boolean hasCustomView = customView != null;
484c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (!hasCustomView || !canTextInput(customView)) {
485ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            mWindow.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
486ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
487ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        }
488ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
489c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (hasCustomView) {
490ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            final FrameLayout custom = (FrameLayout) mWindow.findViewById(R.id.custom);
491ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            custom.addView(customView, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
492ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mViewSpacingSpecified) {
494ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                custom.setPadding(
495ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                        mViewSpacingLeft, mViewSpacingTop, mViewSpacingRight, mViewSpacingBottom);
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
497ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mListView != null) {
499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                ((LinearLayout.LayoutParams) customPanel.getLayoutParams()).weight = 0;
500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
502ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customPanel.setVisibility(View.GONE);
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
504c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
505c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        // Only display the divider if we have a title and a custom view or a
506c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        // message.
50732aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell        if (hasTitle) {
508c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final View divider;
509ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            if (mMessage != null || customView != null || mListView != null) {
51032aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell                divider = mWindow.findViewById(R.id.titleDivider);
51132aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell            } else {
51232aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell                divider = mWindow.findViewById(R.id.titleDividerTop);
51332aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell            }
51432aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell
51532aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell            if (divider != null) {
51632aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell                divider.setVisibility(View.VISIBLE);
51732aa2c90ee6e12f6c53c7d572d5c02f1d795b8f7Adam Powell            }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
519c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
520c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        setBackground(a, topPanel, contentPanel, customPanel, buttonPanel, hasTitle, hasCustomView,
521c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                hasButtons);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
525154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    private boolean setupTitle(ViewGroup topPanel) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasTitle = true;
527b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCustomTitleView != null) {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Add the custom title view directly to the topPanel layout
530154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            LayoutParams lp = new LayoutParams(
531154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
532b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
5335ea0bc1abccea067875d00dc9b9dde7c17c1efffAdam Powell            topPanel.addView(mCustomTitleView, 0, lp);
534b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Hide the title template
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View titleTemplate = mWindow.findViewById(R.id.title_template);
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            titleTemplate.setVisibility(View.GONE);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconView = (ImageView) mWindow.findViewById(R.id.icon);
540a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
541a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            final boolean hasTextTitle = !TextUtils.isEmpty(mTitle);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (hasTextTitle) {
543a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // Display the title if a title is supplied, else hide it.
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTitleView = (TextView) mWindow.findViewById(R.id.alertTitle);
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTitleView.setText(mTitle);
546a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
547a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // Do this last so that if the user has supplied any icons we
548a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // use them instead of the default ones. If the user has
549a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // specified 0 then make it disappear.
550a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                if (mIconId != 0) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mIconView.setImageResource(mIconId);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (mIcon != null) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mIconView.setImageDrawable(mIcon);
554a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                } else {
555a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                    // Apply the padding from the icon to ensure the title is
556a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                    // aligned correctly.
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTitleView.setPadding(mIconView.getPaddingLeft(),
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIconView.getPaddingTop(),
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIconView.getPaddingRight(),
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIconView.getPaddingBottom());
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mIconView.setVisibility(View.GONE);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Hide the title template
565a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                final View titleTemplate = mWindow.findViewById(R.id.title_template);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                titleTemplate.setVisibility(View.GONE);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIconView.setVisibility(View.GONE);
568e74e7e2a088cc9077e4ee98e01a48bb52e9cfd50Martin Sjolin                topPanel.setVisibility(View.GONE);
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasTitle = false;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasTitle;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
575154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    private void setupContent(ViewGroup contentPanel) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView = (ScrollView) mWindow.findViewById(R.id.scrollView);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView.setFocusable(false);
578b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Special case for users that only want to display a String
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageView = (TextView) mWindow.findViewById(R.id.message);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessageView == null) {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
584b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessage != null) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView.setText(mMessage);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView.setVisibility(View.GONE);
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollView.removeView(mMessageView);
590b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mListView != null) {
592154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                final int childIndex = mScrollView.indexOfChild(mScrollView);
593154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                contentPanel.removeViewAt(childIndex);
594154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                contentPanel.addView(mListView, childIndex,
595154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        new LayoutParams(MATCH_PARENT, MATCH_PARENT));
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                contentPanel.setVisibility(View.GONE);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
600154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette
601154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        // Set up scroll indicators (if present).
602154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        final View indicatorUp = mWindow.findViewById(R.id.scrollIndicatorUp);
603154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        final View indicatorDown = mWindow.findViewById(R.id.scrollIndicatorDown);
604154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        if (indicatorUp != null || indicatorDown != null) {
605154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            if (mMessage != null) {
606154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                // We're just showing the ScrollView, set up listener.
607154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                mScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
608154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        @Override
609154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        public void onScrollChange(View v, int scrollX, int scrollY,
610154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                                int oldScrollX, int oldScrollY) {
611154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                            manageScrollIndicators(v, indicatorUp, indicatorDown);
612154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        }
613154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    });
614154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                // Set up the indicators following layout.
615154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                mScrollView.post(new Runnable() {
616154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                     @Override
617154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                     public void run() {
618154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                             manageScrollIndicators(mScrollView, indicatorUp, indicatorDown);
619154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                         }
620154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                     });
621154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette
622154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            } else if (mListView != null) {
623154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                // We're just showing the AbsListView, set up listener.
624154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
625154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        @Override
626154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        public void onScrollStateChanged(AbsListView view, int scrollState) {
627154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                            // That's cool, I guess?
628154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        }
629154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette
630154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        @Override
631154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        public void onScroll(AbsListView v, int firstVisibleItem,
632154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                                int visibleItemCount, int totalItemCount) {
633154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                            manageScrollIndicators(v, indicatorUp, indicatorDown);
634154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        }
635154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    });
636154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                // Set up the indicators following layout.
637154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                mListView.post(new Runnable() {
638154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        @Override
639154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        public void run() {
640154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                            manageScrollIndicators(mListView, indicatorUp, indicatorDown);
641154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        }
642154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    });
643154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            } else {
644154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                // We don't have any content to scroll, remove the indicators.
645154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                if (indicatorUp != null) {
646154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    contentPanel.removeView(indicatorUp);
647154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                }
648154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                if (indicatorDown != null) {
649154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    contentPanel.removeView(indicatorDown);
650154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                }
651154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            }
652154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        }
653154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    }
654154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette
655154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    private static void manageScrollIndicators(View v, View upIndicator, View downIndicator) {
656154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        if (upIndicator != null) {
657154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            upIndicator.setVisibility(v.canScrollVertically(-1) ? View.VISIBLE : View.INVISIBLE);
658154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        }
659154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        if (downIndicator != null) {
660154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            downIndicator.setVisibility(v.canScrollVertically(1) ? View.VISIBLE : View.INVISIBLE);
661154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean setupButtons() {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int BIT_BUTTON_POSITIVE = 1;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int BIT_BUTTON_NEGATIVE = 2;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int BIT_BUTTON_NEUTRAL = 4;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int whichButtons = 0;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonPositive = (Button) mWindow.findViewById(R.id.button1);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonPositive.setOnClickListener(mButtonHandler);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mButtonPositiveText)) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonPositive.setVisibility(View.GONE);
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonPositive.setText(mButtonPositiveText);
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonPositive.setVisibility(View.VISIBLE);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            whichButtons = whichButtons | BIT_BUTTON_POSITIVE;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonNegative = (Button) mWindow.findViewById(R.id.button2);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonNegative.setOnClickListener(mButtonHandler);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mButtonNegativeText)) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNegative.setVisibility(View.GONE);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNegative.setText(mButtonNegativeText);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNegative.setVisibility(View.VISIBLE);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            whichButtons = whichButtons | BIT_BUTTON_NEGATIVE;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonNeutral = (Button) mWindow.findViewById(R.id.button3);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonNeutral.setOnClickListener(mButtonHandler);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mButtonNeutralText)) {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNeutral.setVisibility(View.GONE);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNeutral.setText(mButtonNeutralText);
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNeutral.setVisibility(View.VISIBLE);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            whichButtons = whichButtons | BIT_BUTTON_NEUTRAL;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7043320dcd049700481c744d499feeecd1454afd4d7Adam Powell        if (shouldCenterSingleButton(mContext)) {
7053320dcd049700481c744d499feeecd1454afd4d7Adam Powell            /*
7063320dcd049700481c744d499feeecd1454afd4d7Adam Powell             * If we only have 1 button it should be centered on the layout and
7073320dcd049700481c744d499feeecd1454afd4d7Adam Powell             * expand to fill 50% of the available space.
7083320dcd049700481c744d499feeecd1454afd4d7Adam Powell             */
7093320dcd049700481c744d499feeecd1454afd4d7Adam Powell            if (whichButtons == BIT_BUTTON_POSITIVE) {
7103320dcd049700481c744d499feeecd1454afd4d7Adam Powell                centerButton(mButtonPositive);
7113320dcd049700481c744d499feeecd1454afd4d7Adam Powell            } else if (whichButtons == BIT_BUTTON_NEGATIVE) {
7123079e587bd519ba78cb34b1bd0b869e2879458abSangkyu Lee                centerButton(mButtonNegative);
7133320dcd049700481c744d499feeecd1454afd4d7Adam Powell            } else if (whichButtons == BIT_BUTTON_NEUTRAL) {
7143320dcd049700481c744d499feeecd1454afd4d7Adam Powell                centerButton(mButtonNeutral);
7153320dcd049700481c744d499feeecd1454afd4d7Adam Powell            }
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
717b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return whichButtons != 0;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void centerButton(Button button) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) button.getLayoutParams();
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        params.gravity = Gravity.CENTER_HORIZONTAL;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        params.weight = 0.5f;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        button.setLayoutParams(params);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View leftSpacer = mWindow.findViewById(R.id.leftSpacer);
727a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        if (leftSpacer != null) {
728a93347a62ec9887862abb9d6f216906c533a8562Adam Powell            leftSpacer.setVisibility(View.VISIBLE);
729a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View rightSpacer = mWindow.findViewById(R.id.rightSpacer);
731a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        if (rightSpacer != null) {
732a93347a62ec9887862abb9d6f216906c533a8562Adam Powell            rightSpacer.setVisibility(View.VISIBLE);
733a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
736c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette    private void setBackground(TypedArray a, View topPanel, View contentPanel, View customPanel,
737c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            View buttonPanel, boolean hasTitle, boolean hasCustomView, boolean hasButtons) {
738119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int fullDark = 0;
739119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int topDark = 0;
740119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int centerDark = 0;
741119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int bottomDark = 0;
742119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int fullBright = 0;
743119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int topBright = 0;
744119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int centerBright = 0;
745119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int bottomBright = 0;
746119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int bottomMedium = 0;
747b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
748b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        // If the needsDefaultBackgrounds attribute is set, we know we're
749b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        // inheriting from a framework style.
750b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        final boolean needsDefaultBackgrounds = a.getBoolean(
751b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette                R.styleable.AlertDialog_needsDefaultBackgrounds, true);
752b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        if (needsDefaultBackgrounds) {
753119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            fullDark = R.drawable.popup_full_dark;
754119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            topDark = R.drawable.popup_top_dark;
755119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            centerDark = R.drawable.popup_center_dark;
756119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            bottomDark = R.drawable.popup_bottom_dark;
757119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            fullBright = R.drawable.popup_full_bright;
758119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            topBright = R.drawable.popup_top_bright;
759119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            centerBright = R.drawable.popup_center_bright;
760119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            bottomBright = R.drawable.popup_bottom_bright;
761119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            bottomMedium = R.drawable.popup_bottom_medium;
762119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        }
763b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
764119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        topBright = a.getResourceId(R.styleable.AlertDialog_topBright, topBright);
7654a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan        topDark = a.getResourceId(R.styleable.AlertDialog_topDark, topDark);
766119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        centerBright = a.getResourceId(R.styleable.AlertDialog_centerBright, centerBright);
7674a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan        centerDark = a.getResourceId(R.styleable.AlertDialog_centerDark, centerDark);
7684a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan
769c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        /* We now set the background of all of the sections of the alert.
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * First collect together each section that is being displayed along
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * with whether it is on a light or dark background, then run through
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * them setting their backgrounds.  This is complicated because we need
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * to correctly use the full, top, middle, and bottom graphics depending
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * on how many views they are and where they appear.
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
776c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
777c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final View[] views = new View[4];
778c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final boolean[] light = new boolean[4];
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View lastView = null;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean lastLight = false;
781c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasTitle) {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views[pos] = topPanel;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light[pos] = false;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos++;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
788c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* The contentPanel displays either a custom text message or
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * a ListView. If it's text we should use the dark background
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for ListView we should use the light background. If neither
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * are there the contentPanel will be hidden so set it as null.
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
794c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        views[pos] = contentPanel.getVisibility() == View.GONE ? null : contentPanel;
7956fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy        light[pos] = mListView != null;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pos++;
797c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
798c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (hasCustomView) {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views[pos] = customPanel;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light[pos] = mForceInverseBackground;
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos++;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
803c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasButtons) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views[pos] = buttonPanel;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light[pos] = true;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
808c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean setView = false;
810c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        for (pos = 0; pos < views.length; pos++) {
811c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final View v = views[pos];
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v == null) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
815c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (lastView != null) {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!setView) {
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastView.setBackgroundResource(lastLight ? topBright : topDark);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastView.setBackgroundResource(lastLight ? centerBright : centerDark);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setView = true;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
824c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastView = v;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastLight = light[pos];
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
828c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lastView != null) {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (setView) {
8314a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                bottomBright = a.getResourceId(R.styleable.AlertDialog_bottomBright, bottomBright);
8324a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                bottomMedium = a.getResourceId(R.styleable.AlertDialog_bottomMedium, bottomMedium);
8334a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                bottomDark = a.getResourceId(R.styleable.AlertDialog_bottomDark, bottomDark);
834c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
835c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                // ListViews will use the Bright background, but buttons use the
836c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                // Medium background.
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastView.setBackgroundResource(
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        lastLight ? (hasButtons ? bottomMedium : bottomBright) : bottomDark);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
8404a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                fullBright = a.getResourceId(R.styleable.AlertDialog_fullBright, fullBright);
8414a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                fullDark = a.getResourceId(R.styleable.AlertDialog_fullDark, fullDark);
842c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastView.setBackgroundResource(lastLight ? fullBright : fullDark);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
846c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
847c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final ListView listView = mListView;
848c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (listView != null && mAdapter != null) {
849c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            listView.setAdapter(mAdapter);
850c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final int checkedItem = mCheckedItem;
851c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            if (checkedItem > -1) {
852c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                listView.setItemChecked(checkedItem, true);
853c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                listView.setSelection(checkedItem);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8579c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8589c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy    public static class RecycleListView extends ListView {
8599c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        boolean mRecycleOnMeasure = true;
8609c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8619c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        public RecycleListView(Context context) {
8629c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            super(context);
8639c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
8649c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8659c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        public RecycleListView(Context context, AttributeSet attrs) {
8669c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            super(context, attrs);
8679c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
8689c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
869617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        public RecycleListView(Context context, AttributeSet attrs, int defStyleAttr) {
870617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette            super(context, attrs, defStyleAttr);
871617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        }
872617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
873617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        public RecycleListView(
874617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette                Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
875617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette            super(context, attrs, defStyleAttr, defStyleRes);
8769c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
8779c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8789c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        @Override
8799c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        protected boolean recycleOnMeasure() {
8809c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            return mRecycleOnMeasure;
8819c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
8829c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy    }
8839c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class AlertParams {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Context mContext;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final LayoutInflater mInflater;
887b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
888076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunne        public int mIconId = 0;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable mIcon;
890576e1dff3d40610377a763db6c9e6bf999e00987blunden        public int mIconAttrId = 0;
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mTitle;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public View mCustomTitleView;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mMessage;
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mPositiveButtonText;
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mPositiveButtonListener;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mNegativeButtonText;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mNegativeButtonListener;
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mNeutralButtonText;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mNeutralButtonListener;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mCancelable;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnCancelListener mOnCancelListener;
9027f02dc5c9c48a01bec459b71ac73a6ad37b9e12cAdam Powell        public DialogInterface.OnDismissListener mOnDismissListener;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnKeyListener mOnKeyListener;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence[] mItems;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ListAdapter mAdapter;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mOnClickListener;
907ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        public int mViewLayoutResId;
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public View mView;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingLeft;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingTop;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingRight;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingBottom;
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mViewSpacingSpecified = false;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean[] mCheckedItems;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mIsMultiChoice;
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mIsSingleChoice;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mCheckedItem = -1;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnMultiChoiceClickListener mOnCheckboxClickListener;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Cursor mCursor;
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mLabelColumn;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mIsCheckedColumn;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mForceInverseBackground;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public AdapterView.OnItemSelectedListener mOnItemSelectedListener;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public OnPrepareListViewListener mOnPrepareListViewListener;
9259c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        public boolean mRecycleOnMeasure = true;
9269c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Interface definition for a callback to be invoked before the ListView
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * will be bound to an adapter.
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface OnPrepareListViewListener {
932b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Called before the ListView is bound to an adapter.
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param listView The ListView that will be shown in the dialog.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void onPrepareListView(ListView listView);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
939b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public AlertParams(Context context) {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCancelable = true;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
945b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void apply(AlertController dialog) {
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCustomTitleView != null) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setCustomTitle(mCustomTitleView);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTitle != null) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setTitle(mTitle);
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mIcon != null) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setIcon(mIcon);
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mIconId >= 0) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setIcon(mIconId);
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
959576e1dff3d40610377a763db6c9e6bf999e00987blunden                if (mIconAttrId > 0) {
960576e1dff3d40610377a763db6c9e6bf999e00987blunden                    dialog.setIcon(dialog.getIconAttributeResId(mIconAttrId));
961576e1dff3d40610377a763db6c9e6bf999e00987blunden                }
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mMessage != null) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setMessage(mMessage);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPositiveButtonText != null) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setButton(DialogInterface.BUTTON_POSITIVE, mPositiveButtonText,
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPositiveButtonListener, null);
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNegativeButtonText != null) {
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setButton(DialogInterface.BUTTON_NEGATIVE, mNegativeButtonText,
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mNegativeButtonListener, null);
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNeutralButtonText != null) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setButton(DialogInterface.BUTTON_NEUTRAL, mNeutralButtonText,
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mNeutralButtonListener, null);
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mForceInverseBackground) {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setInverseBackgroundForced(true);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For a list, the client can either supply an array of items or an
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // adapter or a cursor
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mItems != null) || (mCursor != null) || (mAdapter != null)) {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                createListView(dialog);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView != null) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mViewSpacingSpecified) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setView(mView, mViewSpacingLeft, mViewSpacingTop, mViewSpacingRight,
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mViewSpacingBottom);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setView(mView);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
993ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            } else if (mViewLayoutResId != 0) {
994ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                dialog.setView(mViewLayoutResId);
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
996ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.setCancelable(mCancelable);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.setOnCancelListener(mOnCancelListener);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnKeyListener != null) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setOnKeyListener(mOnKeyListener);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            */
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1005b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void createListView(final AlertController dialog) {
10079c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            final RecycleListView listView = (RecycleListView)
1008fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                    mInflater.inflate(dialog.mListLayout, null);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ListAdapter adapter;
1010b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mIsMultiChoice) {
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCursor == null) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    adapter = new ArrayAdapter<CharSequence>(
1014fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                            mContext, dialog.mMultiChoiceItemLayout, R.id.text1, mItems) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        @Override
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        public View getView(int position, View convertView, ViewGroup parent) {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            View view = super.getView(position, convertView, parent);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mCheckedItems != null) {
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                boolean isItemChecked = mCheckedItems[position];
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (isItemChecked) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    listView.setItemChecked(position, true);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return view;
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    };
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    adapter = new CursorAdapter(mContext, mCursor, false) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        private final int mLabelIndex;
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        private final int mIsCheckedIndex;
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final Cursor cursor = getCursor();
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLabelIndex = cursor.getColumnIndexOrThrow(mLabelColumn);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIsCheckedIndex = cursor.getColumnIndexOrThrow(mIsCheckedColumn);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        @Override
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        public void bindView(View view, Context context, Cursor cursor) {
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            CheckedTextView text = (CheckedTextView) view.findViewById(R.id.text1);
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            text.setText(cursor.getString(mLabelIndex));
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            listView.setItemChecked(cursor.getPosition(),
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    cursor.getInt(mIsCheckedIndex) == 1);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1045b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        @Override
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        public View newView(Context context, Cursor cursor, ViewGroup parent) {
1048fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                            return mInflater.inflate(dialog.mMultiChoiceItemLayout,
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    parent, false);
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1051b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    };
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1055b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette                int layout = mIsSingleChoice
1056fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                        ? dialog.mSingleChoiceItemLayout : dialog.mListItemLayout;
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCursor == null) {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    adapter = (mAdapter != null) ? mAdapter
10592356c5e69b0911e6334ebf6374217898371be5acAlan Viverette                            : new CheckedItemAdapter(mContext, layout, R.id.text1, mItems);
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1061b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette                    adapter = new SimpleCursorAdapter(mContext, layout,
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mCursor, new String[]{mLabelColumn}, new int[]{R.id.text1});
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1065b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnPrepareListViewListener != null) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnPrepareListViewListener.onPrepareListView(listView);
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1069b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* Don't directly set the adapter on the ListView as we might
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * want to add a footer to the ListView later.
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.mAdapter = adapter;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.mCheckedItem = mCheckedItem;
1075b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnClickListener != null) {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setOnItemClickListener(new OnItemClickListener() {
1078c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    @Override
1079c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOnClickListener.onClick(dialog.mDialogInterface, position);
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!mIsSingleChoice) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dialog.mDialogInterface.dismiss();
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                });
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mOnCheckboxClickListener != null) {
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setOnItemClickListener(new OnItemClickListener() {
1088c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    @Override
1089c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mCheckedItems != null) {
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mCheckedItems[position] = listView.isItemChecked(position);
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOnCheckboxClickListener.onClick(
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                dialog.mDialogInterface, position, listView.isItemChecked(position));
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                });
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1098b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Attach a given OnItemSelectedListener to the ListView
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnItemSelectedListener != null) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setOnItemSelectedListener(mOnItemSelectedListener);
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1103b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mIsSingleChoice) {
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mIsMultiChoice) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11099c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            listView.mRecycleOnMeasure = mRecycleOnMeasure;
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.mListView = listView;
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11142356c5e69b0911e6334ebf6374217898371be5acAlan Viverette    private static class CheckedItemAdapter extends ArrayAdapter<CharSequence> {
11152356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        public CheckedItemAdapter(Context context, int resource, int textViewResourceId,
11162356c5e69b0911e6334ebf6374217898371be5acAlan Viverette                CharSequence[] objects) {
11172356c5e69b0911e6334ebf6374217898371be5acAlan Viverette            super(context, resource, textViewResourceId, objects);
11182356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        }
11192356c5e69b0911e6334ebf6374217898371be5acAlan Viverette
11202356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        @Override
11212356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        public boolean hasStableIds() {
11222356c5e69b0911e6334ebf6374217898371be5acAlan Viverette            return true;
11232356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        }
11242356c5e69b0911e6334ebf6374217898371be5acAlan Viverette
11252356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        @Override
11262356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        public long getItemId(int position) {
11272356c5e69b0911e6334ebf6374217898371be5acAlan Viverette            return position;
11282356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        }
11292356c5e69b0911e6334ebf6374217898371be5acAlan Viverette    }
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1131