187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen/*
287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Copyright (C) 2007 The Android Open Source Project
387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen *
487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * you may not use this file except in compliance with the License.
687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * You may obtain a copy of the License at
787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen *
887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen *
1087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Unless required by applicable law or agreed to in writing, software
1187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
1287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * See the License for the specific language governing permissions and
1487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * limitations under the License.
1587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen */
1687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
1787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenpackage com.android.music;
1887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
1987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.database.AbstractCursor;
2087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.database.Cursor;
2187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.database.DataSetObserver;
2287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.util.Log;
2387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
2487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen/**
2587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * A variant of MergeCursor that sorts the cursors being merged. If decent
2687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * performance is ever obtained, it can be put back under android.database.
2787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen */
2887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenpublic class SortCursor extends AbstractCursor
2987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen{
3087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private static final String TAG = "SortCursor";
3187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private Cursor mCursor; // updated in onMove
3287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private Cursor[] mCursors;
3387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private int [] mSortColumns;
3487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private final int ROWCACHESIZE = 64;
3587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private int mRowNumCache[] = new int[ROWCACHESIZE];
3687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private int mCursorCache[] = new int[ROWCACHESIZE];
3787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private int mCurRowNumCache[][];
3887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private int mLastCacheHit = -1;
3987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
4087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    private DataSetObserver mObserver = new DataSetObserver() {
4187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
4287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        @Override
4387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        public void onChanged() {
4487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            // Reset our position so the optimizations in move-related code
4587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            // don't screw us over
4687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mPos = -1;
4787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
4887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
4987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        @Override
5087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        public void onInvalidated() {
5187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mPos = -1;
5287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
5387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    };
5487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
5587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public SortCursor(Cursor[] cursors, String sortcolumn)
5687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
5787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mCursors = cursors;
5887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
5987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
6087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mSortColumns = new int[length];
6187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
6287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] == null) continue;
6387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
6487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            // Register ourself as a data set observer
6587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mCursors[i].registerDataSetObserver(mObserver);
6687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
6787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mCursors[i].moveToFirst();
6887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
6987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            // We don't catch the exception
7087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mSortColumns[i] = mCursors[i].getColumnIndexOrThrow(sortcolumn);
7187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
7287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mCursor = null;
7387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        String smallest = "";
7487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int j = 0 ; j < length; j++) {
7587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[j] == null || mCursors[j].isAfterLast())
7687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                continue;
7787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            String current = mCursors[j].getString(mSortColumns[j]);
7887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursor == null || current.compareToIgnoreCase(smallest) < 0) {
7987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                smallest = current;
8087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCursor = mCursors[j];
8187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
8287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
8387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
8487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = mRowNumCache.length - 1; i >= 0; i--) {
8587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mRowNumCache[i] = -2;
8687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
8787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mCurRowNumCache = new int[ROWCACHESIZE][length];
8887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
8987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
9087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
9187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public int getCount()
9287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
9387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int count = 0;
9487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
9587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
9687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] != null) {
9787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                count += mCursors[i].getCount();
9887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
9987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
10087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return count;
10187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
10287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
10387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
10487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public boolean onMove(int oldPosition, int newPosition)
10587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
10687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        if (oldPosition == newPosition)
10787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            return true;
10887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
10987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        /* Find the right cursor
11087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen         * Because the client of this cursor (the listadapter/view) tends
11187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen         * to jump around in the cursor somewhat, a simple cache strategy
11287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen         * is used to avoid having to search all cursors from the start.
11387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen         * TODO: investigate strategies for optimizing random access and
11487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen         * reverse-order access.
11587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen         */
11687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
11787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int cache_entry = newPosition % ROWCACHESIZE;
11887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
11987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        if (mRowNumCache[cache_entry] == newPosition) {
12087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            int which = mCursorCache[cache_entry];
12187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mCursor = mCursors[which];
12287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursor == null) {
12387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                Log.w(TAG, "onMove: cache results in a null cursor.");
12487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                return false;
12587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
12687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mCursor.moveToPosition(mCurRowNumCache[cache_entry][which]);
12787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mLastCacheHit = cache_entry;
12887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            return true;
12987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
13087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
13187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mCursor = null;
13287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
13387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
13487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        if (mLastCacheHit >= 0) {
13587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            for (int i = 0; i < length; i++) {
13687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                if (mCursors[i] == null) continue;
13787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCursors[i].moveToPosition(mCurRowNumCache[mLastCacheHit][i]);
13887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
13987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
14087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
14187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        if (newPosition < oldPosition || oldPosition == -1) {
14287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            for (int i = 0 ; i < length; i++) {
14387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                if (mCursors[i] == null) continue;
14487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCursors[i].moveToFirst();
14587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
14687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            oldPosition = 0;
14787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
14887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        if (oldPosition < 0) {
14987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            oldPosition = 0;
15087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
15187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
15287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        // search forward to the new position
15387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int smallestIdx = -1;
15487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for(int i = oldPosition; i <= newPosition; i++) {
15587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            String smallest = "";
15687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            smallestIdx = -1;
15787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            for (int j = 0 ; j < length; j++) {
15887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                if (mCursors[j] == null || mCursors[j].isAfterLast()) {
15987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                    continue;
16087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                }
16187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                String current = mCursors[j].getString(mSortColumns[j]);
16287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                if (smallestIdx < 0 || current.compareToIgnoreCase(smallest) < 0) {
16387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                    smallest = current;
16487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                    smallestIdx = j;
16587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                }
16687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
16787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (i == newPosition) break;
16887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[smallestIdx] != null) {
16987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCursors[smallestIdx].moveToNext();
17087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
17187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
17287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mCursor = mCursors[smallestIdx];
17387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mRowNumCache[cache_entry] = newPosition;
17487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mCursorCache[cache_entry] = smallestIdx;
17587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0; i < length; i++) {
17687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] != null) {
17787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCurRowNumCache[cache_entry][i] = mCursors[i].getPosition();
17887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
17987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
18087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        mLastCacheHit = -1;
18187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return true;
18287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
18387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
18487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
18587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public String getString(int column)
18687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
18787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getString(column);
18887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
18987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
19087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
19187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public short getShort(int column)
19287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
19387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getShort(column);
19487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
19587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
19687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
19787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public int getInt(int column)
19887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
19987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getInt(column);
20087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
20187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
20287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
20387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public long getLong(int column)
20487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
20587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getLong(column);
20687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
20787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
20887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
20987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public float getFloat(int column)
21087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
21187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getFloat(column);
21287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
21387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
21487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
21587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public double getDouble(int column)
21687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
21787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getDouble(column);
21887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
21987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
22087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
221f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori    public int getType(int column) {
222f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori        return mCursor.getType(column);
223f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori    }
224f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori
225f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori    @Override
22687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public boolean isNull(int column)
22787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
22887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.isNull(column);
22987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
23087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
23187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
23287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public byte[] getBlob(int column)
23387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
23487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return mCursor.getBlob(column);
23587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
23687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
23787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
23887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public String[] getColumnNames()
23987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
24087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        if (mCursor != null) {
24187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            return mCursor.getColumnNames();
24287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        } else {
24387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            // All of the cursors may be empty, but they can still return
24487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            // this information.
24587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            int length = mCursors.length;
24687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            for (int i = 0 ; i < length ; i++) {
24787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                if (mCursors[i] != null) {
24887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                    return mCursors[i].getColumnNames();
24987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                }
25087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
25187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            throw new IllegalStateException("No cursor that can return names");
25287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
25387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
25487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
25587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
25687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public void deactivate()
25787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
25887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
25987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
26087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] == null) continue;
26187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mCursors[i].deactivate();
26287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
26387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
26487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
26587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
26687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public void close() {
26787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
26887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
26987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] == null) continue;
27087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            mCursors[i].close();
27187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
27287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
27387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
27487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
27587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public void registerDataSetObserver(DataSetObserver observer) {
27687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
27787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
27887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] != null) {
27987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCursors[i].registerDataSetObserver(observer);
28087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
28187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
28287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
28387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
28487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
28587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public void unregisterDataSetObserver(DataSetObserver observer) {
28687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
28787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
28887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] != null) {
28987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                mCursors[i].unregisterDataSetObserver(observer);
29087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
29187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
29287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
29387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
29487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    @Override
29587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    public boolean requery()
29687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    {
29787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        int length = mCursors.length;
29887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        for (int i = 0 ; i < length ; i++) {
29987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i] == null) continue;
30087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
30187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            if (mCursors[i].requery() == false) {
30287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen                return false;
30387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen            }
30487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        }
30587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen
30687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen        return true;
30787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen    }
30887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen}
309