1a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey/*
2a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey *
4a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * you may not use this file except in compliance with the License.
6a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * You may obtain a copy of the License at
7a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey *
8a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey *
10a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * See the License for the specific language governing permissions and
14a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey * limitations under the License.
15a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey */
16a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
17a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeypackage com.android.documentsui;
18a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
19a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport android.content.AsyncTaskLoader;
20a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport android.content.Context;
21a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
22a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport com.android.documentsui.model.RootInfo;
23a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
24a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeyimport java.util.Collection;
25a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
26a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkeypublic class RootsLoader extends AsyncTaskLoader<Collection<RootInfo>> {
2746de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey    private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver();
2846de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey
29a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    private final RootsCache mRoots;
30a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    private final State mState;
31a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
32a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    private Collection<RootInfo> mResult;
33a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
34a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    public RootsLoader(Context context, RootsCache roots, State state) {
35a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        super(context);
36a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        mRoots = roots;
37a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        mState = state;
3846de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey
3946de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey        getContext().getContentResolver()
4046de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey                .registerContentObserver(RootsCache.sNotificationUri, false, mObserver);
41a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
42a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
43a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    @Override
44a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    public final Collection<RootInfo> loadInBackground() {
45a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        return mRoots.getMatchingRootsBlocking(mState);
46a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
47a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
48a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    @Override
49a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    public void deliverResult(Collection<RootInfo> result) {
50a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        if (isReset()) {
51a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            return;
52a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
534a1ca86f4757647b62995eede2a45d06273503bfSteve McKay
54a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        mResult = result;
55a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
56a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        if (isStarted()) {
57a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            super.deliverResult(result);
58a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
59a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
60a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
61a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    @Override
62a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    protected void onStartLoading() {
63a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        if (mResult != null) {
64a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            deliverResult(mResult);
65a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
66a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        if (takeContentChanged() || mResult == null) {
67a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey            forceLoad();
68a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        }
69a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
70a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
71a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    @Override
72a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    protected void onStopLoading() {
73a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        cancelLoad();
74a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
75a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
76a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    @Override
77a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    protected void onReset() {
78a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        super.onReset();
79a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
80a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        // Ensure the loader is stopped
81a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        onStopLoading();
82a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey
83a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey        mResult = null;
8446de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey
8546de7b50243d3896fe97d1ee7a00258085cea1caJeff Sharkey        getContext().getContentResolver().unregisterContentObserver(mObserver);
86a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey    }
87a9ce049db87259e302e2368d2a4a1c11a94fd831Jeff Sharkey}
88