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