package org.commcare.tasks; import org.commcare.tasks.templates.ManagedAsyncTask; /** * Base implementation for a singleton task that reports progress and results * through a TaskListener. Handles clearing pointer to static task via * extender's implementation of clearTaskInstance. */ public abstract class SingletonTask<Params, Progress, Result> extends ManagedAsyncTask<Params, Progress, Result> { protected static String TAG; private TaskListener<Progress, Result> taskListener = null; /** * Clears pointer to the singleton class instance in a thread-safe manner */ protected abstract void clearTaskInstance(); @Override protected void onProgressUpdate(Progress... values) { super.onProgressUpdate(values); if (taskListener != null) { taskListener.handleTaskUpdate(values); } } @Override protected void onPostExecute(Result result) { super.onPostExecute(result); if (taskListener != null) { taskListener.handleTaskCompletion(result); } clearTaskInstance(); } @Override protected void onCancelled(Result result) { if (android.os.Build.VERSION.SDK_INT >= 11) { super.onCancelled(result); } else { super.onCancelled(); } if (taskListener != null) { taskListener.handleTaskCancellation(); } clearTaskInstance(); } /** * Start reporting progress with a listener process. * * @throws TaskListenerRegistrationException If this task was already * registered with a listener */ public void registerTaskListener(TaskListener<Progress, Result> listener) throws TaskListenerRegistrationException { if (taskListener != null) { throw new TaskListenerRegistrationException("This " + TAG + " was already registered with a TaskListener"); } taskListener = listener; } /** * Stop reporting progress with a listener process * * @throws TaskListenerRegistrationException If this task wasn't registered * with the unregistering listener. */ public void unregisterTaskListener(TaskListener<Progress, Result> listener) throws TaskListenerRegistrationException { if (listener != taskListener) { throw new TaskListenerRegistrationException("The provided listener wasn't " + "registered with this " + TAG); } taskListener = null; } }