131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov/*
231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov *
431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * you may not use this file except in compliance with the License.
631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * You may obtain a copy of the License at
731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov *
831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov *
1031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
1131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
1231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * See the License for the specific language governing permissions and
1431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * limitations under the License
1531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov */
1628f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts;
1731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
1831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikovimport android.database.AbstractCursor;
1931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikovimport android.database.Cursor;
2031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
2131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov/**
2231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Cursor wrapper that reorders rows according to supplied specific position mapping.
2331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov */
2431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikovpublic class ReorderingCursorWrapper extends AbstractCursor {
2531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
2631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    private final Cursor mCursor;
2731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    private final int[] mPositionMap;
2831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
2931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    /**
3031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov     * Constructor.
3131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov     *
3231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov     * @param cursor wrapped cursor
3331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov     * @param positionMap maps wrapper cursor positions to wrapped cursor positions
3431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov     *            so that positionMap[wrapperPosition] == wrappedPosition
3531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov     */
3631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public ReorderingCursorWrapper(Cursor cursor, int[] positionMap) {
3731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        if (cursor.getCount() != positionMap.length) {
3831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov            throw new IllegalArgumentException("Cursor and position map have different sizes.");
3931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        }
4031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
4131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        mCursor = cursor;
4231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        mPositionMap = positionMap;
4331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
4431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
4531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
463d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov    public void close() {
473d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov        super.close();
483d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov        mCursor.close();
493d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov    }
503d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov
513d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov    @Override
5231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public boolean onMove(int oldPosition, int newPosition) {
5331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.moveToPosition(mPositionMap[newPosition]);
5431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
5531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
5631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
5731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public String[] getColumnNames() {
5831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getColumnNames();
5931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
6031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
6131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
6231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public int getCount() {
6331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getCount();
6431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
6531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
6631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
6731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public double getDouble(int column) {
6831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getDouble(column);
6931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
7031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
7131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
7231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public float getFloat(int column) {
7331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getFloat(column);
7431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
7531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
7631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
7731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public int getInt(int column) {
7831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getInt(column);
7931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
8031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
8131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
8231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public long getLong(int column) {
8331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getLong(column);
8431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
8531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
8631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
8731b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public short getShort(int column) {
8831b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getShort(column);
8931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
9031b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
9131b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
9231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public String getString(int column) {
9331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.getString(column);
9431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
9531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov
9631b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    @Override
971a40dbed84a2a2f397d52c64099469ed3557aabeVasu Nori    public int getType(int column) {
981a40dbed84a2a2f397d52c64099469ed3557aabeVasu Nori        return mCursor.getType(column);
991a40dbed84a2a2f397d52c64099469ed3557aabeVasu Nori    }
1001a40dbed84a2a2f397d52c64099469ed3557aabeVasu Nori
1011a40dbed84a2a2f397d52c64099469ed3557aabeVasu Nori    @Override
10231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    public boolean isNull(int column) {
10331b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov        return mCursor.isNull(column);
10431b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov    }
10531b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov}