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