Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/org/adblockplus/android/ProxyService.java

Issue 5327480814567424: Issue 1108 - Support notifications (Closed)
Patch Set: Local_refs, naming, nits. Created Feb. 18, 2015, 1:13 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/org/adblockplus/android/CrashHandler.java ('k') | src/org/adblockplus/android/Utils.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/org/adblockplus/android/ProxyService.java
diff --git a/src/org/adblockplus/android/ProxyService.java b/src/org/adblockplus/android/ProxyService.java
index 0d136f69f0305ae9ab5b2e997677612457ff0120..f70ee4ec0d3da747706fdbb7bc9b169880c00e04 100755
--- a/src/org/adblockplus/android/ProxyService.java
+++ b/src/org/adblockplus/android/ProxyService.java
@@ -59,8 +59,6 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
private static final boolean LOG_REQUESTS = false;
- static final int ONGOING_NOTIFICATION_ID = R.string.app_name;
-
private static final long POSITION_RIGHT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD ? Long.MIN_VALUE : Long.MAX_VALUE;
/**
@@ -79,7 +77,7 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
public static final String BROADCAST_PROXY_FAILED = "org.adblockplus.android.PROXY_FAILURE";
/**
- * Common command bridge
+ * Proxy state changed
*/
public static final String PROXY_STATE_CHANGED_ACTION = "org.adblockplus.android.PROXY_STATE_CHANGED";
@@ -93,6 +91,8 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
private ProxyConfigurator proxyConfigurator = null;
+ private NotificationWatcher notificationWatcher = null;
+
@SuppressLint("NewApi")
@Override
public void onCreate()
@@ -220,9 +220,12 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
// Lock service
hideIcon = prefs.getBoolean(getString(R.string.pref_hideicon), getResources().getBoolean(R.bool.def_hideicon));
- startForeground(ONGOING_NOTIFICATION_ID, getNotification());
+ startForeground(AdblockPlus.ONGOING_NOTIFICATION_ID, getNotification());
sendStateChangedBroadcast();
+
+ this.startNotificationWatcher();
+
Log.i(TAG, "Service started");
}
@@ -237,6 +240,8 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
{
super.onDestroy();
+ this.stopNotificationWatcher();
+
unregisterReceiver(this.proxyReceiver);
unregisterReceiver(this.proxyStateChangedReceiver);
@@ -500,7 +505,7 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
{
hideIcon = hide;
final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- notificationManager.notify(ONGOING_NOTIFICATION_ID, getNotification());
+ notificationManager.notify(AdblockPlus.ONGOING_NOTIFICATION_ID, getNotification());
}
public void sendStateChangedBroadcast()
@@ -563,7 +568,7 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
if (intent != null && PROXY_STATE_CHANGED_ACTION.equals(intent.getAction()))
{
final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- notificationManager.notify(ONGOING_NOTIFICATION_ID, getNotification());
+ notificationManager.notify(AdblockPlus.ONGOING_NOTIFICATION_ID, getNotification());
ProxyService.this.sendStateChangedBroadcast();
}
}
@@ -596,4 +601,123 @@ public class ProxyService extends Service implements OnSharedPreferenceChangeLis
}
}
}
+
+ private void startNotificationWatcher()
+ {
+ this.stopNotificationWatcher();
+
+ this.notificationWatcher = new NotificationWatcher(this);
+
+ final Thread thread = new Thread(this.notificationWatcher);
+ thread.setDaemon(true);
+ thread.start();
+ }
+
+ private void stopNotificationWatcher()
+ {
+ if (this.notificationWatcher != null)
+ {
+ this.notificationWatcher.stop();
+ this.notificationWatcher = null;
+ }
+ }
+
+ private static class NotificationWatcher implements Runnable
+ {
+ public static final int DEFAULT_FIRST_POLL_INTERVAL = 3 * 60; /* seconds */
+ public static final int DEFAULT_NEXT_POLL_INTERVALS = 0; /* seconds */
+
+ private final ProxyService proxyService;
+ private final int firstPollInterval;
+ private final int nextPollIntervals;
+
+ volatile boolean running = true;
+
+ public NotificationWatcher(final ProxyService proxyService, final int firstPollInterval,
+ final int nextPollIntervals)
+ {
+ this.proxyService = proxyService;
+ this.firstPollInterval = Math.max(0, firstPollInterval);
+ this.nextPollIntervals = Math.max(0, nextPollIntervals);
+ }
+
+ public NotificationWatcher(final ProxyService proxyService)
+ {
+ this(proxyService, DEFAULT_FIRST_POLL_INTERVAL, DEFAULT_NEXT_POLL_INTERVALS);
+ }
+
+ protected void stop()
+ {
+ this.running = false;
+ }
+
+ @Override
+ public void run()
+ {
+ if (this.firstPollInterval == 0)
+ {
+ this.running = false;
+ return;
+ }
+
+ long nextPoll = System.currentTimeMillis() + 1000L * this.firstPollInterval;
+
+ while (this.running)
+ {
+ try
+ {
+ Thread.sleep(250);
+ }
+ catch (InterruptedException ex)
+ {
+ break;
+ }
+
+ if (System.currentTimeMillis() >= nextPoll && this.running)
+ {
+ try
+ {
+ Log.d(TAG, "Polling for notifications");
+ org.adblockplus.libadblockplus.Notification notification = AdblockPlus.getApplication()
+ .getNotificationToShow();
+
+ int idx = 0;
+ while (notification != null)
+ {
+ Notification notif = new NotificationCompat.Builder(
+ this.proxyService.getApplicationContext())
+ .setSmallIcon(R.drawable.ic_stat_blocking)
+ .setContentTitle(notification.getTitle())
+ .setContentText(notification.getMessageString())
+ .getNotification();
+
+ final NotificationManager notificationManager = (NotificationManager) this.proxyService
+ .getSystemService(NOTIFICATION_SERVICE);
+ notificationManager.notify(AdblockPlus.GROUPED_NOTIFICATION_ID + idx, notif);
+
+ notification.markAsShown();
+
+ idx++;
+ notification = AdblockPlus.getApplication().getNotificationToShow();
+ }
+
+ Log.d(TAG, "Received " + idx + " new notifications");
+ }
+ catch (Exception ex)
+ {
+ Log.e(TAG, "Polling for notifications failed: " + ex.getMessage(), ex);
+ }
+
+ if (this.nextPollIntervals == 0)
+ {
+ this.running = false;
+ }
+ else
+ {
+ nextPoll = System.currentTimeMillis() + 1000L * this.nextPollIntervals;
+ }
+ }
+ }
+ }
+ }
}
« no previous file with comments | « src/org/adblockplus/android/CrashHandler.java ('k') | src/org/adblockplus/android/Utils.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld