blob: 76c99fa4793a3cb8a393ecdd2aab7cd779038b5e [file] [log] [blame]
Daniel Nishi2ef20fb2016-05-11 12:54:13 -07001/*
2 * Copyright (C) 2016 Google Inc.
3 * Licensed to The Android Open Source Project.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.settings.utils;
19
20import android.content.AsyncTaskLoader;
21import android.content.Context;
22
23/**
24 * This class fills in some boilerplate for AsyncTaskLoader to actually load things.
25 *
26 * Subclasses need to implement {@link AsyncLoader#loadInBackground()} to perform the actual
27 * background task, and {@link AsyncLoader#onDiscardResult(T)} to clean up previously loaded
28 * results.
29 *
30 * This loader is based on the MailAsyncTaskLoader from the AOSP EmailUnified repo.
31 */
32public abstract class AsyncLoader<T> extends AsyncTaskLoader<T> {
33 private T mResult;
34
35 public AsyncLoader(final Context context) {
36 super(context);
37 }
38
39 @Override
40 protected void onStartLoading() {
41 if (mResult != null) {
42 deliverResult(mResult);
43 }
44
45 if (takeContentChanged() || mResult == null) {
46 forceLoad();
47 }
48 }
49
50 @Override
51 protected void onStopLoading() {
52 cancelLoad();
53 }
54
55 @Override
56 public void deliverResult(final T data) {
57 if (isReset()) {
58 if (data != null) {
59 onDiscardResult(data);
60 }
61 return;
62 }
63
64 final T oldResult = mResult;
65 mResult = data;
66
67 if (isStarted()) {
68 super.deliverResult(data);
69 }
70
71 if (oldResult != null && oldResult != mResult) {
72 onDiscardResult(oldResult);
73 }
74 }
75
76 @Override
77 protected void onReset() {
78 super.onReset();
79
80 onStopLoading();
81
82 if (mResult != null) {
83 onDiscardResult(mResult);
84 }
85 mResult = null;
86 }
87
88 @Override
89 public void onCanceled(final T data) {
90 super.onCanceled(data);
91
92 if (data != null) {
93 onDiscardResult(data);
94 }
95 }
96
97 /**
98 * Called when discarding the load results so subclasses can take care of clean-up or
99 * recycling tasks. This is not called if the same result (by way of pointer equality) is
100 * returned again by a subsequent call to loadInBackground, or if result is null.
101 *
102 * Note that this may be called concurrently with loadInBackground(), and in some circumstances
103 * may be called more than once for a given object.
104 *
105 * @param result The value returned from {@link AsyncLoader#loadInBackground()} which
106 * is to be discarded.
107 */
108 protected abstract void onDiscardResult(final T result);
109}