1 /*
2  * Copyright (C) 2012 Google Inc. All Rights Reserved.
3  */
4 
5 package com.android.deskclock.widget.sgv;
6 import android.view.View;
7 import android.view.ViewGroup;
8 import android.widget.BaseAdapter;
9 
10 import com.android.deskclock.widget.sgv.ReorderUtils;
11 
12 /**
13  * Adapter for use with {@link StaggeredGridView}. Copied from Keep.
14  * TODO: Keep up to date with fixes to their code; if they move into a shared library, use that.
15  */
16 public abstract class GridAdapter extends BaseAdapter {
17     /**
18      * A tag key which stores the id of the associated object. If set, this
19      * allows for faster creation of views.
20      */
21     private static final int GRID_ID_TAG = "gridIdTag".hashCode();
22     private View mHeaderView;
23     private View mFooterView;
24 
GridAdapter()25     public GridAdapter() {
26         super();
27     }
28 
29     /**
30      * Checks to see if the child at the specified position is draggable
31      * @param position The position of the child to check against
32      * @return boolean If true, the child at the specified position is draggable.
33      */
isDraggable(int position)34     public boolean isDraggable(int position) {
35         return false;
36     }
37 
38     /**
39      * For a view at the specified position, return the region around the view that is a possible
40      * reordering area.
41      * @param position The adapter position
42      * @param isLastColumnInGrid Flag to indicate whether the view at the specified position is
43      * laid out at the last column in the grid.  Being in the last column has some UI implications
44      * when it comes to reordering.  As an example, if a view has reordering area set to Left, and
45      * is laid out in the last column, the grid may also choose to enable the right reordering area
46      * for this view as well so that the user has the convenience have dropping views on the right
47      * edge of the grid to re-order.
48      * @return int The re-ordering area for the view at this adapter position.
49      * Possible return values are a combination of
50      * {@link ReorderUtils#REORDER_AREA_NONE}, {@link ReorderUtils#REORDER_AREA_VALID}
51      */
getReorderingArea(int position, boolean isLastColumnInGrid)52     public int getReorderingArea(int position, boolean isLastColumnInGrid) {
53         return ReorderUtils.REORDER_AREA_NONE;
54     }
55 
56     /**
57      * The direction for drag to reorder that is allowed.  By default, the allowed direction
58      * is free across both horizontal and vertical axes.
59      * @return int The allowed direction for drag to reorder.  Possible return values are a
60      * combination of {@link ReorderUtils#REORDER_DIRECTION_VERTICAL} and/or
61      * {@link ReorderUtils#REORDER_DIRECTION_HORIZONTAL}
62      */
getReorderingDirection()63     public int getReorderingDirection() {
64         return ReorderUtils.REORDER_DIRECTION_VERTICAL | ReorderUtils.REORDER_DIRECTION_HORIZONTAL;
65     }
66 
getHeaderView()67     public View getHeaderView() {
68         return mHeaderView;
69     }
70 
setHeaderView(View view)71     public void setHeaderView(View view) {
72         mHeaderView = view;
73     }
74 
getFooterView()75     public View getFooterView() {
76         return mFooterView;
77     }
78 
setFooterView(View view)79     public void setFooterView(View view) {
80         mFooterView = view;
81     }
82 
hasHeader()83     public boolean hasHeader() {
84         return mHeaderView != null;
85     }
86 
hasFooter()87     public boolean hasFooter() {
88         return mFooterView != null;
89     }
90 
91     /**
92      * Views created via the GridAdapter or any subclasses should call this to
93      * store the id of the item associated with them.
94      */
setItemId(View view, long id)95     public void setItemId(View view, long id) {
96         view.setTag(GRID_ID_TAG, id);
97     }
98 
99     /**
100      * Get the id of the item associated with this view.
101      */
getItemIdFromView(View view, int position)102     public long getItemIdFromView(View view, int position) {
103         final Object id = view.getTag(GRID_ID_TAG);
104         if (id != null) {
105             return (Long) id;
106         }
107 
108         return getItemId(position);
109     }
110 
111     /**
112      * Get the id of the item associated with this view.  The specified Object is associated with
113      * the view at this position, and can be used to optimize retrieval of the id by the adapter.
114      * @param item Object associated with this view at this position.
115      * @param position Position of the item.
116      * @return id Id for the item at this position.
117      */
getItemId(Object item, int position)118     public long getItemId(Object item, int position) {
119         // TODO: Rather than using Object, use BaseNode so that we're not confused between this
120         // method, and the method above.
121         return getItemId(position);
122     }
123 
124     /**
125      * Get the type of the view given the item it will display based on its
126      * position in the cursor managed by the adapter. Previously, the adapter
127      * would create an item based on the position and use that item to get the
128      * view type. However, if the item already exists due to another call that
129      * required it, it is much better to reuse the item than recreate it.
130      *
131      * @param item Object associated with the view at this position
132      * @param position Position of the item we are verifying
133      * @return int representing the type of the item at the supplied position
134      */
getItemViewType(Object item, int position)135     public int getItemViewType(Object item, int position) {
136         return getItemViewType(position);
137     }
138 
139     /**
140      * Get the view given its associated item.
141      *
142      * @param item Object associated with the view at this position
143      * @param position Position of the item we are verifying
144      * @param scrap The old view to reuse, if possible. Note: You should check
145      *            that this view is non-null and of an appropriate type before
146      *            using. If it is not possible to convert this view to display
147      *            the correct data, this method can create a new view.
148      *            Heterogeneous lists can specify their number of view types, so
149      *            that this View is always of the right type (see
150      *            getViewTypeCount() and getItemViewType(int)).
151      * @param parent The parent view this view will eventually be attached to
152      * @param measuredWidth
153      * @return View
154      */
getView(Object item, int position, View scrap, ViewGroup parent, int measuredWidth)155     public View getView(Object item, int position, View scrap, ViewGroup parent,
156             int measuredWidth) {
157         return getView(position, scrap, parent);
158     }
159 
160     /**
161      * Get how many columns a specific view will span in the grid.
162      */
getItemColumnSpan(Object item, int position)163     abstract public int getItemColumnSpan(Object item, int position);
164 
165     /**
166      * The first change position of all items. It will be used by
167      * StaggeredGridView to optimize rendering, such as skip unchanged items. By
168      * default it returns 0, so StaggeredGridView will not try to optimize.
169      */
getFirstChangedPosition()170     public int getFirstChangedPosition() {
171         return 0;
172     }
173 
174     /**
175      * StaggeredGridView only works with stable id. Any adapter which wants to
176      * use staggered grid view is enforced to use stable ids.
177      */
178     @Override
hasStableIds()179     public boolean hasStableIds() {
180         return true;
181     }
182 }
183