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