BaseCursorPagerAdapter.java revision f77a7eb196d16110c7b1087352b423913821ff61
1f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein/*
2f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Copyright (C) 2011 Google Inc.
3f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Licensed to The Android Open Source Project.
4f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *
5f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
6f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * you may not use this file except in compliance with the License.
7f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * You may obtain a copy of the License at
8f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *
9f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
10f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein *
11f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software
12f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
13f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * See the License for the specific language governing permissions and
15f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * limitations under the License.
16f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */
17f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
18f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinpackage com.android.ex.photo.adapters;
19f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
20f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.Fragment;
21f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.FragmentManager;
22f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.content.Context;
23f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.database.Cursor;
24f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.util.Log;
25f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.util.SparseIntArray;
26f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.view.View;
27f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
28f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.provider.PhotoContract;
29f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
30f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport java.util.HashMap;
31f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
32f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein/**
33f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Page adapter for use with an BaseCursorLoader. Unlike other cursor adapters, this has no
34f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * observers for automatic refresh. Instead, it depends upon external mechanisms to provide
35f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * the update signal.
36f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */
37f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinpublic abstract class BaseCursorPagerAdapter extends BaseFragmentPagerAdapter {
38f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private static final String TAG = "BaseCursorPagerAdapter";
39f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
40f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    Context mContext;
41f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean mDataValid;
42f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private Cursor mCursor;
43f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private int mRowIDColumn;
44f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Mapping of row ID to cursor position */
45f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private SparseIntArray mItemPosition;
46f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /** Mapping of instantiated object to row ID */
47f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private HashMap<Object, Integer> mObjectRowMap = new HashMap<Object, Integer>();
48f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
49f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
50f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Constructor that always enables auto-requery.
51f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
52f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param c The cursor from which to get the data.
53f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param context The context
54f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
55f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public BaseCursorPagerAdapter(Context context, FragmentManager fm, Cursor c) {
56f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        super(fm);
57f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        init(context, c);
58f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
59f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
60f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
61f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Makes a fragment for the data pointed to by the cursor
62f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
63f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param context Interface to application's global information
64f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param cursor The cursor from which to get the data. The cursor is already
65f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * moved to the correct position.
66f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @return the newly created fragment.
67f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
68f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public abstract Fragment getItem(Context context, Cursor cursor);
69f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
70f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
71f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Fragment getItem(int position) {
72f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mDataValid && moveCursorTo(position)) {
73f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return getItem(mContext, mCursor);
74f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
75f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return null;
76f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
77f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
78f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
79f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public int getCount() {
80f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mDataValid && mCursor != null) {
81f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return mCursor.getCount();
82f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
83f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return 0;
84f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
85f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
86f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
87f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
88f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Object instantiateItem(View container, int position) {
89f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (!mDataValid) {
90f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            throw new IllegalStateException("this should only be called when the cursor is valid");
91f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
92f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
93f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final Integer rowId;
94f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (moveCursorTo(position)) {
95f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            rowId = mCursor.getString(mRowIDColumn).hashCode();
96f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
97f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            rowId = null;
98f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
99f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
100f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        // Create the fragment and bind cursor data
101f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final Object obj = super.instantiateItem(container, position);
102f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (obj != null) {
103f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mObjectRowMap.put(obj, rowId);
104f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
105f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return obj;
106f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
107f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
108f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
109f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public void destroyItem(View container, int position, Object object) {
110f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mObjectRowMap.remove(object);
111f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
112f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        super.destroyItem(container, position, object);
113f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
114f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
115f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
116f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public int getItemPosition(Object object) {
117f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final Integer rowId = mObjectRowMap.get(object);
118f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (rowId == null || mItemPosition == null) {
119f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return POSITION_NONE;
120f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
121f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
122f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        final int position = mItemPosition.get(rowId, POSITION_NONE);
123f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return position;
124f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
125f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
126f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
127f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @return true if data is valid
128f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
129f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public boolean isDataValid() {
130f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return mDataValid;
131f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
132f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
133f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
134f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Returns the cursor.
135f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
136f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Cursor getCursor() {
137f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return mCursor;
138f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
139f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
140f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
141f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Returns the data item associated with the specified position in the data set.
142f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
143f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Object getDataItem(int position) {
144f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mDataValid && moveCursorTo(position)) {
145f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return mCursor;
146f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
147f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return null;
148f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
149f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
150f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
151f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
152f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Returns the row id associated with the specified position in the list.
153f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
154f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public long getItemId(int position) {
155f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mDataValid && moveCursorTo(position)) {
156f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return mCursor.getString(mRowIDColumn).hashCode();
157f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
158f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return 0;
159f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
160f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
161f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
162f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
163f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Swap in a new Cursor, returning the old Cursor.
164f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
165f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param newCursor The new cursor to be used.
166f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @return Returns the previously set Cursor, or null if there was not one.
167f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * If the given new Cursor is the same instance is the previously set
168f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Cursor, null is also returned.
169f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
170f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public Cursor swapCursor(Cursor newCursor) {
171f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (Log.isLoggable(TAG, Log.VERBOSE)) {
172f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            Log.v(TAG, "swapCursor old=" + (mCursor == null ? -1 : mCursor.getCount()) +
173f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                    "; new=" + (newCursor == null ? -1 : newCursor.getCount()));
174f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
175f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
176f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (newCursor == mCursor) {
177f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return null;
178f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
179f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        Cursor oldCursor = mCursor;
180f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mCursor = newCursor;
181f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (newCursor != null) {
182f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mRowIDColumn = newCursor.getColumnIndex(PhotoContract.PhotoViewColumns.URI);
183f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mDataValid = true;
184f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
185f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mRowIDColumn = -1;
186f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mDataValid = false;
187f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
188f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
189f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        setItemPosition();
190f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        notifyDataSetChanged();     // notify the observers about the new cursor
191f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return oldCursor;
192f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
193f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
194f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
195f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Converts the cursor into a CharSequence. Subclasses should override this
196f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * method to convert their results. The default implementation returns an
197f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * empty String for null values or the default String representation of
198f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * the value.
199f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
200f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @param cursor the cursor to convert to a CharSequence
201f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @return a CharSequence representing the value
202f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
203f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    public CharSequence convertToString(Cursor cursor) {
204f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return cursor == null ? "" : cursor.toString();
205f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
206f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
207f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    @Override
208f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    protected String makeFragmentName(int viewId, int index) {
209f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (moveCursorTo(index)) {
210f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return "android:pager:" + viewId + ":" + mCursor.getString(mRowIDColumn).hashCode();
211f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        } else {
212f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return super.makeFragmentName(viewId, index);
213f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
214f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
215f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
216f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
217f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Moves the cursor to the given position
218f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     *
219f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * @return {@code true} if the cursor's position was set. Otherwise, {@code false}.
220f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
221f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private boolean moveCursorTo(int position) {
222f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (mCursor != null && !mCursor.isClosed()) {
223f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return mCursor.moveToPosition(position);
224f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
225f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        return false;
226f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
227f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
228f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
229f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Initialize the adapter.
230f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
231f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void init(Context context, Cursor c) {
232f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        boolean cursorPresent = c != null;
233f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mCursor = c;
234f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mDataValid = cursorPresent;
235f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mContext = context;
236f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mRowIDColumn = cursorPresent
237f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein                ? mCursor.getColumnIndex(PhotoContract.PhotoViewColumns.URI) : -1;
238f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
239f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
240f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    /**
241f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * Sets the {@link #mItemPosition} instance variable with the current mapping of
242f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     * row id to cursor position.
243f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein     */
244f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    private void setItemPosition() {
245f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        if (!mDataValid || mCursor == null || mCursor.isClosed()) {
246f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            mItemPosition = null;
247f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            return;
248f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
249f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
250f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        SparseIntArray itemPosition = new SparseIntArray(mCursor.getCount());
251f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
252f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mCursor.moveToPosition(-1);
253f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        while (mCursor.moveToNext()) {
254f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            final int rowId = mCursor.getString(mRowIDColumn).hashCode();
255f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            final int position = mCursor.getPosition();
256f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein
257f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein            itemPosition.append(rowId, position);
258f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        }
259f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein        mItemPosition = itemPosition;
260f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein    }
261f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein}
262