From 630f6b1cf8a671890f7bb590f5219d8b63614cd9 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Tue, 30 Aug 2011 18:02:37 -0700 Subject: [PATCH] Add AbstractCursor.setExtras() This allows providers to return SQLiteCursor with a bundle, without wrapping it in a CursorWrapper, which has performance penalty on cross-process queries. Bug 5220669 Change-Id: I46b9dfb3d8e01e9caf080bb24acfd97551441e25 --- .../java/android/database/AbstractCursor.java | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/core/java/android/database/AbstractCursor.java b/core/java/android/database/AbstractCursor.java index b6487bd2f7f68..5fe42dbc32825 100644 --- a/core/java/android/database/AbstractCursor.java +++ b/core/java/android/database/AbstractCursor.java @@ -36,6 +36,8 @@ public abstract class AbstractCursor implements CrossProcessCursor { DataSetObservable mDataSetObservable = new DataSetObservable(); ContentObservable mContentObservable = new ContentObservable(); + Bundle mExtras = Bundle.EMPTY; + /* -------------------------------------------------------- */ /* These need to be implemented by subclasses */ abstract public int getCount(); @@ -71,11 +73,11 @@ public abstract class AbstractCursor implements CrossProcessCursor { public int getColumnCount() { return getColumnNames().length; } - + public void deactivate() { deactivateInternal(); } - + /** * @hide */ @@ -99,7 +101,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { public boolean isClosed() { return mClosed; } - + public void close() { mClosed = true; mContentObservable.unregisterAll(); @@ -120,7 +122,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { return true; } - + public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) { // Default implementation, uses getString String result = getString(columnIndex); @@ -136,7 +138,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { buffer.sizeCopied = 0; } } - + /* -------------------------------------------------------- */ /* Implementation */ public AbstractCursor() { @@ -181,7 +183,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { return result; } - + /** * Copy data from cursor to CursorWindow * @param position start position of data @@ -199,7 +201,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { window.setStartPosition(position); int columnNum = getColumnCount(); window.setNumColumns(columnNum); - while (moveToNext() && window.allocRow()) { + while (moveToNext() && window.allocRow()) { for (int i = 0; i < columnNum; i++) { String field = getString(i); if (field != null) { @@ -215,7 +217,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { } } } - + mPos = oldpos; } catch (IllegalStateException e){ // simply ignore it @@ -314,7 +316,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { mContentObservable.unregisterObserver(observer); } } - + /** * This is hidden until the data set change model has been re-evaluated. * @hide @@ -322,14 +324,14 @@ public abstract class AbstractCursor implements CrossProcessCursor { protected void notifyDataSetChange() { mDataSetObservable.notifyChanged(); } - + /** * This is hidden until the data set change model has been re-evaluated. * @hide */ protected DataSetObservable getDataSetObservable() { return mDataSetObservable; - + } public void registerDataSetObserver(DataSetObserver observer) { @@ -383,8 +385,19 @@ public abstract class AbstractCursor implements CrossProcessCursor { return false; } + /** + * Sets a {@link Bundle} that will be returned by {@link #getExtras()}. null will + * be converted into {@link Bundle#EMPTY}. + * + * @param extras {@link Bundle} to set. + * @hide + */ + public void setExtras(Bundle extras) { + mExtras = (extras == null) ? Bundle.EMPTY : extras; + } + public Bundle getExtras() { - return Bundle.EMPTY; + return mExtras; } public Bundle respond(Bundle extras) {