Skip to content

Commit

Permalink
BLE: Links/Objects around the user
Browse files Browse the repository at this point in the history
  • Loading branch information
Duncan Cragg committed Dec 23, 2013
1 parent db9bd51 commit bc88588
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 19 deletions.
5 changes: 4 additions & 1 deletion AndroidManifest.xml
Expand Up @@ -5,7 +5,7 @@
android:versionName="1.0">

<uses-sdk android:minSdkVersion="10"
android:targetSdkVersion="10" />
android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />
Expand All @@ -17,8 +17,11 @@
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

<application android:label="@string/app_name"
android:icon="@drawable/icon"
Expand Down
2 changes: 1 addition & 1 deletion project.properties
Expand Up @@ -11,4 +11,4 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=Google Inc.:Google APIs:10
target=Google Inc.:Google APIs:19
86 changes: 86 additions & 0 deletions src/android/cyrus/BLELinks.java
@@ -0,0 +1,86 @@
package cyrus;

import android.content.*;
import android.content.pm.PackageManager;
import android.bluetooth.*;
import android.bluetooth.BluetoothAdapter.*;

import cyrus.platform.Kernel;
import cyrus.forest.WebObject;
import cyrus.gui.Cyrus;

import static cyrus.lib.Utils.*;

public class BLELinks extends WebObject implements BluetoothAdapter.LeScanCallback {

public BLELinks(){ Cyrus.user.linksaround=this; }

public BLELinks(String s){ super(s,true); }

private boolean running=false;
private BluetoothAdapter bluetoothAdapter;
private final static int REQUEST_ENABLE_BT = 1;

public void evaluate(){
if(!Cyrus.top.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) return;
if(!running) runBLEScan();
}

private void runBLEScan(){
running=true;
BluetoothManager bm=(BluetoothManager)Cyrus.top.getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter=bm.getAdapter(); if(bluetoothAdapter==null) return;
new Thread(){ public void run(){
while(running){
checkOnScanning();
Kernel.sleep(500);
}}}.start();
}

boolean notifiedEnableBT=false;
boolean scanning=false;
boolean suspended=false;

synchronized private void checkOnScanning(){
if(suspended) return;
if(!bluetoothAdapter.isEnabled()){
if(scanning) bluetoothAdapter.stopLeScan(this);
scanning=false;
if(!notifiedEnableBT){
notifiedEnableBT=true;
Cyrus.top.toast("Enable Bluetooth to detect local objects", false);
}
return;
// Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// Cyrus.top.startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
if(scanning) return;
scanning=true;
bluetoothAdapter.startLeScan(this);
}

synchronized public void enableScanning(){
suspended=false;
}

synchronized public void disableScanning(){
suspended=true;
scanning=false;
bluetoothAdapter.stopLeScan(this);
}

@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] ad){
new Evaluator(this){ public void evaluate(){
String data="";
for(int i=0; i<ad.length; i++) data += String.format("%02x ", ad[i]);
String url=String.format("http://%d.%d.%d.%d:%d/o/uid-%02x%02x-%02x%02x-%02x%02x-%02x%02x.json",
0xff&ad[9],0xff&ad[10],0xff&ad[11],0xff&ad[12],
((0xff & ad[13])*256)+(0xff & ad[14]),
ad[15],ad[16],ad[17],ad[18],ad[19],ad[20],ad[21],ad[22]);
contentList("list", list(url));
contentInt("rssi", rssi);
}};
}
}

