]> Pileus Git - ~andy/iBeaconNav/commitdiff
Get iBeacon service running
authorAndy Spencer <andy753421@gmail.com>
Sat, 1 Mar 2014 04:38:20 +0000 (04:38 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sat, 1 Mar 2014 04:38:20 +0000 (04:38 +0000)
.gitignore
AndroidManifest.xml
makefile
src/edu/ucla/iBeaconNav/Main.java
src/edu/ucla/iBeaconNav/Task.java

index 0947ddf656c8adcfeb7b33f311fc5516f90f3c63..72719b96ba8cab6bc8c29dc42327ad867ad75bc6 100644 (file)
@@ -1,6 +1,9 @@
 # Settings
 config.mk
 
 # Settings
 config.mk
 
+# Local files
+local/
+
 # Vim junk
 *~
 *.swp
 # Vim junk
 *~
 *.swp
@@ -9,9 +12,3 @@ config.mk
 bin/
 gen/
 obj/
 bin/
 gen/
 obj/
-
-# Leave out cards for now
-opt/drawable/*.svg
-opt/drawable/*.xcf
-res/drawable/*.png
-res/drawable/*.jpg
index 5ff7ed080be1e05bdc8ce8e25f64b8857f1e1109..8f0b15b563ef0e138aa8cebc3a5663c164dbb76e 100644 (file)
@@ -5,30 +5,21 @@
        android:versionName="1.0">
 
        <!-- Permissions -->
        android:versionName="1.0">
 
        <!-- Permissions -->
-       <uses-permission
-               android:name="android.permission.INTERNET" />
-       <uses-permission
-               android:name="android.permission.ACCESS_COARSE_LOCATION"/>
-       <uses-permission
-               android:name="android.permission.ACCESS_FINE_LOCATION"/>
-       <uses-permission
-               android:name="android.permission.ACCESS_NETWORK_STATE"/>
-       <uses-permission
-               android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-       <uses-permission
-               android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
-       <uses-permission
-               android:name="com.example.permission.MAPS_RECEIVE"/>
-       <permission
-               android:name="com.example.permission.MAPS_RECEIVE"
-               android:protectionLevel="signature"/>
+       <uses-permission android:name="android.permission.INTERNET" />
+       <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
+       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+       <uses-permission android:name="android.permission.BLUETOOTH"/>
+       <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+       <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
 
        <!-- Features -->
        <uses-feature
                android:glEsVersion="0x00020000"
                android:required="true"/>
        <uses-sdk
 
        <!-- Features -->
        <uses-feature
                android:glEsVersion="0x00020000"
                android:required="true"/>
        <uses-sdk
-               android:minSdkVersion="16"
+               android:minSdkVersion="18"
                android:targetSdkVersion="18" />
 
        <!-- Application -->
                android:targetSdkVersion="18" />
 
        <!-- Application -->
                </activity>
                <activity android:name="Prefs" />
                <service android:name="Task" />
                </activity>
                <activity android:name="Prefs" />
                <service android:name="Task" />
+               <service android:name="com.radiusnetworks.ibeacon.service.IBeaconService"
+                       android:enabled="true"
+                       android:exported="true"
+                       android:isolatedProcess="false"
+                       android:label="iBeacon" />
+               <service android:name="com.radiusnetworks.ibeacon.IBeaconIntentProcessor"
+                       android:enabled="true" />
                <uses-library android:name="com.google.android.maps" />
                <meta-data
                        android:name="com.google.android.gms.version"
                <uses-library android:name="com.google.android.maps" />
                <meta-data
                        android:name="com.google.android.gms.version"
index 3b60e5ef4a4f0c64db420f3ff5f03d8fdb3bfe6c..2ddaa4c1a4c23901db3672730d3ebda8f7e91db4 100644 (file)
--- a/makefile
+++ b/makefile
@@ -9,6 +9,7 @@ KEYNAME ?= android
 ANDROID ?= /opt/android-sdk-update-manager/platforms/android-18/android.jar
 SDKLIB  ?= /opt/android-sdk-update-manager/tools/lib/sdklib.jar
 MAPLIB  ?= /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
 ANDROID ?= /opt/android-sdk-update-manager/platforms/android-18/android.jar
 SDKLIB  ?= /opt/android-sdk-update-manager/tools/lib/sdklib.jar
 MAPLIB  ?= /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
+IBEACON ?= /home/andy/class/AndroidIBeaconLibrary/libs/classes.jar
 TOOLS   ?= /opt/android-sdk-update-manager/build-tools/19.0.1
 
 # Variables
 TOOLS   ?= /opt/android-sdk-update-manager/build-tools/19.0.1
 
 # Variables
@@ -33,7 +34,7 @@ clean:
 
 # ADB targets
 logcat:
 
 # ADB targets
 logcat:
-       adb logcat $(PROGRAM):D AndroidRuntime:E '*:S'
+       adb logcat $(PROGRAM):D IBeaconManager:D AndroidRuntime:E '*:S'
 
 run: bin/install.stamp
        adb shell am start -W                 \
 
 run: bin/install.stamp
        adb shell am start -W                 \
@@ -66,8 +67,8 @@ uninstall:
        @zipalign -f 4 $@.in $@
 
 %.dex: $(OBJ) makefile | bin
        @zipalign -f 4 $@.in $@
 
 %.dex: $(OBJ) makefile | bin
-       @echo "DEX    $@ obj $(notdir $(MAPLIB))"
-       @dx --dex --output $@ obj $(MAPLIB)
+       @echo "DEX    $@ obj $(notdir $(MAPLIB)) $(notdir $(IBEACON))"
+       @dx --dex --output $@ obj $(MAPLIB) $(IBEACON)
 
 %.res: AndroidManifest.xml $(RES) | bin
        @echo "RES    $@"
 
 %.res: AndroidManifest.xml $(RES) | bin
        @echo "RES    $@"
@@ -77,11 +78,12 @@ uninstall:
                -M AndroidManifest.xml    \
                -S res                    \
                -S /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/res \
                -M AndroidManifest.xml    \
                -S res                    \
                -S /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/res \
+               -S /home/andy/class/AndroidIBeaconLibrary/res \
                -F $*.res
 
 $(OBJ): $(SRC) $(GEN) makefile | obj
        @echo "JAVAC  obj/*.class $+"
                -F $*.res
 
 $(OBJ): $(SRC) $(GEN) makefile | obj
        @echo "JAVAC  obj/*.class $+"
-       @JARS=$(ANDROID):$(MAPLIB);       \
+       @JARS=$(ANDROID):$(MAPLIB):$(IBEACON); \
         javac -g                         \
                -Xlint:unchecked          \
                -Xlint:deprecation        \
         javac -g                         \
                -Xlint:unchecked          \
                -Xlint:deprecation        \
@@ -95,6 +97,11 @@ $(OBJ): $(SRC) $(GEN) makefile | obj
 
 $(GEN): AndroidManifest.xml $(RES) | gen
        @echo "GEN    $@"
 
 $(GEN): AndroidManifest.xml $(RES) | gen
        @echo "GEN    $@"
+       @aapt package -f -m               \
+               -I $(ANDROID)             \
+               -M /home/andy/class/AndroidIBeaconLibrary/AndroidManifest.xml \
+               -S /home/andy/class/AndroidIBeaconLibrary/res \
+               -J gen
        @aapt package -f -m               \
                -I $(ANDROID)             \
                -M /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/AndroidManifest.xml \
        @aapt package -f -m               \
                -I $(ANDROID)             \
                -M /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/AndroidManifest.xml \
@@ -106,6 +113,7 @@ $(GEN): AndroidManifest.xml $(RES) | gen
                -M AndroidManifest.xml    \
                -S res                    \
                -S /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/res \
                -M AndroidManifest.xml    \
                -S res                    \
                -S /opt/android-sdk-update-manager/extras/google/google_play_services/libproject/google-play-services_lib/res \
+               -S /home/andy/class/AndroidIBeaconLibrary/res \
                -J gen
 
 # Directories
                -J gen
 
 # Directories
index 6bb29f93b17ba25e023a6afe658770c7c0faf45d..81f40513eaac3c3d532331ccc57b72523658996a 100644 (file)
@@ -40,7 +40,6 @@ public class Main extends Activity
        private Messenger    messenger;
        private Task         task;
        private Toast        toast;
        private Messenger    messenger;
        private Task         task;
        private Toast        toast;
-       private boolean      running;
 
        /* Widgets */
        private TabHost      window;
 
        /* Widgets */
        private TabHost      window;
@@ -64,7 +63,6 @@ public class Main extends Activity
        {
                Util.debug("Main: onRegister");
                this.task    = task;
        {
                Util.debug("Main: onRegister");
                this.task    = task;
-               this.running = this.task.isRunning();
        }
 
        private void onPosition()
        }
 
        private void onPosition()
@@ -85,7 +83,7 @@ public class Main extends Activity
        {
                Util.debug("Main: register");
                startService(new Intent(this, Task.class)
        {
                Util.debug("Main: register");
                startService(new Intent(this, Task.class)
-                               .putExtra("Command",   Task.REGISTER)
+                               .putExtra("Command",   Task.Command.REGISTER)
                                .putExtra("Messenger", this.messenger));
        }
 
                                .putExtra("Messenger", this.messenger));
        }
 
@@ -93,16 +91,14 @@ public class Main extends Activity
        {
                Util.debug("Main: connect");
                startService(new Intent(this, Task.class)
        {
                Util.debug("Main: connect");
                startService(new Intent(this, Task.class)
-                               .putExtra("Command", Task.CONNECT));
-               this.running = true;
+                               .putExtra("Command", Task.Command.CONNECT));
        }
 
        private void disconnect()
        {
                Util.debug("Main: disconnect");
                startService(new Intent(this, Task.class)
        }
 
        private void disconnect()
        {
                Util.debug("Main: disconnect");
                startService(new Intent(this, Task.class)
-                               .putExtra("Command", Task.DISCONNECT));
-               this.running = false;
+                               .putExtra("Command", Task.Command.DISCONNECT));
        }
 
        private void quit()
        }
 
        private void quit()
@@ -234,8 +230,9 @@ public class Main extends Activity
        @Override
        public boolean onPrepareOptionsMenu(Menu menu)
        {
        @Override
        public boolean onPrepareOptionsMenu(Menu menu)
        {
-               menu.findItem(R.id.connect).setVisible(!this.running);
-               menu.findItem(R.id.disconnect).setVisible(this.running);
+               boolean running = this.task != null && this.task.isRunning();
+               menu.findItem(R.id.connect).setVisible(!running);
+               menu.findItem(R.id.disconnect).setVisible(running);
                return true;
        }
 
                return true;
        }
 
@@ -262,24 +259,16 @@ public class Main extends Activity
        {
                public void handleMessage(android.os.Message msg)
                {
        {
                public void handleMessage(android.os.Message msg)
                {
-                       switch (msg.what) {
-                               case Task.REGISTER:
-                                       Main.this.onRegister((Task)msg.obj);
-                                       break;
-                               case Task.POSITION:
+                       Task.Response resp = Task.Response.values()[msg.what];
+                       switch (resp) {
+                               case POSITION:
                                        Main.this.onPosition();
                                        break;
                                        Main.this.onPosition();
                                        break;
-                               case Task.CONNECT:
-                                       Main.this.running = true;
-                                       break;
-                               case Task.DISCONNECT:
-                                       Main.this.running = false;
-                                       break;
-                               case Task.NOTIFY:
+                               case NOTIFY:
                                        Main.this.onNotify((String)msg.obj);
                                        break;
                                default:
                                        Main.this.onNotify((String)msg.obj);
                                        break;
                                default:
-                                       Util.debug("Main: unknown message - " + msg.what);
+                                       Util.debug("Main: unknown message - " + resp);
                                        break;
                        }
                }
                                        break;
                        }
                }
index 58ef0031c4324135b66f273cae858215286cc81e..049776ed9b0929c55096a709b31cb03af9e0a781 100644 (file)
@@ -2,6 +2,7 @@ package edu.ucla.iBeaconNav;
 
 import java.util.List;
 import java.util.LinkedList;
 
 import java.util.List;
 import java.util.LinkedList;
+import java.util.Collection;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -14,28 +15,38 @@ import android.content.SharedPreferences;
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Messenger;
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Messenger;
+import android.os.RemoteException;
 import android.preference.PreferenceManager;
 
 import android.preference.PreferenceManager;
 
-public class Task extends Service implements Runnable
+import com.radiusnetworks.ibeacon.*;
+import com.radiusnetworks.ibeacon.client.*;
+import com.radiusnetworks.ibeacon.service.*;
+
+public class Task extends Service implements IBeaconConsumer, RangeNotifier, MonitorNotifier
 {
 {
-       /* 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;
+       /* Main -> Task Messsages */
+       static enum Command {
+               REGISTER,
+               CONNECT,
+               DISCONNECT,
+       };
+
+       /* Task -> Main messages */
+       static enum Response {
+               POSITION,
+               NOTIFY,
+       };
 
        /* Private data */
 
        /* Private data */
-       private Messenger  messenger;
-       private Thread     thread;
-       private boolean    active;
+       private Messenger      messenger;
+       private IBeaconManager ibeacon;
 
        /* Private methods */
 
        /* Private methods */
-       private void tellMain(int cmd, Object value)
+       private void tellMain(Response cmd, Object value)
        {
                try {
                        android.os.Message msg = android.os.Message.obtain();
        {
                try {
                        android.os.Message msg = android.os.Message.obtain();
-                       msg.what = cmd;
+                       msg.what = cmd.ordinal();
                        msg.obj  = value;
                        this.messenger.send(msg);
                } catch (Exception e) {
                        msg.obj  = value;
                        this.messenger.send(msg);
                } catch (Exception e) {
@@ -46,68 +57,62 @@ public class Task extends Service implements Runnable
        private void notify(String text, int icon)
        {
                // Notify Main
        private void notify(String text, int icon)
        {
                // Notify Main
-               this.tellMain(NOTIFY, text);
+               this.tellMain(Task.Response.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);
 
                // 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);
                //note.setLatestEventInfo(this, "iBeaconNav!", text, pend);
-               //this.startForeground(1, note);
+               //PendingIntent pend = PendingIntent.getActivity(this, 0, intent, 0);
+
+               Notification  note = new Notification.Builder(this)
+                       .setContentTitle("iBeaconNav!")
+                       .setContentText("iBeaconNav!")
+                       .setSmallIcon(icon)
+                       .build();
+
+               this.startForeground(1, note);
        }
 
        }
 
-       private void handle(int cmd, Messenger mgr)
+       private void handle(Command cmd, Messenger mgr)
        {
                // Validate messenger
        {
                // Validate messenger
-               if (cmd != REGISTER && mgr != null && mgr != this.messenger) {
+               if (cmd != Task.Command.REGISTER && mgr != null && mgr != this.messenger)
                        Util.debug("Task: handle - invalid 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);
-                       }
+               // Handle the command
+               switch (cmd) {
+                       // Setup communication with Main
+                       case REGISTER:
+                               Util.debug("Task: handle - register");
+                               this.messenger = mgr;
+                               break;
+
+                       // Create client thread
+                       case CONNECT:
+                               Util.debug("Task: handle - connect");
+                               this.notify("Connected", android.R.drawable.presence_online);
+                               this.ibeacon = IBeaconManager.getInstanceForApplication(this);
+                               this.ibeacon.bind(this);
+                               //this.ibeacon.setBackgroundMode(this, false);
+                               break;
+
+                       // Stop client thread
+                       case DISCONNECT:
+                               Util.debug("Task: handle - register");
+                               //this.ibeacon.setBackgroundMode(this, true);
+                               this.ibeacon.unBind(this);
+                               this.ibeacon = null;
+                               this.stopForeground(true);
+                               break;
                }
        }
 
        /* Public methods */
        public boolean isRunning()
        {
                }
        }
 
        /* 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");
+               return this.ibeacon != null;
        }
 
        /* Service Methods */
        }
 
        /* Service Methods */
@@ -116,13 +121,14 @@ public class Task extends Service implements Runnable
        {
                Util.debug("Task: onCreate");
                super.onCreate();
        {
                Util.debug("Task: onCreate");
                super.onCreate();
+               IBeaconManager.LOG_DEBUG = true;
        }
 
        @Override
        public void onDestroy()
        {
                Util.debug("Task: onDestroy");
        }
 
        @Override
        public void onDestroy()
        {
                Util.debug("Task: onDestroy");
-               this.handle(DISCONNECT, null);
+               super.onDestroy();
        }
 
        @Override
        }
 
        @Override
@@ -130,7 +136,7 @@ public class Task extends Service implements Runnable
        {
                Util.debug("Task: onStartCommand");
                int       rval = super.onStartCommand(intent, flags, startId);
        {
                Util.debug("Task: onStartCommand");
                int       rval = super.onStartCommand(intent, flags, startId);
-               int       cmd  = intent.getExtras().getInt("Command");
+               Command   cmd  =   (Command)intent.getExtras().get("Command");
                Messenger mgr  = (Messenger)intent.getExtras().get("Messenger");
                this.handle(cmd, mgr);
                return rval;
                Messenger mgr  = (Messenger)intent.getExtras().get("Messenger");
                this.handle(cmd, mgr);
                return rval;
@@ -142,4 +148,43 @@ public class Task extends Service implements Runnable
                Util.debug("Task: onBind");
                return null;
        }
                Util.debug("Task: onBind");
                return null;
        }
+
+       /* IBeaconConsumer Methods */
+       @Override
+       public void onIBeaconServiceConnect() {
+               Util.debug("Task: onIBeaconServiceConnect");
+
+               this.ibeacon.setRangeNotifier(this);
+               this.ibeacon.setMonitorNotifier(this);
+
+               try {
+                       Region region = new Region("iBeaconNavMonitoringId", null, null, null);
+                       this.ibeacon.startRangingBeaconsInRegion(region);
+                       this.ibeacon.startMonitoringBeaconsInRegion(region);
+               } catch (RemoteException e) {
+                       Util.debug("Task: onIBeaconServiceConnect - error");
+               }
+       }
+
+       /* RangeNotifier Methods */
+        @Override
+        public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
+               Util.debug("Task: didRangeBeaconsInRegion");
+        }
+
+       /* MonitorNotifier Methods */
+       @Override
+       public void didEnterRegion(Region region) {
+               Util.debug("Task: didEnterRegion");
+       }
+
+       @Override
+       public void didExitRegion(Region region) {
+               Util.debug("Task: didExitRegion");
+       }
+
+       @Override
+       public void didDetermineStateForRegion(int state, Region region) {
+               Util.debug("Task: didDetermineStateForRegion");
+       }
 }
 }