From 2bd8b88254da627295bb6a06b8793e13a6e010c2 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Wed, 6 Nov 2013 23:43:11 +0100 Subject: [PATCH] Added auto refresh to the activity OnResume creates an AsyncTask which keeps running until cancelled. It requests server updates with a delay of two seconds between each update. OnPause cancels the AsyncTask. To handle multiselect gracefully, the fragment requests the auto refresh to be paused. This pause is remembered between resets, as long as the multiselect mode is active. Once the users selects an action or exits multiselect, the auto refresh resumes. There are probably several things I haven't thought of, and there should be a user setting for this maybe. Signed-off-by: Jonas Kalderstam --- .../transdroid/core/gui/TorrentsActivity.java | 56 +++++++++++++++++++ .../transdroid/core/gui/TorrentsFragment.java | 6 ++ 2 files changed, 62 insertions(+) diff --git a/core/src/org/transdroid/core/gui/TorrentsActivity.java b/core/src/org/transdroid/core/gui/TorrentsActivity.java index 3f86df82..8493cf64 100644 --- a/core/src/org/transdroid/core/gui/TorrentsActivity.java +++ b/core/src/org/transdroid/core/gui/TorrentsActivity.java @@ -103,6 +103,7 @@ import android.app.SearchManager; import android.content.ContentResolver; import android.content.Intent; import android.net.Uri; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.view.View; @@ -169,6 +170,11 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi protected TorrentsFragment fragmentTorrents; @FragmentById(resName = "torrent_details") protected DetailsFragment fragmentDetails; + + // Auto refresh task. Could be replaced by @Background(id="task-id") + private AsyncTask autoRefreshTask; + // Fragment uses this to pause the refresh across restarts + public boolean stopRefresh = false; @Override public void onCreate(Bundle savedInstanceState) { @@ -274,6 +280,8 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi @Override protected void onResume() { super.onResume(); + // Start auto refresh + startAutoRefresh(); // Refresh server settings navigationSpinnerAdapter.updateServers(applicationSettings.getAllServerSettings()); @@ -300,6 +308,54 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi fragmentTorrents.quickUpdateTorrent(affected, result.getBooleanExtra("torrent_removed", false)); } } + + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public void startAutoRefresh() { + // Check if already running + if (autoRefreshTask != null || stopRefresh) + return; + + autoRefreshTask = new AsyncTask() { + @Override + protected Void doInBackground(Void... params) { + while (!isCancelled()) { + // X seconds seems reasonable if someone actually wants real time updates + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + // Ignore + } + // Just in case it was cancelled during sleep + if (isCancelled()) + return null; + + refreshTorrents(); + if (Daemon.supportsStats(currentConnection.getType())) + getAdditionalStats(); + } + return null; + } + + }; + // Executes serially by default on Honeycomb, was parallel before + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + autoRefreshTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); + else + autoRefreshTask.execute(); + } + + public void stopAutoRefresh() { + if (autoRefreshTask != null) + autoRefreshTask.cancel(true); + autoRefreshTask = null; + } + + @Override + protected void onPause() { + stopAutoRefresh(); + super.onPause(); + } @Override protected void onDestroy() { diff --git a/core/src/org/transdroid/core/gui/TorrentsFragment.java b/core/src/org/transdroid/core/gui/TorrentsFragment.java index c84bdadc..f8e8e049 100644 --- a/core/src/org/transdroid/core/gui/TorrentsFragment.java +++ b/core/src/org/transdroid/core/gui/TorrentsFragment.java @@ -261,6 +261,9 @@ public class TorrentsFragment extends SherlockFragment implements OnLabelPickedL menu.findItem(R.id.action_stop).setVisible(Daemon.supportsStoppingStarting(daemonType)); menu.findItem(R.id.action_setlabel).setVisible(Daemon.supportsSetLabel(daemonType)); } + // Pause autorefresh + ((TorrentsActivity) getActivity()).stopRefresh = true; + ((TorrentsActivity) getActivity()).stopAutoRefresh(); return true; } @@ -329,6 +332,9 @@ public class TorrentsFragment extends SherlockFragment implements OnLabelPickedL @Override public void onDestroyActionMode(ActionMode mode) { + // Resume autorefresh + ((TorrentsActivity) getActivity()).stopRefresh = false; + ((TorrentsActivity) getActivity()).startAutoRefresh(); selectionManagerMode.onDestroyActionMode(mode); }