diff --git a/Clover/app/src/main/AndroidManifest.xml b/Clover/app/src/main/AndroidManifest.xml
index c0c9ddd2..3d85b924 100644
--- a/Clover/app/src/main/AndroidManifest.xml
+++ b/Clover/app/src/main/AndroidManifest.xml
@@ -80,10 +80,6 @@ along with this program. If not, see .
-
-
diff --git a/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java b/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java
deleted file mode 100644
index a52e8514..00000000
--- a/Clover/app/src/main/java/org/floens/chan/ui/service/WatchNotifier.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Clover - 4chan browser https://github.com/Floens/Clover/
- * Copyright (C) 2014 Floens
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package org.floens.chan.ui.service;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.text.TextUtils;
-
-import org.floens.chan.Chan;
-import org.floens.chan.R;
-import org.floens.chan.core.manager.WatchManager;
-import org.floens.chan.core.model.Post;
-import org.floens.chan.core.model.orm.Pin;
-import org.floens.chan.core.settings.ChanSettings;
-import org.floens.chan.ui.activity.BoardActivity;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.inject.Inject;
-
-import static org.floens.chan.Chan.inject;
-
-public class WatchNotifier extends Service {
- private static final String TAG = "WatchNotifier";
- private static final int NOTIFICATION_ID = 1;
- private static final PostAgeComparator POST_AGE_COMPARATOR = new PostAgeComparator();
- private static final int SUBJECT_LENGTH = 6;
- private static final String IMAGE_TEXT = "(img) ";
- private static final Pattern SHORTEN_NO_PATTERN = Pattern.compile(">>\\d+(?=\\d{3})(\\d{3})");
-
- private NotificationManager nm;
-
- @Inject
- WatchManager watchManager;
-
- @Override
- public IBinder onBind(final Intent intent) {
- return null;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- inject(this);
-
- nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- nm.cancel(NOTIFICATION_ID);
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- if (intent != null && intent.getExtras() != null && intent.getExtras().getBoolean("pause_pins", false)) {
- pausePins();
- } else {
- updateNotification();
- }
-
- return START_STICKY;
- }
-
- public void updateNotification() {
- Notification notification = createNotification();
- if (notification != null) {
- nm.notify(NOTIFICATION_ID, notification);
- }
- }
-
- public void pausePins() {
- watchManager.pauseAll();
- }
-
- @Nullable
- private Notification createNotification() {
- boolean notifyQuotesOnly = ChanSettings.watchNotifyMode.get().equals("quotes");
- boolean soundQuotesOnly = ChanSettings.watchSound.get().equals("quotes");
-
- List unviewedPosts = new ArrayList<>();
- List listQuoting = new ArrayList<>();
- List pins = new ArrayList<>();
- List subjectPins = new ArrayList<>();
-
- boolean light = false;
- boolean sound = false;
- boolean peek = false;
-
- for (Pin pin : watchManager.getWatchingPins()) {
- WatchManager.PinWatcher watcher = watchManager.getPinWatcher(pin);
- if (watcher == null || pin.isError) {
- continue;
- }
-
- pins.add(pin);
-
- if (notifyQuotesOnly) {
- unviewedPosts.addAll(watcher.getUnviewedQuotes());
- listQuoting.addAll(watcher.getUnviewedQuotes());
- if (watcher.getWereNewQuotes()) {
- light = true;
- sound = true;
- peek = true;
- }
- if (pin.getNewQuoteCount() > 0) {
- subjectPins.add(pin);
- }
- } else {
- unviewedPosts.addAll(watcher.getUnviewedPosts());
- listQuoting.addAll(watcher.getUnviewedQuotes());
- if (watcher.getWereNewPosts()) {
- light = true;
- if (!soundQuotesOnly) {
- sound = true;
- peek = true;
- }
- }
- if (watcher.getWereNewQuotes()) {
- sound = true;
- peek = true;
- }
- if (pin.getNewPostCount() > 0) {
- subjectPins.add(pin);
- }
- }
- }
-
- if (Chan.getInstance().getApplicationInForeground()) {
- light = false;
- sound = false;
- }
-
- if (!ChanSettings.watchPeek.get()) {
- peek = false;
- }
-
- return notifyAboutPosts(pins, subjectPins, unviewedPosts, listQuoting, notifyQuotesOnly, light, sound, peek);
- }
-
- @Nullable
- private Notification notifyAboutPosts(List pins, List subjectPins, List unviewedPosts, List listQuoting,
- boolean notifyQuotesOnly, boolean light, boolean sound, boolean peek) {
- if (unviewedPosts.isEmpty()) {
- return null;
- }
- // New posts notification
- String message;
- List postsForExpandedLines;
- if (notifyQuotesOnly) {
- message = getResources().getQuantityString(R.plurals.watch_new_quotes, listQuoting.size(), listQuoting.size());
- postsForExpandedLines = listQuoting;
- } else {
- postsForExpandedLines = unviewedPosts;
- if (listQuoting.size() > 0) {
- message = getResources().getQuantityString(R.plurals.watch_new_quoting, unviewedPosts.size(), unviewedPosts.size(), listQuoting.size());
- } else {
- message = getResources().getQuantityString(R.plurals.watch_new, unviewedPosts.size(), unviewedPosts.size());
- }
- }
-
- Collections.sort(postsForExpandedLines, POST_AGE_COMPARATOR);
- List expandedLines = new ArrayList<>();
- for (Post postForExpandedLine : postsForExpandedLines) {
- CharSequence prefix;
- if (postForExpandedLine.getTitle().length() <= SUBJECT_LENGTH) {
- prefix = postForExpandedLine.getTitle();
- } else {
- prefix = postForExpandedLine.getTitle().subSequence(0, SUBJECT_LENGTH);
- }
-
- String comment = postForExpandedLine.image() != null ? IMAGE_TEXT : "";
- if (postForExpandedLine.comment.length() > 0) {
- comment += postForExpandedLine.comment;
- }
-
- // Replace >>132456798 with >789 to shorten the notification
- comment = SHORTEN_NO_PATTERN.matcher(comment).replaceAll(">$1");
-
- expandedLines.add(prefix + ": " + comment);
- }
-
- Pin targetPin = null;
- if (subjectPins.size() == 1) {
- targetPin = subjectPins.get(0);
- }
-
- String smallText = TextUtils.join(", ", expandedLines);
- return get(message, smallText, expandedLines, light, sound, peek, true, targetPin);
- }
-
- /**
- * Create a notification with the supplied parameters.
- * The style of the big notification is InboxStyle, a list of text.
- *
- * @param title The title of the notification
- * @param smallText The content of the small notification
- * @param expandedLines A list of lines for the big notification, or null if not shown
- * @param sound Should the notification make a sound
- * @param peek Peek the notification into the screen
- * @param alertIcon Show the alert version of the icon
- * @param target The target pin, or null to open the pinned pane on tap
- */
- private Notification get(String title, String smallText, List expandedLines,
- boolean light, boolean sound, boolean peek, boolean alertIcon, Pin target) {
- Intent intent = new Intent(this, BoardActivity.class);
- intent.setAction(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-
- intent.putExtra("pin_id", target == null ? -1 : target.id);
-
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
-
- NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
- if (sound || peek) {
- builder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
- }
-
- if (light) {
- long watchLed = Long.parseLong(ChanSettings.watchLed.get(), 16);
- if (watchLed >= 0) {
- builder.setLights((int) watchLed, 1000, 1000);
- }
- }
-
- builder.setContentIntent(pendingIntent);
-
- builder.setContentTitle(title);
- if (smallText != null) {
- builder.setContentText(smallText);
- }
-
- if (alertIcon || peek) {
- builder.setSmallIcon(R.drawable.ic_stat_notify_alert);
- builder.setPriority(NotificationCompat.PRIORITY_HIGH);
- } else {
- builder.setSmallIcon(R.drawable.ic_stat_notify);
- builder.setPriority(NotificationCompat.PRIORITY_MIN);
- }
-
- Intent pauseWatching = new Intent(this, WatchNotifier.class);
- pauseWatching.putExtra("pause_pins", true);
-
- PendingIntent pauseWatchingPending = PendingIntent.getService(this, 0, pauseWatching,
- PendingIntent.FLAG_UPDATE_CURRENT);
-
- builder.addAction(R.drawable.ic_action_pause, getString(R.string.watch_pause_pins),
- pauseWatchingPending);
-
- if (expandedLines != null) {
- NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle();
- for (CharSequence line : expandedLines.subList(Math.max(0, expandedLines.size() - 10), expandedLines.size())) {
- style.addLine(line);
- }
- style.setBigContentTitle(title);
- builder.setStyle(style);
- }
-
- return builder.build();
- }
-
- private static class PostAgeComparator implements Comparator {
- @Override
- public int compare(Post lhs, Post rhs) {
- if (lhs.time < rhs.time) {
- return 1;
- } else if (lhs.time > rhs.time) {
- return -1;
- } else {
- return 0;
- }
- }
- }
-}