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