109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi/* 209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Copyright (C) 2016 Google Inc. 309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Licensed to The Android Open Source Project. 409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Licensed under the Apache License, Version 2.0 (the "License"); 609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * you may not use this file except in compliance with the License. 709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * You may obtain a copy of the License at 809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * http://www.apache.org/licenses/LICENSE-2.0 1009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 1109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Unless required by applicable law or agreed to in writing, software 1209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * distributed under the License is distributed on an "AS IS" BASIS, 1309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * See the License for the specific language governing permissions and 1509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * limitations under the License. 1609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 1709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 1809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishipackage com.android.storagemanager.utils; 1909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 2009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.content.AsyncTaskLoader; 2109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.content.Context; 2209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 2309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi/** 2409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * This class fills in some boilerplate for AsyncTaskLoader to actually load things. 2509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 2609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Subclasses need to implement {@link AsyncLoader#loadInBackground()} to perform the actual 2709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * background task, and {@link AsyncLoader#onDiscardResult(T)} to clean up previously loaded 2809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * results. 2909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 3009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * This loader is based on the MailAsyncTaskLoader from the AOSP EmailUnified repo. 3109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 3209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishipublic abstract class AsyncLoader<T> extends AsyncTaskLoader<T> { 3309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private T mResult; 3409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 3509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public AsyncLoader(final Context context) { 3609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super(context); 3709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 3809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 3909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 4009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected void onStartLoading() { 4109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (mResult != null) { 4209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi deliverResult(mResult); 4309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 4409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 4509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (takeContentChanged() || mResult == null) { 4609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi forceLoad(); 4709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 4809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 4909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 5009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 5109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected void onStopLoading() { 5209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi cancelLoad(); 5309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 5409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 5509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 5609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void deliverResult(final T data) { 5709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (isReset()) { 5809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (data != null) { 5909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi onDiscardResult(data); 6009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 6109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi return; 6209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 6309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 6409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi final T oldResult = mResult; 6509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mResult = data; 6609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 6709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (isStarted()) { 6809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.deliverResult(data); 6909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 7009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 7109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (oldResult != null && oldResult != mResult) { 7209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi onDiscardResult(oldResult); 7309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 7409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 7509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 7609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 7709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected void onReset() { 7809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onReset(); 7909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 8009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi onStopLoading(); 8109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 8209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (mResult != null) { 8309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi onDiscardResult(mResult); 8409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 8509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mResult = null; 8609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 8709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 8809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 8909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onCanceled(final T data) { 9009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onCanceled(data); 9109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 9209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (data != null) { 9309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi onDiscardResult(data); 9409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 9509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 9609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 9709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi /** 9809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Called when discarding the load results so subclasses can take care of clean-up or 9909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * recycling tasks. This is not called if the same result (by way of pointer equality) is 10009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * returned again by a subsequent call to loadInBackground, or if result is null. 10109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 10209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Note that this may be called concurrently with loadInBackground(), and in some circumstances 10309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * may be called more than once for a given object. 10409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 10509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * @param result The value returned from {@link AsyncLoader#loadInBackground()} which 10609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * is to be discarded. 10709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 10809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected abstract void onDiscardResult(final T result); 10909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi} 110