11f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler/*
21f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * Copyright (C) 2013 Google Inc.
31f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * Licensed to The Android Open Source Project.
41f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler *
51f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
61f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * you may not use this file except in compliance with the License.
71f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * You may obtain a copy of the License at
81f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler *
91f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
101f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler *
111f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * Unless required by applicable law or agreed to in writing, software
121f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
131f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * See the License for the specific language governing permissions and
151f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * limitations under the License.
161f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler */
171f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
181f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantlerpackage com.android.mail.ui;
191f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
201f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantlerimport android.content.AsyncTaskLoader;
211f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantlerimport android.content.Context;
221f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
231f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler/**
241f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * This class fills in some boilerplate for AsyncTaskLoader to actually load things.
251f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler *
261f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * Subclasses need to implement {@link MailAsyncTaskLoader#loadInBackground()} to perform the actual
271f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * background task, and {@link MailAsyncTaskLoader#onDiscardResult(T)} to clean up previously loaded
281f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler * results.
291f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler */
301f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
311f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantlerpublic abstract class MailAsyncTaskLoader<T> extends AsyncTaskLoader<T> {
321f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    private T mResult;
331f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
341f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    public MailAsyncTaskLoader(final Context context) {
351f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        super(context);
361f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    }
371f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
381f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    @Override
391f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    protected void onStartLoading() {
401f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (mResult != null) {
411f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            deliverResult(mResult);
421f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
431f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
441f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (takeContentChanged() || mResult == null) {
451f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            forceLoad();
461f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
471f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    }
481f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
491f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    @Override
501f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    protected void onStopLoading() {
511f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        cancelLoad();
521f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    }
531f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
541f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    @Override
551f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    public void deliverResult(final T data) {
561f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (isReset()) {
571f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            if (data != null) {
581f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler                onDiscardResult(data);
591f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            }
601f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            return;
611f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
621f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
631f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        final T oldResult = mResult;
641f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        mResult = data;
651f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
661f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (isStarted()) {
671f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            super.deliverResult(data);
681f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
691f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
701f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (oldResult != null && oldResult != mResult) {
711f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            onDiscardResult(oldResult);
721f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
731f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    }
741f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
751f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    @Override
761f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    protected void onReset() {
771f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        super.onReset();
781f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
791f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        onStopLoading();
801f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
811f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (mResult != null) {
821f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            onDiscardResult(mResult);
831f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
841f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        mResult = null;
851f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    }
861f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
871f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    @Override
881f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    public void onCanceled(final T data) {
891f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        super.onCanceled(data);
901f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
911f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        if (data != null) {
921f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler            onDiscardResult(data);
931f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler        }
941f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    }
951f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler
961f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    /**
971f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     * Called when discarding the load results so subclasses can take care of clean-up or
981f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     * recycling tasks. This is not called if the same result (by way of pointer equality) is
991f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     * returned again by a subsequent call to loadInBackground, or if result is null.
1001f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     *
1011f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     * Note that this may be called concurrently with loadInBackground(), and in some circumstances
1021f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     * may be called more than once for a given object.
1031f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     *
1041f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     * @param result The value returned from {@link MailAsyncTaskLoader#loadInBackground()} which
1051f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     *               is to be discarded.
1061f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler     */
1071f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler    protected abstract void onDiscardResult(final T result);
1081f1239b94b2417fc9395f7b2139dc2180aaf3578Tony Mantler}
109