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