19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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 android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DataSetObserver;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
318a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
328a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An abstract base class for spinner widgets. SDK users will probably not
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to use this class.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AbsSpinner_entries
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class AbsSpinner extends AdapterView<SpinnerAdapter> {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SpinnerAdapter mAdapter;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHeightMeasureSpec;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWidthMeasureSpec;
45afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionLeftPadding = 0;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionTopPadding = 0;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionRightPadding = 0;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSelectionBottomPadding = 0;
50afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy    final Rect mSpinnerPadding = new Rect();
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy    final RecycleBin mRecycler = new RecycleBin();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DataSetObserver mDataSetObserver;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Temporary frame to hold a child View's frame rectangle */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Rect mTouchFrame;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AbsSpinner(Context context) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initAbsSpinner();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AbsSpinner(Context context, AttributeSet attrs) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public AbsSpinner(Context context, AttributeSet attrs, int defStyle) {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs, defStyle);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initAbsSpinner();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AbsSpinner, defStyle, 0);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entries != null) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayAdapter<CharSequence> adapter =
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    new ArrayAdapter<CharSequence>(context,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            R.layout.simple_spinner_item, entries);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setAdapter(adapter);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Common code for different constructor flavors
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void initAbsSpinner() {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFocusable(true);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setWillNotDraw(false);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Adapter is used to provide the data which backs this Spinner.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It also provides methods to transform spinner items based on their position
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * relative to the selected item.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param adapter The SpinnerAdapter to use for this Spinner
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAdapter(SpinnerAdapter adapter) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (null != mAdapter) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAdapter.unregisterDataSetObserver(mDataSetObserver);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resetList();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAdapter = adapter;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedPosition = INVALID_POSITION;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedRowId = INVALID_ROW_ID;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAdapter != null) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOldItemCount = mItemCount;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mItemCount = mAdapter.getCount();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkFocus();
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataSetObserver = new AdapterDataSetObserver();
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAdapter.registerDataSetObserver(mDataSetObserver);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int position = mItemCount > 0 ? 0 : INVALID_POSITION;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setSelectedPositionInt(position);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setNextSelectedPositionInt(position);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mItemCount == 0) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Nothing selected
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                checkSelectionChanged();
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkFocus();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resetList();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Nothing selected
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checkSelectionChanged();
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requestLayout();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Clear out all children from the list
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void resetList() {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataChanged = false;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNeedSync = false;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeAllViewsInLayout();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedPosition = INVALID_POSITION;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldSelectedRowId = INVALID_ROW_ID;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setSelectedPositionInt(INVALID_POSITION);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNextSelectedPositionInt(INVALID_POSITION);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.View#measure(int, int)
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Figure out the dimensions of this Spinner. The width comes from
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the widthMeasureSpec as Spinnners can't have their width set to
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UNSPECIFIED. The height is based on the height of the selected item
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * plus padding.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int widthSize;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int heightSize;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.left = mPaddingLeft > mSelectionLeftPadding ? mPaddingLeft
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionLeftPadding;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.top = mPaddingTop > mSelectionTopPadding ? mPaddingTop
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionTopPadding;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.right = mPaddingRight > mSelectionRightPadding ? mPaddingRight
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionRightPadding;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSpinnerPadding.bottom = mPaddingBottom > mSelectionBottomPadding ? mPaddingBottom
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : mSelectionBottomPadding;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDataChanged) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleDataChanged();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int preferredHeight = 0;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int preferredWidth = 0;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean needsMeasuring = true;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int selectedPosition = getSelectedItemPosition();
188afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        if (selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount()) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Try looking in the recycler. (Maybe we were measured once already)
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View view = mRecycler.get(selectedPosition);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (view == null) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Make a new one
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view = mAdapter.getView(selectedPosition, null, this);
1944213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
1954213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                if (view.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
1964213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    view.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
1974213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (view != null) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Put in recycler for re-measuring and/or layout
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRecycler.put(selectedPosition, view);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (view != null) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view.getLayoutParams() == null) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlockLayoutRequests = true;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    view.setLayoutParams(generateDefaultLayoutParams());
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlockLayoutRequests = false;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                measureChild(view, widthMeasureSpec, heightMeasureSpec);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                preferredHeight = getChildHeight(view) + mSpinnerPadding.top + mSpinnerPadding.bottom;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                preferredWidth = getChildWidth(view) + mSpinnerPadding.left + mSpinnerPadding.right;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                needsMeasuring = false;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needsMeasuring) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // No views -- just use padding
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (widthMode == MeasureSpec.UNSPECIFIED) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                preferredWidth = mSpinnerPadding.left + mSpinnerPadding.right;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight());
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth());
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
231189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn        heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0);
232189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn        widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 0);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMeasuredDimension(widthSize, heightSize);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeightMeasureSpec = heightMeasureSpec;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidthMeasureSpec = widthMeasureSpec;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getChildHeight(View child) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return child.getMeasuredHeight();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getChildWidth(View child) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return child.getMeasuredWidth();
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new ViewGroup.LayoutParams(
250980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewGroup.LayoutParams.WRAP_CONTENT);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void recycleAllViews() {
255afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        final int childCount = getChildCount();
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AbsSpinner.RecycleBin recycleBin = mRecycler;
257afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        final int position = mFirstPosition;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // All views go in recycler
260afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        for (int i = 0; i < childCount; i++) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View v = getChildAt(i);
262afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy            int index = position + i;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recycleBin.put(index, v);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Jump directly to a specific item in the adapter data.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelection(int position, boolean animate) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Animate only if requested position is already on screen somewhere
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean shouldAnimate = animate && mFirstPosition <= position &&
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                position <= mFirstPosition + getChildCount() - 1;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setSelectionInt(position, shouldAnimate);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelection(int position) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setNextSelectedPositionInt(position);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requestLayout();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Makes the item at the supplied position selected.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param position Position to select
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param animate Should the transition be animated
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setSelectionInt(int position, boolean animate) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (position != mOldSelectedPosition) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlockLayoutRequests = true;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int delta  = position - mSelectedPosition;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setNextSelectedPositionInt(position);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            layout(delta, animate);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBlockLayoutRequests = false;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    abstract void layout(int delta, boolean animate);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getSelectedView() {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mItemCount > 0 && mSelectedPosition >= 0) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getChildAt(mSelectedPosition - mFirstPosition);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override to prevent spamming ourselves with layout requests
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as we place views
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.View#requestLayout()
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mBlockLayoutRequests) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.requestLayout();
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SpinnerAdapter getAdapter() {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAdapter;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getCount() {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mItemCount;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maps a point to a position in the list.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x X in local coordinate
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y Y in local coordinate
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The position of the item which contains the specified point, or
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #INVALID_POSITION} if the point does not intersect an item.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int pointToPosition(int x, int y) {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect frame = mTouchFrame;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (frame == null) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTouchFrame = new Rect();
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            frame = mTouchFrame;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = getChildCount();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = count - 1; i >= 0; i--) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View child = getChildAt(i);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (child.getVisibility() == View.VISIBLE) {
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                child.getHitRect(frame);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (frame.contains(x, y)) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mFirstPosition + i;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return INVALID_POSITION;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class SavedState extends BaseSavedState {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long selectedId;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int position;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructor called from {@link AbsSpinner#onSaveInstanceState()}
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState(Parcelable superState) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructor called from {@link #CREATOR}
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private SavedState(Parcel in) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(in);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            selectedId = in.readLong();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position = in.readInt();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, int flags) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.writeToParcel(out, flags);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(selectedId);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(position);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "AbsSpinner.SavedState{"
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Integer.toHexString(System.identityHashCode(this))
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " selectedId=" + selectedId
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " position=" + position + "}";
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Parcelable.Creator<SavedState> CREATOR
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new Parcelable.Creator<SavedState>() {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState createFromParcel(Parcel in) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState(in);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState[] newArray(int size) {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState[size];
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Parcelable onSaveInstanceState() {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcelable superState = super.onSaveInstanceState();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState ss = new SavedState(superState);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ss.selectedId = getSelectedItemId();
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ss.selectedId >= 0) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ss.position = getSelectedItemPosition();
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ss.position = INVALID_POSITION;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ss;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onRestoreInstanceState(Parcelable state) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState ss = (SavedState) state;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onRestoreInstanceState(ss.getSuperState());
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ss.selectedId >= 0) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataChanged = true;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNeedSync = true;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSyncRowId = ss.selectedId;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSyncPosition = ss.position;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSyncMode = SYNC_SELECTED_POSITION;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecycleBin {
441afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy        private final SparseArray<View> mScrapHeap = new SparseArray<View>();
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void put(int position, View v) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrapHeap.put(position, v);
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View get(int position) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // System.out.print("Looking for " + position);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View result = mScrapHeap.get(position);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (result != null) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // System.out.println(" HIT");
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrapHeap.delete(position);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // System.out.println(" MISS");
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
458afc0155718ceb6b14d78dffc5590bd359511be8bRomain Guy
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void clear() {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final SparseArray<View> scrapHeap = mScrapHeap;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = scrapHeap.size();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View view = scrapHeap.valueAt(i);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view != null) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    removeDetachedView(view, true);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrapHeap.clear();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4718a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov
4728a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    @Override
4738a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
4748a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        super.onInitializeAccessibilityEvent(event);
4758a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        event.setClassName(AbsSpinner.class.getName());
4768a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    }
4778a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov
4788a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    @Override
4798a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
4808a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        super.onInitializeAccessibilityNodeInfo(info);
4818a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov        info.setClassName(AbsSpinner.class.getName());
4828a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
484