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
2362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viveretteimport android.annotation.Nullable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlertDialog;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
336fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guyimport android.util.AttributeSet;
343320dcd049700481c744d499feeecd1454afd4d7Adam Powellimport android.util.TypedValue;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
40076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunneimport android.view.ViewGroup.LayoutParams;
4135c3cb6a598d2868db064a2dcd6f3b7031fe9f0aAlan Viveretteimport android.view.ViewParent;
4262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viveretteimport android.view.ViewStub;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
44119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnanimport android.view.WindowInsets;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
47076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunneimport android.widget.AdapterView.OnItemClickListener;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ArrayAdapter;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Button;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.CheckedTextView;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.CursorAdapter;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.FrameLayout;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ImageView;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.LinearLayout;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListAdapter;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListView;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ScrollView;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SimpleCursorAdapter;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AlertController {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final DialogInterface mDialogInterface;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Window mWindow;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette    private CharSequence mTitle;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mMessage;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ListView mListView;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private View mView;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    private int mViewLayoutResId;
75ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingLeft;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingTop;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingRight;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mViewSpacingBottom;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mViewSpacingSpecified = false;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette    private Button mButtonPositive;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mButtonPositiveText;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Message mButtonPositiveMessage;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Button mButtonNegative;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mButtonNegativeText;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Message mButtonNegativeMessage;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Button mButtonNeutral;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mButtonNeutralText;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Message mButtonNeutralMessage;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ScrollView mScrollView;
95b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
96a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette    private int mIconId = 0;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mIcon;
98b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ImageView mIconView;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mTitleView;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mMessageView;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private View mCustomTitleView;
103b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mForceInverseBackground;
105b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ListAdapter mAdapter;
107b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mCheckedItem = -1;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
110fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mAlertDialogLayout;
1114c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    private int mButtonPanelSideLayout;
112fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mListLayout;
113fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mMultiChoiceItemLayout;
114fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mSingleChoiceItemLayout;
115fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell    private int mListItemLayout;
116fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
1172e750a14743e2403f37f559973563e9236a40883Alan Viverette    private boolean mShowTitle;
1182e750a14743e2403f37f559973563e9236a40883Alan Viverette
1194c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    private int mButtonPanelLayoutHint = AlertDialog.LAYOUT_HINT_NONE;
120b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Handler mHandler;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
123c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette    private final View.OnClickListener mButtonHandler = new View.OnClickListener() {
124c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        @Override
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onClick(View v) {
126c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final Message m;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v == mButtonPositive && mButtonPositiveMessage != null) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m = Message.obtain(mButtonPositiveMessage);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (v == mButtonNegative && mButtonNegativeMessage != null) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m = Message.obtain(mButtonNegativeMessage);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (v == mButtonNeutral && mButtonNeutralMessage != null) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m = Message.obtain(mButtonNeutralMessage);
133c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            } else {
134c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                m = null;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
136c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (m != null) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m.sendToTarget();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Post a message so we dismiss after the above handlers are executed
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialogInterface)
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .sendToTarget();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class ButtonHandler extends Handler {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Button clicks have Message.what as the BUTTON{1,2,3} constant
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final int MSG_DISMISS_DIALOG = 1;
150b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private WeakReference<DialogInterface> mDialog;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ButtonHandler(DialogInterface dialog) {
1542e750a14743e2403f37f559973563e9236a40883Alan Viverette            mDialog = new WeakReference<>(dialog);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
160b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DialogInterface.BUTTON_POSITIVE:
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DialogInterface.BUTTON_NEGATIVE:
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DialogInterface.BUTTON_NEUTRAL:
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
166b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MSG_DISMISS_DIALOG:
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ((DialogInterface) msg.obj).dismiss();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1733320dcd049700481c744d499feeecd1454afd4d7Adam Powell    private static boolean shouldCenterSingleButton(Context context) {
1748990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette        final TypedValue outValue = new TypedValue();
1758990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette        context.getTheme().resolveAttribute(R.attr.alertDialogCenterButtons, outValue, true);
1763320dcd049700481c744d499feeecd1454afd4d7Adam Powell        return outValue.data != 0;
1773320dcd049700481c744d499feeecd1454afd4d7Adam Powell    }
1783320dcd049700481c744d499feeecd1454afd4d7Adam Powell
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AlertController(Context context, DialogInterface di, Window window) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDialogInterface = di;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindow = window;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler = new ButtonHandler(di);
184fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
1858990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette        final TypedArray a = context.obtainStyledAttributes(null,
1868990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog, R.attr.alertDialogStyle, 0);
187fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
1888990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette        mAlertDialogLayout = a.getResourceId(
1898990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog_layout, R.layout.alert_dialog);
1904c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        mButtonPanelSideLayout = a.getResourceId(
1918990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog_buttonPanelSideLayout, 0);
192fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mListLayout = a.getResourceId(
1938990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog_listLayout, R.layout.select_dialog);
1948990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette
195fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mMultiChoiceItemLayout = a.getResourceId(
1968990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog_multiChoiceItemLayout,
1978990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.layout.select_dialog_multichoice);
198fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mSingleChoiceItemLayout = a.getResourceId(
1998990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog_singleChoiceItemLayout,
2008990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.layout.select_dialog_singlechoice);
201fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        mListItemLayout = a.getResourceId(
2028990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.styleable.AlertDialog_listItemLayout,
2038990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                R.layout.select_dialog_item);
2042e750a14743e2403f37f559973563e9236a40883Alan Viverette        mShowTitle = a.getBoolean(R.styleable.AlertDialog_showTitle, true);
205fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell
206fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell        a.recycle();
207ccf8e661c7aa750865c33ddc3ddfecd8775f3ae7Chris Banes
208ccf8e661c7aa750865c33ddc3ddfecd8775f3ae7Chris Banes        /* We use a custom title so never request a window title */
209ccf8e661c7aa750865c33ddc3ddfecd8775f3ae7Chris Banes        window.requestFeature(Window.FEATURE_NO_TITLE);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
211b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean canTextInput(View v) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v.onCheckIsTextEditor()) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
216b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(v instanceof ViewGroup)) {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
220b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewGroup vg = (ViewGroup)v;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = vg.getChildCount();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i > 0) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = vg.getChildAt(i);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (canTextInput(v)) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
230b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
233b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void installContent() {
2354c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        int contentView = selectContentView();
2364c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        mWindow.setContentView(contentView);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setupView();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2394c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout
2404c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    private int selectContentView() {
2414c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        if (mButtonPanelSideLayout == 0) {
2424c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout            return mAlertDialogLayout;
2434c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        }
2444c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        if (mButtonPanelLayoutHint == AlertDialog.LAYOUT_HINT_SIDE) {
2454c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout            return mButtonPanelSideLayout;
2464c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        }
2474c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        // TODO: use layout hint side for long messages/lists
2484c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        return mAlertDialogLayout;
2494c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    }
250b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTitle(CharSequence title) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTitle = title;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTitleView != null) {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTitleView.setText(title);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see AlertDialog.Builder#setCustomTitle(View)
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCustomTitle(View customTitleView) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCustomTitleView = customTitleView;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
264b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMessage(CharSequence message) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessage = message;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessageView != null) {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView.setText(message);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
273ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette     * Set the view resource to display in the dialog.
274ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette     */
275ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    public void setView(int layoutResId) {
276ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mView = null;
277ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewLayoutResId = layoutResId;
278ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewSpacingSpecified = false;
279ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    }
280ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
281ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette    /**
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the view to display in the dialog.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setView(View view) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = view;
286ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewLayoutResId = 0;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingSpecified = false;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
289b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the view to display in the dialog along with the spacing around that view
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight,
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int viewSpacingBottom) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = view;
296ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        mViewLayoutResId = 0;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingSpecified = true;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingLeft = viewSpacingLeft;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingTop = viewSpacingTop;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingRight = viewSpacingRight;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewSpacingBottom = viewSpacingBottom;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3054c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout     * Sets a hint for the best button panel layout.
3064c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout     */
3074c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    public void setButtonPanelLayoutHint(int layoutHint) {
3084c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout        mButtonPanelLayoutHint = layoutHint;
3094c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    }
3104c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout
3114c0cb8a526eec87fdba6dc371e21abfa4e993ea0Craig Stout    /**
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets a click listener or a message to be sent when the button is clicked.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You only need to pass one of {@code listener} or {@code msg}.
314b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette     *
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param whichButton Which button, can be one of
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link DialogInterface#BUTTON_POSITIVE},
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link DialogInterface#BUTTON_NEGATIVE}, or
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link DialogInterface#BUTTON_NEUTRAL}
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text The text to display in positive button.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param listener The {@link DialogInterface.OnClickListener} to use.
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param msg The {@link Message} to be sent when clicked.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setButton(int whichButton, CharSequence text,
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DialogInterface.OnClickListener listener, Message msg) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (msg == null && listener != null) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg = mHandler.obtainMessage(whichButton, listener);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
329b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (whichButton) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_POSITIVE:
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonPositiveText = text;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonPositiveMessage = msg;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
336b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEGATIVE:
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNegativeText = text;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNegativeMessage = msg;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
341b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEUTRAL:
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNeutralText = text;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mButtonNeutralMessage = msg;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
346b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("Button does not exist");
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
353a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * Specifies the icon to display next to the alert title.
354a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     *
355a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * @param resId the resource identifier of the drawable to use as the icon,
356a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     *            or 0 for no icon
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIcon(int resId) {
359a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette        mIcon = null;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIconId = resId;
361a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIconView != null) {
363a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            if (resId != 0) {
364476da7720a939c55e74e5387225f364b581cb29aChris Banes                mIconView.setVisibility(View.VISIBLE);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIconView.setImageResource(mIconId);
366a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            } else {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIconView.setVisibility(View.GONE);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
371a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
372a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette    /**
373a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * Specifies the icon to display next to the alert title.
374a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     *
375a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     * @param icon the drawable to use as the icon or null for no icon
376a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette     */
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIcon(Drawable icon) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIcon = icon;
379a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette        mIconId = 0;
380a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
381a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette        if (mIconView != null) {
382a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            if (icon != null) {
38312a47ac41ed7d9968d6ceae50402a41f8a8ba79cChris Banes                mIconView.setVisibility(View.VISIBLE);
384a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                mIconView.setImageDrawable(icon);
385a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            } else {
386a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                mIconView.setVisibility(View.GONE);
387a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
391576e1dff3d40610377a763db6c9e6bf999e00987blunden    /**
392576e1dff3d40610377a763db6c9e6bf999e00987blunden     * @param attrId the attributeId of the theme-specific drawable
393576e1dff3d40610377a763db6c9e6bf999e00987blunden     * to resolve the resourceId for.
394576e1dff3d40610377a763db6c9e6bf999e00987blunden     *
395576e1dff3d40610377a763db6c9e6bf999e00987blunden     * @return resId the resourceId of the theme-specific drawable
396576e1dff3d40610377a763db6c9e6bf999e00987blunden     */
397576e1dff3d40610377a763db6c9e6bf999e00987blunden    public int getIconAttributeResId(int attrId) {
398576e1dff3d40610377a763db6c9e6bf999e00987blunden        TypedValue out = new TypedValue();
399576e1dff3d40610377a763db6c9e6bf999e00987blunden        mContext.getTheme().resolveAttribute(attrId, out, true);
400576e1dff3d40610377a763db6c9e6bf999e00987blunden        return out.resourceId;
401576e1dff3d40610377a763db6c9e6bf999e00987blunden    }
402576e1dff3d40610377a763db6c9e6bf999e00987blunden
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInverseBackgroundForced(boolean forceInverseBackground) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mForceInverseBackground = forceInverseBackground;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
406b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ListView getListView() {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mListView;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
410b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Button getButton(int whichButton) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (whichButton) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_POSITIVE:
4146fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy                return mButtonPositive;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEGATIVE:
4166fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy                return mButtonNegative;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DialogInterface.BUTTON_NEUTRAL:
4186fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy                return mButtonNeutral;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
423b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
4246fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy    @SuppressWarnings({"UnusedDeclaration"})
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
4266fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy        return mScrollView != null && mScrollView.executeKeyEvent(event);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4296fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy    @SuppressWarnings({"UnusedDeclaration"})
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
4316fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy        return mScrollView != null && mScrollView.executeKeyEvent(event);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
433119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan
43462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    /**
43562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     * Resolves whether a custom or default panel should be used. Removes the
43662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     * default panel if a custom panel should be used. If the resolved panel is
43762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     * a view stub, inflates before returning.
43862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     *
43962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     * @param customPanel the custom panel
44062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     * @param defaultPanel the default panel
44162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     * @return the panel to use
44262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette     */
44362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    @Nullable
44462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    private ViewGroup resolvePanel(@Nullable View customPanel, @Nullable View defaultPanel) {
44562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        if (customPanel == null) {
44662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            // Inflate the default panel, if needed.
44762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            if (defaultPanel instanceof ViewStub) {
44862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                defaultPanel = ((ViewStub) defaultPanel).inflate();
44962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            }
45062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
45162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            return (ViewGroup) defaultPanel;
45262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        }
45362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
45462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        // Remove the default panel entirely.
45562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        if (defaultPanel != null) {
45662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            final ViewParent parent = defaultPanel.getParent();
45762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            if (parent instanceof ViewGroup) {
45862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                ((ViewGroup) parent).removeView(defaultPanel);
45962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            }
46062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        }
46162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
46262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        // Inflate the custom panel, if needed.
46362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        if (customPanel instanceof ViewStub) {
46462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            customPanel = ((ViewStub) customPanel).inflate();
46562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        }
46662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
46762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        return (ViewGroup) customPanel;
46862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    }
46962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setupView() {
47162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View parentPanel = mWindow.findViewById(R.id.parentPanel);
47262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View defaultTopPanel = parentPanel.findViewById(R.id.topPanel);
47362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View defaultContentPanel = parentPanel.findViewById(R.id.contentPanel);
47462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View defaultButtonPanel = parentPanel.findViewById(R.id.buttonPanel);
475b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
47662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        // Install custom content before setting up the title or buttons so
47762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        // that we can handle panel overrides.
47862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final ViewGroup customPanel = (ViewGroup) parentPanel.findViewById(R.id.customPanel);
47962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        setupCustomContent(customPanel);
480b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
48162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View customTopPanel = customPanel.findViewById(R.id.topPanel);
48262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View customContentPanel = customPanel.findViewById(R.id.contentPanel);
48362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final View customButtonPanel = customPanel.findViewById(R.id.buttonPanel);
48462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
48562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        // Resolve the correct panels and remove the defaults, if needed.
48662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final ViewGroup topPanel = resolvePanel(customTopPanel, defaultTopPanel);
48762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final ViewGroup contentPanel = resolvePanel(customContentPanel, defaultContentPanel);
48862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final ViewGroup buttonPanel = resolvePanel(customButtonPanel, defaultButtonPanel);
48962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
49062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        setupContent(contentPanel);
49162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        setupButtons(buttonPanel);
49262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        setupTitle(topPanel);
49362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
49462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final boolean hasCustomPanel = customPanel != null
49562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                && customPanel.getVisibility() != View.GONE;
49662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final boolean hasTopPanel = topPanel != null
49762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                && topPanel.getVisibility() != View.GONE;
49862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final boolean hasButtonPanel = buttonPanel != null
49962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                && buttonPanel.getVisibility() != View.GONE;
50062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
50162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        // Only display the text spacer if we don't have buttons.
50262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        if (!hasButtonPanel) {
50362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            if (contentPanel != null) {
50462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                final View spacer = contentPanel.findViewById(R.id.textSpacerNoButtons);
50562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                if (spacer != null) {
50662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                    spacer.setVisibility(View.VISIBLE);
50762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                }
508d044ad97a8ac1f62c572c7e42c77e960441d8d02Adam Powell            }
509ef57575887bde74ef09e9f21aae6b02f9c8163c7Dianne Hackborn            mWindow.setCloseOnTouchOutsideIfNotSet(true);
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        if (hasTopPanel) {
513922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            // Only clip scrolling content to padding if we have a title.
514922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            if (mScrollView != null) {
515922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette                mScrollView.setClipToPadding(true);
516922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            }
517922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette
518922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            // Only show the divider if we have a title.
519d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            View divider = null;
520922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            if (mMessage != null || mListView != null || hasCustomPanel) {
521d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                if (!hasCustomPanel) {
522d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                    divider = topPanel.findViewById(R.id.titleDividerNoCustom);
523d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                }
524d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                if (divider == null) {
525d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                    divider = topPanel.findViewById(R.id.titleDivider);
526d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                }
527d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette
52862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            } else {
52962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                divider = topPanel.findViewById(R.id.titleDividerTop);
53062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            }
53162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
53262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            if (divider != null) {
53362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                divider.setVisibility(View.VISIBLE);
53462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            }
535d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        } else {
536d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            if (contentPanel != null) {
537d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                final View spacer = contentPanel.findViewById(R.id.textSpacerNoTitle);
538d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                if (spacer != null) {
539d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                    spacer.setVisibility(View.VISIBLE);
540d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                }
541d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            }
542d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        }
543d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette
544d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        if (mListView instanceof RecycleListView) {
545d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            ((RecycleListView) mListView).setHasDecor(hasTopPanel, hasButtonPanel);
54662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        }
54762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
548922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette        // Update scroll indicators as needed.
549922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette        if (!hasCustomPanel) {
550922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            final View content = mListView != null ? mListView : mScrollView;
551922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            if (content != null) {
552922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette                final int indicators = (hasTopPanel ? View.SCROLL_INDICATOR_TOP : 0)
553922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette                        | (hasButtonPanel ? View.SCROLL_INDICATOR_BOTTOM : 0);
554922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette                content.setScrollIndicators(indicators,
555922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette                        View.SCROLL_INDICATOR_TOP | View.SCROLL_INDICATOR_BOTTOM);
556922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette            }
557922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette        }
558922e1c6ed28da4c5b7ff6b1d4448fe3e8c11652fAlan Viverette
55962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final TypedArray a = mContext.obtainStyledAttributes(
56062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                null, R.styleable.AlertDialog, R.attr.alertDialogStyle, 0);
56162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        setBackground(a, topPanel, contentPanel, customPanel, buttonPanel,
56262c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette                hasTopPanel, hasCustomPanel, hasButtonPanel);
56362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        a.recycle();
56462c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    }
56562c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette
56662c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    private void setupCustomContent(ViewGroup customPanel) {
567ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        final View customView;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
569ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customView = mView;
570ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        } else if (mViewLayoutResId != 0) {
571ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            final LayoutInflater inflater = LayoutInflater.from(mContext);
572ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customView = inflater.inflate(mViewLayoutResId, customPanel, false);
573ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        } else {
574ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customView = null;
575ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        }
576ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
577c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final boolean hasCustomView = customView != null;
578c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (!hasCustomView || !canTextInput(customView)) {
579ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            mWindow.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
580ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
581ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        }
582ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
583c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (hasCustomView) {
584ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            final FrameLayout custom = (FrameLayout) mWindow.findViewById(R.id.custom);
585ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            custom.addView(customView, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
586ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mViewSpacingSpecified) {
588ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                custom.setPadding(
589ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                        mViewSpacingLeft, mViewSpacingTop, mViewSpacingRight, mViewSpacingBottom);
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
591ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
592105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mListView != null) {
593105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                ((LinearLayout.LayoutParams) customPanel.getLayoutParams()).weight = 0;
594105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
596ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            customPanel.setVisibility(View.GONE);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    private void setupTitle(ViewGroup topPanel) {
6012e750a14743e2403f37f559973563e9236a40883Alan Viverette        if (mCustomTitleView != null && mShowTitle) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Add the custom title view directly to the topPanel layout
6032e750a14743e2403f37f559973563e9236a40883Alan Viverette            final LayoutParams lp = new LayoutParams(
604154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
605b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
6065ea0bc1abccea067875d00dc9b9dde7c17c1efffAdam Powell            topPanel.addView(mCustomTitleView, 0, lp);
607b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Hide the title template
6092e750a14743e2403f37f559973563e9236a40883Alan Viverette            final View titleTemplate = mWindow.findViewById(R.id.title_template);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            titleTemplate.setVisibility(View.GONE);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconView = (ImageView) mWindow.findViewById(R.id.icon);
613a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
614a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette            final boolean hasTextTitle = !TextUtils.isEmpty(mTitle);
6152e750a14743e2403f37f559973563e9236a40883Alan Viverette            if (hasTextTitle && mShowTitle) {
616a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // Display the title if a title is supplied, else hide it.
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTitleView = (TextView) mWindow.findViewById(R.id.alertTitle);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTitleView.setText(mTitle);
619a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette
620a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // Do this last so that if the user has supplied any icons we
621a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // use them instead of the default ones. If the user has
622a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                // specified 0 then make it disappear.
623a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                if (mIconId != 0) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mIconView.setImageResource(mIconId);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (mIcon != null) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mIconView.setImageDrawable(mIcon);
627a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                } else {
628a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                    // Apply the padding from the icon to ensure the title is
629a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                    // aligned correctly.
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTitleView.setPadding(mIconView.getPaddingLeft(),
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIconView.getPaddingTop(),
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIconView.getPaddingRight(),
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIconView.getPaddingBottom());
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mIconView.setVisibility(View.GONE);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Hide the title template
638a1a680480e3d5534c2cd4f8b706ad10725993c2aAlan Viverette                final View titleTemplate = mWindow.findViewById(R.id.title_template);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                titleTemplate.setVisibility(View.GONE);
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIconView.setVisibility(View.GONE);
641e74e7e2a088cc9077e4ee98e01a48bb52e9cfd50Martin Sjolin                topPanel.setVisibility(View.GONE);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
646154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    private void setupContent(ViewGroup contentPanel) {
64762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        mScrollView = (ScrollView) contentPanel.findViewById(R.id.scrollView);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollView.setFocusable(false);
649b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Special case for users that only want to display a String
65162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        mMessageView = (TextView) contentPanel.findViewById(R.id.message);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessageView == null) {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
655b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessage != null) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView.setText(mMessage);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView.setVisibility(View.GONE);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollView.removeView(mMessageView);
661b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mListView != null) {
66335c3cb6a598d2868db064a2dcd6f3b7031fe9f0aAlan Viverette                final ViewGroup scrollParent = (ViewGroup) mScrollView.getParent();
66435c3cb6a598d2868db064a2dcd6f3b7031fe9f0aAlan Viverette                final int childIndex = scrollParent.indexOfChild(mScrollView);
66535c3cb6a598d2868db064a2dcd6f3b7031fe9f0aAlan Viverette                scrollParent.removeViewAt(childIndex);
66635c3cb6a598d2868db064a2dcd6f3b7031fe9f0aAlan Viverette                scrollParent.addView(mListView, childIndex,
667154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette                        new LayoutParams(MATCH_PARENT, MATCH_PARENT));
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                contentPanel.setVisibility(View.GONE);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
672154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    }
673154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette
674154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette    private static void manageScrollIndicators(View v, View upIndicator, View downIndicator) {
675154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        if (upIndicator != null) {
676154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            upIndicator.setVisibility(v.canScrollVertically(-1) ? View.VISIBLE : View.INVISIBLE);
677154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        }
678154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        if (downIndicator != null) {
679154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette            downIndicator.setVisibility(v.canScrollVertically(1) ? View.VISIBLE : View.INVISIBLE);
680154c2c24dc3b741bcc0d54c46d349478d24472acAlan Viverette        }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68362c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette    private void setupButtons(ViewGroup buttonPanel) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int BIT_BUTTON_POSITIVE = 1;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int BIT_BUTTON_NEGATIVE = 2;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int BIT_BUTTON_NEUTRAL = 4;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int whichButtons = 0;
68862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        mButtonPositive = (Button) buttonPanel.findViewById(R.id.button1);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonPositive.setOnClickListener(mButtonHandler);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mButtonPositiveText)) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonPositive.setVisibility(View.GONE);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonPositive.setText(mButtonPositiveText);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonPositive.setVisibility(View.VISIBLE);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            whichButtons = whichButtons | BIT_BUTTON_POSITIVE;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        mButtonNegative = (Button) buttonPanel.findViewById(R.id.button2);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonNegative.setOnClickListener(mButtonHandler);
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mButtonNegativeText)) {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNegative.setVisibility(View.GONE);
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNegative.setText(mButtonNegativeText);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNegative.setVisibility(View.VISIBLE);
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            whichButtons = whichButtons | BIT_BUTTON_NEGATIVE;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71162c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        mButtonNeutral = (Button) buttonPanel.findViewById(R.id.button3);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mButtonNeutral.setOnClickListener(mButtonHandler);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(mButtonNeutralText)) {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNeutral.setVisibility(View.GONE);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNeutral.setText(mButtonNeutralText);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mButtonNeutral.setVisibility(View.VISIBLE);
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            whichButtons = whichButtons | BIT_BUTTON_NEUTRAL;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7233320dcd049700481c744d499feeecd1454afd4d7Adam Powell        if (shouldCenterSingleButton(mContext)) {
7243320dcd049700481c744d499feeecd1454afd4d7Adam Powell            /*
7253320dcd049700481c744d499feeecd1454afd4d7Adam Powell             * If we only have 1 button it should be centered on the layout and
7263320dcd049700481c744d499feeecd1454afd4d7Adam Powell             * expand to fill 50% of the available space.
7273320dcd049700481c744d499feeecd1454afd4d7Adam Powell             */
7283320dcd049700481c744d499feeecd1454afd4d7Adam Powell            if (whichButtons == BIT_BUTTON_POSITIVE) {
7293320dcd049700481c744d499feeecd1454afd4d7Adam Powell                centerButton(mButtonPositive);
7303320dcd049700481c744d499feeecd1454afd4d7Adam Powell            } else if (whichButtons == BIT_BUTTON_NEGATIVE) {
7313079e587bd519ba78cb34b1bd0b869e2879458abSangkyu Lee                centerButton(mButtonNegative);
7323320dcd049700481c744d499feeecd1454afd4d7Adam Powell            } else if (whichButtons == BIT_BUTTON_NEUTRAL) {
7333320dcd049700481c744d499feeecd1454afd4d7Adam Powell                centerButton(mButtonNeutral);
7343320dcd049700481c744d499feeecd1454afd4d7Adam Powell            }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
736b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
73762c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        final boolean hasButtons = whichButtons != 0;
73862c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        if (!hasButtons) {
73962c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette            buttonPanel.setVisibility(View.GONE);
74062c79e9a64c3b2cafd5500ed3064977dff7b7da3Alan Viverette        }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void centerButton(Button button) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) button.getLayoutParams();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        params.gravity = Gravity.CENTER_HORIZONTAL;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        params.weight = 0.5f;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        button.setLayoutParams(params);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View leftSpacer = mWindow.findViewById(R.id.leftSpacer);
749a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        if (leftSpacer != null) {
750a93347a62ec9887862abb9d6f216906c533a8562Adam Powell            leftSpacer.setVisibility(View.VISIBLE);
751a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View rightSpacer = mWindow.findViewById(R.id.rightSpacer);
753a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        if (rightSpacer != null) {
754a93347a62ec9887862abb9d6f216906c533a8562Adam Powell            rightSpacer.setVisibility(View.VISIBLE);
755a93347a62ec9887862abb9d6f216906c533a8562Adam Powell        }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
758c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette    private void setBackground(TypedArray a, View topPanel, View contentPanel, View customPanel,
759c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            View buttonPanel, boolean hasTitle, boolean hasCustomView, boolean hasButtons) {
760119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int fullDark = 0;
761119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int topDark = 0;
762119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int centerDark = 0;
763119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int bottomDark = 0;
764119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int fullBright = 0;
765119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int topBright = 0;
766119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int centerBright = 0;
767119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int bottomBright = 0;
768119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        int bottomMedium = 0;
769b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
770b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        // If the needsDefaultBackgrounds attribute is set, we know we're
771b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        // inheriting from a framework style.
772b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        final boolean needsDefaultBackgrounds = a.getBoolean(
773b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette                R.styleable.AlertDialog_needsDefaultBackgrounds, true);
774b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette        if (needsDefaultBackgrounds) {
775119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            fullDark = R.drawable.popup_full_dark;
776119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            topDark = R.drawable.popup_top_dark;
777119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            centerDark = R.drawable.popup_center_dark;
778119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            bottomDark = R.drawable.popup_bottom_dark;
779119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            fullBright = R.drawable.popup_full_bright;
780119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            topBright = R.drawable.popup_top_bright;
781119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            centerBright = R.drawable.popup_center_bright;
782119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            bottomBright = R.drawable.popup_bottom_bright;
783119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan            bottomMedium = R.drawable.popup_bottom_medium;
784119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        }
785b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
786119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        topBright = a.getResourceId(R.styleable.AlertDialog_topBright, topBright);
7874a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan        topDark = a.getResourceId(R.styleable.AlertDialog_topDark, topDark);
788119ba2c72dfb50d41177722da01d2750437fb165Vinod Krishnan        centerBright = a.getResourceId(R.styleable.AlertDialog_centerBright, centerBright);
7894a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan        centerDark = a.getResourceId(R.styleable.AlertDialog_centerDark, centerDark);
7904a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan
791c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        /* We now set the background of all of the sections of the alert.
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * First collect together each section that is being displayed along
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * with whether it is on a light or dark background, then run through
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * them setting their backgrounds.  This is complicated because we need
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * to correctly use the full, top, middle, and bottom graphics depending
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * on how many views they are and where they appear.
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
798c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
799c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final View[] views = new View[4];
800c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final boolean[] light = new boolean[4];
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View lastView = null;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean lastLight = false;
803c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasTitle) {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views[pos] = topPanel;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light[pos] = false;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos++;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
810c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* The contentPanel displays either a custom text message or
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * a ListView. If it's text we should use the dark background
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for ListView we should use the light background. If neither
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * are there the contentPanel will be hidden so set it as null.
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
816c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        views[pos] = contentPanel.getVisibility() == View.GONE ? null : contentPanel;
8176fe2b22085864b8f6bb6c59ecc0a12c6c4253309Romain Guy        light[pos] = mListView != null;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pos++;
819c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
820c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (hasCustomView) {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views[pos] = customPanel;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light[pos] = mForceInverseBackground;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos++;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
825c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasButtons) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views[pos] = buttonPanel;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            light[pos] = true;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
830c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean setView = false;
832c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        for (pos = 0; pos < views.length; pos++) {
833c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final View v = views[pos];
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v == null) {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
837c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (lastView != null) {
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!setView) {
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastView.setBackgroundResource(lastLight ? topBright : topDark);
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastView.setBackgroundResource(lastLight ? centerBright : centerDark);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setView = true;
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
846c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastView = v;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastLight = light[pos];
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
850c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lastView != null) {
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (setView) {
8534a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                bottomBright = a.getResourceId(R.styleable.AlertDialog_bottomBright, bottomBright);
8544a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                bottomMedium = a.getResourceId(R.styleable.AlertDialog_bottomMedium, bottomMedium);
8554a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                bottomDark = a.getResourceId(R.styleable.AlertDialog_bottomDark, bottomDark);
856c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
857c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                // ListViews will use the Bright background, but buttons use the
858c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                // Medium background.
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastView.setBackgroundResource(
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        lastLight ? (hasButtons ? bottomMedium : bottomBright) : bottomDark);
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
8624a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                fullBright = a.getResourceId(R.styleable.AlertDialog_fullBright, fullBright);
8634a3735d0810d641ef0fab3f3c0705a8a861f26a9Vinod Krishnan                fullDark = a.getResourceId(R.styleable.AlertDialog_fullDark, fullDark);
864c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastView.setBackgroundResource(lastLight ? fullBright : fullDark);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
868c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette
869c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        final ListView listView = mListView;
870c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette        if (listView != null && mAdapter != null) {
871c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            listView.setAdapter(mAdapter);
872c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            final int checkedItem = mCheckedItem;
873c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette            if (checkedItem > -1) {
874c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                listView.setItemChecked(checkedItem, true);
875c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                listView.setSelection(checkedItem);
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8809c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy    public static class RecycleListView extends ListView {
881d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        private final int mPaddingTopNoTitle;
882d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        private final int mPaddingBottomNoButtons;
883d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette
8849c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        boolean mRecycleOnMeasure = true;
8859c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8869c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        public RecycleListView(Context context) {
887d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            this(context, null);
8889c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
8899c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
8909c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        public RecycleListView(Context context, AttributeSet attrs) {
8919c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            super(context, attrs);
892617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
893d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            final TypedArray ta = context.obtainStyledAttributes(
894d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                    attrs, R.styleable.RecycleListView);
895d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            mPaddingBottomNoButtons = ta.getDimensionPixelOffset(
896d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                    R.styleable.RecycleListView_paddingBottomNoButtons, -1);
897d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            mPaddingTopNoTitle = ta.getDimensionPixelOffset(
898d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                    R.styleable.RecycleListView_paddingTopNoTitle, -1);
899d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        }
900d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette
901d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette        public void setHasDecor(boolean hasTitle, boolean hasButtons) {
902d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            if (!hasButtons || !hasTitle) {
903d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                final int paddingLeft = getPaddingLeft();
904d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                final int paddingTop = hasTitle ? getPaddingTop() : mPaddingTopNoTitle;
905d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                final int paddingRight = getPaddingRight();
906d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                final int paddingBottom = hasButtons ? getPaddingBottom() : mPaddingBottomNoButtons;
907d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette                setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
908d6bfb82dc85dba3c469a407cc318e63cfff33a0eAlan Viverette            }
9099c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
9109c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
9119c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        @Override
9129c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        protected boolean recycleOnMeasure() {
9139c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            return mRecycleOnMeasure;
9149c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        }
9159c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy    }
9169c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class AlertParams {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Context mContext;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final LayoutInflater mInflater;
920b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
921076c7fbeda5c4205e3e52fbc6110ab1c4b342afeGilles Debunne        public int mIconId = 0;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Drawable mIcon;
923576e1dff3d40610377a763db6c9e6bf999e00987blunden        public int mIconAttrId = 0;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mTitle;
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public View mCustomTitleView;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mMessage;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mPositiveButtonText;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mPositiveButtonListener;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mNegativeButtonText;
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mNegativeButtonListener;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence mNeutralButtonText;
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mNeutralButtonListener;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mCancelable;
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnCancelListener mOnCancelListener;
9357f02dc5c9c48a01bec459b71ac73a6ad37b9e12cAdam Powell        public DialogInterface.OnDismissListener mOnDismissListener;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnKeyListener mOnKeyListener;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence[] mItems;
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ListAdapter mAdapter;
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnClickListener mOnClickListener;
940ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette        public int mViewLayoutResId;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public View mView;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingLeft;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingTop;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingRight;
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mViewSpacingBottom;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mViewSpacingSpecified = false;
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean[] mCheckedItems;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mIsMultiChoice;
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mIsSingleChoice;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mCheckedItem = -1;
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DialogInterface.OnMultiChoiceClickListener mOnCheckboxClickListener;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Cursor mCursor;
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mLabelColumn;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mIsCheckedColumn;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mForceInverseBackground;
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public AdapterView.OnItemSelectedListener mOnItemSelectedListener;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public OnPrepareListViewListener mOnPrepareListViewListener;
9589c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy        public boolean mRecycleOnMeasure = true;
9599c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Interface definition for a callback to be invoked before the ListView
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * will be bound to an adapter.
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface OnPrepareListViewListener {
965b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Called before the ListView is bound to an adapter.
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param listView The ListView that will be shown in the dialog.
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void onPrepareListView(ListView listView);
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
972b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public AlertParams(Context context) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCancelable = true;
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
978b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void apply(AlertController dialog) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCustomTitleView != null) {
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setCustomTitle(mCustomTitleView);
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTitle != null) {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setTitle(mTitle);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mIcon != null) {
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setIcon(mIcon);
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9895c2d8f7d51d5a944459ddc61034854c6cef7a639Alan Viverette                if (mIconId != 0) {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setIcon(mIconId);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9925c2d8f7d51d5a944459ddc61034854c6cef7a639Alan Viverette                if (mIconAttrId != 0) {
993576e1dff3d40610377a763db6c9e6bf999e00987blunden                    dialog.setIcon(dialog.getIconAttributeResId(mIconAttrId));
994576e1dff3d40610377a763db6c9e6bf999e00987blunden                }
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mMessage != null) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setMessage(mMessage);
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPositiveButtonText != null) {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setButton(DialogInterface.BUTTON_POSITIVE, mPositiveButtonText,
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPositiveButtonListener, null);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNegativeButtonText != null) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setButton(DialogInterface.BUTTON_NEGATIVE, mNegativeButtonText,
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mNegativeButtonListener, null);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNeutralButtonText != null) {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setButton(DialogInterface.BUTTON_NEUTRAL, mNeutralButtonText,
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mNeutralButtonListener, null);
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mForceInverseBackground) {
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setInverseBackgroundForced(true);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For a list, the client can either supply an array of items or an
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // adapter or a cursor
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mItems != null) || (mCursor != null) || (mAdapter != null)) {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                createListView(dialog);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView != null) {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mViewSpacingSpecified) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setView(mView, mViewSpacingLeft, mViewSpacingTop, mViewSpacingRight,
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mViewSpacingBottom);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialog.setView(mView);
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1026ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette            } else if (mViewLayoutResId != 0) {
1027ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette                dialog.setView(mViewLayoutResId);
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1029ec186706df72fbb62bfe813d83cff9167dd95cb4Alan Viverette
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.setCancelable(mCancelable);
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.setOnCancelListener(mOnCancelListener);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnKeyListener != null) {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dialog.setOnKeyListener(mOnKeyListener);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            */
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1038b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private void createListView(final AlertController dialog) {
10408990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette            final RecycleListView listView =
10418990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                    (RecycleListView) mInflater.inflate(dialog.mListLayout, null);
10428990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette            final ListAdapter adapter;
1043b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mIsMultiChoice) {
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mCursor == null) {
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    adapter = new ArrayAdapter<CharSequence>(
1047fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                            mContext, dialog.mMultiChoiceItemLayout, R.id.text1, mItems) {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        @Override
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        public View getView(int position, View convertView, ViewGroup parent) {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            View view = super.getView(position, convertView, parent);
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mCheckedItems != null) {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                boolean isItemChecked = mCheckedItems[position];
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (isItemChecked) {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    listView.setItemChecked(position, true);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return view;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    };
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    adapter = new CursorAdapter(mContext, mCursor, false) {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        private final int mLabelIndex;
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        private final int mIsCheckedIndex;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        {
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final Cursor cursor = getCursor();
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLabelIndex = cursor.getColumnIndexOrThrow(mLabelColumn);
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mIsCheckedIndex = cursor.getColumnIndexOrThrow(mIsCheckedColumn);
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        @Override
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        public void bindView(View view, Context context, Cursor cursor) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            CheckedTextView text = (CheckedTextView) view.findViewById(R.id.text1);
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            text.setText(cursor.getString(mLabelIndex));
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            listView.setItemChecked(cursor.getPosition(),
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    cursor.getInt(mIsCheckedIndex) == 1);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1078b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        @Override
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        public View newView(Context context, Cursor cursor, ViewGroup parent) {
1081fcca00accb923d3cbda4e0d6f5540b10e8279cd2Adam Powell                            return mInflater.inflate(dialog.mMultiChoiceItemLayout,
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    parent, false);
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1084b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    };
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
10888990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                final int layout;
10898990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                if (mIsSingleChoice) {
10908990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                    layout = dialog.mSingleChoiceItemLayout;
10918990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                } else {
10928990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                    layout = dialog.mListItemLayout;
10938990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                }
10948990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette
10958990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                if (mCursor != null) {
10968990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                    adapter = new SimpleCursorAdapter(mContext, layout, mCursor,
10978990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                            new String[] { mLabelColumn }, new int[] { R.id.text1 });
10988990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                } else if (mAdapter != null) {
10998990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                    adapter = mAdapter;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11018990083b198cf05036d2190e4fe62316fbd1f0a4Alan Viverette                    adapter = new CheckedItemAdapter(mContext, layout, R.id.text1, mItems);
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1104b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnPrepareListViewListener != null) {
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnPrepareListViewListener.onPrepareListView(listView);
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1108b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* Don't directly set the adapter on the ListView as we might
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * want to add a footer to the ListView later.
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.mAdapter = adapter;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.mCheckedItem = mCheckedItem;
1114b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnClickListener != null) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setOnItemClickListener(new OnItemClickListener() {
1117c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    @Override
1118c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOnClickListener.onClick(dialog.mDialogInterface, position);
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!mIsSingleChoice) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dialog.mDialogInterface.dismiss();
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                });
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mOnCheckboxClickListener != null) {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setOnItemClickListener(new OnItemClickListener() {
1127c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    @Override
1128c3cf19af8dd2b7bee834e1b1cc037d789b4356ceAlan Viverette                    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mCheckedItems != null) {
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mCheckedItems[position] = listView.isItemChecked(position);
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOnCheckboxClickListener.onClick(
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                dialog.mDialogInterface, position, listView.isItemChecked(position));
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                });
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1137b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Attach a given OnItemSelectedListener to the ListView
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnItemSelectedListener != null) {
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setOnItemSelectedListener(mOnItemSelectedListener);
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1142b17c6c178f7b7b2774915497c7d2a871cf1fd85fAlan Viverette
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mIsSingleChoice) {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mIsMultiChoice) {
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11489c802c1e95befbd8de30ea4ebc48ae05cb948b2bRomain Guy            listView.mRecycleOnMeasure = mRecycleOnMeasure;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dialog.mListView = listView;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11532356c5e69b0911e6334ebf6374217898371be5acAlan Viverette    private static class CheckedItemAdapter extends ArrayAdapter<CharSequence> {
11542356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        public CheckedItemAdapter(Context context, int resource, int textViewResourceId,
11552356c5e69b0911e6334ebf6374217898371be5acAlan Viverette                CharSequence[] objects) {
11562356c5e69b0911e6334ebf6374217898371be5acAlan Viverette            super(context, resource, textViewResourceId, objects);
11572356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        }
11582356c5e69b0911e6334ebf6374217898371be5acAlan Viverette
11592356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        @Override
11602356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        public boolean hasStableIds() {
11612356c5e69b0911e6334ebf6374217898371be5acAlan Viverette            return true;
11622356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        }
11632356c5e69b0911e6334ebf6374217898371be5acAlan Viverette
11642356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        @Override
11652356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        public long getItemId(int position) {
11662356c5e69b0911e6334ebf6374217898371be5acAlan Viverette            return position;
11672356c5e69b0911e6334ebf6374217898371be5acAlan Viverette        }
11682356c5e69b0911e6334ebf6374217898371be5acAlan Viverette    }
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1170