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