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