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