14c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein/*
24c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Copyright (C) 2012 Google Inc. All Rights Reserved.
34c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */
44c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
54c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinpackage com.android.deskclock.widget.sgv;
64c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport android.view.View;
74c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport android.view.ViewGroup;
84c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport android.widget.BaseAdapter;
94c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
104c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport com.android.deskclock.widget.sgv.ReorderUtils;
114c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
124c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein/**
134c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Adapter for use with {@link StaggeredGridView}. Copied from Keep.
144c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * TODO: Keep up to date with fixes to their code; if they move into a shared library, use that.
154c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */
164c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinpublic abstract class GridAdapter extends BaseAdapter {
174c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
184c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * A tag key which stores the id of the associated object. If set, this
194c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * allows for faster creation of views.
204c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
214c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    private static final int GRID_ID_TAG = "gridIdTag".hashCode();
224c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    private View mHeaderView;
234c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    private View mFooterView;
244c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
254c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public GridAdapter() {
264c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        super();
274c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
284c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
294c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
304c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Checks to see if the child at the specified position is draggable
314c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param position The position of the child to check against
324c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @return boolean If true, the child at the specified position is draggable.
334c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
344c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public boolean isDraggable(int position) {
354c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return false;
364c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
374c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
384c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
394c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * For a view at the specified position, return the region around the view that is a possible
404c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * reordering area.
414c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param position The adapter position
424c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param isLastColumnInGrid Flag to indicate whether the view at the specified position is
434c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * laid out at the last column in the grid.  Being in the last column has some UI implications
444c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * when it comes to reordering.  As an example, if a view has reordering area set to Left, and
454c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * is laid out in the last column, the grid may also choose to enable the right reordering area
464c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * for this view as well so that the user has the convenience have dropping views on the right
474c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * edge of the grid to re-order.
484c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @return int The re-ordering area for the view at this adapter position.
494c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Possible return values are a combination of
504c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * {@link ReorderUtils#REORDER_AREA_NONE}, {@link ReorderUtils#REORDER_AREA_VALID}
514c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
524c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public int getReorderingArea(int position, boolean isLastColumnInGrid) {
534c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return ReorderUtils.REORDER_AREA_NONE;
544c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
554c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
564c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
574c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * The direction for drag to reorder that is allowed.  By default, the allowed direction
584c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * is free across both horizontal and vertical axes.
594c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @return int The allowed direction for drag to reorder.  Possible return values are a
604c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * combination of {@link ReorderUtils#REORDER_DIRECTION_VERTICAL} and/or
614c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * {@link ReorderUtils#REORDER_DIRECTION_HORIZONTAL}
624c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
634c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public int getReorderingDirection() {
644c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return ReorderUtils.REORDER_DIRECTION_VERTICAL | ReorderUtils.REORDER_DIRECTION_HORIZONTAL;
654c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
664c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
674c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public View getHeaderView() {
684c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return mHeaderView;
694c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
704c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
714c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public void setHeaderView(View view) {
724c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        mHeaderView = view;
734c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
744c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
754c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public View getFooterView() {
764c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return mFooterView;
774c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
784c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
794c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public void setFooterView(View view) {
804c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        mFooterView = view;
814c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
824c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
834c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public boolean hasHeader() {
844c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return mHeaderView != null;
854c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
864c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
874c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public boolean hasFooter() {
884c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return mFooterView != null;
894c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
904c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
914c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
924c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Views created via the GridAdapter or any subclasses should call this to
934c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * store the id of the item associated with them.
944c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
954c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public void setItemId(View view, long id) {
964c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        view.setTag(GRID_ID_TAG, id);
974c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
984c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
994c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1004c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Get the id of the item associated with this view.
1014c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1024c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public long getItemIdFromView(View view, int position) {
1034c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        final Object id = view.getTag(GRID_ID_TAG);
1044c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        if (id != null) {
1054c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein            return (Long) id;
1064c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        }
1074c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1084c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return getItemId(position);
1094c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
1104c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1114c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1124c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Get the id of the item associated with this view.  The specified Object is associated with
1134c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * the view at this position, and can be used to optimize retrieval of the id by the adapter.
1144c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param item Object associated with this view at this position.
1154c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param position Position of the item.
1164c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @return id Id for the item at this position.
1174c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1184c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public long getItemId(Object item, int position) {
1194c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        // TODO: Rather than using Object, use BaseNode so that we're not confused between this
1204c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        // method, and the method above.
1214c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return getItemId(position);
1224c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
1234c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1244c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1254c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Get the type of the view given the item it will display based on its
1264c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * position in the cursor managed by the adapter. Previously, the adapter
1274c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * would create an item based on the position and use that item to get the
1284c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * view type. However, if the item already exists due to another call that
1294c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * required it, it is much better to reuse the item than recreate it.
1304c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *
1314c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param item Object associated with the view at this position
1324c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param position Position of the item we are verifying
1334c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @return int representing the type of the item at the supplied position
1344c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1354c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public int getItemViewType(Object item, int position) {
1364c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return getItemViewType(position);
1374c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
1384c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1394c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1404c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Get the view given its associated item.
1414c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *
1424c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param item Object associated with the view at this position
1434c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param position Position of the item we are verifying
1444c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param scrap The old view to reuse, if possible. Note: You should check
1454c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *            that this view is non-null and of an appropriate type before
1464c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *            using. If it is not possible to convert this view to display
1474c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *            the correct data, this method can create a new view.
1484c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *            Heterogeneous lists can specify their number of view types, so
1494c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *            that this View is always of the right type (see
1504c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     *            getViewTypeCount() and getItemViewType(int)).
1514c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param parent The parent view this view will eventually be attached to
1524c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @param measuredWidth
1534c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * @return View
1544c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1554c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public View getView(Object item, int position, View scrap, ViewGroup parent,
1564c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein            int measuredWidth) {
1574c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return getView(position, scrap, parent);
1584c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
1594c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1604c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1614c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * Get how many columns a specific view will span in the grid.
1624c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1634c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    abstract public int getItemColumnSpan(Object item, int position);
1644c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1654c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1664c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * The first change position of all items. It will be used by
1674c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * StaggeredGridView to optimize rendering, such as skip unchanged items. By
1684c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * default it returns 0, so StaggeredGridView will not try to optimize.
1694c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1704c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public int getFirstChangedPosition() {
1714c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return 0;
1724c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
1734c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein
1744c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    /**
1754c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * StaggeredGridView only works with stable id. Any adapter which wants to
1764c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     * use staggered grid view is enforced to use stable ids.
1774c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein     */
1784c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    @Override
1794c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    public boolean hasStableIds() {
1804c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein        return true;
1814c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein    }
1824c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein}
183