19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.HandlerThread; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A helper class to help make handling asynchronous {@link ContentResolver} 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * queries easier. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class AsyncQueryHandler extends Handler { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "AsyncQuery"; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean localLOGV = false; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EVENT_ARG_QUERY = 1; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EVENT_ARG_INSERT = 2; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EVENT_ARG_UPDATE = 3; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EVENT_ARG_DELETE = 4; 41a5f743f1fc7c5037ee7ad4ab611115b6d44af5b8Jeff Sharkey 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ final WeakReference<ContentResolver> mResolver; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Looper sLooper = null; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mWorkerThreadHandler; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static final class WorkerArgs { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uri uri; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Handler handler; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] projection; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String selection; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] selectionArgs; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String orderBy; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object result; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object cookie; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ContentValues values; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected class WorkerHandler extends Handler { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WorkerHandler(Looper looper) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(looper); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ContentResolver resolver = mResolver.get(); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolver == null) return; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WorkerArgs args = (WorkerArgs) msg.obj; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int token = msg.what; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int event = msg.arg1; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (event) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_QUERY: 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Cursor cursor; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor = resolver.query(args.uri, args.projection, 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selection, args.selectionArgs, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.orderBy); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Calling getCount() causes the cursor window to be filled, 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // which will make the first access on the main thread a lot faster. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursor != null) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor.getCount(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 8862fd4e3fcb5af7ddbeae9f6faec73aa667a3a702Daisuke Miyakawa Log.w(TAG, "Exception thrown during handling EVENT_ARG_QUERY", e); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cursor = null; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.result = cursor; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_INSERT: 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.result = resolver.insert(args.uri, args.values); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_UPDATE: 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.result = resolver.update(args.uri, args.values, args.selection, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selectionArgs); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_DELETE: 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.result = resolver.delete(args.uri, args.selection, args.selectionArgs); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // passing the original token value back to the caller 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // on top of the event values in arg1. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message reply = args.handler.obtainMessage(token); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.obj = args; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.arg1 = msg.arg1; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "WorkerHandler.handleMsg: msg.arg1=" + msg.arg1 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", reply.what=" + reply.what); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.sendToTarget(); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AsyncQueryHandler(ContentResolver cr) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResolver = new WeakReference<ContentResolver>(cr); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (AsyncQueryHandler.class) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sLooper == null) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HandlerThread thread = new HandlerThread("AsyncQueryWorker"); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thread.start(); 131a5f743f1fc7c5037ee7ad4ab611115b6d44af5b8Jeff Sharkey 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sLooper = thread.getLooper(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkerThreadHandler = createHandler(sLooper); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Handler createHandler(Looper looper) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WorkerHandler(looper); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method begins an asynchronous query. When the query is done 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onQueryComplete} is called. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token A token passed into {@link #onQueryComplete} to identify 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the query. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie An object that gets passed into {@link #onQueryComplete} 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The URI, using the content:// scheme, for the content to 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieve. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param projection A list of which columns to return. Passing null will 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return all columns, which is discouraged to prevent reading data 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from storage that isn't going to be used. 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selection A filter declaring which rows to return, formatted as an 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SQL WHERE clause (excluding the WHERE itself). Passing null will 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return all rows for the given URI. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectionArgs You may include ?s in selection, which will be 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replaced by the values from selectionArgs, in the order that they 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appear in the selection. The values will be bound as Strings. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param orderBy How to order the rows, formatted as an SQL ORDER BY 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clause (excluding the ORDER BY itself). Passing null will use the 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default sort order, which may be unordered. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startQuery(int token, Object cookie, Uri uri, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] projection, String selection, String[] selectionArgs, 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String orderBy) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use the token as what so cancelOperations works properly 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = mWorkerThreadHandler.obtainMessage(token); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.arg1 = EVENT_ARG_QUERY; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WorkerArgs args = new WorkerArgs(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.handler = this; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.uri = uri; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.projection = projection; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selection = selection; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selectionArgs = selectionArgs; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.orderBy = orderBy; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.cookie = cookie; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.obj = args; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkerThreadHandler.sendMessage(msg); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Attempts to cancel operation that has not already started. Note that 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no guarantee that the operation will be canceled. They still may 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result in a call to on[Query/Insert/Update/Delete]Complete after this 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call has completed. 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token The token representing the operation to be canceled. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If multiple operations have the same token they will all be canceled. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void cancelOperation(int token) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkerThreadHandler.removeMessages(token); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method begins an asynchronous insert. When the insert operation is 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done {@link #onInsertComplete} is called. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token A token passed into {@link #onInsertComplete} to identify 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the insert operation. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie An object that gets passed into {@link #onInsertComplete} 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri the Uri passed to the insert operation. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param initialValues the ContentValues parameter passed to the insert operation. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void startInsert(int token, Object cookie, Uri uri, 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues initialValues) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use the token as what so cancelOperations works properly 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = mWorkerThreadHandler.obtainMessage(token); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.arg1 = EVENT_ARG_INSERT; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WorkerArgs args = new WorkerArgs(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.handler = this; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.uri = uri; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.cookie = cookie; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.values = initialValues; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.obj = args; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkerThreadHandler.sendMessage(msg); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method begins an asynchronous update. When the update operation is 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done {@link #onUpdateComplete} is called. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token A token passed into {@link #onUpdateComplete} to identify 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the update operation. 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie An object that gets passed into {@link #onUpdateComplete} 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri the Uri passed to the update operation. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param values the ContentValues parameter passed to the update operation. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void startUpdate(int token, Object cookie, Uri uri, 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values, String selection, String[] selectionArgs) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use the token as what so cancelOperations works properly 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = mWorkerThreadHandler.obtainMessage(token); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.arg1 = EVENT_ARG_UPDATE; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WorkerArgs args = new WorkerArgs(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.handler = this; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.uri = uri; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.cookie = cookie; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.values = values; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selection = selection; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selectionArgs = selectionArgs; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.obj = args; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkerThreadHandler.sendMessage(msg); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method begins an asynchronous delete. When the delete operation is 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done {@link #onDeleteComplete} is called. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token A token passed into {@link #onDeleteComplete} to identify 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the delete operation. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie An object that gets passed into {@link #onDeleteComplete} 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri the Uri passed to the delete operation. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selection the where clause. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void startDelete(int token, Object cookie, Uri uri, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String selection, String[] selectionArgs) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use the token as what so cancelOperations works properly 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = mWorkerThreadHandler.obtainMessage(token); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.arg1 = EVENT_ARG_DELETE; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WorkerArgs args = new WorkerArgs(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.handler = this; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.uri = uri; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.cookie = cookie; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selection = selection; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project args.selectionArgs = selectionArgs; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.obj = args; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkerThreadHandler.sendMessage(msg); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when an asynchronous query is completed. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token the token to identify the query, passed in from 282a5f743f1fc7c5037ee7ad4ab611115b6d44af5b8Jeff Sharkey * {@link #startQuery}. 283a5f743f1fc7c5037ee7ad4ab611115b6d44af5b8Jeff Sharkey * @param cookie the cookie object passed in from {@link #startQuery}. 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cursor The cursor holding the results from the query. 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when an asynchronous insert is completed. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token the token to identify the query, passed in from 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startInsert}. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie the cookie object that's passed in from 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startInsert}. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri the uri returned from the insert operation. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onInsertComplete(int token, Object cookie, Uri uri) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when an asynchronous update is completed. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token the token to identify the query, passed in from 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startUpdate}. 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie the cookie object that's passed in from 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startUpdate}. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param result the result returned from the update operation 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onUpdateComplete(int token, Object cookie, int result) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when an asynchronous delete is completed. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token the token to identify the query, passed in from 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startDelete}. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cookie the cookie object that's passed in from 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startDelete}. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param result the result returned from the delete operation 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDeleteComplete(int token, Object cookie, int result) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WorkerArgs args = (WorkerArgs) msg.obj; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(TAG, "AsyncQueryHandler.handleMessage: msg.what=" + msg.what 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", msg.arg1=" + msg.arg1); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int token = msg.what; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int event = msg.arg1; 340a5f743f1fc7c5037ee7ad4ab611115b6d44af5b8Jeff Sharkey 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass token back to caller on each callback. 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (event) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_QUERY: 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onQueryComplete(token, args.cookie, (Cursor) args.result); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_INSERT: 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onInsertComplete(token, args.cookie, (Uri) args.result); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_UPDATE: 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onUpdateComplete(token, args.cookie, (Integer) args.result); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ARG_DELETE: 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onDeleteComplete(token, args.cookie, (Integer) args.result); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 361