19911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton/*
29911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Copyright (C) 2010 The Android Open Source Project
39911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton *
49911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License");
59911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * you may not use this file except in compliance with the License.
69911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * You may obtain a copy of the License at
79911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton *
89911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton *      http://www.apache.org/licenses/LICENSE-2.0
99911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton *
109911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Unless required by applicable law or agreed to in writing, software
119911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS,
129911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * See the License for the specific language governing permissions and
149911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * limitations under the License.
159911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */
169911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
179911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonpackage android.content;
189911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
194d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikovimport android.database.ContentObserver;
209911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonimport android.database.Cursor;
219911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonimport android.net.Uri;
22421fa2744556d6483007bc2a6a1e4030811142f9Dianne Hackbornimport android.os.AsyncTask;
239911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
24a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackbornimport java.io.FileDescriptor;
25a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackbornimport java.io.PrintWriter;
26a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackbornimport java.util.Arrays;
27a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn
289911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton/**
299911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * A loader that queries the {@link ContentResolver} and returns a {@link Cursor}.
30327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * This class implements the {@link Loader} protocol in a standard way for
31327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * querying cursors, building on {@link AsyncTaskLoader} to perform the cursor
32327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * query on a background thread so that it does not block the application's UI.
33327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn *
34327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * <p>A CursorLoader must be built with the full information for the query to
35327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * perform, either through the
36327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * {@link #CursorLoader(Context, Uri, String[], String, String[], String)} or
37327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * creating an empty instance with {@link #CursorLoader(Context)} and filling
38327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * in the desired paramters with {@link #setUri(Uri)}, {@link #setSelection(String)},
39327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * {@link #setSelectionArgs(String[])}, {@link #setSortOrder(String)},
40327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * and {@link #setProjection(String[])}.
419911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */
429911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonpublic class CursorLoader extends AsyncTaskLoader<Cursor> {
43a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    final ForceLoadContentObserver mObserver;
44a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn
459911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    Uri mUri;
469911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    String[] mProjection;
479911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    String mSelection;
489911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    String[] mSelectionArgs;
499911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    String mSortOrder;
509911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
51a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    Cursor mCursor;
52a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn
539911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    /* Runs on a worker thread */
549911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    @Override
559911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public Cursor loadInBackground() {
569911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection,
579911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton                mSelectionArgs, mSortOrder);
589911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        if (cursor != null) {
594d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov            // Ensure the cursor window is filled
609911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton            cursor.getCount();
614d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov            registerContentObserver(cursor, mObserver);
629911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        }
639911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        return cursor;
649911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
659911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
664d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov    /**
674d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov     * Registers an observer to get notifications from the content provider
684d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov     * when the cursor needs to be refreshed.
694d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov     */
70247fe74c934cb3fba85aae7e051a8044f460fb11Dianne Hackborn    void registerContentObserver(Cursor cursor, ContentObserver observer) {
714d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov        cursor.registerContentObserver(mObserver);
724d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov    }
734d891e7db56c823a7baefd94fd3fb4af8b485ea9Dmitri Plotnikov
749911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    /* Runs on the UI thread */
759911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    @Override
769911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public void deliverResult(Cursor cursor) {
770e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn        if (isReset()) {
789911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton            // An async query came in while the loader is stopped
794565d52bdd60490b05f9f8f7c1fd3c552974948cDmitri Plotnikov            if (cursor != null) {
80229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn                cursor.close();
814565d52bdd60490b05f9f8f7c1fd3c552974948cDmitri Plotnikov            }
829911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton            return;
839911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        }
848e6f69b08fa3be56ad11aaffbecbcbead49afd33Ben Komalo        Cursor oldCursor = mCursor;
859911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mCursor = cursor;
868e6f69b08fa3be56ad11aaffbecbcbead49afd33Ben Komalo
87a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        if (isStarted()) {
88c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn            super.deliverResult(cursor);
89c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        }
90c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn
91c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
92229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn            oldCursor.close();
938e6f69b08fa3be56ad11aaffbecbcbead49afd33Ben Komalo        }
949911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
959911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
96327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn    /**
97327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * Creates an empty unspecified CursorLoader.  You must follow this with
98327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * calls to {@link #setUri(Uri)}, {@link #setSelection(String)}, etc
99327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * to specify the query to perform.
100327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     */
101327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn    public CursorLoader(Context context) {
102327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn        super(context);
103327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn        mObserver = new ForceLoadContentObserver();
104327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn    }
105327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn
106327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn    /**
107327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * Creates a fully-specified CursorLoader.  See
108327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * {@link ContentResolver#query(Uri, String[], String, String[], String)
109327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * ContentResolver.query()} for documentation on the meaning of the
110327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     * parameters.  These will be passed as-is to that call.
111327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn     */
1129911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public CursorLoader(Context context, Uri uri, String[] projection, String selection,
1139911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton            String[] selectionArgs, String sortOrder) {
1149911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        super(context);
1159911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mObserver = new ForceLoadContentObserver();
1169911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mUri = uri;
1179911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mProjection = projection;
1189911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mSelection = selection;
1199911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mSelectionArgs = selectionArgs;
1209911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mSortOrder = sortOrder;
1219911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1229911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1239911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    /**
1249911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks
1259911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     * will be called on the UI thread. If a previous load has been completed and is still valid
126bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov     * the result may be passed to the callbacks immediately.
1279911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     *
1289911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     * Must be called from the UI thread
1299911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     */
1309911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    @Override
131a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    protected void onStartLoading() {
1329911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        if (mCursor != null) {
1339911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton            deliverResult(mCursor);
134f73c75ca20fcaaee1b0eeaaf756252c33e3099c6Dianne Hackborn        }
1350e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn        if (takeContentChanged() || mCursor == null) {
1369911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton            forceLoad();
1379911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        }
1389911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1399911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1409911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    /**
1419911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     * Must be called from the UI thread
1429911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton     */
1439911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    @Override
144a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    protected void onStopLoading() {
1459911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        // Attempt to cancel the current load task if possible.
1469911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        cancelLoad();
1479911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1489911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1499911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    @Override
150327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn    public void onCanceled(Cursor cursor) {
151bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov        if (cursor != null && !cursor.isClosed()) {
152229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn            cursor.close();
153bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov        }
154bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov    }
155bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov
156bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov    @Override
157a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    protected void onReset() {
1580e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn        super.onReset();
1590e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn
1609911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        // Ensure the loader is stopped
1610e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn        onStopLoading();
162c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn
163c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        if (mCursor != null && !mCursor.isClosed()) {
164229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn            mCursor.close();
165c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        }
166c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        mCursor = null;
1679911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1689911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1699911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public Uri getUri() {
1709911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        return mUri;
1719911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1729911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1739911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public void setUri(Uri uri) {
1749911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mUri = uri;
1759911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1769911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1779911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public String[] getProjection() {
1789911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        return mProjection;
1799911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1809911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1819911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public void setProjection(String[] projection) {
1829911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mProjection = projection;
1839911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1849911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1859911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public String getSelection() {
1869911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        return mSelection;
1879911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1889911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1899911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public void setSelection(String selection) {
1909911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mSelection = selection;
1919911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1929911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1939911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public String[] getSelectionArgs() {
1949911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        return mSelectionArgs;
1959911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
1969911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
1979911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public void setSelectionArgs(String[] selectionArgs) {
1989911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mSelectionArgs = selectionArgs;
1999911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
2009911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
2019911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public String getSortOrder() {
2029911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        return mSortOrder;
2039911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
2049911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton
2059911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    public void setSortOrder(String sortOrder) {
2069911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton        mSortOrder = sortOrder;
2079911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton    }
208a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn
209a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    @Override
210a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
211a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        super.dump(prefix, fd, writer, args);
212a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mUri="); writer.println(mUri);
213a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mProjection=");
214a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn                writer.println(Arrays.toString(mProjection));
215a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mSelection="); writer.println(mSelection);
216a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mSelectionArgs=");
217a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn                writer.println(Arrays.toString(mSelectionArgs));
218a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mSortOrder="); writer.println(mSortOrder);
219a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mCursor="); writer.println(mCursor);
220a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn        writer.print(prefix); writer.print("mContentChanged="); writer.println(mContentChanged);
221a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn    }
2229911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton}
223