--- /dev/null
+package edu.ucla.iBeaconNav;
+
+import java.util.List;
+import java.util.LinkedList;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Messenger;
+import android.preference.PreferenceManager;
+
+public class Task extends Service implements Runnable
+{
+ /* Commands */
+ public static final int REGISTER = 0;
+ public static final int POSITION = 1;
+ public static final int CONNECT = 2;
+ public static final int DISCONNECT = 3;
+ public static final int NOTIFY = 4;
+
+ /* Private data */
+ private Messenger messenger;
+ private Thread thread;
+ private boolean active;
+
+ /* Private methods */
+ private void tellMain(int cmd, Object value)
+ {
+ try {
+ android.os.Message msg = android.os.Message.obtain();
+ msg.what = cmd;
+ msg.obj = value;
+ this.messenger.send(msg);
+ } catch (Exception e) {
+ Util.debug("Task: error sending message", e);
+ }
+ }
+
+ private void notify(String text, int icon)
+ {
+ // Notify Main
+ this.tellMain(NOTIFY, text);
+
+ // Notification bar
+ //Notification note = new Notification(icon, null, 0);
+ //Intent intent = new Intent(this, Main.class);
+ //PendingIntent pend = PendingIntent.getActivity(this, 0, intent, 0);
+
+ //note.setLatestEventInfo(this, "iBeaconNav!", text, pend);
+ //this.startForeground(1, note);
+ }
+
+ private void handle(int cmd, Messenger mgr)
+ {
+ // Validate messenger
+ if (cmd != REGISTER && mgr != null && mgr != this.messenger) {
+ Util.debug("Task: handle - invalid messenger");
+ }
+
+ // Setup communication with Main
+ if (cmd == REGISTER) {
+ Util.debug("Task: handle - register");
+ this.messenger = mgr;
+ this.tellMain(REGISTER, this);
+ }
+
+ // Create client thread
+ if (cmd == CONNECT && this.thread == null) {
+ Util.debug("Task: handle - connect");
+ this.thread = new Thread(this);
+ this.thread.start();
+ }
+
+ // Stop client thread
+ if (cmd == DISCONNECT && this.thread != null) {
+ Util.debug("Task: handle - register");
+ try {
+ this.thread.join();
+ } catch (Exception e) {
+ Util.debug("Task: error stopping service", e);
+ }
+ }
+ }
+
+ /* Public methods */
+ public boolean isRunning()
+ {
+ return this.thread != null;
+ }
+
+ /* Runnable methods */
+ @Override
+ public void run()
+ {
+ Util.debug("Task: thread run");
+
+ // Run nav algorithm
+ while (this.active) {
+ // Read sensor data
+ this.tellMain(POSITION, 0);
+ }
+
+ Util.debug("Task: thread exit");
+ }
+
+ /* Service Methods */
+ @Override
+ public void onCreate()
+ {
+ Util.debug("Task: onCreate");
+ super.onCreate();
+ }
+
+ @Override
+ public void onDestroy()
+ {
+ Util.debug("Task: onDestroy");
+ this.handle(DISCONNECT, null);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId)
+ {
+ Util.debug("Task: onStartCommand");
+ int rval = super.onStartCommand(intent, flags, startId);
+ int cmd = intent.getExtras().getInt("Command");
+ Messenger mgr = (Messenger)intent.getExtras().get("Messenger");
+ this.handle(cmd, mgr);
+ return rval;
+ }
+
+ @Override
+ public IBinder onBind(Intent intent)
+ {
+ Util.debug("Task: onBind");
+ return null;
+ }
+}