Merge pull request #435 from lgobinath/feature-android-analytics-new-sensors

Add new sensors to the android sense plugin
revert-dabc3590
Charitha Goonetilleke 8 years ago committed by GitHub
commit ac50d49e8f

@ -61,4 +61,5 @@ dependencies {
compile 'org.altbeacon:android-beacon-library:2.8.1' compile 'org.altbeacon:android-beacon-library:2.8.1'
compile 'uk.co.alt236:easycursor-android:1.0.0' compile 'uk.co.alt236:easycursor-android:1.0.0'
compile 'uk.co.alt236:bluetooth-le-library-android:1.0.0' compile 'uk.co.alt236:bluetooth-le-library-android:1.0.0'
compile 'com.google.android.gms:play-services-location:9.4.0'
} }

@ -11,11 +11,16 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BATTERY_STATS" /> <uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-sdk android:minSdkVersion="19" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-sdk android:minSdkVersion="19" />
<application <application
android:allowBackup="true" android:allowBackup="true"
@ -45,6 +50,8 @@
android:label="@string/app_name" > android:label="@string/app_name" >
</service> </service>
<service android:name="org.wso2.carbon.iot.android.sense.event.streams.activity.ActivityReceiver"/>
<receiver android:name="org.wso2.carbon.iot.android.sense.event.SenseScheduleReceiver" > <receiver android:name="org.wso2.carbon.iot.android.sense.event.SenseScheduleReceiver" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />
@ -53,13 +60,6 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver
android:name="org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryDataReceiver"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>
<activity <activity
android:name="org.wso2.carbon.iot.android.sense.realtimeviewer.ActivitySelectSensor" android:name="org.wso2.carbon.iot.android.sense.realtimeviewer.ActivitySelectSensor"