3 changes: 1 addition & 2 deletions src/android/cyrus/Cyrus2GUI.java
Expand Up @@ -64,7 +64,6 @@ public LinkedHashMap user2GUI(){
public LinkedHashMap links2GUI(){
String listuid = user.content("private:viewing");
LinkedList<String> links = user.contentList("private:viewing:list");
if(links==null) return null;
LinkedList viewlist = new LinkedList();
viewlist.add(style("direction","vertical"));
String title = user.content("private:viewing:title");
Expand Down Expand Up @@ -442,7 +441,7 @@ private void addListIfPresent(LinkedList viewlist, String tag, String label){
public void linksList2GUI(LinkedList<String> links, LinkedList viewlist, String prefix, String listuid, String label){
if(label!=null && label.length()!=0) viewlist.add(label);
int i= -1;
for(String uid: links){ i++;
if(links!=null) for(String uid: links){ i++;
String bmtext=null;
if(user.contentSet(prefix+":"+i+":is")){
if(bmtext==null) bmtext=user.contentString(prefix+":"+i+":when");
Expand Down
41 changes: 26 additions & 15 deletions src/android/cyrus/User.java
Expand Up @@ -38,42 +38,48 @@ public class User extends CyrusLanguage {

static public User currentUser=null;

static public BLELinks linksaround=null;

static public void createUserAndDevice(){

String fullName=UserContacts.getUsersFullName();
String your=fullName.equals("You")? "Your": fullName+"'s";

CyrusLanguage contact = new CyrusLanguage(
"{ \"is\": [ \"editable\", \"contact\" ], \n"+
" \"full-name\": \""+fullName+"\", \n"+
" \"address\": { } \n"+
"}");
"{ is: editable contact\n"+
" full-name: \""+fullName+"\" \n"+
" address: { } \n"+
"}", true);

CyrusLanguage links = new CyrusLanguage(
"{ \"is\": [ \"link\", \"list\", \"editable\" ], \n"+
" \"list\": null \n"+
"}");
"{ is: link list editable\n"+
"}", true);

LinkedList cyruslinks=Kernel.config.listPathN("app:links");
links.publicState.listPath("list", cyruslinks);
linksaround = new BLELinks(
"{ is: broadcast link list\n"+
" title: \"Objects Around\" \n"+
"}");

User contacts = new User(
"{ \"is\": [ \"private\", \"contact\", \"list\" ], \n"+
" \"title\": \"Phone Contacts\", \n"+
" \"list\": null \n"+
"}");
"{ is: private contact list\n"+
" title: \"Phone Contacts\", \n"+
"}", true);

// -----------------------------------------------------

String homeusers=Kernel.config.stringPathN("app:homeusers");
currentUser = new User(homeusers, contact.uid, links.uid, contacts.uid);
currentUser = new User(homeusers, contact.uid, links.uid, linksaround.uid, contacts.uid);

LinkedList cyruslinks=Kernel.config.listPathN("app:links");
cyruslinks.addFirst(linksaround.uid);
cyruslinks.addFirst(currentUser.uid);
links.publicState.listPath("list", cyruslinks);

currentUser.funcobs.setCacheNotifyAndSaveConfig(currentUser);

currentUser.funcobs.cacheSaveAndEvaluate(contact, true);
currentUser.funcobs.cacheSaveAndEvaluate(links);
currentUser.funcobs.cacheSaveAndEvaluate(linksaround);
currentUser.funcobs.cacheSaveAndEvaluate(contacts);
currentUser.funcobs.cacheSaveAndEvaluate(currentUser, true);

Expand All @@ -83,9 +89,11 @@ static public void createUserAndDevice(){

public User(String jsonstring){ super(jsonstring); }

public User(String jsonstring, boolean cyrus){ super(jsonstring,cyrus); }

public User(JSON json){ super(json); }

public User(String homeusers, String contactuid, String linksuid, String contactsuid){
public User(String homeusers, String contactuid, String linksuid, String linksarounduid, String contactsuid){
super("{ \"is\": \"user\", \n"+
" \"homeusers\": \""+homeusers+"\", \n"+
" \"saying\": \"\", \n"+
Expand All @@ -99,6 +107,7 @@ public User(String homeusers, String contactuid, String linksuid, String contact
" \"editing\": null, \n"+
" \"viewas\": \"gui\", \n"+
" \"links\": \""+linksuid+"\", \n"+
" \"links-around\": \""+linksarounduid+"\", \n"+
" \"history\": null, \n"+
" \"contacts\": \""+contactsuid+"\", \n"+
" \"responses\": { }, \n"+
Expand Down Expand Up @@ -171,10 +180,12 @@ public void evaluate(){
}
};
if(currentlocation!=null) currentlocation.getLocationUpdates();
if(linksaround!=null) linksaround.enableScanning();
}

public void onTopPause(){
if(currentlocation!=null) currentlocation.stopLocationUpdates();
if(linksaround!=null) linksaround.disableScanning();
}

public void onTopDestroy(){
Expand Down

0 comments on commit bc88588

Please sign in to comment.