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 199911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonimport android.database.Cursor; 209911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamiltonimport android.net.Uri; 21a7771df3696954f0e279407e8894a916a7cb26ccJeff Brownimport android.os.CancellationSignal; 22a7771df3696954f0e279407e8894a916a7cb26ccJeff Brownimport android.os.OperationCanceledException; 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; 524c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown CancellationSignal mCancellationSignal; 53a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn 549911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /* Runs on a worker thread */ 559911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 569911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public Cursor loadInBackground() { 5775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown synchronized (this) { 5875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown if (isLoadInBackgroundCanceled()) { 5975ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown throw new OperationCanceledException(); 6075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 614c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown mCancellationSignal = new CancellationSignal(); 6275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 6375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown try { 6475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection, 654c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown mSelectionArgs, mSortOrder, mCancellationSignal); 6675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown if (cursor != null) { 67c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown try { 68c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown // Ensure the cursor window is filled. 69c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown cursor.getCount(); 70da2223f8975cab9048d554eb5229cc5ff5a1e6c1Scott Kennedy cursor.registerContentObserver(mObserver); 71c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown } catch (RuntimeException ex) { 72c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown cursor.close(); 73c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown throw ex; 74c21b5a019c1da00b6d861cd2859e3c349a44b3a7Jeff Brown } 7575ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 7675ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown return cursor; 7775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } finally { 7875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown synchronized (this) { 794c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown mCancellationSignal = null; 8075ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 8175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 8275ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 8375ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 8475ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown @Override 85b19a71a20adb48c084e87d06a1e6b0dcb49170f5Jeff Brown public void cancelLoadInBackground() { 86b19a71a20adb48c084e87d06a1e6b0dcb49170f5Jeff Brown super.cancelLoadInBackground(); 8775ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown 8875ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown synchronized (this) { 894c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown if (mCancellationSignal != null) { 904c1241df8f8b7fd5ec3dff6c7e0f66271248e76eJeff Brown mCancellationSignal.cancel(); 9175ea64fc54f328d37b115cfb1ded1e45c30380edJeff Brown } 929911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 939911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 949911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 959911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /* Runs on the UI thread */ 969911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 979911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public void deliverResult(Cursor cursor) { 980e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn if (isReset()) { 999911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton // An async query came in while the loader is stopped 1004565d52bdd60490b05f9f8f7c1fd3c552974948cDmitri Plotnikov if (cursor != null) { 101229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn cursor.close(); 1024565d52bdd60490b05f9f8f7c1fd3c552974948cDmitri Plotnikov } 1039911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return; 1049911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1058e6f69b08fa3be56ad11aaffbecbcbead49afd33Ben Komalo Cursor oldCursor = mCursor; 1069911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mCursor = cursor; 1078e6f69b08fa3be56ad11aaffbecbcbead49afd33Ben Komalo 108a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn if (isStarted()) { 109c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn super.deliverResult(cursor); 110c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn } 111c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn 112c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { 113229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn oldCursor.close(); 1148e6f69b08fa3be56ad11aaffbecbcbead49afd33Ben Komalo } 1159911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1169911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 117327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn /** 118327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * Creates an empty unspecified CursorLoader. You must follow this with 119327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * calls to {@link #setUri(Uri)}, {@link #setSelection(String)}, etc 120327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * to specify the query to perform. 121327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn */ 122327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn public CursorLoader(Context context) { 123327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn super(context); 124327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn mObserver = new ForceLoadContentObserver(); 125327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn } 126327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn 127327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn /** 128327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * Creates a fully-specified CursorLoader. See 129327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * {@link ContentResolver#query(Uri, String[], String, String[], String) 130327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * ContentResolver.query()} for documentation on the meaning of the 131327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn * parameters. These will be passed as-is to that call. 132327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn */ 1339911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public CursorLoader(Context context, Uri uri, String[] projection, String selection, 1349911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton String[] selectionArgs, String sortOrder) { 1359911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton super(context); 1369911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mObserver = new ForceLoadContentObserver(); 1379911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mUri = uri; 1389911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mProjection = projection; 1399911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mSelection = selection; 1409911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mSelectionArgs = selectionArgs; 1419911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mSortOrder = sortOrder; 1429911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1439911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1449911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /** 1459911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Starts an asynchronous load of the contacts list data. When the result is ready the callbacks 1469911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * will be called on the UI thread. If a previous load has been completed and is still valid 147bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov * the result may be passed to the callbacks immediately. 1489911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * 1499911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Must be called from the UI thread 1509911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */ 1519911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 152a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn protected void onStartLoading() { 1539911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton if (mCursor != null) { 1549911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton deliverResult(mCursor); 155f73c75ca20fcaaee1b0eeaaf756252c33e3099c6Dianne Hackborn } 1560e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn if (takeContentChanged() || mCursor == null) { 1579911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton forceLoad(); 1589911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1599911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1609911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1619911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton /** 1629911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton * Must be called from the UI thread 1639911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton */ 1649911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 165a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn protected void onStopLoading() { 1669911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton // Attempt to cancel the current load task if possible. 1679911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton cancelLoad(); 1689911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1699911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1709911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton @Override 171327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn public void onCanceled(Cursor cursor) { 172bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov if (cursor != null && !cursor.isClosed()) { 173229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn cursor.close(); 174bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov } 175bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov } 176bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov 177bef9c7a59dc020c5cdcbd555b5212ae5a10e8045Dmitri Plotnikov @Override 178a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn protected void onReset() { 1790e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn super.onReset(); 1800e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn 1819911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton // Ensure the loader is stopped 1820e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn onStopLoading(); 183c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn 184c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (mCursor != null && !mCursor.isClosed()) { 185229edbc38dedbd58fb058da47fc3108276e61de4Dianne Hackborn mCursor.close(); 186c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn } 187c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn mCursor = null; 1889911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1899911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1909911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public Uri getUri() { 1919911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return mUri; 1929911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1939911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1949911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public void setUri(Uri uri) { 1959911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mUri = uri; 1969911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 1979911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 1989911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public String[] getProjection() { 1999911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return mProjection; 2009911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2019911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2029911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public void setProjection(String[] projection) { 2039911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mProjection = projection; 2049911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2059911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2069911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public String getSelection() { 2079911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return mSelection; 2089911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2099911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2109911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public void setSelection(String selection) { 2119911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mSelection = selection; 2129911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2139911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2149911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public String[] getSelectionArgs() { 2159911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return mSelectionArgs; 2169911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2179911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2189911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public void setSelectionArgs(String[] selectionArgs) { 2199911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mSelectionArgs = selectionArgs; 2209911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2219911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2229911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public String getSortOrder() { 2239911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton return mSortOrder; 2249911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 2259911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton 2269911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton public void setSortOrder(String sortOrder) { 2279911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton mSortOrder = sortOrder; 2289911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton } 229a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn 230a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn @Override 231a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { 232a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn super.dump(prefix, fd, writer, args); 233a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mUri="); writer.println(mUri); 234a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mProjection="); 235a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.println(Arrays.toString(mProjection)); 236a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mSelection="); writer.println(mSelection); 237a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mSelectionArgs="); 238a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.println(Arrays.toString(mSelectionArgs)); 239a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mSortOrder="); writer.println(mSortOrder); 240a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mCursor="); writer.println(mCursor); 241a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn writer.print(prefix); writer.print("mContentChanged="); writer.println(mContentChanged); 242a2ea747faaf5fcd437afbaaf4085cfc29e7c16b8Dianne Hackborn } 2439911b7f83db2e960f72345e6d50df2b77ca75e3fJeff Hamilton} 244