@ -25,20 +25,24 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.wso2.carbon.iot.android.sense.beacon.BeaconScanedData; import org.wso2.carbon.iot.android.sense.beacon.BeaconScanedData;
import org.wso2.carbon.iot.android.sense.constants.SenseConstants;
import org.wso2.carbon.iot.android.sense.data.publisher.mqtt.AndroidSenseMQTTHandler; import org.wso2.carbon.iot.android.sense.data.publisher.mqtt.AndroidSenseMQTTHandler;
import org.wso2.carbon.iot.android.sense.data.publisher.mqtt.transport.MQTTTransportHandler; import org.wso2.carbon.iot.android.sense.data.publisher.mqtt.transport.MQTTTransportHandler;
import org.wso2.carbon.iot.android.sense.data.publisher.mqtt.transport.TransportHandlerException; import org.wso2.carbon.iot.android.sense.data.publisher.mqtt.transport.TransportHandlerException;
import org.wso2.carbon.iot.android.sense.constants.SenseConstants;
import org.wso2.carbon.iot.android.sense.event.streams.Location.LocationData; import org.wso2.carbon.iot.android.sense.event.streams.Location.LocationData;
import org.wso2.carbon.iot.android.sense.event.streams.Location.LocationDataReader;
import org.wso2.carbon.iot.android.sense.event.streams.Speed.SpeedData;
import org.wso2.carbon.iot.android.sense.event.streams.Sensor.SensorData; import org.wso2.carbon.iot.android.sense.event.streams.Sensor.SensorData;
import org.wso2.carbon.iot.android.sense.event.streams.Speed.SpeedData;
import org.wso2.carbon.iot.android.sense.event.streams.activity.ActivityData;
import org.wso2.carbon.iot.android.sense.event.streams.application.ApplicationData;
import org.wso2.carbon.iot.android.sense.event.streams.audio.AudioData;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryData; import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryData;
import org.wso2.carbon.iot.android.sense.event.streams.call.CallData;
import org.wso2.carbon.iot.android.sense.event.streams.screen.ScreenData;
import org.wso2.carbon.iot.android.sense.event.streams.sms.SmsData;
import org.wso2.carbon.iot.android.sense.speech.detector.util.ProcessWords; import org.wso2.carbon.iot.android.sense.speech.detector.util.ProcessWords;
import org.wso2.carbon.iot.android.sense.speech.detector.util.WordData; import org.wso2.carbon.iot.android.sense.speech.detector.util.WordData;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
import org.wso2.carbon.iot.android.sense.util.LocalRegistry; import org.wso2.carbon.iot.android.sense.util.LocalRegistry;
//import org.wso2.carbon.iot.android.sense.util.SenseClient; import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -111,17 +115,21 @@ public class DataPublisherService extends Service {
} }
SenseDataHolder.resetSensorDataHolder(); SenseDataHolder.resetSensorDataHolder();
//retrieve batter data. //retrieve battery data.
List<BatteryData> batteryDataMap = SenseDataHolder.getBatteryDataHolder(); List<BatteryData> batteryDataMap = SenseDataHolder.getBatteryDataHolder();
if (!batteryDataMap.isEmpty()) { if (!batteryDataMap.isEmpty()) {
for (BatteryData batteryData : batteryDataMap) { for (BatteryData batteryData : batteryDataMap) {
Event event = new Event(); Event event = new Event();
event.setTimestamp(batteryData.getTimestamp()); event.setTimestamp(batteryData.getTimestamp());
event.setBattery(batteryData.getLevel()); event.setBattery(batteryData.getLevel());
event.setBatteryTemperature(batteryData.getTemperature());
event.setBatteryStatus(batteryData.getStatus());
event.setBatteryState(batteryData.getState().toString());
events.add(event); events.add(event);
} }
} }
SenseDataHolder.resetBatteryDataHolder(); SenseDataHolder.resetBatteryDataHolder();
//retrieve location data. //retrieve location data.
List<LocationData> locationDataMap = SenseDataHolder.getLocationDataHolder(); List<LocationData> locationDataMap = SenseDataHolder.getLocationDataHolder();
@ -186,6 +194,90 @@ public class DataPublisherService extends Service {
} }
} }
SenseDataHolder.resetWordDataHolder(); SenseDataHolder.resetWordDataHolder();
// retrieve call data.
List<CallData> callDataList = SenseDataHolder.getCallDataHolder();
if (!callDataList.isEmpty()) {
for (CallData callData : callDataList) {
Event event = new Event();
event.setCallNumber(callData.getPhoneNumber());
event.setCallType(callData.getType().toString().toLowerCase());
event.setCallStartTime(callData.getStartTime());
event.setCallEndTime(callData.getEndTime());
event.setTimestamp(callData.getStartTime());
events.add(event);
}
}
SenseDataHolder.resetCallDataHolder();
// retrieve screen data.
List<ScreenData> screenDataList = SenseDataHolder.getScreenDataHolder();
if (!screenDataList.isEmpty()) {
for (ScreenData screenData : screenDataList) {
Event event = new Event();
event.setScreenState(screenData.getAction());
event.setTimestamp(screenData.getTimestamp());
events.add(event);
}
}
SenseDataHolder.resetScreenDataHolder();
// retrieve audio data.
List<AudioData> audioDataList = SenseDataHolder.getAudioDataHolder();
if (!audioDataList.isEmpty()) {
for (AudioData audioData : audioDataList) {
Event event = new Event();
event.setTimestamp(audioData.getTimestamp());
event.setAudioPlaying(audioData.isPlaying());
event.setHeadsetOn(audioData.isHeadsetOn());
event.setMusicVolume(audioData.getMusicVolume());
events.add(event);
}
}
SenseDataHolder.resetAudioDataHolder();
// retrieve activity data.
List<ActivityData> activityDataList = SenseDataHolder.getActivityDataHolder();
if (!activityDataList.isEmpty()) {
for (ActivityData activityData : activityDataList) {
Event event = new Event();
event.setTimestamp(activityData.getTimestamp());
event.setActivityType(activityData.getActivity());
event.setConfidence(activityData.getConfidence());
events.add(event);
}
}
SenseDataHolder.resetActivityDataHolder();
// retrieve sms data.
List<SmsData> smsDataList = SenseDataHolder.getSmsDataHolder();
if (!smsDataList.isEmpty()) {
for (SmsData smsData : smsDataList) {
Event event = new Event();
event.setTimestamp(smsData.getTimestamp());
event.setSmsNumber(smsData.getPhoneNumber());
events.add(event);
}
}
SenseDataHolder.resetSmsDataHolder();
// retrieve application data.
List<ApplicationData> appDataList = SenseDataHolder.getApplicationDataHolder();
if (!appDataList.isEmpty()) {
for (ApplicationData appData : appDataList) {
Event event = new Event();
event.setTimestamp(appData.getTimestamp());
event.setPackageName(appData.getPackageName());
event.setAction(appData.getAction().toString());
events.add(event);
}
}
SenseDataHolder.resetApplicationDataHolder();
//publish the data //publish the data
if (events.size() > 0 && LocalRegistry.isEnrolled(context)) { if (events.size() > 0 && LocalRegistry.isEnrolled(context)) {
String user = LocalRegistry.getUsername(context); String user = LocalRegistry.getUsername(context);

@ -16,6 +16,12 @@ public class Event {
private float accelerometer[] = new float[]{0, 0, 0}; //x,y,z private float accelerometer[] = new float[]{0, 0, 0}; //x,y,z
private float magnetic[] = new float[]{0, 0, 0};; //x,y,z private float magnetic[] = new float[]{0, 0, 0};; //x,y,z
private float gyroscope[] = new float[]{0, 0, 0};; //x,y,z private float gyroscope[] = new float[]{0, 0, 0};; //x,y,z
private int batteryTemperature;
private int batteryStatus;
/**
* LOW or OK
*/
private String batteryState;
private float light; private float light;
private float pressure; private float pressure;
private float proximity; private float proximity;
@ -32,8 +38,28 @@ public class Event {
private int beaconMinor; private int beaconMinor;
private int beaconUuid; private int beaconUuid;
private String beaconProximity; private String beaconProximity;
private String callNumber;
private String callType;
private long callStartTime;
private long callEndTime;
/**
* State of the phone display.
* Possible values are:
* on
* off
* unknown
*/
private String screenState;
private boolean audioPlaying;
private boolean headsetOn;
private int musicVolume;
private int activityType;
private int confidence;
private String smsNumber;
private String packageName;
private String action;
private int getBattery() { private int getBattery() {
return battery; return battery;
@ -44,6 +70,33 @@ public class Event {
this.battery = battery; this.battery = battery;
} }
public int getBatteryTemperature() {
return batteryTemperature;
}
public void setBatteryTemperature(int batteryTemperature) {
this.type = "battery"; // Type is battery
this.batteryTemperature = batteryTemperature;
}
public int getBatteryStatus() {
return batteryStatus;
}
public void setBatteryStatus(int batteryStatus) {
this.type = "battery"; // Type is battery
this.batteryStatus = batteryStatus;
}
public String getBatteryState() {
return batteryState != null ? batteryState : "";
}
public void setBatteryState(String batteryState) {
this.type = "battery"; // Type is battery
this.batteryState = batteryState;
}
private double[] getGps() { private double[] getGps() {
return gps; return gps;
} }
@ -125,6 +178,15 @@ public class Event {
this.rotation = rotation; this.rotation = rotation;
} }
public void setSmsNumber(String smsNumber) {
this.type = "sms";
this.smsNumber = smsNumber;
}
public String getSmsNumber() {
return smsNumber;
}
private String getWordSessionId() { private String getWordSessionId() {
return wordSessionId != null ? wordSessionId : ""; return wordSessionId != null ? wordSessionId : "";
} }
@ -142,6 +204,24 @@ public class Event {
this.word = word; this.word = word;
} }
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.type = "application";
this.packageName = packageName;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.type = "application";
this.action = action;
}
private long getTimestamp() { private long getTimestamp() {
return timestamp; return timestamp;
} }
@ -181,6 +261,9 @@ public class Event {
public float getSpeed() { public float getSpeed() {
this.type = "speed"; this.type = "speed";
if (Float.isInfinite(speed) || Float.isNaN(speed)) {
return -1.0f;
}
return speed; return speed;
} }
@ -234,8 +317,98 @@ public class Event {
} }
public String getBeaconProximity() { public String getBeaconProximity() {
this.type = "beaconProximity"; return beaconProximity != null ? beaconProximity : "";
return beaconProximity; }
public String getCallNumber() {
return callNumber != null ? callNumber : "";
}
public void setCallNumber(String callNumber) {
this.type = "call";
this.callNumber = callNumber;
}
public String getCallType() {
return callType != null ? callType : "";
}
public void setCallType(String callType) {
this.type = "call";
this.callType = callType;
}
public long getCallStartTime() {
return callStartTime;
}
public void setCallStartTime(long callStartTime) {
this.type = "call";
this.callStartTime = callStartTime;
}
public long getCallEndTime() {
return callEndTime;
}
public void setCallEndTime(long callEndTime) {
this.type = "call";
this.callEndTime = callEndTime;
}
public String getScreenState() {
return screenState != null ? screenState : "";
}
public void setScreenState(String screenState) {
this.type = "screen";
this.screenState = screenState;
}
public boolean isAudioPlaying() {
return audioPlaying;
}
public void setAudioPlaying(boolean audioPlaying) {
this.type = "audio";
this.audioPlaying = audioPlaying;
}
public boolean isHeadsetOn() {
return headsetOn;
}
public void setHeadsetOn(boolean headsetOn) {
this.type = "audio";
this.headsetOn = headsetOn;
}
public int getMusicVolume() {
return musicVolume;
}
public void setMusicVolume(int musicVolume) {
this.type = "audio";
this.musicVolume = musicVolume;
}
public int getActivityType() {
return activityType;
}
public void setActivityType(int activityType) {
this.type = "activity";
this.activityType = activityType;
}
public int getConfidence() {
return confidence;
}
public void setConfidence(int confidence) {
// Do not set type here since it can be used for various types.
// However, now it is being used by activity only
this.confidence = confidence;
} }
public JSONObject getEvent() throws JSONException { public JSONObject getEvent() throws JSONException {
@ -248,7 +421,13 @@ public class Event {
jsonEvent.put("metaData", jsonMetaData); jsonEvent.put("metaData", jsonMetaData);
JSONObject jsonPayloadData = new JSONObject(); JSONObject jsonPayloadData = new JSONObject();
// battery
jsonPayloadData.put("battery", getBattery()); jsonPayloadData.put("battery", getBattery());
jsonPayloadData.put("battery_state", getBatteryState());
jsonPayloadData.put("battery_status", getBatteryStatus());
jsonPayloadData.put("battery_temperature", getBatteryTemperature());
//gps //gps
double gpsEvents[] = getGps(); double gpsEvents[] = getGps();
jsonPayloadData.put("gps_lat", gpsEvents[0]); jsonPayloadData.put("gps_lat", gpsEvents[0]);
@ -301,6 +480,29 @@ public class Event {
jsonPayloadData.put("word_sessionId", getWordSessionId()); jsonPayloadData.put("word_sessionId", getWordSessionId());
jsonPayloadData.put("word_status", getWordStatus()); jsonPayloadData.put("word_status", getWordStatus());
// call
jsonPayloadData.put("call_number", getCallNumber());
jsonPayloadData.put("call_type", getCallType());
jsonPayloadData.put("call_start_time", getCallStartTime());
jsonPayloadData.put("call_end_time", getCallEndTime());
// screen
jsonPayloadData.put("screen_state", getScreenState());
// headset
jsonPayloadData.put("audio_playing", isAudioPlaying());
jsonPayloadData.put("headset_on", isHeadsetOn());
jsonPayloadData.put("music_volume", getMusicVolume());
jsonPayloadData.put("activity_type", getActivityType());
jsonPayloadData.put("confidence", getConfidence());
jsonPayloadData.put("sms_number", getSmsNumber());
jsonPayloadData.put("application_name", getPackageName());
jsonPayloadData.put("action", getAction());
jsonEvent.put("payloadData", jsonPayloadData); jsonEvent.put("payloadData", jsonPayloadData);
return jsonEvent; return jsonEvent;

@ -16,11 +16,11 @@ package org.wso2.carbon.iot.android.sense.event;
import android.app.Service; import android.app.Service;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder; import android.os.IBinder;
import org.wso2.carbon.iot.android.sense.event.streams.SenseDataCollector; import org.wso2.carbon.iot.android.sense.event.streams.SenseDataCollector;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryDataReceiver;
import org.wso2.carbon.iot.android.sense.util.LocalRegistry; import org.wso2.carbon.iot.android.sense.util.LocalRegistry;
import org.wso2.carbon.iot.android.sense.util.SenseDataReceiverManager;
import org.wso2.carbon.iot.android.sense.util.SenseWakeLock; import org.wso2.carbon.iot.android.sense.util.SenseWakeLock;
/** /**
@ -48,10 +48,14 @@ public class SenseService extends Service {
//Below triggers the data collection for sensors,location and battery. //Below triggers the data collection for sensors,location and battery.
SenseDataCollector Sensor = new SenseDataCollector(this, SenseDataCollector.DataType.SENSOR); SenseDataCollector Sensor = new SenseDataCollector(this, SenseDataCollector.DataType.SENSOR);
SenseDataCollector Location = new SenseDataCollector(this, SenseDataCollector.DataType.LOCATION); SenseDataCollector Location = new SenseDataCollector(this, SenseDataCollector.DataType.LOCATION);
registerReceiver(new BatteryDataReceiver(), new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
SenseDataCollector speed = new SenseDataCollector(this, SenseDataCollector.DataType.SPEED); SenseDataCollector speed = new SenseDataCollector(this, SenseDataCollector.DataType.SPEED);
SenseDataCollector audio = new SenseDataCollector(this, SenseDataCollector.DataType.AUDIO);
SenseDataReceiverManager.registerBatteryDataReceiver(this);
SenseDataReceiverManager.registerScreenDataReceiver(this);
SenseDataReceiverManager.registerCallDataReceiver(this);
SenseDataReceiverManager.registerActivityDataReceiver(this);
SenseDataReceiverManager.registerSmsDataReceiver(this);
SenseDataReceiverManager.registerAppDataReceiver(this);
//service will not be stopped until we manually stop the service //service will not be stopped until we manually stop the service
return Service.START_NOT_STICKY; return Service.START_NOT_STICKY;
@ -59,6 +63,13 @@ public class SenseService extends Service {
@Override @Override
public void onDestroy() { public void onDestroy() {
SenseDataReceiverManager.unregisterBatteryDataReceiver(this);
SenseDataReceiverManager.unregisterScreenDataReceiver(this);
SenseDataReceiverManager.unregisterCallDataReceiver(this);
SenseDataReceiverManager.unregisterActivityDataReceiver(this);
SenseDataReceiverManager.unregisterSmsDataReceiver(this);
SenseDataReceiverManager.unregisterAppDataReceiver(this);
SenseWakeLock.releaseCPUWakeLock(); SenseWakeLock.releaseCPUWakeLock();
super.onDestroy(); super.onDestroy();
} }

@ -19,13 +19,14 @@ import org.wso2.carbon.iot.android.sense.event.streams.Location.LocationDataRead
import org.wso2.carbon.iot.android.sense.event.streams.Sensor.SensorDataReader; import org.wso2.carbon.iot.android.sense.event.streams.Sensor.SensorDataReader;
import org.wso2.carbon.iot.android.sense.event.streams.Speed.SpeedDataReader; import org.wso2.carbon.iot.android.sense.event.streams.Speed.SpeedDataReader;
import org.wso2.carbon.iot.android.sense.beacon.MonitoringActivity; import org.wso2.carbon.iot.android.sense.beacon.MonitoringActivity;
import org.wso2.carbon.iot.android.sense.event.streams.audio.AudioDataReader;
/** /**
* This class triggered by service to collect the sensor data. * This class triggered by service to collect the sensor data.
*/ */
public class SenseDataCollector { public class SenseDataCollector {
public enum DataType { public enum DataType {
SENSOR, LOCATION,SPEED SENSOR, LOCATION,SPEED, AUDIO
} }
public SenseDataCollector(Context ctx, DataType dt) { public SenseDataCollector(Context ctx, DataType dt) {
@ -40,6 +41,9 @@ public class SenseDataCollector {
case SPEED: case SPEED:
dr = new SpeedDataReader(ctx); dr = new SpeedDataReader(ctx);
break; break;
case AUDIO:
dr = new AudioDataReader(ctx);
break;
} }
if (dr != null) { if (dr != null) {

@ -0,0 +1,67 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.activity;
import java.util.Date;
public class ActivityData {
/**
* 0 - In vehicle
* 1 - Bicycle
* 2 - Foot
* 3 - Still
* 4 - Unknown
* 5 - Tilting
* 7 - Walking
* 8 - Running
*/
private int activity;
private int confidence;
private long timestamp;
ActivityData(int activity, int confidence) {
this.activity = activity;
this.confidence = confidence;
this.timestamp = new Date().getTime();
}
public int getActivity() {
return activity;
}
public void setActivity(int activity) {
this.activity = activity;
}
public int getConfidence() {
return confidence;
}
public void setConfidence(int confidence) {
this.confidence = confidence;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}

@ -0,0 +1,54 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.activity;
import android.app.IntentService;
import android.content.Intent;
import com.google.android.gms.location.ActivityRecognitionResult;
import com.google.android.gms.location.DetectedActivity;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
public class ActivityReceiver extends IntentService {
public static final int MINIMUM_CONFIDENCE = 75;
/**
* Retrieve the information for every 10 seconds.
*/
public static final long UPDATE_INTERVAL = 10000;
public ActivityReceiver() {
super(ActivityReceiver.class.getName());
}
@Override
protected void onHandleIntent(Intent intent) {
if (ActivityRecognitionResult.hasResult(intent)) {
ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
for (DetectedActivity activity : result.getProbableActivities()) {
if (activity.getConfidence() >= MINIMUM_CONFIDENCE) {
ActivityData data = new ActivityData(activity.getType(), activity.getConfidence());
SenseDataHolder.getActivityDataHolder().add(data);
}
}
}
}
}

@ -0,0 +1,61 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.application;
import java.util.Date;
public class ApplicationData {
public enum Action {
INSTALL, REMOVE
}
private long timestamp;
private String packageName;
private Action action;
ApplicationData(String packageName, Action action) {
this.packageName = packageName;
this.action = action;
this.timestamp = new Date().getTime();
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public Action getAction() {
return action;
}
public void setAction(Action action) {
this.action = action;
}
}

@ -0,0 +1,45 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
/**
* Currently interested on package add and remove only. Can be extended for modification.
*/
public class ApplicationDataReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String packageName = intent.getData().toString().substring(8);
ApplicationData appData;
if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
appData = new ApplicationData(packageName, ApplicationData.Action.INSTALL);
} else {
// Removed
appData = new ApplicationData(packageName, ApplicationData.Action.REMOVE);
}
SenseDataHolder.getApplicationDataHolder().add(appData);
}
}

@ -0,0 +1,58 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.audio;
public class AudioData {
private long timestamp;
private boolean headsetOn;
private int musicVolume;
private boolean playing;
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public boolean isHeadsetOn() {
return headsetOn;
}
public void setHeadsetOn(boolean headsetOn) {
this.headsetOn = headsetOn;
}
public int getMusicVolume() {
return musicVolume;
}
public void setMusicVolume(int musicVolume) {
this.musicVolume = musicVolume;
}
public boolean isPlaying() {
return playing;
}
public void setPlaying(boolean playing) {
this.playing = playing;
}
}

@ -0,0 +1,50 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.audio;
import android.content.Context;
import android.media.AudioManager;
import android.util.Log;
import org.wso2.carbon.iot.android.sense.event.streams.DataReader;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
import java.util.Date;
public class AudioDataReader extends DataReader {
private static final String TAG = AudioDataReader.class.getName();
private Context context;
public AudioDataReader(Context context) {
this.context = context;
}
@Override
public void run() {
Log.d(TAG, "Running AudioDataReader");
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
AudioData audioData = new AudioData();
audioData.setTimestamp(new Date().getTime());
audioData.setPlaying(manager.isMusicActive());
audioData.setHeadsetOn(manager.isWiredHeadsetOn());
audioData.setMusicVolume(manager.getStreamVolume(AudioManager.STREAM_MUSIC));
SenseDataHolder.getAudioDataHolder().add(audioData);
}
}

@ -25,6 +25,10 @@ import java.util.Date;
*/ */
public class BatteryData { public class BatteryData {
public enum State {
LOW, OK
}
private int health; private int health;
private int level; private int level;
private int plugged; private int plugged;
@ -34,6 +38,7 @@ public class BatteryData {
private int temperature; private int temperature;
private int voltage; private int voltage;
private long timestamp; private long timestamp;
private State state;
BatteryData(Intent intent) { BatteryData(Intent intent) {
timestamp = new Date().getTime(); timestamp = new Date().getTime();
@ -46,7 +51,12 @@ public class BatteryData {
String technology = intent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY); String technology = intent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY);
temperature = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0); temperature = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0);
voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0); voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0);
state = State.OK;
}
BatteryData(State state) {
this.timestamp = new Date().getTime();
this.state = state;
} }
public int getHealth() { public int getHealth() {
@ -121,4 +131,12 @@ public class BatteryData {
public void setTimestamp(long timestamp) { public void setTimestamp(long timestamp) {
this.timestamp = timestamp; this.timestamp = timestamp;
} }
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
} }

@ -32,7 +32,13 @@ public class BatteryDataReceiver extends BroadcastReceiver {
*/ */
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BATTERY_OKAY.equals(intent.getAction())) {
SenseDataHolder.getBatteryDataHolder().add(new BatteryData(BatteryData.State.OK));
} else if (Intent.ACTION_BATTERY_LOW.equals(intent.getAction())) {
SenseDataHolder.getBatteryDataHolder().add(new BatteryData(BatteryData.State.LOW));
} else {
SenseDataHolder.getBatteryDataHolder().add(new BatteryData(intent)); SenseDataHolder.getBatteryDataHolder().add(new BatteryData(intent));
} }
}
} }

@ -0,0 +1,70 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.call;
public class CallData {
public enum Type {
INCOMING, OUTGOING, MISSED;
}
private Type type;
private String phoneNumber;
private long startTime;
private long endTime;
public CallData(Type type, String phoneNumber, long startTime, long endTime) {
this.type = type;
this.phoneNumber = phoneNumber;
this.startTime = startTime;
this.endTime = endTime;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
}

@ -0,0 +1,87 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.call;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
public class CallDataReceiver extends BroadcastReceiver {
private static int lastState = TelephonyManager.CALL_STATE_IDLE;
private static long startTime;
private static boolean isIncoming;
private static String lastNotifiedNumber;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
lastNotifiedNumber = intent.getExtras().getString(Intent.EXTRA_PHONE_NUMBER);
} else {
String extraState = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
int state = 0;
if (extraState.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
state = TelephonyManager.CALL_STATE_IDLE;
} else if (extraState.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
state = TelephonyManager.CALL_STATE_OFFHOOK;
} else if (extraState.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
state = TelephonyManager.CALL_STATE_RINGING;
}
if (lastState == state) {
return; // Nothing has been changed
}
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// Receiving a call
isIncoming = true;
startTime = System.currentTimeMillis();
// If incoming call, get the incoming number
lastNotifiedNumber = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if (lastState == TelephonyManager.CALL_STATE_RINGING) {
// RINGING -> OFFHOOK = ANSWERED
isIncoming = true;
startTime = System.currentTimeMillis();
} else {
// NOT RINGING -> OFFHOOK = OUTGOING
isIncoming = false;
startTime = System.currentTimeMillis();
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (lastState == TelephonyManager.CALL_STATE_RINGING) {
// RINGING -> IDLE = MISSED
SenseDataHolder.getCallDataHolder().add(new CallData(CallData.Type.MISSED, lastNotifiedNumber, startTime, System.currentTimeMillis()));
} else if (isIncoming) {
// Incoming (OFFHOOK) -> IDLE = INCOMING CALL ENDED
SenseDataHolder.getCallDataHolder().add(new CallData(CallData.Type.INCOMING, lastNotifiedNumber, startTime, System.currentTimeMillis()));
} else {
// Not Incoming -> IDLE = OUTGOING CALL ENDED
SenseDataHolder.getCallDataHolder().add(new CallData(CallData.Type.OUTGOING, lastNotifiedNumber, startTime, System.currentTimeMillis()));
}
break;
}
lastState = state;
}
}
}

@ -0,0 +1,55 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.screen;
import android.content.Intent;
import java.util.Date;
public class ScreenData {
private String action;
private long timestamp;
ScreenData(Intent intent) {
if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
this.action = "on";
} else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
this.action = "off";
} else {
this.action = "unknown";
}
this.timestamp = new Date().getTime();
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}

@ -0,0 +1,32 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.screen;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
public class ScreenDataReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SenseDataHolder.getScreenDataHolder().add(new ScreenData(intent));
}
}

@ -0,0 +1,58 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.sms;
import java.util.Date;
public class SmsData {
private String phoneNumber;
private long timestamp;
private String message;
SmsData(String phoneNumber, String message) {
this.phoneNumber = phoneNumber;
this.message = message;
this.timestamp = new Date().getTime();
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

@ -0,0 +1,49 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.event.streams.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import org.wso2.carbon.iot.android.sense.util.SenseDataHolder;
public class SmsDataReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String message = currentMessage.getDisplayMessageBody();
SmsData smsData = new SmsData(phoneNumber, message);
SenseDataHolder.getSmsDataHolder().add(smsData);
}
}
}
}

