Loading core/java/android/content/ContentProviderNative.java +8 −16 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.content; import android.content.res.AssetFileDescriptor; import android.database.BulkCursorDescriptor; import android.database.BulkCursorNative; import android.database.BulkCursorToCursorAdaptor; import android.database.Cursor; Loading Loading @@ -113,20 +114,14 @@ abstract public class ContentProviderNative extends Binder implements IContentPr if (cursor != null) { CursorToBulkCursorAdaptor adaptor = new CursorToBulkCursorAdaptor( cursor, observer, getProviderName()); final IBinder binder = adaptor.asBinder(); final int count = adaptor.count(); final int index = BulkCursorToCursorAdaptor.findRowIdColumnIndex( adaptor.getColumnNames()); final boolean wantsAllOnMoveCalls = adaptor.getWantsAllOnMoveCalls(); BulkCursorDescriptor d = adaptor.getBulkCursorDescriptor(); reply.writeNoException(); reply.writeStrongBinder(binder); reply.writeInt(count); reply.writeInt(index); reply.writeInt(wantsAllOnMoveCalls ? 1 : 0); reply.writeInt(1); d.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeNoException(); reply.writeStrongBinder(null); reply.writeInt(0); } return true; Loading Loading @@ -369,12 +364,9 @@ final class ContentProviderProxy implements IContentProvider DatabaseUtils.readExceptionFromParcel(reply); IBulkCursor bulkCursor = BulkCursorNative.asInterface(reply.readStrongBinder()); if (bulkCursor != null) { int rowCount = reply.readInt(); int idColumnPosition = reply.readInt(); boolean wantsAllOnMoveCalls = reply.readInt() != 0; adaptor.initialize(bulkCursor, rowCount, idColumnPosition, wantsAllOnMoveCalls); if (reply.readInt() != 0) { BulkCursorDescriptor d = BulkCursorDescriptor.CREATOR.createFromParcel(reply); adaptor.initialize(d); } else { adaptor.close(); adaptor = null; Loading core/java/android/database/AbstractCursor.java +32 −29 Original line number Diff line number Diff line Loading @@ -33,10 +33,39 @@ import java.util.Map; public abstract class AbstractCursor implements CrossProcessCursor { private static final String TAG = "Cursor"; DataSetObservable mDataSetObservable = new DataSetObservable(); ContentObservable mContentObservable = new ContentObservable(); /** * @deprecated This is never updated by this class and should not be used */ @Deprecated protected HashMap<Long, Map<String, Object>> mUpdatedRows; protected int mPos; /** * This must be set to the index of the row ID column by any * subclass that wishes to support updates. */ protected int mRowIdColumnIndex; /** * If {@link #mRowIdColumnIndex} is not -1 this contains contains the value of * the column at {@link #mRowIdColumnIndex} for the current row this cursor is * pointing at. */ protected Long mCurrentRowID; protected boolean mClosed; protected ContentResolver mContentResolver; private Uri mNotifyUri; private final Object mSelfObserverLock = new Object(); private ContentObserver mSelfObserver; private boolean mSelfObserverRegistered; Bundle mExtras = Bundle.EMPTY; private DataSetObservable mDataSetObservable = new DataSetObservable(); private ContentObservable mContentObservable = new ContentObservable(); private Bundle mExtras = Bundle.EMPTY; /* -------------------------------------------------------- */ /* These need to be implemented by subclasses */ Loading Loading @@ -415,30 +444,4 @@ public abstract class AbstractCursor implements CrossProcessCursor { } } } /** * @deprecated This is never updated by this class and should not be used */ @Deprecated protected HashMap<Long, Map<String, Object>> mUpdatedRows; /** * This must be set to the index of the row ID column by any * subclass that wishes to support updates. */ protected int mRowIdColumnIndex; protected int mPos; /** * If {@link #mRowIdColumnIndex} is not -1 this contains contains the value of * the column at {@link #mRowIdColumnIndex} for the current row this cursor is * pointing at. */ protected Long mCurrentRowID; protected ContentResolver mContentResolver; protected boolean mClosed = false; private Uri mNotifyUri; private ContentObserver mSelfObserver; final private Object mSelfObserverLock = new Object(); private boolean mSelfObserverRegistered; } core/java/android/database/BulkCursorDescriptor.java 0 → 100644 +78 −0 Original line number Diff line number Diff line /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.database; import android.os.Parcel; import android.os.Parcelable; /** * Describes the properties of a {@link CursorToBulkCursorAdaptor} that are * needed to initialize its {@link BulkCursorToCursorAdaptor} counterpart on the client's end. * * {@hide} */ public final class BulkCursorDescriptor implements Parcelable { public static final Parcelable.Creator<BulkCursorDescriptor> CREATOR = new Parcelable.Creator<BulkCursorDescriptor>() { @Override public BulkCursorDescriptor createFromParcel(Parcel in) { BulkCursorDescriptor d = new BulkCursorDescriptor(); d.readFromParcel(in); return d; } @Override public BulkCursorDescriptor[] newArray(int size) { return new BulkCursorDescriptor[size]; } }; public IBulkCursor cursor; public String[] columnNames; public boolean wantsAllOnMoveCalls; public int count; public CursorWindow window; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeStrongBinder(cursor.asBinder()); out.writeStringArray(columnNames); out.writeInt(wantsAllOnMoveCalls ? 1 : 0); out.writeInt(count); if (window != null) { out.writeInt(1); window.writeToParcel(out, flags); } else { out.writeInt(0); } } public void readFromParcel(Parcel in) { cursor = BulkCursorNative.asInterface(in.readStrongBinder()); columnNames = in.readStringArray(); wantsAllOnMoveCalls = in.readInt() != 0; count = in.readInt(); if (in.readInt() != 0) { window = CursorWindow.CREATOR.createFromParcel(in); } } } core/java/android/database/BulkCursorNative.java +0 −91 Original line number Diff line number Diff line Loading @@ -72,26 +72,6 @@ public abstract class BulkCursorNative extends Binder implements IBulkCursor return true; } case COUNT_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); int count = count(); reply.writeNoException(); reply.writeInt(count); return true; } case GET_COLUMN_NAMES_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); String[] columnNames = getColumnNames(); reply.writeNoException(); reply.writeInt(columnNames.length); int length = columnNames.length; for (int i = 0; i < length; i++) { reply.writeString(columnNames[i]); } return true; } case DEACTIVATE_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); deactivate(); Loading Loading @@ -125,14 +105,6 @@ public abstract class BulkCursorNative extends Binder implements IBulkCursor return true; } case WANTS_ON_MOVE_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); boolean result = getWantsAllOnMoveCalls(); reply.writeNoException(); reply.writeInt(result ? 1 : 0); return true; } case GET_EXTRAS_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); Bundle extras = getExtras(); Loading Loading @@ -217,52 +189,6 @@ final class BulkCursorProxy implements IBulkCursor { } } public int count() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IBulkCursor.descriptor); boolean result = mRemote.transact(COUNT_TRANSACTION, data, reply, 0); DatabaseUtils.readExceptionFromParcel(reply); int count; if (result == false) { count = -1; } else { count = reply.readInt(); } return count; } finally { data.recycle(); reply.recycle(); } } public String[] getColumnNames() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IBulkCursor.descriptor); mRemote.transact(GET_COLUMN_NAMES_TRANSACTION, data, reply, 0); DatabaseUtils.readExceptionFromParcel(reply); String[] columnNames = null; int numColumns = reply.readInt(); columnNames = new String[numColumns]; for (int i = 0; i < numColumns; i++) { columnNames[i] = reply.readString(); } return columnNames; } finally { data.recycle(); reply.recycle(); } } public void deactivate() throws RemoteException { Parcel data = Parcel.obtain(); Loading Loading @@ -317,23 +243,6 @@ final class BulkCursorProxy implements IBulkCursor { } } public boolean getWantsAllOnMoveCalls() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IBulkCursor.descriptor); mRemote.transact(WANTS_ON_MOVE_TRANSACTION, data, reply, 0); DatabaseUtils.readExceptionFromParcel(reply); int result = reply.readInt(); return result != 0; } finally { data.recycle(); reply.recycle(); } } public Bundle getExtras() throws RemoteException { if (mExtras == null) { Parcel data = Parcel.obtain(); Loading core/java/android/database/BulkCursorToCursorAdaptor.java +9 −28 Original line number Diff line number Diff line Loading @@ -30,35 +30,24 @@ public final class BulkCursorToCursorAdaptor extends AbstractWindowedCursor { private SelfContentObserver mObserverBridge = new SelfContentObserver(this); private IBulkCursor mBulkCursor; private int mCount; private String[] mColumns; private boolean mWantsAllOnMoveCalls; private int mCount; /** * Initializes the adaptor. * Must be called before first use. */ public void initialize(IBulkCursor bulkCursor, int count, int idIndex, boolean wantsAllOnMoveCalls) { mBulkCursor = bulkCursor; mColumns = null; // lazily retrieved mCount = count; mRowIdColumnIndex = idIndex; mWantsAllOnMoveCalls = wantsAllOnMoveCalls; } /** * Returns column index of "_id" column, or -1 if not found. */ public static int findRowIdColumnIndex(String[] columnNames) { int length = columnNames.length; for (int i = 0; i < length; i++) { if (columnNames[i].equals("_id")) { return i; public void initialize(BulkCursorDescriptor d) { mBulkCursor = d.cursor; mColumns = d.columnNames; mRowIdColumnIndex = DatabaseUtils.findRowIdColumnIndex(mColumns); mWantsAllOnMoveCalls = d.wantsAllOnMoveCalls; mCount = d.count; if (d.window != null) { setWindow(d.window); } } return -1; } /** * Gets a SelfDataChangeOberserver that can be sent to a remote Loading Loading @@ -169,14 +158,6 @@ public final class BulkCursorToCursorAdaptor extends AbstractWindowedCursor { public String[] getColumnNames() { throwIfCursorIsClosed(); if (mColumns == null) { try { mColumns = mBulkCursor.getColumnNames(); } catch (RemoteException ex) { Log.e(TAG, "Unable to fetch column names because the remote process is dead"); return null; } } return mColumns; } Loading Loading
core/java/android/content/ContentProviderNative.java +8 −16 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.content; import android.content.res.AssetFileDescriptor; import android.database.BulkCursorDescriptor; import android.database.BulkCursorNative; import android.database.BulkCursorToCursorAdaptor; import android.database.Cursor; Loading Loading @@ -113,20 +114,14 @@ abstract public class ContentProviderNative extends Binder implements IContentPr if (cursor != null) { CursorToBulkCursorAdaptor adaptor = new CursorToBulkCursorAdaptor( cursor, observer, getProviderName()); final IBinder binder = adaptor.asBinder(); final int count = adaptor.count(); final int index = BulkCursorToCursorAdaptor.findRowIdColumnIndex( adaptor.getColumnNames()); final boolean wantsAllOnMoveCalls = adaptor.getWantsAllOnMoveCalls(); BulkCursorDescriptor d = adaptor.getBulkCursorDescriptor(); reply.writeNoException(); reply.writeStrongBinder(binder); reply.writeInt(count); reply.writeInt(index); reply.writeInt(wantsAllOnMoveCalls ? 1 : 0); reply.writeInt(1); d.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { reply.writeNoException(); reply.writeStrongBinder(null); reply.writeInt(0); } return true; Loading Loading @@ -369,12 +364,9 @@ final class ContentProviderProxy implements IContentProvider DatabaseUtils.readExceptionFromParcel(reply); IBulkCursor bulkCursor = BulkCursorNative.asInterface(reply.readStrongBinder()); if (bulkCursor != null) { int rowCount = reply.readInt(); int idColumnPosition = reply.readInt(); boolean wantsAllOnMoveCalls = reply.readInt() != 0; adaptor.initialize(bulkCursor, rowCount, idColumnPosition, wantsAllOnMoveCalls); if (reply.readInt() != 0) { BulkCursorDescriptor d = BulkCursorDescriptor.CREATOR.createFromParcel(reply); adaptor.initialize(d); } else { adaptor.close(); adaptor = null; Loading
core/java/android/database/AbstractCursor.java +32 −29 Original line number Diff line number Diff line Loading @@ -33,10 +33,39 @@ import java.util.Map; public abstract class AbstractCursor implements CrossProcessCursor { private static final String TAG = "Cursor"; DataSetObservable mDataSetObservable = new DataSetObservable(); ContentObservable mContentObservable = new ContentObservable(); /** * @deprecated This is never updated by this class and should not be used */ @Deprecated protected HashMap<Long, Map<String, Object>> mUpdatedRows; protected int mPos; /** * This must be set to the index of the row ID column by any * subclass that wishes to support updates. */ protected int mRowIdColumnIndex; /** * If {@link #mRowIdColumnIndex} is not -1 this contains contains the value of * the column at {@link #mRowIdColumnIndex} for the current row this cursor is * pointing at. */ protected Long mCurrentRowID; protected boolean mClosed; protected ContentResolver mContentResolver; private Uri mNotifyUri; private final Object mSelfObserverLock = new Object(); private ContentObserver mSelfObserver; private boolean mSelfObserverRegistered; Bundle mExtras = Bundle.EMPTY; private DataSetObservable mDataSetObservable = new DataSetObservable(); private ContentObservable mContentObservable = new ContentObservable(); private Bundle mExtras = Bundle.EMPTY; /* -------------------------------------------------------- */ /* These need to be implemented by subclasses */ Loading Loading @@ -415,30 +444,4 @@ public abstract class AbstractCursor implements CrossProcessCursor { } } } /** * @deprecated This is never updated by this class and should not be used */ @Deprecated protected HashMap<Long, Map<String, Object>> mUpdatedRows; /** * This must be set to the index of the row ID column by any * subclass that wishes to support updates. */ protected int mRowIdColumnIndex; protected int mPos; /** * If {@link #mRowIdColumnIndex} is not -1 this contains contains the value of * the column at {@link #mRowIdColumnIndex} for the current row this cursor is * pointing at. */ protected Long mCurrentRowID; protected ContentResolver mContentResolver; protected boolean mClosed = false; private Uri mNotifyUri; private ContentObserver mSelfObserver; final private Object mSelfObserverLock = new Object(); private boolean mSelfObserverRegistered; }
core/java/android/database/BulkCursorDescriptor.java 0 → 100644 +78 −0 Original line number Diff line number Diff line /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.database; import android.os.Parcel; import android.os.Parcelable; /** * Describes the properties of a {@link CursorToBulkCursorAdaptor} that are * needed to initialize its {@link BulkCursorToCursorAdaptor} counterpart on the client's end. * * {@hide} */ public final class BulkCursorDescriptor implements Parcelable { public static final Parcelable.Creator<BulkCursorDescriptor> CREATOR = new Parcelable.Creator<BulkCursorDescriptor>() { @Override public BulkCursorDescriptor createFromParcel(Parcel in) { BulkCursorDescriptor d = new BulkCursorDescriptor(); d.readFromParcel(in); return d; } @Override public BulkCursorDescriptor[] newArray(int size) { return new BulkCursorDescriptor[size]; } }; public IBulkCursor cursor; public String[] columnNames; public boolean wantsAllOnMoveCalls; public int count; public CursorWindow window; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeStrongBinder(cursor.asBinder()); out.writeStringArray(columnNames); out.writeInt(wantsAllOnMoveCalls ? 1 : 0); out.writeInt(count); if (window != null) { out.writeInt(1); window.writeToParcel(out, flags); } else { out.writeInt(0); } } public void readFromParcel(Parcel in) { cursor = BulkCursorNative.asInterface(in.readStrongBinder()); columnNames = in.readStringArray(); wantsAllOnMoveCalls = in.readInt() != 0; count = in.readInt(); if (in.readInt() != 0) { window = CursorWindow.CREATOR.createFromParcel(in); } } }
core/java/android/database/BulkCursorNative.java +0 −91 Original line number Diff line number Diff line Loading @@ -72,26 +72,6 @@ public abstract class BulkCursorNative extends Binder implements IBulkCursor return true; } case COUNT_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); int count = count(); reply.writeNoException(); reply.writeInt(count); return true; } case GET_COLUMN_NAMES_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); String[] columnNames = getColumnNames(); reply.writeNoException(); reply.writeInt(columnNames.length); int length = columnNames.length; for (int i = 0; i < length; i++) { reply.writeString(columnNames[i]); } return true; } case DEACTIVATE_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); deactivate(); Loading Loading @@ -125,14 +105,6 @@ public abstract class BulkCursorNative extends Binder implements IBulkCursor return true; } case WANTS_ON_MOVE_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); boolean result = getWantsAllOnMoveCalls(); reply.writeNoException(); reply.writeInt(result ? 1 : 0); return true; } case GET_EXTRAS_TRANSACTION: { data.enforceInterface(IBulkCursor.descriptor); Bundle extras = getExtras(); Loading Loading @@ -217,52 +189,6 @@ final class BulkCursorProxy implements IBulkCursor { } } public int count() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IBulkCursor.descriptor); boolean result = mRemote.transact(COUNT_TRANSACTION, data, reply, 0); DatabaseUtils.readExceptionFromParcel(reply); int count; if (result == false) { count = -1; } else { count = reply.readInt(); } return count; } finally { data.recycle(); reply.recycle(); } } public String[] getColumnNames() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IBulkCursor.descriptor); mRemote.transact(GET_COLUMN_NAMES_TRANSACTION, data, reply, 0); DatabaseUtils.readExceptionFromParcel(reply); String[] columnNames = null; int numColumns = reply.readInt(); columnNames = new String[numColumns]; for (int i = 0; i < numColumns; i++) { columnNames[i] = reply.readString(); } return columnNames; } finally { data.recycle(); reply.recycle(); } } public void deactivate() throws RemoteException { Parcel data = Parcel.obtain(); Loading Loading @@ -317,23 +243,6 @@ final class BulkCursorProxy implements IBulkCursor { } } public boolean getWantsAllOnMoveCalls() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IBulkCursor.descriptor); mRemote.transact(WANTS_ON_MOVE_TRANSACTION, data, reply, 0); DatabaseUtils.readExceptionFromParcel(reply); int result = reply.readInt(); return result != 0; } finally { data.recycle(); reply.recycle(); } } public Bundle getExtras() throws RemoteException { if (mExtras == null) { Parcel data = Parcel.obtain(); Loading
core/java/android/database/BulkCursorToCursorAdaptor.java +9 −28 Original line number Diff line number Diff line Loading @@ -30,35 +30,24 @@ public final class BulkCursorToCursorAdaptor extends AbstractWindowedCursor { private SelfContentObserver mObserverBridge = new SelfContentObserver(this); private IBulkCursor mBulkCursor; private int mCount; private String[] mColumns; private boolean mWantsAllOnMoveCalls; private int mCount; /** * Initializes the adaptor. * Must be called before first use. */ public void initialize(IBulkCursor bulkCursor, int count, int idIndex, boolean wantsAllOnMoveCalls) { mBulkCursor = bulkCursor; mColumns = null; // lazily retrieved mCount = count; mRowIdColumnIndex = idIndex; mWantsAllOnMoveCalls = wantsAllOnMoveCalls; } /** * Returns column index of "_id" column, or -1 if not found. */ public static int findRowIdColumnIndex(String[] columnNames) { int length = columnNames.length; for (int i = 0; i < length; i++) { if (columnNames[i].equals("_id")) { return i; public void initialize(BulkCursorDescriptor d) { mBulkCursor = d.cursor; mColumns = d.columnNames; mRowIdColumnIndex = DatabaseUtils.findRowIdColumnIndex(mColumns); mWantsAllOnMoveCalls = d.wantsAllOnMoveCalls; mCount = d.count; if (d.window != null) { setWindow(d.window); } } return -1; } /** * Gets a SelfDataChangeOberserver that can be sent to a remote Loading Loading @@ -169,14 +158,6 @@ public final class BulkCursorToCursorAdaptor extends AbstractWindowedCursor { public String[] getColumnNames() { throwIfCursorIsClosed(); if (mColumns == null) { try { mColumns = mBulkCursor.getColumnNames(); } catch (RemoteException ex) { Log.e(TAG, "Unable to fetch column names because the remote process is dead"); return null; } } return mColumns; } Loading