1ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey/*
2ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *
4ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * you may not use this file except in compliance with the License.
6ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * You may obtain a copy of the License at
7ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *
8ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey *
10ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * See the License for the specific language governing permissions and
14ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey * limitations under the License.
15ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey */
16ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
17ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeypackage com.android.documentsui;
18ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
193eb2d07fd3ef67e54d5004fb6bff931b1b7b44c9Steve McKayimport static com.android.documentsui.Shared.DEBUG;
2058efce36cd1b26006e08ddd696292bf06fc34c81Steve McKayimport static com.android.documentsui.Shared.TAG;
217a3b88cf56ded3afb9bd6d1ad150b2d6b1f2f4d7Steve McKayimport static com.android.documentsui.State.SORT_ORDER_DISPLAY_NAME;
227a3b88cf56ded3afb9bd6d1ad150b2d6b1f2f4d7Steve McKayimport static com.android.documentsui.State.SORT_ORDER_LAST_MODIFIED;
237a3b88cf56ded3afb9bd6d1ad150b2d6b1f2f4d7Steve McKayimport static com.android.documentsui.State.SORT_ORDER_SIZE;
24b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey
255dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.content.AsyncTaskLoader;
265dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.content.ContentProviderClient;
27d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.content.ContentResolver;
28ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.content.Context;
29ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.database.Cursor;
30ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.net.Uri;
31ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.os.CancellationSignal;
325dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.os.OperationCanceledException;
3314a6df7d7626b5e3c739e4dafd11073a471c91a8Makoto Onukiimport android.os.RemoteException;
343e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkeyimport android.provider.DocumentsContract;
355dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.provider.DocumentsContract.Document;
36d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.util.Log;
37d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
38f862155e3476f8d9644d57072a6d92375bde628eSteve McKayimport com.android.documentsui.dirlist.DirectoryFragment;
39d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo;
40d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.model.RootInfo;
41ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
42ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport libcore.io.IoUtils;
43ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
443e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkeyimport java.io.FileNotFoundException;
453e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey
465dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeypublic class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
476efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
486efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey    private static final String[] SEARCH_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR };
496efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey
505dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
515dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
524ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey    private final int mType;
53d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private final RootInfo mRoot;
545dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private final Uri mUri;
55fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey    private final int mUserSortOrder;
56893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska    private final boolean mSearchMode;
57ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
583eb2d07fd3ef67e54d5004fb6bff931b1b7b44c9Steve McKay    private DocumentInfo mDoc;
595dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private CancellationSignal mSignal;
605dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private DirectoryResult mResult;
61ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
624ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey    public DirectoryLoader(Context context, int type, RootInfo root, DocumentInfo doc, Uri uri,
63893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            int userSortOrder, boolean inSearchMode) {
64d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey        super(context, ProviderExecutor.forAuthority(root.authority));
654ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey        mType = type;
66d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mRoot = root;
675dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        mUri = uri;
68fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey        mUserSortOrder = userSortOrder;
693eb2d07fd3ef67e54d5004fb6bff931b1b7b44c9Steve McKay        mDoc = doc;
70893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        mSearchMode = inSearchMode;
71ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
72ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
73ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    @Override
745dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public final DirectoryResult loadInBackground() {
755dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        synchronized (this) {
765dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            if (isLoadInBackgroundCanceled()) {
775dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                throw new OperationCanceledException();
785dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            }
795dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            mSignal = new CancellationSignal();
805dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
81d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
82d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final ContentResolver resolver = getContext().getContentResolver();
83251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        final String authority = mUri.getAuthority();
84d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
85d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final DirectoryResult result = new DirectoryResult();
86ae6d6b494c2f5837889ebe8cbd50d6782697884fTomasz Mikolajewski        result.doc = mDoc;
87d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
883e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey        // Use default document when searching
89893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        if (mSearchMode) {
903e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey            final Uri docUri = DocumentsContract.buildDocumentUri(
913e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey                    mRoot.authority, mRoot.documentId);
923e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey            try {
933e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey                mDoc = DocumentInfo.fromUri(resolver, docUri);
943e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey            } catch (FileNotFoundException e) {
953e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey                Log.w(TAG, "Failed to query", e);
963e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey                result.exception = e;
973e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey                return result;
983e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey            }
993e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey        }
1003e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey
101fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey        if (mUserSortOrder != State.SORT_ORDER_UNKNOWN) {
102fb3445c9b31c7f8401d6eec0606dabee366c8aadJeff Sharkey            result.sortOrder = mUserSortOrder;
103d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        } else {
104d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            if ((mDoc.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0) {
105d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                result.sortOrder = State.SORT_ORDER_LAST_MODIFIED;
106d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            } else {
107d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                result.sortOrder = State.SORT_ORDER_DISPLAY_NAME;
108d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            }
109d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
110d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
1114ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey        // Search always uses ranking from provider
112893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska        if (mSearchMode) {
1134ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey            result.sortOrder = State.SORT_ORDER_UNKNOWN;
1144ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey        }
1154ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey
1163eb2d07fd3ef67e54d5004fb6bff931b1b7b44c9Steve McKay        if (DEBUG)
1173eb2d07fd3ef67e54d5004fb6bff931b1b7b44c9Steve McKay                Log.d(TAG, "userSortOrder=" + mUserSortOrder + ", sortOrder=" + result.sortOrder);
118d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
119d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey        ContentProviderClient client = null;
1203eb2d07fd3ef67e54d5004fb6bff931b1b7b44c9Steve McKay        Cursor cursor = null;
121d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        try {
122d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey            client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority);
123d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey            cursor = client.query(
124d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                    mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal);
12514a6df7d7626b5e3c739e4dafd11073a471c91a8Makoto Onuki            if (cursor == null) {
12614a6df7d7626b5e3c739e4dafd11073a471c91a8Makoto Onuki                throw new RemoteException("Provider returned null");
12714a6df7d7626b5e3c739e4dafd11073a471c91a8Makoto Onuki            }
12814a6df7d7626b5e3c739e4dafd11073a471c91a8Makoto Onuki
129954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey            cursor.registerContentObserver(mObserver);
130954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey
1314ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey            cursor = new RootCursorWrapper(mUri.getAuthority(), mRoot.rootId, cursor, -1);
1324ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey
133893390bd580eca39ecd693cb0d76c7bc9b36a11dAga Wronska            if (mSearchMode) {
1344ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey                // Filter directories out of search results, for now
1356efba22ce510352bb84910d6efc42fecafd31ed7Jeff Sharkey                cursor = new FilteringCursorWrapper(cursor, null, SEARCH_REJECT_MIMES);
1364ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey            }
137251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
138d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey            result.client = client;
1394ec973925fc2cd18f9ec0d0ca5af588564fded27Jeff Sharkey            result.cursor = cursor;
14054ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } catch (Exception e) {
1413e1189b3590aefb65a2af720ae2ba959bbd4188dJeff Sharkey            Log.w(TAG, "Failed to query", e);
1425dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            result.exception = e;
143d01571e6d4e1c403534e19142720530d324eac9bJeff Sharkey            ContentProviderClient.releaseQuietly(client);
1445dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        } finally {
1455dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            synchronized (this) {
1465dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                mSignal = null;
1475dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            }
14854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
149d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
150b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey        return result;
15154ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    }
15254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
1535dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1545dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void cancelLoadInBackground() {
1555dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        super.cancelLoadInBackground();
156b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey
1575dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        synchronized (this) {
1585dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            if (mSignal != null) {
1595dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                mSignal.cancel();
160ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            }
161ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
1625dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1635dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1645dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1655dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void deliverResult(DirectoryResult result) {
1665dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (isReset()) {
1675dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            IoUtils.closeQuietly(result);
1685dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            return;
1695dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1705dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        DirectoryResult oldResult = mResult;
1715dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        mResult = result;
1725dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1735dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (isStarted()) {
1745dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            super.deliverResult(result);
1755dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1765dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1775dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (oldResult != null && oldResult != result) {
1785dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            IoUtils.closeQuietly(oldResult);
1795dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1805dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1815dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1825dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1835dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    protected void onStartLoading() {
1845dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (mResult != null) {
1855dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            deliverResult(mResult);
1865dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1875dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (takeContentChanged() || mResult == null) {
1885dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            forceLoad();
1895dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1905dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1915dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1925dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1935dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    protected void onStopLoading() {
1945dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        cancelLoad();
1955dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1965dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1975dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1985dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void onCanceled(DirectoryResult result) {
1995dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        IoUtils.closeQuietly(result);
2005dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
2015dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2025dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
2035dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    protected void onReset() {
2045dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        super.onReset();
2055dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2065dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        // Ensure the loader is stopped
2075dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        onStopLoading();
2085dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2095dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        IoUtils.closeQuietly(mResult);
2105dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        mResult = null;
2115dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2125dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        getContext().getContentResolver().unregisterContentObserver(mObserver);
2135dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
214ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
215251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public static String getQuerySortOrder(int sortOrder) {
216251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        switch (sortOrder) {
217b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            case SORT_ORDER_DISPLAY_NAME:
2185dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return Document.COLUMN_DISPLAY_NAME + " ASC";
219b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            case SORT_ORDER_LAST_MODIFIED:
2205dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return Document.COLUMN_LAST_MODIFIED + " DESC";
221b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            case SORT_ORDER_SIZE:
2225dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return Document.COLUMN_SIZE + " DESC";
2235dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            default:
2245dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return null;
225ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
226ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
227ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey}
228