@ -60,6 +60,7 @@ public class SupportedSensors {
sensorList.add("Light"); sensorList.add("Light");
sensorList.add("Gyroscope"); sensorList.add("Gyroscope");
sensorList.add("Proximity"); sensorList.add("Proximity");
sensorList.add("Pedometer");
} }
/** /**
@ -74,6 +75,7 @@ public class SupportedSensors {
sensorTypeMap.put("gyroscope", Sensor.TYPE_GYROSCOPE); sensorTypeMap.put("gyroscope", Sensor.TYPE_GYROSCOPE);
sensorTypeMap.put("light", Sensor.TYPE_LIGHT); sensorTypeMap.put("light", Sensor.TYPE_LIGHT);
sensorTypeMap.put("proximity", Sensor.TYPE_PROXIMITY); sensorTypeMap.put("proximity", Sensor.TYPE_PROXIMITY);
sensorTypeMap.put("pedometer", Sensor.TYPE_STEP_COUNTER);
} }
/** /**
@ -88,6 +90,7 @@ public class SupportedSensors {
typeSensorMap.put(Sensor.TYPE_GYROSCOPE, "gyroscope"); typeSensorMap.put(Sensor.TYPE_GYROSCOPE, "gyroscope");
typeSensorMap.put(Sensor.TYPE_LIGHT, "light"); typeSensorMap.put(Sensor.TYPE_LIGHT, "light");
typeSensorMap.put(Sensor.TYPE_PROXIMITY, "proximity"); typeSensorMap.put(Sensor.TYPE_PROXIMITY, "proximity");
typeSensorMap.put(Sensor.TYPE_STEP_COUNTER, "pedometer");
} }
/** /**

@ -17,11 +17,17 @@ import org.wso2.carbon.iot.android.sense.beacon.BeaconScanedData;
import org.wso2.carbon.iot.android.sense.event.streams.Location.LocationData; import org.wso2.carbon.iot.android.sense.event.streams.Location.LocationData;
import org.wso2.carbon.iot.android.sense.event.streams.Sensor.SensorData; import org.wso2.carbon.iot.android.sense.event.streams.Sensor.SensorData;
import org.wso2.carbon.iot.android.sense.event.streams.Speed.SpeedData; import org.wso2.carbon.iot.android.sense.event.streams.Speed.SpeedData;
import org.wso2.carbon.iot.android.sense.event.streams.activity.ActivityData;
import org.wso2.carbon.iot.android.sense.event.streams.application.ApplicationData;
import org.wso2.carbon.iot.android.sense.event.streams.audio.AudioData;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryData; import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryData;
import org.wso2.carbon.iot.android.sense.event.streams.call.CallData;
import org.wso2.carbon.iot.android.sense.event.streams.screen.ScreenData;
import org.wso2.carbon.iot.android.sense.event.streams.sms.SmsData;
import org.wso2.carbon.iot.android.sense.speech.detector.util.WordData; import org.wso2.carbon.iot.android.sense.speech.detector.util.WordData;
import java.util.List; import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import android.util.Log;
/** /**
@ -31,11 +37,16 @@ public class SenseDataHolder {
private static List<SensorData> sensorDataHolder; private static List<SensorData> sensorDataHolder;
private static List<BatteryData> batteryDataHolder; private static List<BatteryData> batteryDataHolder;
private static List<CallData> callDataHolder;
private static List<LocationData> locationDataHolder; private static List<LocationData> locationDataHolder;
private static List<WordData> wordDataHolder; private static List<WordData> wordDataHolder;
private static List<SpeedData> speedDataHolder; private static List<SpeedData> speedDataHolder;
private static List<BeaconScanedData> beaconScanedDataHolder; private static List<BeaconScanedData> beaconScanedDataHolder;
private static List<ScreenData> screenDataHolder;
private static List<AudioData> audioDataHolder;
private static List<ActivityData> activityDataHolder;
private static List<SmsData> smsDataHolder;
private static List<ApplicationData> applicationDataHolder;
//LocationData gps; //LocationData gps;
@ -56,6 +67,13 @@ public class SenseDataHolder {
return batteryDataHolder; return batteryDataHolder;
} }
public static List<CallData> getCallDataHolder() {
if (callDataHolder == null) {
callDataHolder = new CopyOnWriteArrayList<>();
}
return callDataHolder;
}
public static List<LocationData> getLocationDataHolder() { public static List<LocationData> getLocationDataHolder() {
@ -88,6 +106,41 @@ public class SenseDataHolder {
return beaconScanedDataHolder; return beaconScanedDataHolder;
} }
public static List<ScreenData> getScreenDataHolder() {
if (screenDataHolder == null) {
screenDataHolder = new CopyOnWriteArrayList<>();
}
return screenDataHolder;
}
public static List<AudioData> getAudioDataHolder() {
if (audioDataHolder == null) {
audioDataHolder = new CopyOnWriteArrayList<>();
}
return audioDataHolder;
}
public static List<ActivityData> getActivityDataHolder() {
if (activityDataHolder == null) {
activityDataHolder = new CopyOnWriteArrayList<>();
}
return activityDataHolder;
}
public static List<SmsData> getSmsDataHolder() {
if (smsDataHolder == null) {
smsDataHolder = new CopyOnWriteArrayList<>();
}
return smsDataHolder;
}
public static List<ApplicationData> getApplicationDataHolder() {
if (applicationDataHolder == null) {
applicationDataHolder = new CopyOnWriteArrayList<>();
}
return applicationDataHolder;
}
public static void resetSensorDataHolder() { public static void resetSensorDataHolder() {
sensorDataHolder = null; sensorDataHolder = null;
} }
@ -96,6 +149,10 @@ public class SenseDataHolder {
batteryDataHolder = null; batteryDataHolder = null;
} }
public static void resetCallDataHolder() {
callDataHolder = null;
}
public static void resetLocationDataHolder() { public static void resetLocationDataHolder() {
locationDataHolder = null; locationDataHolder = null;
} }
@ -112,5 +169,23 @@ public class SenseDataHolder {
beaconScanedDataHolder = null; beaconScanedDataHolder = null;
} }
public static void resetScreenDataHolder() {
screenDataHolder = null;
}
public static void resetAudioDataHolder() {
audioDataHolder = null;
}
public static void resetActivityDataHolder() {
activityDataHolder = null;
}
public static void resetSmsDataHolder() {
smsDataHolder = null;
}
public static void resetApplicationDataHolder() {
applicationDataHolder = null;
}
} }

@ -0,0 +1,175 @@
/*
* Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.iot.android.sense.util;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Telephony;
import android.support.annotation.Nullable;
import android.telephony.TelephonyManager;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.ActivityRecognition;
import org.wso2.carbon.iot.android.sense.event.streams.activity.ActivityReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.application.ApplicationDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.battery.BatteryDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.call.CallDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.screen.ScreenDataReceiver;
import org.wso2.carbon.iot.android.sense.event.streams.sms.SmsDataReceiver;
public class SenseDataReceiverManager {
private static BroadcastReceiver batteryDataReceiver;
private static BroadcastReceiver screenDataReceiver;
private static BroadcastReceiver callDataReceiver;
private static GoogleApiClient apiClient;
private static SmsDataReceiver smsDataReceiver;
private static ApplicationDataReceiver appDataReceiver;
private SenseDataReceiverManager() {
}
public static void registerBatteryDataReceiver(Context context) {
if (batteryDataReceiver == null) {
batteryDataReceiver = new BatteryDataReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_LOW);
intentFilter.addAction(Intent.ACTION_BATTERY_OKAY);
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
context.registerReceiver(batteryDataReceiver, intentFilter);
}
}
public static void unregisterBatteryDataReceiver(Context context) {
if (batteryDataReceiver != null) {
context.unregisterReceiver(batteryDataReceiver);
batteryDataReceiver = null;
}
}
public static void registerScreenDataReceiver(Context context) {
if (screenDataReceiver == null) {
screenDataReceiver = new ScreenDataReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
context.registerReceiver(screenDataReceiver, intentFilter);
}
}
public static void unregisterScreenDataReceiver(Context context) {
if (screenDataReceiver != null) {
context.unregisterReceiver(screenDataReceiver);
screenDataReceiver = null;
}
}
public static void registerCallDataReceiver(Context context) {
if (callDataReceiver == null) {
callDataReceiver = new CallDataReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
intentFilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
context.registerReceiver(callDataReceiver, intentFilter);
}
}
public static void unregisterCallDataReceiver(Context context) {
if (callDataReceiver != null) {
context.unregisterReceiver(callDataReceiver);
callDataReceiver = null;
}
}
public static void registerActivityDataReceiver(Context context) {
if (apiClient == null) {
Intent intent = new Intent(context, ActivityReceiver.class);
final PendingIntent pendingIntent = PendingIntent.getService(context, 888971, intent, PendingIntent.FLAG_UPDATE_CURRENT);
apiClient = new GoogleApiClient.Builder(context)
.addApi(ActivityRecognition.API)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(@Nullable Bundle bundle) {
ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(apiClient, ActivityReceiver.UPDATE_INTERVAL, pendingIntent);
}
@Override
public void onConnectionSuspended(int i) {
ActivityRecognition.ActivityRecognitionApi.removeActivityUpdates(apiClient, pendingIntent);
}
})
.build();
apiClient.connect();
}
}
public static void unregisterActivityDataReceiver(Context context) {
if (apiClient != null) {
apiClient.disconnect();
apiClient = null;
}
}
public static void registerSmsDataReceiver(Context context) {
if (smsDataReceiver == null) {
smsDataReceiver = new SmsDataReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
context.registerReceiver(smsDataReceiver, intentFilter);
}
}
public static void unregisterSmsDataReceiver(Context context) {
if (smsDataReceiver != null) {
context.unregisterReceiver(smsDataReceiver);
smsDataReceiver = null;
}
}
public static void registerAppDataReceiver(Context context) {
if (appDataReceiver == null) {
appDataReceiver = new ApplicationDataReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
context.registerReceiver(appDataReceiver, intentFilter);
}
}
public static void unregisterAppDataReceiver(Context context) {
if (appDataReceiver != null) {
context.unregisterReceiver(appDataReceiver);
appDataReceiver = null;
}
}
}
Loading…
Cancel
Save