DirectoryLoader.java revision d182bb641f228b2d28527a6aa86075f6358ab838
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
19d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.TAG;
20d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.MODE_UNKNOWN;
21b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME;
22b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED;
23b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE;
24d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_UNKNOWN;
25d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport static com.android.documentsui.model.DocumentInfo.getCursorInt;
26b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey
275dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.content.AsyncTaskLoader;
285dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.content.ContentProviderClient;
29d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.content.ContentResolver;
30ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.content.Context;
31ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.database.Cursor;
32ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.net.Uri;
33ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport android.os.CancellationSignal;
345dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.os.OperationCanceledException;
355dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeyimport android.provider.DocumentsContract.Document;
36d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport android.util.Log;
37d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
38d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.DocumentsActivity.State;
39d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.RecentsProvider.StateColumns;
40d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo;
41d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkeyimport com.android.documentsui.model.RootInfo;
42ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
43ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkeyimport libcore.io.IoUtils;
44ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
45b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkeyclass DirectoryResult implements AutoCloseable {
465dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    ContentProviderClient client;
47b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey    Cursor cursor;
485dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    Exception exception;
49b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey
50d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    int mode = MODE_UNKNOWN;
51d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    int sortOrder = SORT_ORDER_UNKNOWN;
52d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
53b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey    @Override
545dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void close() {
55b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey        IoUtils.closeQuietly(cursor);
565dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        ContentProviderClient.closeQuietly(client);
575dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        cursor = null;
585dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        client = null;
59b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey    }
60b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey}
61b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey
625dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkeypublic class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> {
635dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
645dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
65d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private final RootInfo mRoot;
66d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    private final DocumentInfo mDoc;
675dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private final Uri mUri;
68ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
695dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private CancellationSignal mSignal;
705dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    private DirectoryResult mResult;
71ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
72d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey    public DirectoryLoader(Context context, RootInfo root, DocumentInfo doc, Uri uri) {
735dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        super(context);
74d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mRoot = root;
75d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        mDoc = doc;
765dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        mUri = uri;
77ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
78ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
79ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    @Override
805dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public final DirectoryResult loadInBackground() {
815dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        synchronized (this) {
825dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            if (isLoadInBackgroundCanceled()) {
835dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                throw new OperationCanceledException();
845dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            }
855dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            mSignal = new CancellationSignal();
865dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
87d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
88d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final ContentResolver resolver = getContext().getContentResolver();
89251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        final String authority = mUri.getAuthority();
90d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
91d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        final DirectoryResult result = new DirectoryResult();
92d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
93d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        int userMode = State.MODE_UNKNOWN;
94d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        int userSortOrder = State.SORT_ORDER_UNKNOWN;
95d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
96d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        // Pick up any custom modes requested by user
97d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        Cursor cursor = null;
9854ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        try {
99d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            final Uri stateUri = RecentsProvider.buildState(
100d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                    mRoot.authority, mRoot.rootId, mDoc.documentId);
101d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            cursor = resolver.query(stateUri, null, null, null, null);
102d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            if (cursor.moveToFirst()) {
103d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                userMode = getCursorInt(cursor, StateColumns.MODE);
104d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                userSortOrder = getCursorInt(cursor, StateColumns.SORT_ORDER);
105d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            }
106d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        } finally {
107d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            IoUtils.closeQuietly(cursor);
108d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
109d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
110d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        if (userMode != State.MODE_UNKNOWN) {
111d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            result.mode = userMode;
112d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        } else {
113d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            if ((mDoc.flags & Document.FLAG_DIR_PREFERS_GRID) != 0) {
114d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                result.mode = State.MODE_GRID;
115d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            } else {
116d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                result.mode = State.MODE_LIST;
117d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            }
118d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
119d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
120d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        if (userSortOrder != State.SORT_ORDER_UNKNOWN) {
121d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            result.sortOrder = userSortOrder;
122d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        } else {
123d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            if ((mDoc.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0) {
124d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                result.sortOrder = State.SORT_ORDER_LAST_MODIFIED;
125d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            } else {
126d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                result.sortOrder = State.SORT_ORDER_DISPLAY_NAME;
127d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            }
128d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        }
129d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
130d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        Log.d(TAG, "userMode=" + userMode + ", userSortOrder=" + userSortOrder + " --> mode="
131d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                + result.mode + ", sortOrder=" + result.sortOrder);
132d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
133d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey        try {
134d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            result.client = resolver.acquireUnstableContentProviderClient(authority);
135d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            cursor = result.client.query(
136d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                    mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal);
137954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey            cursor.registerContentObserver(mObserver);
138954be0232655d316bc5decbbd35579af902c75c2Jeff Sharkey
139d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            final Cursor withRoot = new RootCursorWrapper(
140d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey                    mUri.getAuthority(), mRoot.rootId, cursor, -1);
141d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            final Cursor sorted = new SortingCursorWrapper(withRoot, result.sortOrder);
142251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey
143251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey            result.cursor = sorted;
14454ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        } catch (Exception e) {
145d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey            Log.d(TAG, "Failed to query", e);
1465dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            result.exception = e;
1475dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            ContentProviderClient.closeQuietly(result.client);
1485dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        } finally {
1495dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            synchronized (this) {
1505dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                mSignal = null;
1515dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            }
15254ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey        }
153d182bb641f228b2d28527a6aa86075f6358ab838Jeff Sharkey
154b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey        return result;
15554ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey    }
15654ca29a5b94c2edf461c5433825d4ae17469fd7cJeff Sharkey
1575dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1585dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void cancelLoadInBackground() {
1595dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        super.cancelLoadInBackground();
160b448660a227f93d7bd5c5d019a21745e67c2f54dJeff Sharkey
1615dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        synchronized (this) {
1625dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            if (mSignal != null) {
1635dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                mSignal.cancel();
164ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey            }
165ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
1665dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1675dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1685dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1695dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void deliverResult(DirectoryResult result) {
1705dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (isReset()) {
1715dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            IoUtils.closeQuietly(result);
1725dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            return;
1735dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1745dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        DirectoryResult oldResult = mResult;
1755dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        mResult = result;
1765dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1775dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (isStarted()) {
1785dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            super.deliverResult(result);
1795dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1805dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1815dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (oldResult != null && oldResult != result) {
1825dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            IoUtils.closeQuietly(oldResult);
1835dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1845dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1855dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1865dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1875dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    protected void onStartLoading() {
1885dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (mResult != null) {
1895dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            deliverResult(mResult);
1905dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1915dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        if (takeContentChanged() || mResult == null) {
1925dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            forceLoad();
1935dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        }
1945dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
1955dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
1965dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
1975dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    protected void onStopLoading() {
1985dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        cancelLoad();
1995dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
2005dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2015dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
2025dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    public void onCanceled(DirectoryResult result) {
2035dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        IoUtils.closeQuietly(result);
2045dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
2055dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2065dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    @Override
2075dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    protected void onReset() {
2085dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        super.onReset();
2095dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2105dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        // Ensure the loader is stopped
2115dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        onStopLoading();
2125dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2135dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        IoUtils.closeQuietly(mResult);
2145dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        mResult = null;
2155dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey
2165dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey        getContext().getContentResolver().unregisterContentObserver(mObserver);
2175dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey    }
218ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey
219251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey    public static String getQuerySortOrder(int sortOrder) {
220251097b3789632000ccdaf7fb7d66a82ff37d882Jeff Sharkey        switch (sortOrder) {
221b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            case SORT_ORDER_DISPLAY_NAME:
2225dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return Document.COLUMN_DISPLAY_NAME + " ASC";
223b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            case SORT_ORDER_LAST_MODIFIED:
2245dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return Document.COLUMN_LAST_MODIFIED + " DESC";
225b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey            case SORT_ORDER_SIZE:
2265dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return Document.COLUMN_SIZE + " DESC";
2275dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey            default:
2285dfb345df7cb17b3a7e534a80a270b4afe7934daJeff Sharkey                return null;
229ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey        }
230ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey    }
231ef7184a1aa0be5d496a5cb495a0f9e11f342af44Jeff Sharkey}
232