GridScenario.java revision 1d3165f10b12165f02b7015ac1a817c5f60e6399
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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
171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AbsListView;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.BaseAdapter;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.GridView;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListAdapter;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.google.android.collect.Maps;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Utility base class for creating various GridView scenarios.  Configurable by the number
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of items, how tall each item should be (in relation to the screen height), and
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * what item should start with selection.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class GridScenario extends Activity {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private GridView mGridView;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNumItems;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mStartingSelectionPosition;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private double mItemScreenSizeFactor;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Map<Integer, Double> mOverrideItemScreenSizeFactors = Maps.newHashMap();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mScreenHeight;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mStackFromBottom;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mColumnWidth;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNumColumns;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mStretchMode;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mVerticalSpacing;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public GridView getGridView() {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mGridView;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getScreenHeight() {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScreenHeight;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The initial number of items in the grid as specified by the scenario.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This number may change over time.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getInitialNumItems() {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNumItems;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The desired height of 1 item, ignoring overrides
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDesiredItemHeight() {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (int) (mScreenHeight * mItemScreenSizeFactor);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Better way to pass in optional params than a honkin' paramater list :)
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Params {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mNumItems = 4;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mStartingSelectionPosition = -1;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private double mItemScreenSizeFactor = 1 / 5;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Map<Integer, Double> mOverrideItemScreenSizeFactors = Maps.newHashMap();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mStackFromBottom = false;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mMustFillScreen = true;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mColumnWidth = 0;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mNumColumns = GridView.AUTO_FIT;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mStretchMode = GridView.STRETCH_COLUMN_WIDTH;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mVerticalSpacing = 0;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set the number of items in the grid.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setNumItems(int numItems) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNumItems = numItems;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set the position that starts selected.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param startingSelectionPosition The selected position within the adapter's data set.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Pass -1 if you do not want to force a selection.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setStartingSelectionPosition(int startingSelectionPosition) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartingSelectionPosition = startingSelectionPosition;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set the factor that determines how tall each item is in relation to the
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * screen height.
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setItemScreenSizeFactor(double itemScreenSizeFactor) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mItemScreenSizeFactor = itemScreenSizeFactor;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Override the item screen size factor for a particular item.  Useful for
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * creating grids with non-uniform item height.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param position The position in the grid.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param itemScreenSizeFactor The screen size factor to use for the height.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setPositionScreenSizeFactorOverride(
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int position, double itemScreenSizeFactor) {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOverrideItemScreenSizeFactors.put(position, itemScreenSizeFactor);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the stacking direction
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param stackFromBottom
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setStackFromBottom(boolean stackFromBottom) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStackFromBottom = stackFromBottom;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets whether the sum of the height of the grid items must be at least the
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * height of the grid view.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setMustFillScreen(boolean fillScreen) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMustFillScreen = fillScreen;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the individual width of each column.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param requestedWidth the width in pixels of the column
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setColumnWidth(int requestedWidth) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColumnWidth = requestedWidth;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the number of columns in the grid.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setNumColumns(int numColumns) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNumColumns = numColumns;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the stretch mode.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setStretchMode(int stretchMode) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStretchMode = stretchMode;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the spacing between rows in the grid
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Params setVerticalSpacing(int verticalSpacing) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVerticalSpacing  = verticalSpacing;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * How each scenario customizes its behavior.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected abstract void init(Params params);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this to provide an different adapter for your scenario
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The adapter that this scenario will use
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ListAdapter createAdapter() {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new MyAdapter();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you want to know when something has been selected (perhaps
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more importantly, that {@link android.widget.AdapterView.OnItemSelectedListener} has
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been triggered).
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings({ "UnusedDeclaration" })
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void positionSelected(int positon) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if you want to know that nothing is selected.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void nothingSelected() {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle icicle) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onCreate(icicle);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // turn off title bar
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenHeight = getWindowManager().getDefaultDisplay().getHeight();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Params params = new Params();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(params);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readAndValidateParams(params);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView = new GridView(this);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setLayoutParams(new ViewGroup.LayoutParams(
245980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT,
246980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT));
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setDrawSelectorOnTop(false);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNumColumns >= GridView.AUTO_FIT) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGridView.setNumColumns(mNumColumns);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mColumnWidth > 0) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGridView.setColumnWidth(mColumnWidth);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mVerticalSpacing > 0) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGridView.setVerticalSpacing(mVerticalSpacing);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setStretchMode(mStretchMode);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setAdapter(createAdapter());
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mStartingSelectionPosition >= 0) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGridView.setSelection(mStartingSelectionPosition);
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setPadding(10, 10, 10, 10);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setStackFromBottom(mStackFromBottom);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onItemSelected(AdapterView parent, View v, int position, long id) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                positionSelected(position);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onNothingSelected(AdapterView parent) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nothingSelected();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setContentView(mGridView);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Read in and validate all of the params passed in by the scenario.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readAndValidateParams(Params params) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (params.mMustFillScreen ) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double totalFactor = 0.0;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < params.mNumItems; i++) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params.mOverrideItemScreenSizeFactors.containsKey(i)) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    totalFactor += params.mOverrideItemScreenSizeFactors.get(i);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    totalFactor += params.mItemScreenSizeFactor;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalFactor < 1.0) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("grid items must combine to be at least " +
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "the height of the screen.  this is not the case with " + params.mNumItems
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " items and " + params.mItemScreenSizeFactor + " screen factor and " +
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "screen height of " + mScreenHeight);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNumItems = params.mNumItems;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartingSelectionPosition = params.mStartingSelectionPosition;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mItemScreenSizeFactor = params.mItemScreenSizeFactor;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOverrideItemScreenSizeFactors.putAll(params.mOverrideItemScreenSizeFactors);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStackFromBottom = params.mStackFromBottom;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColumnWidth = params.mColumnWidth;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNumColumns = params.mNumColumns;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStretchMode = params.mStretchMode;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVerticalSpacing = params.mVerticalSpacing;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final String getValueAtPosition(int position) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "postion " + position;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a view for a grid item.  Override this to create a custom view beyond
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the simple focusable / unfocusable text view.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param position The position.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parent The parent
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param desiredHeight The height the view should be to respect the desired item
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   to screen height ratio.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a view for the grid.
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected View createView(int position, ViewGroup parent, int desiredHeight) {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextView result = new TextView(parent.getContext());
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.setHeight(desiredHeight);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.setText(getValueAtPosition(position));
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams(
333980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                ViewGroup.LayoutParams.MATCH_PARENT,
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewGroup.LayoutParams.WRAP_CONTENT);
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.setLayoutParams(lp);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.setId(position);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.setBackgroundColor(0x55ffffff);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class MyAdapter extends BaseAdapter {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getCount() {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mNumItems;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object getItem(int position) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getValueAtPosition(position);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getItemId(int position) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return position;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (convertView != null) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((TextView) convertView).setText(getValueAtPosition(position));
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                convertView.setId(position);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return convertView;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int desiredHeight = getDesiredItemHeight();
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOverrideItemScreenSizeFactors.containsKey(position)) {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                desiredHeight = (int) (mScreenHeight * mOverrideItemScreenSizeFactors.get(position));
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return createView(position, parent, desiredHeight);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
371