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