package androidx.loader.content; import android.content.Context; import android.os.Handler; import android.os.SystemClock; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RestrictTo; import androidx.core.os.OperationCanceledException; import androidx.core.util.TimeUtils; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; public abstract class AsyncTaskLoader extends Loader { public static final boolean DEBUG = false; public static final String TAG = "AsyncTaskLoader"; public volatile AsyncTaskLoader.LoadTask mCancellingTask; private final Executor mExecutor; public Handler mHandler; public long mLastLoadCompleteTime; public volatile AsyncTaskLoader.LoadTask mTask; public long mUpdateThrottle; public final class LoadTask extends ModernAsyncTask implements Runnable { private final CountDownLatch mDone = new CountDownLatch(1); public boolean waiting; public LoadTask() { } public D doInBackground(Void... voidArr) { try { return (D) AsyncTaskLoader.this.onLoadInBackground(); } catch (OperationCanceledException e) { if (isCancelled()) { return null; } throw e; } } @Override // androidx.loader.content.ModernAsyncTask public void onCancelled(D d) { try { AsyncTaskLoader.this.dispatchOnCancelled(this, d); } finally { this.mDone.countDown(); } } @Override // androidx.loader.content.ModernAsyncTask public void onPostExecute(D d) { try { AsyncTaskLoader.this.dispatchOnLoadComplete(this, d); } finally { this.mDone.countDown(); } } @Override // java.lang.Runnable public void run() { this.waiting = false; AsyncTaskLoader.this.executePendingTask(); } public void waitForLoader() { try { this.mDone.await(); } catch (InterruptedException unused) { } } } public AsyncTaskLoader(@NonNull Context context) { this(context, ModernAsyncTask.THREAD_POOL_EXECUTOR); } private AsyncTaskLoader(@NonNull Context context, @NonNull Executor executor) { super(context); this.mLastLoadCompleteTime = -10000; this.mExecutor = executor; } public void cancelLoadInBackground() { } public void dispatchOnCancelled(AsyncTaskLoader.LoadTask loadTask, D d) { onCanceled(d); if (this.mCancellingTask == loadTask) { rollbackContentChanged(); this.mLastLoadCompleteTime = SystemClock.uptimeMillis(); this.mCancellingTask = null; deliverCancellation(); executePendingTask(); } } public void dispatchOnLoadComplete(AsyncTaskLoader.LoadTask loadTask, D d) { if (this.mTask != loadTask) { dispatchOnCancelled(loadTask, d); } else if (isAbandoned()) { onCanceled(d); } else { commitContentChanged(); this.mLastLoadCompleteTime = SystemClock.uptimeMillis(); this.mTask = null; deliverResult(d); } } @Override // androidx.loader.content.Loader @Deprecated public void dump(String str, FileDescriptor fileDescriptor, PrintWriter printWriter, String[] strArr) { super.dump(str, fileDescriptor, printWriter, strArr); if (this.mTask != null) { printWriter.print(str); printWriter.print("mTask="); printWriter.print(this.mTask); printWriter.print(" waiting="); printWriter.println(this.mTask.waiting); } if (this.mCancellingTask != null) { printWriter.print(str); printWriter.print("mCancellingTask="); printWriter.print(this.mCancellingTask); printWriter.print(" waiting="); printWriter.println(this.mCancellingTask.waiting); } if (this.mUpdateThrottle != 0) { printWriter.print(str); printWriter.print("mUpdateThrottle="); TimeUtils.formatDuration(this.mUpdateThrottle, printWriter); printWriter.print(" mLastLoadCompleteTime="); TimeUtils.formatDuration(this.mLastLoadCompleteTime, SystemClock.uptimeMillis(), printWriter); printWriter.println(); } } public void executePendingTask() { if (this.mCancellingTask == null && this.mTask != null) { if (this.mTask.waiting) { this.mTask.waiting = false; this.mHandler.removeCallbacks(this.mTask); } if (this.mUpdateThrottle <= 0 || SystemClock.uptimeMillis() >= this.mLastLoadCompleteTime + this.mUpdateThrottle) { this.mTask.executeOnExecutor(this.mExecutor, null); return; } this.mTask.waiting = true; this.mHandler.postAtTime(this.mTask, this.mLastLoadCompleteTime + this.mUpdateThrottle); } } public boolean isLoadInBackgroundCanceled() { return this.mCancellingTask != null; } @Nullable public abstract D loadInBackground(); @Override // androidx.loader.content.Loader public boolean onCancelLoad() { if (this.mTask == null) { return false; } if (!this.mStarted) { this.mContentChanged = true; } if (this.mCancellingTask != null) { if (this.mTask.waiting) { this.mTask.waiting = false; this.mHandler.removeCallbacks(this.mTask); } this.mTask = null; return false; } else if (this.mTask.waiting) { this.mTask.waiting = false; this.mHandler.removeCallbacks(this.mTask); this.mTask = null; return false; } else { boolean cancel = this.mTask.cancel(false); if (cancel) { this.mCancellingTask = this.mTask; cancelLoadInBackground(); } this.mTask = null; return cancel; } } public void onCanceled(@Nullable D d) { } @Override // androidx.loader.content.Loader public void onForceLoad() { super.onForceLoad(); cancelLoad(); this.mTask = new LoadTask(); executePendingTask(); } @Nullable public D onLoadInBackground() { return loadInBackground(); } public void setUpdateThrottle(long j) { this.mUpdateThrottle = j; if (j != 0) { this.mHandler = new Handler(); } } @RestrictTo({RestrictTo.Scope.LIBRARY_GROUP}) public void waitForLoader() { AsyncTaskLoader.LoadTask loadTask = this.mTask; if (loadTask != null) { loadTask.waitForLoader(); } } }