Merge "AbstractWindowedCursor is not special."
This commit is contained in:
@@ -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()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user