diff --git a/Chan/AndroidManifest.xml b/Chan/AndroidManifest.xml index 935eafa5..2c7fbbdc 100644 --- a/Chan/AndroidManifest.xml +++ b/Chan/AndroidManifest.xml @@ -53,6 +53,14 @@ android:name="android.support.PARENT_ACTIVITY" android:value="org.floens.chan.activity.BoardActivity" /> + + + + + + + + + \ No newline at end of file diff --git a/Chan/res/values/strings.xml b/Chan/res/values/strings.xml index b2144f34..f01974a4 100644 --- a/Chan/res/values/strings.xml +++ b/Chan/res/values/strings.xml @@ -88,6 +88,8 @@ Error deleting post Only delete the image + Thread watcher + General Ask before opening links Default name @@ -100,4 +102,10 @@ Open link? + Off + Watching pinned threads + + To view the thread watcher options, turn the thread watcher on. + + diff --git a/Chan/res/xml/preference.xml b/Chan/res/xml/preference.xml index 63b7699c..7f899874 100644 --- a/Chan/res/xml/preference.xml +++ b/Chan/res/xml/preference.xml @@ -1,57 +1,52 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + android:key="about_licences" + android:summary="@string/preference_licences_summary" + android:title="@string/preference_licenses" /> - + android:key="about_version" + android:title="Chan" /> + android:key="about_developer" + android:title="@string/preference_developer" > + android:action="android.intent.action.VIEW" + android:targetClass="org.floens.chan.activity.DeveloperActivity" + android:targetPackage="org.floens.chan" /> - - - - - - + \ No newline at end of file diff --git a/Chan/src/org/floens/chan/ChanApplication.java b/Chan/src/org/floens/chan/ChanApplication.java index c4da0ed0..643545d9 100644 --- a/Chan/src/org/floens/chan/ChanApplication.java +++ b/Chan/src/org/floens/chan/ChanApplication.java @@ -8,7 +8,6 @@ import org.floens.chan.service.PinnedService; import org.floens.chan.utils.IconCache; import android.app.Application; -import android.content.Intent; import android.content.SharedPreferences; import android.os.StrictMode; import android.preference.PreferenceManager; @@ -72,7 +71,7 @@ public class ChanApplication extends Application { new PinnedManager(this); new ReplyManager(this); - startService(new Intent(this, PinnedService.class)); + PinnedService.startStopAccordingToSettings(this); } } diff --git a/Chan/src/org/floens/chan/activity/WatchSettingsActivity.java b/Chan/src/org/floens/chan/activity/WatchSettingsActivity.java new file mode 100644 index 00000000..6776696e --- /dev/null +++ b/Chan/src/org/floens/chan/activity/WatchSettingsActivity.java @@ -0,0 +1,108 @@ +package org.floens.chan.activity; + +import org.floens.chan.R; +import org.floens.chan.utils.ChanPreferences; +import org.floens.chan.utils.Utils; + +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentTransaction; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.preference.PreferenceFragment; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.LinearLayout; +import android.widget.Switch; +import android.widget.TextView; + +public class WatchSettingsActivity extends Activity implements OnCheckedChangeListener { + private Switch watchSwitch; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.watch_settings, menu); + + watchSwitch = (Switch) menu.findItem(R.id.enable_watch_switch).getActionView(); + watchSwitch.setOnCheckedChangeListener(this); + watchSwitch.setPadding(0, 0, Utils.dp(this, 20), 0); + + setEnabled(ChanPreferences.getWatchEnabled()); + + return true; + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + setEnabled(isChecked); + } + + private void setEnabled(boolean enabled) { + if (enabled) { + FragmentTransaction t = getFragmentManager().beginTransaction(); + t.replace(android.R.id.content, new WatchSettingsFragment()); + t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); + t.commit(); + } else { + FragmentTransaction t = getFragmentManager().beginTransaction(); + t.replace(android.R.id.content, TextFragment.newInstance(R.string.watch_info_text)); + t.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); + t.commit(); + } + + watchSwitch.setChecked(enabled); + + ChanPreferences.setWatchEnabled(enabled); + + watchSwitch.setEnabled(false); + new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { + @Override + public void run() { + watchSwitch.setEnabled(true); + } + }, 500); + } + + public static class TextFragment extends Fragment { + public static TextFragment newInstance(int textResource) { + TextFragment f = new TextFragment(); + Bundle bundle = new Bundle(); + bundle.putInt("text_resource", textResource); + f.setArguments(bundle); + return f; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle savedInstanceState) { + LinearLayout container = new LinearLayout(inflater.getContext()); + + int p = Utils.dp(inflater.getContext(), 20); + container.setPadding(p, p, p, p); + + TextView text = new TextView(inflater.getContext()); + text.setTextSize(20); + text.setText(getArguments().getInt("text_resource")); + + container.setGravity(Gravity.CENTER); + container.addView(text); + + return container; + } + } + + public static class WatchSettingsFragment extends PreferenceFragment { + + } + +} diff --git a/Chan/src/org/floens/chan/fragment/SettingsFragment.java b/Chan/src/org/floens/chan/fragment/SettingsFragment.java index acbf81ac..9d337c25 100644 --- a/Chan/src/org/floens/chan/fragment/SettingsFragment.java +++ b/Chan/src/org/floens/chan/fragment/SettingsFragment.java @@ -15,27 +15,27 @@ import android.widget.Toast; public class SettingsFragment extends PreferenceFragment { private int clickCount = 0; - + private Preference developerPreference; - + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + addPreferencesFromResource(R.xml.preference); - + Preference aboutLicences = findPreference("about_licences"); if (aboutLicences != null) { aboutLicences.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { startActivity(new Intent(getActivity(), AboutActivity.class)); - + return true; } }); } - + Preference aboutVersion = findPreference("about_version"); if (aboutVersion != null) { aboutVersion.setOnPreferenceClickListener(new OnPreferenceClickListener() { @@ -43,35 +43,45 @@ public class SettingsFragment extends PreferenceFragment { public boolean onPreferenceClick(Preference preference) { if (++clickCount >= 5) { clickCount = 0; - + boolean enabled = !ChanPreferences.getDeveloper(); ChanPreferences.setDeveloper(enabled); updateDeveloperPreference(); - - Toast.makeText(getActivity(), + + Toast.makeText(getActivity(), (enabled ? "Enabled " : "Disabled ") + "developer options", Toast.LENGTH_LONG).show(); } - + return true; } }); - + String version = ""; try { version = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0).versionName; } catch (NameNotFoundException e) { e.printStackTrace(); } - + aboutVersion.setTitle(R.string.app_name); aboutVersion.setSummary(version); } - + developerPreference = findPreference("about_developer"); ((PreferenceGroup) findPreference("group_about")).removePreference(developerPreference); updateDeveloperPreference(); } - + + @Override + public void onResume() { + super.onResume(); + + final Preference watchPreference = findPreference("watch_settings"); + if (watchPreference != null) { + watchPreference.setSummary(ChanPreferences.getWatchEnabled() ? R.string.watch_summary_enabled : R.string.watch_summary_disabled); + } + } + private void updateDeveloperPreference() { if (ChanPreferences.getDeveloper()) { ((PreferenceGroup) findPreference("group_about")).addPreference(developerPreference); diff --git a/Chan/src/org/floens/chan/loader/Loader.java b/Chan/src/org/floens/chan/loader/Loader.java index 61cc59aa..87e237eb 100644 --- a/Chan/src/org/floens/chan/loader/Loader.java +++ b/Chan/src/org/floens/chan/loader/Loader.java @@ -200,8 +200,6 @@ public class Loader { private void onData(List result) { if (destroyed) return; - Logger.test("ondata in loader"); - postsById.clear(); for (Post post : result) { postsById.append(post.no, post); diff --git a/Chan/src/org/floens/chan/manager/ThreadManager.java b/Chan/src/org/floens/chan/manager/ThreadManager.java index 212ec13b..8905d872 100644 --- a/Chan/src/org/floens/chan/manager/ThreadManager.java +++ b/Chan/src/org/floens/chan/manager/ThreadManager.java @@ -38,10 +38,9 @@ import android.widget.Toast; import com.android.volley.VolleyError; /** - * All PostView's need to have this referenced. - * This manages some things like pages, starting and stopping of loading, - * handling linkables, replies popups etc. - * onDestroy, onStart and onStop must be called from the activity/fragment + * All PostView's need to have this referenced. This manages some things like + * pages, starting and stopping of loading, handling linkables, replies popups + * etc. onDestroy, onStart and onStop must be called from the activity/fragment */ public class ThreadManager implements Loader.LoaderListener { private static final String TAG = "ThreadManager"; @@ -54,8 +53,8 @@ public class ThreadManager implements Loader.LoaderListener { private Loader loader; - public ThreadManager(Activity context, final ThreadManagerListener listener) { - activity = context; + public ThreadManager(Activity activity, final ThreadManagerListener listener) { + this.activity = activity; threadManagerListener = listener; } @@ -137,12 +136,14 @@ public class ThreadManager implements Loader.LoaderListener { } public Post findPostById(int id) { - if (loader == null) return null; + if (loader == null) + return null; return loader.findPostById(id); } public Loadable getLoadable() { - if (loader == null) return null; + if (loader == null) + return null; return loader.getLoadable(); } @@ -178,7 +179,7 @@ public class ThreadManager implements Loader.LoaderListener { builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - switch(which) { + switch (which) { case 0: // Reply openReply(true); // todo if tablet // Pass through @@ -205,7 +206,8 @@ public class ThreadManager implements Loader.LoaderListener { } public void openReply(boolean startInActivity) { - if (loader == null) return; + if (loader == null) + return; if (startInActivity) { ReplyActivity.setLoadable(loader.getLoadable()); @@ -246,7 +248,7 @@ public class ThreadManager implements Loader.LoaderListener { text += "File: " + post.filename + " \nSize: " + post.imageWidth + "x" + post.imageHeight + "\n\n"; } - text += "Time: " + post.date ; + text += "Time: " + post.date; if (!TextUtils.isEmpty(post.id)) { text += "\nId: " + post.id; @@ -268,24 +270,23 @@ public class ThreadManager implements Loader.LoaderListener { text += "\nCapcode: " + post.capcode; } - AlertDialog dialog = new AlertDialog.Builder(activity) - .setTitle(R.string.post_info) - .setMessage(text) - .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }) - .create(); + AlertDialog dialog = new AlertDialog.Builder(activity).setTitle(R.string.post_info).setMessage(text) + .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }).create(); dialog.show(); } /** - * When the user clicks a post: - * a. when there's one linkable, open the linkable. - * b. when there's more than one linkable, show the user multiple options to select from. - * @param post The post that was clicked. + * When the user clicks a post: a. when there's one linkable, open the + * linkable. b. when there's more than one linkable, show the user multiple + * options to select from. + * + * @param post + * The post that was clicked. */ public void showPostLinkables(Post post) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); @@ -329,7 +330,9 @@ public class ThreadManager implements Loader.LoaderListener { /** * Handle when a linkable has been clicked. - * @param linkable the selected linkable. + * + * @param linkable + * the selected linkable. */ private void handleLinkableSelected(final PostLinkable linkable) { if (linkable.type == PostLinkable.Type.QUOTE) { @@ -337,20 +340,16 @@ public class ThreadManager implements Loader.LoaderListener { } else if (linkable.type == PostLinkable.Type.LINK) { if (ChanPreferences.getOpenLinkConfirmation()) { AlertDialog dialog = new AlertDialog.Builder(activity) - .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - openLink(linkable); - } - }) - .setTitle(R.string.open_link_confirmation) - .setMessage(linkable.value) - .create(); + .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + openLink(linkable); + } + }).setTitle(R.string.open_link_confirmation).setMessage(linkable.value).create(); dialog.show(); } else { @@ -360,9 +359,11 @@ public class ThreadManager implements Loader.LoaderListener { } /** - * When a linkable to a post has been clicked, - * show a dialog with the referenced post in it. - * @param linkable the clicked linkable. + * When a linkable to a post has been clicked, show a dialog with the + * referenced post in it. + * + * @param linkable + * the clicked linkable. */ private void showPostReply(PostLinkable linkable) { String value = linkable.value; @@ -383,21 +384,24 @@ public class ThreadManager implements Loader.LoaderListener { showPostsRepliesFragment(l); } } - } catch(NumberFormatException e) { + } catch (NumberFormatException e) { e.printStackTrace(); } } /** * Open an url. - * @param linkable Linkable with an url. + * + * @param linkable + * Linkable with an url. */ private void openLink(PostLinkable linkable) { activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(linkable.value))); } private void showPostsRepliesFragment(List list) { - // Post popups are now queued up, more than 32 popups on top of each other makes the system crash! + // Post popups are now queued up, more than 32 popups on top of each + // other makes the system crash! popupQueue.add(list); if (currentPopupFragment != null) { @@ -414,7 +418,8 @@ public class ThreadManager implements Loader.LoaderListener { } public void onPostRepliesPop() { - if (popupQueue.size() == 0) return; + if (popupQueue.size() == 0) + return; popupQueue.remove(popupQueue.size() - 1); @@ -442,30 +447,26 @@ public class ThreadManager implements Loader.LoaderListener { int padding = activity.getResources().getDimensionPixelSize(R.dimen.general_padding); view.setPadding(padding, padding, padding, padding); - new AlertDialog.Builder(activity) - .setTitle(R.string.delete_confirm) - .setView(view) - .setPositiveButton(R.string.delete, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - doDeletePost(post, view.isChecked()); - } - }) - .setNegativeButton(R.string.cancel, new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }) - .show(); + new AlertDialog.Builder(activity).setTitle(R.string.delete_confirm).setView(view) + .setPositiveButton(R.string.delete, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + doDeletePost(post, view.isChecked()); + } + }).setNegativeButton(R.string.cancel, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }).show(); } private void doDeletePost(Post post, boolean onlyImageDelete) { SavedReply reply = DatabaseManager.getInstance().getSavedReply(post.board, post.no); if (reply == null) { - /*reply = new SavedReply(); - reply.board = "g"; - reply.no = 1234; - reply.password = "boom";*/ + /* + * reply = new SavedReply(); reply.board = "g"; reply.no = 1234; + * reply.password = "boom"; + */ return; } @@ -501,9 +502,13 @@ public class ThreadManager implements Loader.LoaderListener { public interface ThreadManagerListener { public void onThreadLoaded(List result, boolean append); + public void onThreadLoadError(VolleyError error); + public void onOPClicked(Post post); + public void onThumbnailClicked(Post post); + public void onScrollTo(Post post); } } diff --git a/Chan/src/org/floens/chan/service/PinnedService.java b/Chan/src/org/floens/chan/service/PinnedService.java index 9ab02d81..120e89ec 100644 --- a/Chan/src/org/floens/chan/service/PinnedService.java +++ b/Chan/src/org/floens/chan/service/PinnedService.java @@ -4,19 +4,23 @@ import java.util.List; import org.floens.chan.manager.PinnedManager; import org.floens.chan.model.Pin; +import org.floens.chan.utils.ChanPreferences; import org.floens.chan.utils.Logger; import org.floens.chan.watch.WatchNotifier; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Looper; +import android.widget.Toast; public class PinnedService extends Service { private static final long FOREGROUND_INTERVAL = 10000L; private static final long BACKGROUND_INTERVAL = 60000L; + private static PinnedService instance; private static boolean activityInForeground = false; private Thread loadThread; @@ -33,6 +37,43 @@ public class PinnedService extends Service { activityInForeground = false; } + public static void startStopAccordingToSettings(Context context) { + if (ChanPreferences.getWatchEnabled()) { + if (!getRunning()) { + enable(context); + } + } else { + if (getRunning()) { + disable(context); + } + } + } + + public static void enable(Context context) { + if (!getRunning()) { + context.startService(new Intent(context, PinnedService.class)); + } + } + + public static void disable(Context context) { + if (getRunning()) { + context.stopService(new Intent(context, PinnedService.class)); + } + } + + public static boolean getRunning() { + return instance != null; + } + + public static void callOnPinsChanged() { + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + PinnedManager.getInstance().onPinsChanged(); + } + }); + } + public PinnedService() { watchNotifier = new WatchNotifier(this); } @@ -41,17 +82,25 @@ public class PinnedService extends Service { public void onCreate() { super.onCreate(); - start(); + instance = this; + + startThread(); } @Override public void onDestroy() { super.onDestroy(); + instance = null; + running = false; + if (loadThread != null) { + loadThread.interrupt(); + Toast.makeText(getApplicationContext(), "Service thread interrupted", Toast.LENGTH_SHORT).show(); + } } - private void start() { + private void startThread() { running = true; if (loadThread == null) { @@ -63,18 +112,19 @@ public class PinnedService extends Service { long timeout = activityInForeground ? FOREGROUND_INTERVAL : BACKGROUND_INTERVAL; + if (!running) return; + try { Thread.sleep(timeout); } catch (InterruptedException e) { - e.printStackTrace(); + return; } } - - loadThread = null; } }); loadThread.start(); + Toast.makeText(getApplicationContext(), "Service thread started", Toast.LENGTH_SHORT).show(); } } @@ -87,16 +137,6 @@ public class PinnedService extends Service { watchNotifier.update(); } - public static void callOnPinsChanged() { - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - PinnedManager.getInstance().onPinsChanged(); - } - }); - } - - @Override public IBinder onBind(Intent intent) { return null; diff --git a/Chan/src/org/floens/chan/utils/ChanPreferences.java b/Chan/src/org/floens/chan/utils/ChanPreferences.java index 46ab40b5..7a64c76a 100644 --- a/Chan/src/org/floens/chan/utils/ChanPreferences.java +++ b/Chan/src/org/floens/chan/utils/ChanPreferences.java @@ -1,29 +1,47 @@ package org.floens.chan.utils; import org.floens.chan.ChanApplication; +import org.floens.chan.service.PinnedService; public class ChanPreferences { public static boolean getOpenLinkConfirmation() { return ChanApplication.getPreferences().getBoolean("preference_open_link_confirmation", true); } - + public static String getDefaultName() { return ChanApplication.getPreferences().getString("preference_default_name", ""); } - + public static String getDefaultEmail() { return ChanApplication.getPreferences().getString("preference_default_email", ""); } - + public static boolean getDeveloper() { return ChanApplication.getPreferences().getBoolean("preference_developer", false); } - + public static void setDeveloper(boolean developer) { ChanApplication.getPreferences().edit().putBoolean("preference_developer", developer).commit(); } - + public static String getImageSaveDirectory() { return "Chan"; } + + public static boolean getWatchEnabled() { + return ChanApplication.getPreferences().getBoolean("preference_watch_enabled", true); + } + + /** + * This also calls startStopAccordingToSettings on the PinnedService to + * start/stop the service as needed. + * + * @param enabled + */ + public static void setWatchEnabled(boolean enabled) { + if (getWatchEnabled() != enabled) { + ChanApplication.getPreferences().edit().putBoolean("preference_watch_enabled", enabled).commit(); + PinnedService.startStopAccordingToSettings(ChanApplication.getInstance()); + } + } } diff --git a/Chan/src/org/floens/chan/utils/ScrollerRunnable.java b/Chan/src/org/floens/chan/utils/ScrollerRunnable.java index 8d893b80..16eecc18 100644 --- a/Chan/src/org/floens/chan/utils/ScrollerRunnable.java +++ b/Chan/src/org/floens/chan/utils/ScrollerRunnable.java @@ -5,8 +5,6 @@ import android.view.ViewConfiguration; import android.widget.ListView; public class ScrollerRunnable implements Runnable { - private static final int SCROLL_DURATION = 1; - private static final int MOVE_DOWN_POS = 1; private static final int MOVE_UP_POS = 2; @@ -28,12 +26,12 @@ public class ScrollerRunnable implements Runnable { final int firstPos = mList.getFirstVisiblePosition(); final int lastPos = firstPos + mList.getChildCount() - 1; - int viewTravelCount = 0; +// int viewTravelCount = 0; if (position <= firstPos) { - viewTravelCount = firstPos - position + 1; +// viewTravelCount = firstPos - position + 1; mMode = MOVE_UP_POS; } else if (position >= lastPos) { - viewTravelCount = position - lastPos + 1; +// viewTravelCount = position - lastPos + 1; mMode = MOVE_DOWN_POS; } else { // Already on screen, nothing to do diff --git a/Chan/src/org/floens/chan/utils/Utils.java b/Chan/src/org/floens/chan/utils/Utils.java index 06007256..77be1153 100644 --- a/Chan/src/org/floens/chan/utils/Utils.java +++ b/Chan/src/org/floens/chan/utils/Utils.java @@ -5,9 +5,14 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; +import android.util.TypedValue; import android.view.View; public class Utils { + public static int dp(Context context, int dp) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, context.getResources().getDisplayMetrics()); + } + /** * Sets the android.R.attr.selectableItemBackground as background drawable on the view. * @param view diff --git a/Chan/src/org/floens/chan/watch/WatchNotifier.java b/Chan/src/org/floens/chan/watch/WatchNotifier.java index d87b0b51..6b5f5fdf 100644 --- a/Chan/src/org/floens/chan/watch/WatchNotifier.java +++ b/Chan/src/org/floens/chan/watch/WatchNotifier.java @@ -1,6 +1,10 @@ package org.floens.chan.watch; +import java.util.List; + import org.floens.chan.R; +import org.floens.chan.manager.PinnedManager; +import org.floens.chan.model.Pin; import android.app.Notification; import android.app.NotificationManager; @@ -16,7 +20,18 @@ public class WatchNotifier { } public void update() { - showNotification("Update!"); + List pins = PinnedManager.getInstance().getPins(); + + int count = 0; + int pinCount = 0; + + for (Pin pin : pins) { + count += pin.getNewPostCount(); + pinCount++; + } + + showNotification(count + " new posts in " + pinCount + " threads"); +// showNotification("WatchNotifier update"); } private void showNotification(String text) { @@ -27,6 +42,7 @@ public class WatchNotifier { builder.setContentTitle(text); builder.setContentText(text); builder.setSmallIcon(R.drawable.ic_stat_notify); + builder.setOnlyAlertOnce(false); nm.notify(NOTIFICATION_ID, builder.getNotification()); }