X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fro%2Fieval%2Ffonbot%2FFonBotMainService.java;h=38e0a29d0cbb8b4fd8a850ba28474b3e5ea54ccb;hb=62f5262d8bfa537f2b173c0309f1128054cf0916;hp=a751d231c434173188b16dcd6a6037273eb83430;hpb=8dfb76c9431dbf8401412cb92c7512e7dc3081a2;p=fonbot.git diff --git a/src/ro/ieval/fonbot/FonBotMainService.java b/src/ro/ieval/fonbot/FonBotMainService.java index a751d23..38e0a29 100644 --- a/src/ro/ieval/fonbot/FonBotMainService.java +++ b/src/ro/ieval/fonbot/FonBotMainService.java @@ -4,7 +4,7 @@ import static ro.ieval.fonbot.R.string.*; import static ro.ieval.fonbot.Utils.toNonNull; import java.util.Collections; -import java.util.HashSet; +import java.util.EnumSet; import java.util.Set; import org.eclipse.jdt.annotation.Nullable; @@ -17,10 +17,12 @@ import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.content.IntentFilter; +import android.net.ConnectivityManager; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.content.LocalBroadcastManager; +import android.util.Log; /* * Copyright © 2013 Marius Gavrilescu @@ -62,6 +64,27 @@ public final class FonBotMainService extends Service { } } + /** + * Runnable that continously long polls the server for commands + * + * @author Marius Gavrilescu + */ + private final class LongPollRunnable implements Runnable{ + public void run(){ + final ConnectivityManager man=(ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + final HttpCallExecutableRunnable runnable=new HttpCallExecutableRunnable("/get", null, FonBotMainService.this, new PollResultCallback(FonBotMainService.this), false); + + Log.d("LongPollRunnable", "Long polling started"); + while(man.getActiveNetworkInfo() != null && man.getActiveNetworkInfo().isConnected()) + try { + runnable.run(); + } catch (final Exception ex){ + ex.printStackTrace(); + } + Log.d("LongPollRunnable", "Long polling stopped"); + } + } + /** * Broadcast action: add an ongoing event */ @@ -70,6 +93,8 @@ public final class FonBotMainService extends Service { * Broadcast action: remove an ongoing event */ public static final String ACTION_DELETE_ONGOING="ro.ieval.fonbot.FonBotMainService.ACTION_DELETE_ONGOING"; + /** Broadcast action: trigger a server poll */ + public static final String ACTION_TRIGGER_POLL="ro.ieval.fonbot.FonBotMainService.ACTION_TRIGGER_POLL"; /** * Extra: ongoing event id * @@ -88,7 +113,6 @@ public final class FonBotMainService extends Service { private static final IntentFilter DYNAMIC_BROADCAST_FILTER=new IntentFilter(); static{ - DYNAMIC_BROADCAST_FILTER.addAction(Intent.ACTION_SCREEN_ON); DYNAMIC_BROADCAST_FILTER.addAction(Intent.ACTION_BATTERY_CHANGED); DYNAMIC_BROADCAST_FILTER.addAction(Intent.ACTION_HEADSET_PLUG); } @@ -100,7 +124,13 @@ public final class FonBotMainService extends Service { /** * Set of ongoing events. */ - private final Set ongoing=new HashSet(10); + private final Set ongoing=EnumSet.noneOf(OngoingEvent.class); + + /** true if running in foreground, false otherwise */ + private boolean isForeground = false; + + /** Thread that runs a {@link LongPollRunnable} */ + private Thread longPollThread; /** * Get the set of ongoing events. @@ -130,20 +160,31 @@ public final class FonBotMainService extends Service { @Override public int onStartCommand(final @Nullable Intent intent, final int flags, final int startId) { - if(intent!=null && intent.getAction()==ACTION_PUT_ONGOING && intent.hasExtra(EXTRA_ONGOING_ID)){ + final boolean showOngoing=PreferenceManager.getDefaultSharedPreferences(this).getBoolean("ongoing", false); + boolean updateNotification = false; + if(intent!=null && intent.getAction()==ACTION_PUT_ONGOING && intent.hasExtra(EXTRA_ONGOING_ID) && showOngoing){ ongoing.add(OngoingEvent.values()[intent.getIntExtra(EXTRA_ONGOING_ID, 0)]); LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_ONGOING_UPDATE)); + updateNotification=true; } - if(intent!=null && intent.getAction()==ACTION_DELETE_ONGOING && intent.hasExtra(EXTRA_ONGOING_ID)){ + if(intent!=null && intent.getAction()==ACTION_DELETE_ONGOING && intent.hasExtra(EXTRA_ONGOING_ID) && showOngoing){ ongoing.remove(OngoingEvent.values()[intent.getIntExtra(EXTRA_ONGOING_ID, 0)]); LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_ONGOING_UPDATE)); + updateNotification=true; + } + + if(longPollThread == null || !longPollThread.isAlive()){ + longPollThread = new Thread(new LongPollRunnable()); + longPollThread.start(); } final boolean runForeground=PreferenceManager.getDefaultSharedPreferences(this).getBoolean("foreground", false); if(!runForeground) stopForeground(true); - if(runForeground||!ongoing.isEmpty()){ + final NotificationManager man=(NotificationManager) getSystemService(NOTIFICATION_SERVICE); + final boolean shouldNotify=runForeground||!ongoing.isEmpty(); + if(shouldNotify && (updateNotification || runForeground != isForeground)){ final Intent mainIntent=new Intent(this, FonBotMainActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); final NotificationCompat.Builder builder=new NotificationCompat.Builder(this). @@ -154,26 +195,24 @@ public final class FonBotMainService extends Service { setContentIntent(PendingIntent.getActivity(this, 0, mainIntent, 0)). setOngoing(true); - final Notification notification; - if(ongoing.isEmpty()) - notification=builder.build(); - else { + if(showOngoing && !ongoing.isEmpty()) { final NotificationCompat.InboxStyle inboxBuilder=new NotificationCompat.InboxStyle(builder); for(final OngoingEvent event : ongoing) inboxBuilder.addLine(getString(event.resource)); - notification=inboxBuilder.build(); } + final Notification notification=builder.build(); if(runForeground) - startForeground(1337, builder.build()); - else{ - final NotificationManager man=(NotificationManager) getSystemService(NOTIFICATION_SERVICE); + startForeground(1337, notification); + else man.notify(1337, notification); - } } + if(!shouldNotify) + man.cancel(1337); + isForeground=runForeground; return START_STICKY; } }