diff --git a/Chan/res/values/strings.xml b/Chan/res/values/strings.xml
index 758742ee..4f240abb 100644
--- a/Chan/res/values/strings.xml
+++ b/Chan/res/values/strings.xml
@@ -104,9 +104,11 @@
Off
Watching pinned threads
-
- To view the thread watcher options, turn the thread watcher on.
-
+ To watch pins for new posts, turn the thread watcher on.
+
+ Enable in the background
+ Watching pins when Chan is in the background
+ Not watching when Chan is in the background
Time between reloads in background
- 1 minute
diff --git a/Chan/res/xml/preference_watch.xml b/Chan/res/xml/preference_watch.xml
index a41b73f9..02cddb4f 100644
--- a/Chan/res/xml/preference_watch.xml
+++ b/Chan/res/xml/preference_watch.xml
@@ -1,12 +1,20 @@
-
+
+
+ android:entryValues="@array/watch_background_timeouts_int"
+ android:key="preference_watch_background_timeout"
+ android:summary="Foo"
+ android:title="@string/watch_background_timeout_description" />
-
+
\ No newline at end of file
diff --git a/Chan/src/org/floens/chan/core/ChanPreferences.java b/Chan/src/org/floens/chan/core/ChanPreferences.java
index 77111290..47caf835 100644
--- a/Chan/src/org/floens/chan/core/ChanPreferences.java
+++ b/Chan/src/org/floens/chan/core/ChanPreferences.java
@@ -29,7 +29,7 @@ public class ChanPreferences {
}
public static boolean getWatchEnabled() {
- return ChanApplication.getPreferences().getBoolean("preference_watch_enabled", true);
+ return ChanApplication.getPreferences().getBoolean("preference_watch_enabled", false);
}
/**
@@ -46,8 +46,17 @@ public class ChanPreferences {
}
}
+ public static boolean getWatchBackgroundEnabled() {
+ return ChanApplication.getPreferences().getBoolean("preference_watch_background_enabled", true);
+ }
+
public static long getWatchBackgroundTimeout() {
String number = ChanApplication.getPreferences().getString("preference_watch_background_timeout", "0");
return Integer.parseInt(number) * 1000L;
}
}
+
+
+
+
+
diff --git a/Chan/src/org/floens/chan/core/watch/PinWatcher.java b/Chan/src/org/floens/chan/core/watch/PinWatcher.java
index 00eca50c..e0ad2799 100644
--- a/Chan/src/org/floens/chan/core/watch/PinWatcher.java
+++ b/Chan/src/org/floens/chan/core/watch/PinWatcher.java
@@ -56,7 +56,7 @@ public class PinWatcher implements Loader.LoaderListener {
pin.watchLastCount = 0;
pin.watchNewCount = 0;
- WatchService.callOnPinsChanged();
+ WatchService.onPinWatcherResult();
}
@Override
@@ -73,6 +73,6 @@ public class PinWatcher implements Loader.LoaderListener {
pin.watchNewCount = count;
- WatchService.callOnPinsChanged();
+ WatchService.onPinWatcherResult();
}
}
diff --git a/Chan/src/org/floens/chan/core/watch/WatchNotifier.java b/Chan/src/org/floens/chan/core/watch/WatchNotifier.java
index a6bb5cb4..378f91bc 100644
--- a/Chan/src/org/floens/chan/core/watch/WatchNotifier.java
+++ b/Chan/src/org/floens/chan/core/watch/WatchNotifier.java
@@ -28,6 +28,10 @@ public class WatchNotifier {
nm = (NotificationManager) pinnedService.getSystemService(Context.NOTIFICATION_SERVICE);
}
+ public void destroy() {
+ nm.cancel(NOTIFICATION_ID);
+ }
+
public void update() {
if (!WatchService.getActivityInForeground()) {
prepareNotification();
diff --git a/Chan/src/org/floens/chan/service/WatchService.java b/Chan/src/org/floens/chan/service/WatchService.java
index cc807790..31d3ba9a 100644
--- a/Chan/src/org/floens/chan/service/WatchService.java
+++ b/Chan/src/org/floens/chan/service/WatchService.java
@@ -17,6 +17,8 @@ import android.os.Looper;
import android.widget.Toast;
public class WatchService extends Service {
+ private static final String TAG = "WatchService";
+
private static final long FOREGROUND_INTERVAL = 10000L;
private static WatchService instance;
@@ -76,6 +78,8 @@ public class WatchService extends Service {
for (Pin pin : pins) {
pin.destroyWatcher();
}
+
+ instance.watchNotifier.destroy();
}
}
@@ -83,11 +87,14 @@ public class WatchService extends Service {
return instance != null;
}
- public static void callOnPinsChanged() {
+ public static void onPinWatcherResult() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
ChanApplication.getPinnedManager().onPinsChanged();
+ if (instance != null) {
+ instance.watchNotifier.update();
+ }
}
});
}
@@ -100,6 +107,8 @@ public class WatchService extends Service {
watchNotifier = new WatchNotifier(this);
+ Logger.i(TAG, "WatchService created");
+
startThread();
}
@@ -107,6 +116,7 @@ public class WatchService extends Service {
public void onDestroy() {
super.onDestroy();
+
instance = null;
running = false;
@@ -114,6 +124,8 @@ public class WatchService extends Service {
loadThread.interrupt();
Toast.makeText(getApplicationContext(), "Pinned thread interrupted", Toast.LENGTH_SHORT).show();
}
+
+ Logger.i(TAG, "WatchService destroyed");
}
private void startThread() {
@@ -124,7 +136,7 @@ public class WatchService extends Service {
@Override
public void run() {
while (running) {
- Logger.test("Loadthread iteration");
+ Logger.d(TAG, "Loadthread loop");
update();
@@ -132,12 +144,21 @@ public class WatchService extends Service {
return;
long timeout = activityInForeground ? FOREGROUND_INTERVAL : getBackgroundTimeout();
-
- try {
- Thread.sleep(timeout);
- } catch (InterruptedException e) {
- if (!running) {
- return;
+ if (timeout < 0L) {
+ Logger.d(TAG, "Waiting for interrupt...");
+ try {
+ Object o = new Object();
+ synchronized (o) {
+ o.wait();
+ }
+ } catch (InterruptedException e) {
+ Logger.d(TAG, "Interrupted!");
+ }
+ } else {
+ try {
+ Thread.sleep(timeout);
+ } catch (InterruptedException e) {
+ Logger.d(TAG, "Interrupted!");
}
}
}
@@ -160,9 +181,16 @@ public class WatchService extends Service {
watchNotifier.onForegroundChanged();
}
+ /**
+ * Returns the sleep time the user specified for background iteration
+ * @return the sleep time in ms, or -1 if background reloading is disabled
+ */
private long getBackgroundTimeout() {
- Logger.test("::: " + ChanPreferences.getWatchBackgroundTimeout());
- return ChanPreferences.getWatchBackgroundTimeout();
+ if (ChanPreferences.getWatchBackgroundEnabled()) {
+ return ChanPreferences.getWatchBackgroundTimeout();
+ } else {
+ return -1;
+ }
}
private void update() {
@@ -170,8 +198,6 @@ public class WatchService extends Service {
for (Pin pin : pins) {
pin.updateWatch();
}
-
- watchNotifier.update();
}
@Override
diff --git a/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java b/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java
index 4c353e30..0d960509 100644
--- a/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java
+++ b/Chan/src/org/floens/chan/ui/activity/WatchSettingsActivity.java
@@ -10,6 +10,9 @@ import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceFragment;
import android.view.Gravity;
import android.view.LayoutInflater;
@@ -108,19 +111,33 @@ public class WatchSettingsActivity extends Activity implements OnCheckedChangeLi
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference_watch);
- }
-
- }
-
-}
-
-
-
-
-
-
+ // final Preference backgroundEnabled =
+ // findPreference("preference_watch_background_enabled");
+ final ListPreference backgroundTimeout = (ListPreference) findPreference("preference_watch_background_timeout");
+ String currentValue = backgroundTimeout.getValue();
+ if (currentValue == null) {
+ backgroundTimeout.setValue((String) backgroundTimeout.getEntryValues()[0]);
+ currentValue = backgroundTimeout.getValue();
+ }
+ updateListSummary(backgroundTimeout, currentValue.toString());
+
+ // Timeout is reset when board activity is started
+ backgroundTimeout.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ updateListSummary(backgroundTimeout, newValue.toString());
+ return true;
+ }
+ });
+ }
+ private void updateListSummary(ListPreference backgroundTimeout, String value) {
+ int index = backgroundTimeout.findIndexOfValue(value);
+ backgroundTimeout.setSummary(backgroundTimeout.getEntries()[index]);
+ }
+ }
+}