176921903290ba9229e0238395c35569cbadecb20Flavio Lerda/*
276921903290ba9229e0238395c35569cbadecb20Flavio Lerda * Copyright (C) 2011 The Android Open Source Project
376921903290ba9229e0238395c35569cbadecb20Flavio Lerda *
476921903290ba9229e0238395c35569cbadecb20Flavio Lerda * Licensed under the Apache License, Version 2.0 (the "License");
576921903290ba9229e0238395c35569cbadecb20Flavio Lerda * you may not use this file except in compliance with the License.
676921903290ba9229e0238395c35569cbadecb20Flavio Lerda * You may obtain a copy of the License at
776921903290ba9229e0238395c35569cbadecb20Flavio Lerda *
876921903290ba9229e0238395c35569cbadecb20Flavio Lerda *      http://www.apache.org/licenses/LICENSE-2.0
976921903290ba9229e0238395c35569cbadecb20Flavio Lerda *
1076921903290ba9229e0238395c35569cbadecb20Flavio Lerda * Unless required by applicable law or agreed to in writing, software
1176921903290ba9229e0238395c35569cbadecb20Flavio Lerda * distributed under the License is distributed on an "AS IS" BASIS,
1276921903290ba9229e0238395c35569cbadecb20Flavio Lerda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376921903290ba9229e0238395c35569cbadecb20Flavio Lerda * See the License for the specific language governing permissions and
1476921903290ba9229e0238395c35569cbadecb20Flavio Lerda * limitations under the License.
1576921903290ba9229e0238395c35569cbadecb20Flavio Lerda */
1676921903290ba9229e0238395c35569cbadecb20Flavio Lerda
1776921903290ba9229e0238395c35569cbadecb20Flavio Lerdapackage com.android.contacts.calllog;
1876921903290ba9229e0238395c35569cbadecb20Flavio Lerda
1976921903290ba9229e0238395c35569cbadecb20Flavio Lerdaimport android.database.AbstractCursor;
2006f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjeeimport android.database.ContentObserver;
2176921903290ba9229e0238395c35569cbadecb20Flavio Lerdaimport android.database.Cursor;
2206f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjeeimport android.database.DataSetObserver;
2376921903290ba9229e0238395c35569cbadecb20Flavio Lerda
24e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.common.io.MoreCloseables;
25e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
2676921903290ba9229e0238395c35569cbadecb20Flavio Lerda/**
2776921903290ba9229e0238395c35569cbadecb20Flavio Lerda * Wraps a cursor to add an additional column with the same value for all rows.
2876921903290ba9229e0238395c35569cbadecb20Flavio Lerda * <p>
2976921903290ba9229e0238395c35569cbadecb20Flavio Lerda * The number of rows in the cursor and the set of columns is determined by the cursor being
3076921903290ba9229e0238395c35569cbadecb20Flavio Lerda * wrapped.
3176921903290ba9229e0238395c35569cbadecb20Flavio Lerda */
3276921903290ba9229e0238395c35569cbadecb20Flavio Lerdapublic class ExtendedCursor extends AbstractCursor {
3376921903290ba9229e0238395c35569cbadecb20Flavio Lerda    /** The cursor to wrap. */
3476921903290ba9229e0238395c35569cbadecb20Flavio Lerda    private final Cursor mCursor;
3576921903290ba9229e0238395c35569cbadecb20Flavio Lerda    /** The name of the additional column. */
3676921903290ba9229e0238395c35569cbadecb20Flavio Lerda    private final String mColumnName;
3776921903290ba9229e0238395c35569cbadecb20Flavio Lerda    /** The value to be assigned to the additional column. */
3876921903290ba9229e0238395c35569cbadecb20Flavio Lerda    private final Object mValue;
3976921903290ba9229e0238395c35569cbadecb20Flavio Lerda
4076921903290ba9229e0238395c35569cbadecb20Flavio Lerda    /**
4176921903290ba9229e0238395c35569cbadecb20Flavio Lerda     * Creates a new cursor which extends the given cursor by adding a column with a constant value.
4276921903290ba9229e0238395c35569cbadecb20Flavio Lerda     *
4376921903290ba9229e0238395c35569cbadecb20Flavio Lerda     * @param cursor the cursor to extend
4476921903290ba9229e0238395c35569cbadecb20Flavio Lerda     * @param columnName the name of the additional column
4576921903290ba9229e0238395c35569cbadecb20Flavio Lerda     * @param value the value to be assigned to the additional column
4676921903290ba9229e0238395c35569cbadecb20Flavio Lerda     */
4776921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public ExtendedCursor(Cursor cursor, String columnName, Object value) {
4876921903290ba9229e0238395c35569cbadecb20Flavio Lerda        mCursor = cursor;
4976921903290ba9229e0238395c35569cbadecb20Flavio Lerda        mColumnName = columnName;
5076921903290ba9229e0238395c35569cbadecb20Flavio Lerda        mValue = value;
5176921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
5276921903290ba9229e0238395c35569cbadecb20Flavio Lerda
5376921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
5476921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public int getCount() {
5576921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getCount();
5676921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
5776921903290ba9229e0238395c35569cbadecb20Flavio Lerda
5876921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
5976921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public String[] getColumnNames() {
6076921903290ba9229e0238395c35569cbadecb20Flavio Lerda        String[] columnNames = mCursor.getColumnNames();
6176921903290ba9229e0238395c35569cbadecb20Flavio Lerda        int length = columnNames.length;
6276921903290ba9229e0238395c35569cbadecb20Flavio Lerda        String[] extendedColumnNames = new String[length + 1];
6376921903290ba9229e0238395c35569cbadecb20Flavio Lerda        System.arraycopy(columnNames, 0, extendedColumnNames, 0, length);
6476921903290ba9229e0238395c35569cbadecb20Flavio Lerda        extendedColumnNames[length] = mColumnName;
6576921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return extendedColumnNames;
6676921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
6776921903290ba9229e0238395c35569cbadecb20Flavio Lerda
6876921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
6976921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public String getString(int column) {
7076921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
7176921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return (String) mValue;
7276921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
7376921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getString(column);
7476921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
7576921903290ba9229e0238395c35569cbadecb20Flavio Lerda
7676921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
7776921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public short getShort(int column) {
7876921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
7976921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return (Short) mValue;
8076921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
8176921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getShort(column);
8276921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
8376921903290ba9229e0238395c35569cbadecb20Flavio Lerda
8476921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
8576921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public int getInt(int column) {
8676921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
8776921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return (Integer) mValue;
8876921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
8976921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getInt(column);
9076921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
9176921903290ba9229e0238395c35569cbadecb20Flavio Lerda
9276921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
9376921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public long getLong(int column) {
9476921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
9576921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return (Long) mValue;
9676921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
9776921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getLong(column);
9876921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
9976921903290ba9229e0238395c35569cbadecb20Flavio Lerda
10076921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
10176921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public float getFloat(int column) {
10276921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
10376921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return (Float) mValue;
10476921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
10576921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getFloat(column);
10676921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
10776921903290ba9229e0238395c35569cbadecb20Flavio Lerda
10876921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
10976921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public double getDouble(int column) {
11076921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
11176921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return (Double) mValue;
11276921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
11376921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.getDouble(column);
11476921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
11576921903290ba9229e0238395c35569cbadecb20Flavio Lerda
11676921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
11776921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public boolean isNull(int column) {
11876921903290ba9229e0238395c35569cbadecb20Flavio Lerda        if (column == mCursor.getColumnCount()) {
11976921903290ba9229e0238395c35569cbadecb20Flavio Lerda            return mValue == null;
12076921903290ba9229e0238395c35569cbadecb20Flavio Lerda        }
12176921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.isNull(column);
12276921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
12376921903290ba9229e0238395c35569cbadecb20Flavio Lerda
12476921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
12576921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public boolean onMove(int oldPosition, int newPosition) {
12676921903290ba9229e0238395c35569cbadecb20Flavio Lerda        return mCursor.moveToPosition(newPosition);
12776921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
12876921903290ba9229e0238395c35569cbadecb20Flavio Lerda
12976921903290ba9229e0238395c35569cbadecb20Flavio Lerda    @Override
13076921903290ba9229e0238395c35569cbadecb20Flavio Lerda    public void close() {
13176921903290ba9229e0238395c35569cbadecb20Flavio Lerda        MoreCloseables.closeQuietly(mCursor);
13276921903290ba9229e0238395c35569cbadecb20Flavio Lerda        super.close();
13376921903290ba9229e0238395c35569cbadecb20Flavio Lerda    }
13406f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee
13506f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    @Override
13606f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    public void registerContentObserver(ContentObserver observer) {
13706f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee        mCursor.registerContentObserver(observer);
13806f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    }
13906f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee
14006f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    @Override
14106f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    public void unregisterContentObserver(ContentObserver observer) {
14206f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee        mCursor.unregisterContentObserver(observer);
14306f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    }
14406f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee
14506f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    @Override
14606f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    public void registerDataSetObserver(DataSetObserver observer) {
14706f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee        mCursor.registerDataSetObserver(observer);
14806f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    }
14906f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee
15006f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    @Override
15106f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    public void unregisterDataSetObserver(DataSetObserver observer) {
15206f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee        mCursor.unregisterDataSetObserver(observer);
15306f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee    }
15406f857d40f9666bd633b9680fdf76fe410fa598bDebashish Chatterjee}
155