Loading api/current.xml +128 −0 Original line number Diff line number Diff line Loading @@ -47876,6 +47876,19 @@ visibility="public" > </method> <method name="beginTransactionWithListener" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > <parameter name="transactionListener" type="android.database.sqlite.SQLiteTransactionListener"> </parameter> </method> <method name="close" return="void" abstract="false" Loading Loading @@ -49507,6 +49520,47 @@ > </method> </class> <interface name="SQLiteTransactionListener" abstract="true" static="false" final="false" deprecated="not deprecated" visibility="public" > <method name="onBegin" return="void" abstract="true" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > </method> <method name="onCommit" return="void" abstract="true" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > </method> <method name="onRollback" return="void" abstract="true" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > </method> </interface> </package> <package name="android.gesture" > Loading Loading @@ -115090,6 +115144,46 @@ <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="getWithUri" return="android.util.Pair<android.net.Uri, byte[]>" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="provider" type="android.content.ContentProviderClient"> </parameter> <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="account" type="android.accounts.Account"> </parameter> <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="insert" return="android.net.Uri" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="provider" type="android.content.ContentProviderClient"> </parameter> <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="account" type="android.accounts.Account"> </parameter> <parameter name="data" type="byte[]"> </parameter> <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="newSetOperation" return="android.content.ContentProviderOperation" abstract="false" Loading @@ -115107,6 +115201,21 @@ <parameter name="data" type="byte[]"> </parameter> </method> <method name="newUpdateOperation" return="android.content.ContentProviderOperation" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="data" type="byte[]"> </parameter> </method> <method name="set" return="void" abstract="false" Loading @@ -115128,6 +115237,25 @@ <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="update" return="void" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="provider" type="android.content.ContentProviderClient"> </parameter> <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="data" type="byte[]"> </parameter> <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> </class> <class name="UserDictionary" extends="java.lang.Object" core/java/android/database/sqlite/SQLiteDatabase.java +58 −1 Original line number Diff line number Diff line Loading @@ -175,6 +175,11 @@ public class SQLiteDatabase extends SQLiteClosable { */ private boolean mTransactionIsSuccessful; /** * Valid during the life of a transaction. */ private SQLiteTransactionListener mTransactionListener; /** Synchronize on this when accessing the database */ private final ReentrantLock mLock = new ReentrantLock(true); Loading Loading @@ -394,6 +399,31 @@ public class SQLiteDatabase extends SQLiteClosable { * </pre> */ public void beginTransaction() { beginTransactionWithListener(null /* transactionStatusCallback */); } /** * Begins a transaction. Transactions can be nested. When the outer transaction is ended all of * the work done in that transaction and all of the nested transactions will be committed or * rolled back. The changes will be rolled back if any transaction is ended without being * marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed. * * <p>Here is the standard idiom for transactions: * * <pre> * db.beginTransactionWithListener(listener); * try { * ... * db.setTransactionSuccessful(); * } finally { * db.endTransaction(); * } * </pre> * @param transactionListener listener that should be notified when the transaction begins, * commits, or is rolled back, either explicitly or by a call to * {@link #yieldIfContendedSafely}. */ public void beginTransactionWithListener(SQLiteTransactionListener transactionListener) { lockForced(); boolean ok = false; try { Loading @@ -413,8 +443,17 @@ public class SQLiteDatabase extends SQLiteClosable { // This thread didn't already have the lock, so begin a database // transaction now. execSQL("BEGIN EXCLUSIVE;"); mTransactionListener = transactionListener; mTransactionIsSuccessful = true; mInnerTransactionIsSuccessful = false; if (transactionListener != null) { try { transactionListener.onBegin(); } catch (RuntimeException e) { execSQL("ROLLBACK;"); throw e; } } ok = true; } finally { if (!ok) { Loading Loading @@ -442,11 +481,27 @@ public class SQLiteDatabase extends SQLiteClosable { if (mLock.getHoldCount() != 1) { return; } RuntimeException savedException = null; if (mTransactionListener != null) { try { if (mTransactionIsSuccessful) { mTransactionListener.onCommit(); } else { mTransactionListener.onRollback(); } } catch (RuntimeException e) { savedException = e; mTransactionIsSuccessful = false; } } if (mTransactionIsSuccessful) { execSQL("COMMIT;"); } else { try { execSQL("ROLLBACK;"); if (savedException != null) { throw savedException; } } catch (SQLException e) { if (Config.LOGD) { Log.d(TAG, "exception during rollback, maybe the DB previously " Loading @@ -455,6 +510,7 @@ public class SQLiteDatabase extends SQLiteClosable { } } } finally { mTransactionListener = null; unlockForced(); if (Config.LOGV) { Log.v(TAG, "unlocked " + Thread.currentThread() Loading Loading @@ -561,6 +617,7 @@ public class SQLiteDatabase extends SQLiteClosable { return false; } setTransactionSuccessful(); SQLiteTransactionListener transactionListener = mTransactionListener; endTransaction(); if (checkFullyYielded) { if (this.isDbLockedByCurrentThread()) { Loading @@ -586,7 +643,7 @@ public class SQLiteDatabase extends SQLiteClosable { } } } beginTransaction(); beginTransactionWithListener(transactionListener); return true; } Loading core/java/android/database/sqlite/SQLiteDebug.java +9 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.database.sqlite; import android.util.Config; import android.util.Log; /** * Provides debugging info about all SQLite databases running in the current process. Loading @@ -27,23 +28,27 @@ public final class SQLiteDebug { /** * Controls the printing of SQL statements as they are executed. */ public static final boolean DEBUG_SQL_STATEMENTS = Config.LOGV; public static final boolean DEBUG_SQL_STATEMENTS = Log.isLoggable("SQLiteStatements", Log.VERBOSE); /** * Controls the stack trace reporting of active cursors being * finalized. */ public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION = Config.LOGV; public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION = Log.isLoggable("SQLiteCursorClosing", Log.VERBOSE); /** * Controls the tracking of time spent holding the database lock. */ public static final boolean DEBUG_LOCK_TIME_TRACKING = false; public static final boolean DEBUG_LOCK_TIME_TRACKING = Log.isLoggable("SQLiteLockTime", Log.VERBOSE); /** * Controls the printing of stack traces when tracking the time spent holding the database lock. */ public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = false; public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE); /** * Contains statistics about the active pagers in the current process. Loading core/java/android/database/sqlite/SQLiteTransactionListener.java 0 → 100644 +21 −0 Original line number Diff line number Diff line package android.database.sqlite; /** * A listener for transaction events. */ public interface SQLiteTransactionListener { /** * Called immediately after the transaction begins. */ void onBegin(); /** * Called immediately before commiting the transaction. */ void onCommit(); /** * Called if the transaction is about to be rolled back. */ void onRollback(); } core/java/android/provider/ContactsContract.java +9 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.BitmapFactory; import android.net.Uri; import android.os.RemoteException; import android.text.TextUtils; import android.util.Pair; import java.io.ByteArrayInputStream; import java.io.InputStream; Loading Loading @@ -71,6 +72,14 @@ public final class ContactsContract { return SyncStateContract.Helpers.get(provider, CONTENT_URI, account); } /** * @see android.provider.SyncStateContract.Helpers#get */ public static Pair<Uri, byte[]> getWithUri(ContentProviderClient provider, Account account) throws RemoteException { return SyncStateContract.Helpers.getWithUri(provider, CONTENT_URI, account); } /** * @see android.provider.SyncStateContract.Helpers#set */ Loading Loading
api/current.xml +128 −0 Original line number Diff line number Diff line Loading @@ -47876,6 +47876,19 @@ visibility="public" > </method> <method name="beginTransactionWithListener" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > <parameter name="transactionListener" type="android.database.sqlite.SQLiteTransactionListener"> </parameter> </method> <method name="close" return="void" abstract="false" Loading Loading @@ -49507,6 +49520,47 @@ > </method> </class> <interface name="SQLiteTransactionListener" abstract="true" static="false" final="false" deprecated="not deprecated" visibility="public" > <method name="onBegin" return="void" abstract="true" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > </method> <method name="onCommit" return="void" abstract="true" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > </method> <method name="onRollback" return="void" abstract="true" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > </method> </interface> </package> <package name="android.gesture" > Loading Loading @@ -115090,6 +115144,46 @@ <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="getWithUri" return="android.util.Pair<android.net.Uri, byte[]>" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="provider" type="android.content.ContentProviderClient"> </parameter> <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="account" type="android.accounts.Account"> </parameter> <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="insert" return="android.net.Uri" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="provider" type="android.content.ContentProviderClient"> </parameter> <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="account" type="android.accounts.Account"> </parameter> <parameter name="data" type="byte[]"> </parameter> <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="newSetOperation" return="android.content.ContentProviderOperation" abstract="false" Loading @@ -115107,6 +115201,21 @@ <parameter name="data" type="byte[]"> </parameter> </method> <method name="newUpdateOperation" return="android.content.ContentProviderOperation" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="data" type="byte[]"> </parameter> </method> <method name="set" return="void" abstract="false" Loading @@ -115128,6 +115237,25 @@ <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> <method name="update" return="void" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > <parameter name="provider" type="android.content.ContentProviderClient"> </parameter> <parameter name="uri" type="android.net.Uri"> </parameter> <parameter name="data" type="byte[]"> </parameter> <exception name="RemoteException" type="android.os.RemoteException"> </exception> </method> </class> <class name="UserDictionary" extends="java.lang.Object"
core/java/android/database/sqlite/SQLiteDatabase.java +58 −1 Original line number Diff line number Diff line Loading @@ -175,6 +175,11 @@ public class SQLiteDatabase extends SQLiteClosable { */ private boolean mTransactionIsSuccessful; /** * Valid during the life of a transaction. */ private SQLiteTransactionListener mTransactionListener; /** Synchronize on this when accessing the database */ private final ReentrantLock mLock = new ReentrantLock(true); Loading Loading @@ -394,6 +399,31 @@ public class SQLiteDatabase extends SQLiteClosable { * </pre> */ public void beginTransaction() { beginTransactionWithListener(null /* transactionStatusCallback */); } /** * Begins a transaction. Transactions can be nested. When the outer transaction is ended all of * the work done in that transaction and all of the nested transactions will be committed or * rolled back. The changes will be rolled back if any transaction is ended without being * marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed. * * <p>Here is the standard idiom for transactions: * * <pre> * db.beginTransactionWithListener(listener); * try { * ... * db.setTransactionSuccessful(); * } finally { * db.endTransaction(); * } * </pre> * @param transactionListener listener that should be notified when the transaction begins, * commits, or is rolled back, either explicitly or by a call to * {@link #yieldIfContendedSafely}. */ public void beginTransactionWithListener(SQLiteTransactionListener transactionListener) { lockForced(); boolean ok = false; try { Loading @@ -413,8 +443,17 @@ public class SQLiteDatabase extends SQLiteClosable { // This thread didn't already have the lock, so begin a database // transaction now. execSQL("BEGIN EXCLUSIVE;"); mTransactionListener = transactionListener; mTransactionIsSuccessful = true; mInnerTransactionIsSuccessful = false; if (transactionListener != null) { try { transactionListener.onBegin(); } catch (RuntimeException e) { execSQL("ROLLBACK;"); throw e; } } ok = true; } finally { if (!ok) { Loading Loading @@ -442,11 +481,27 @@ public class SQLiteDatabase extends SQLiteClosable { if (mLock.getHoldCount() != 1) { return; } RuntimeException savedException = null; if (mTransactionListener != null) { try { if (mTransactionIsSuccessful) { mTransactionListener.onCommit(); } else { mTransactionListener.onRollback(); } } catch (RuntimeException e) { savedException = e; mTransactionIsSuccessful = false; } } if (mTransactionIsSuccessful) { execSQL("COMMIT;"); } else { try { execSQL("ROLLBACK;"); if (savedException != null) { throw savedException; } } catch (SQLException e) { if (Config.LOGD) { Log.d(TAG, "exception during rollback, maybe the DB previously " Loading @@ -455,6 +510,7 @@ public class SQLiteDatabase extends SQLiteClosable { } } } finally { mTransactionListener = null; unlockForced(); if (Config.LOGV) { Log.v(TAG, "unlocked " + Thread.currentThread() Loading Loading @@ -561,6 +617,7 @@ public class SQLiteDatabase extends SQLiteClosable { return false; } setTransactionSuccessful(); SQLiteTransactionListener transactionListener = mTransactionListener; endTransaction(); if (checkFullyYielded) { if (this.isDbLockedByCurrentThread()) { Loading @@ -586,7 +643,7 @@ public class SQLiteDatabase extends SQLiteClosable { } } } beginTransaction(); beginTransactionWithListener(transactionListener); return true; } Loading
core/java/android/database/sqlite/SQLiteDebug.java +9 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.database.sqlite; import android.util.Config; import android.util.Log; /** * Provides debugging info about all SQLite databases running in the current process. Loading @@ -27,23 +28,27 @@ public final class SQLiteDebug { /** * Controls the printing of SQL statements as they are executed. */ public static final boolean DEBUG_SQL_STATEMENTS = Config.LOGV; public static final boolean DEBUG_SQL_STATEMENTS = Log.isLoggable("SQLiteStatements", Log.VERBOSE); /** * Controls the stack trace reporting of active cursors being * finalized. */ public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION = Config.LOGV; public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION = Log.isLoggable("SQLiteCursorClosing", Log.VERBOSE); /** * Controls the tracking of time spent holding the database lock. */ public static final boolean DEBUG_LOCK_TIME_TRACKING = false; public static final boolean DEBUG_LOCK_TIME_TRACKING = Log.isLoggable("SQLiteLockTime", Log.VERBOSE); /** * Controls the printing of stack traces when tracking the time spent holding the database lock. */ public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = false; public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE); /** * Contains statistics about the active pagers in the current process. Loading
core/java/android/database/sqlite/SQLiteTransactionListener.java 0 → 100644 +21 −0 Original line number Diff line number Diff line package android.database.sqlite; /** * A listener for transaction events. */ public interface SQLiteTransactionListener { /** * Called immediately after the transaction begins. */ void onBegin(); /** * Called immediately before commiting the transaction. */ void onCommit(); /** * Called if the transaction is about to be rolled back. */ void onRollback(); }
core/java/android/provider/ContactsContract.java +9 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.BitmapFactory; import android.net.Uri; import android.os.RemoteException; import android.text.TextUtils; import android.util.Pair; import java.io.ByteArrayInputStream; import java.io.InputStream; Loading Loading @@ -71,6 +72,14 @@ public final class ContactsContract { return SyncStateContract.Helpers.get(provider, CONTENT_URI, account); } /** * @see android.provider.SyncStateContract.Helpers#get */ public static Pair<Uri, byte[]> getWithUri(ContentProviderClient provider, Account account) throws RemoteException { return SyncStateContract.Helpers.getWithUri(provider, CONTENT_URI, account); } /** * @see android.provider.SyncStateContract.Helpers#set */ Loading