X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fro%2Fieval%2Ffonbot%2FFonBotMainService.java;h=8bc69ae7541ad8c2bea7857f1af8c43d8037246f;hb=e0c7f061c5a2a4d8798deed39a8347f6e3a0e54b;hp=dba53894b38f28e8295d3152c798da4e6a35845d;hpb=c4351ec6871946f41b37936923a9b7b343691340;p=fonbot.git diff --git a/src/ro/ieval/fonbot/FonBotMainService.java b/src/ro/ieval/fonbot/FonBotMainService.java index dba5389..8bc69ae 100644 --- a/src/ro/ieval/fonbot/FonBotMainService.java +++ b/src/ro/ieval/fonbot/FonBotMainService.java @@ -3,12 +3,14 @@ package ro.ieval.fonbot; import static ro.ieval.fonbot.R.string.*; import static ro.ieval.fonbot.Utils.toNonNull; +import java.net.SocketTimeoutException; import java.util.Collections; import java.util.EnumSet; import java.util.Set; import org.eclipse.jdt.annotation.Nullable; +import ro.ieval.fonbot.Address.Protocol; import ro.ieval.fonbot.Utils.OngoingEvent; import android.app.Notification; @@ -17,10 +19,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 +66,30 @@ 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.doRun(); + } catch (final SocketTimeoutException e){ + Log.d("LongPollRunnable", "Socket timeout, refreshing connection"); + } catch (final Exception ex){ + ex.printStackTrace(); + break; + } + Log.d("LongPollRunnable", "Long polling stopped"); + } + } + /** * Broadcast action: add an ongoing event */ @@ -70,8 +98,22 @@ 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"; + + /** + * Broadcast action: process a command received via SMS + */ + public static final String ACTION_PROCESS_COMMAND="ro.ieval.fonbot.FonBotMainService.ACTION_PROCESS_COMMAND"; + + /** + * Extra: command line + */ + public static final String EXTRA_COMMAND_LINE="ro.ieval.fonbot.FonBotMainService.EXTRA_COMMAND_LINE"; + + /** + * Extra: SMS originating address + */ + public static final String EXTRA_SMS_ORIGIN_ADDRESS="ro.ieval.fonbot.FonBotMainService.EXTRA_SMS_ORIGIN_ADDRESS"; + /** * Extra: ongoing event id * @@ -90,7 +132,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); } @@ -107,6 +148,9 @@ public final class FonBotMainService extends Service { /** 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. * @@ -135,20 +179,35 @@ public final class FonBotMainService extends Service { @Override public int onStartCommand(final @Nullable Intent intent, final int flags, final int startId) { + 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)){ + 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(intent!=null && intent.getAction()==ACTION_PROCESS_COMMAND) { + final String cmdline = intent.getStringExtra(EXTRA_COMMAND_LINE); + final String origin = intent.getStringExtra(EXTRA_SMS_ORIGIN_ADDRESS); + final Address address= new Address(toNonNull(Protocol.SMS), origin);//NOPMD variable depends on originAddress + final String[] words=Utils.shellwords(toNonNull(cmdline)); + final String[] args=new String[words.length-1];//NOPMD variable size depends on words.length + System.arraycopy(words, 1, args, 0, args.length); + + Utils.processCommand(this, toNonNull(words[0]), args, toNonNull(address)); + } + + if(longPollThread == null || !longPollThread.isAlive()){ + longPollThread = new Thread(new LongPollRunnable()); + longPollThread.start(); + } - if(intent!=null && intent.getAction()==ACTION_TRIGGER_POLL) - Utils.pollServer(this); + ExecutableRunnable.retryTasks(); final boolean runForeground=PreferenceManager.getDefaultSharedPreferences(this).getBoolean("foreground", false); if(!runForeground) @@ -167,7 +226,7 @@ public final class FonBotMainService extends Service { setContentIntent(PendingIntent.getActivity(this, 0, mainIntent, 0)). setOngoing(true); - if(!ongoing.isEmpty()) { + if(showOngoing && !ongoing.isEmpty()) { final NotificationCompat.InboxStyle inboxBuilder=new NotificationCompat.InboxStyle(builder); for(final OngoingEvent event : ongoing)