Merge "AbstractWindowedCursor is not special."

This commit is contained in:
Jeff Brown
2011-10-14 21:06:15 -07:00
committed by Android (Google) Code Review

View File

@@ -25,9 +25,9 @@ import android.util.Log;
/** /**
* Wraps a BulkCursor around an existing Cursor making it remotable. * Wraps a BulkCursor around an existing Cursor making it remotable.
* <p> * <p>
* If the wrapped cursor is a {@link AbstractWindowedCursor} then it owns * If the wrapped cursor returns non-null from {@link CrossProcessCursor#getWindow}
* the cursor window. Otherwise, the adaptor takes ownership of the * then it is assumed to own the window. Otherwise, the adaptor provides a
* cursor itself and ensures it gets closed as needed during deactivation * window to be filled and ensures it gets closed as needed during deactivation
* and requeries. * and requeries.
* </p> * </p>
* *
@@ -48,12 +48,11 @@ public final class CursorToBulkCursorAdaptor extends BulkCursorNative
private CrossProcessCursor mCursor; private CrossProcessCursor mCursor;
/** /**
* The cursor window used by the cross process cursor. * The cursor window that was filled by the cross process cursor in the
* This field is always null for abstract windowed cursors since they are responsible * case where the cursor does not support getWindow.
* for managing the lifetime of their window. * This field is only ever non-null when the window has actually be filled.
*/ */
private CursorWindow mWindowForNonWindowedCursor; private CursorWindow mFilledWindow;
private boolean mWindowForNonWindowedCursorWasFilled;
private static final class ContentObserverProxy extends ContentObserver { private static final class ContentObserverProxy extends ContentObserver {
protected IContentObserver mRemote; protected IContentObserver mRemote;
@@ -103,11 +102,10 @@ public final class CursorToBulkCursorAdaptor extends BulkCursorNative
} }
} }
private void closeWindowForNonWindowedCursorLocked() { private void closeFilledWindowLocked() {
if (mWindowForNonWindowedCursor != null) { if (mFilledWindow != null) {
mWindowForNonWindowedCursor.close(); mFilledWindow.close();
mWindowForNonWindowedCursor = null; mFilledWindow = null;
mWindowForNonWindowedCursorWasFilled = false;
} }
} }
@@ -118,7 +116,7 @@ public final class CursorToBulkCursorAdaptor extends BulkCursorNative
mCursor = null; mCursor = null;
} }
closeWindowForNonWindowedCursorLocked(); closeFilledWindowLocked();
} }
private void throwIfCursorIsClosed() { private void throwIfCursorIsClosed() {
@@ -139,30 +137,24 @@ public final class CursorToBulkCursorAdaptor extends BulkCursorNative
synchronized (mLock) { synchronized (mLock) {
throwIfCursorIsClosed(); throwIfCursorIsClosed();
CursorWindow window; if (!mCursor.moveToPosition(startPos)) {
if (mCursor instanceof AbstractWindowedCursor) { closeFilledWindowLocked();
AbstractWindowedCursor windowedCursor = (AbstractWindowedCursor)mCursor; return null;
window = windowedCursor.getWindow(); }
if (window == null) {
window = new CursorWindow(mProviderName);
windowedCursor.setWindow(window);
}
mCursor.moveToPosition(startPos); CursorWindow window = mCursor.getWindow();
if (window != null) {
closeFilledWindowLocked();
} else { } else {
window = mWindowForNonWindowedCursor; window = mFilledWindow;
if (window == null) { if (window == null) {
window = new CursorWindow(mProviderName); mFilledWindow = new CursorWindow(mProviderName);
mWindowForNonWindowedCursor = window; window = mFilledWindow;
} mCursor.fillWindow(startPos, window);
} else if (startPos < window.getStartPosition()
mCursor.moveToPosition(startPos); || startPos >= window.getStartPosition() + window.getNumRows()) {
window.clear();
if (!mWindowForNonWindowedCursorWasFilled
|| startPos < window.getStartPosition()
|| startPos >= window.getStartPosition() + window.getNumRows()) {
mCursor.fillWindow(startPos, window); mCursor.fillWindow(startPos, window);
mWindowForNonWindowedCursorWasFilled = true;
} }
} }
@@ -211,7 +203,7 @@ public final class CursorToBulkCursorAdaptor extends BulkCursorNative
mCursor.deactivate(); mCursor.deactivate();
} }
closeWindowForNonWindowedCursorLocked(); closeFilledWindowLocked();
} }
} }
@@ -227,7 +219,7 @@ public final class CursorToBulkCursorAdaptor extends BulkCursorNative
synchronized (mLock) { synchronized (mLock) {
throwIfCursorIsClosed(); throwIfCursorIsClosed();
closeWindowForNonWindowedCursorLocked(); closeFilledWindowLocked();
try { try {
if (!mCursor.requery()) { if (!mCursor.requery()) {