package org.commcare.fragments; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.support.v4.app.Fragment; import android.util.Log; import org.commcare.activities.CommCareActivity; import org.commcare.tasks.templates.CommCareTask; /** * Hold a reference to current task to report its progress and results The * Android framework will pass us a reference to the newly created Activity * after each configuration change. * * @author ctsims */ public class TaskConnectorFragment<R> extends Fragment { private CommCareTask<?, ?, ?, R> currentTask; private WakeLock wakelock; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof CommCareActivity) { if (isCurrentTaskRunning()) { CommCareActivity activity = (CommCareActivity)context; // connecting to a task requires the activity's state holder to // be set; which we're in the middle of, so take a shortcut activity.setStateHolder(this); this.currentTask.connect(activity); } } } private boolean isCurrentTaskRunning() { return this.currentTask != null && this.currentTask.getStatus() == AsyncTask.Status.RUNNING; } @Override public void onDetach() { super.onDetach(); if (currentTask != null) { Log.i("CommCareUI", "Detaching activity from current task: " + this.currentTask); currentTask.disconnect(); releaseWakeLock(); } } public void cancelTask() { if (currentTask != null) { currentTask.cancel(false); currentTask.tryAbort(); } } private synchronized void acquireWakeLock(CommCareActivity activity) { int lockLevel = activity.getWakeLockLevel(); if (lockLevel != CommCareTask.DONT_WAKELOCK) { releaseWakeLock(); PowerManager pm = (PowerManager)activity.getSystemService(Context.POWER_SERVICE); wakelock = pm.newWakeLock(lockLevel, "CommCareLock"); wakelock.acquire(); } } public synchronized void releaseWakeLock() { if (wakelock != null && wakelock.isHeld()) { wakelock.release(); } wakelock = null; } public void connectTask(CommCareTask<?, ?, ?, R> task, CommCareActivity activity) { acquireWakeLock(activity); this.currentTask = task; } }