diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle
index 0c360c9b1..9f6b11adf 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/build.gradle
@@ -61,4 +61,5 @@ dependencies {
compile 'org.altbeacon:android-beacon-library:2.8.1'
compile 'uk.co.alt236:easycursor-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'
}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml
index 7ba9b334c..2b0f926da 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/AndroidManifest.xml
@@ -11,11 +11,16 @@
-
-
+
+
+
+
+
+
+
+
+
@@ -53,13 +60,6 @@
-
-
-
-
-
batteryDataMap = SenseDataHolder.getBatteryDataHolder();
if (!batteryDataMap.isEmpty()) {
for (BatteryData batteryData : batteryDataMap) {
Event event = new Event();
event.setTimestamp(batteryData.getTimestamp());
event.setBattery(batteryData.getLevel());
+ event.setBatteryTemperature(batteryData.getTemperature());
+ event.setBatteryStatus(batteryData.getStatus());
+ event.setBatteryState(batteryData.getState().toString());
events.add(event);
}
}
SenseDataHolder.resetBatteryDataHolder();
+
//retrieve location data.
List locationDataMap = SenseDataHolder.getLocationDataHolder();
@@ -132,7 +140,7 @@ public class DataPublisherService extends Service {
event.setGps(new double[]{locationData.getLatitude(), locationData.getLongitude()});
events.add(event);
}
- }
+ }
SenseDataHolder.resetLocationDataHolder();
//retrieve speed data.
@@ -186,6 +194,90 @@ public class DataPublisherService extends Service {
}
}
SenseDataHolder.resetWordDataHolder();
+
+ // retrieve call data.
+ List 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 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 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 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 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 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
if (events.size() > 0 && LocalRegistry.isEnrolled(context)) {
String user = LocalRegistry.getUsername(context);
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/data/publisher/Event.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/data/publisher/Event.java
index 5b5446d70..1bc91c3a3 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/data/publisher/Event.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/data/publisher/Event.java
@@ -16,6 +16,12 @@ public class Event {
private float accelerometer[] = 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 int batteryTemperature;
+ private int batteryStatus;
+ /**
+ * LOW or OK
+ */
+ private String batteryState;
private float light;
private float pressure;
private float proximity;
@@ -32,8 +38,28 @@ public class Event {
private int beaconMinor;
private int beaconUuid;
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() {
return battery;
@@ -44,6 +70,33 @@ public class Event {
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() {
return gps;
}
@@ -125,6 +178,15 @@ public class Event {
this.rotation = rotation;
}
+ public void setSmsNumber(String smsNumber) {
+ this.type = "sms";
+ this.smsNumber = smsNumber;
+ }
+
+ public String getSmsNumber() {
+ return smsNumber;
+ }
+
private String getWordSessionId() {
return wordSessionId != null ? wordSessionId : "";
}
@@ -142,6 +204,24 @@ public class Event {
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() {
return timestamp;
}
@@ -181,6 +261,9 @@ public class Event {
public float getSpeed() {
this.type = "speed";
+ if (Float.isInfinite(speed) || Float.isNaN(speed)) {
+ return -1.0f;
+ }
return speed;
}
@@ -192,7 +275,7 @@ public class Event {
public String getTurns() {
- if (turn == null || turn.isEmpty() || turn.equals("null")){
+ if (turn == null || turn.isEmpty() || turn.equals("null")) {
turn = "No Turns";
}
return turn;
@@ -234,8 +317,98 @@ public class Event {
}
public String getBeaconProximity() {
- this.type = "beaconProximity";
- return beaconProximity;
+ return beaconProximity != null ? 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 {
@@ -248,7 +421,13 @@ public class Event {
jsonEvent.put("metaData", jsonMetaData);
JSONObject jsonPayloadData = new JSONObject();
+ // battery
jsonPayloadData.put("battery", getBattery());
+ jsonPayloadData.put("battery_state", getBatteryState());
+ jsonPayloadData.put("battery_status", getBatteryStatus());
+ jsonPayloadData.put("battery_temperature", getBatteryTemperature());
+
+
//gps
double gpsEvents[] = getGps();
jsonPayloadData.put("gps_lat", gpsEvents[0]);
@@ -301,6 +480,29 @@ public class Event {
jsonPayloadData.put("word_sessionId", getWordSessionId());
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);
return jsonEvent;
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/SenseService.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/SenseService.java
index 0aac98076..37e3356c6 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/SenseService.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/SenseService.java
@@ -16,11 +16,11 @@ package org.wso2.carbon.iot.android.sense.event;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.os.IBinder;
+
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.SenseDataReceiverManager;
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.
SenseDataCollector Sensor = new SenseDataCollector(this, SenseDataCollector.DataType.SENSOR);
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 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
return Service.START_NOT_STICKY;
@@ -59,6 +63,13 @@ public class SenseService extends Service {
@Override
public void onDestroy() {
+ SenseDataReceiverManager.unregisterBatteryDataReceiver(this);
+ SenseDataReceiverManager.unregisterScreenDataReceiver(this);
+ SenseDataReceiverManager.unregisterCallDataReceiver(this);
+ SenseDataReceiverManager.unregisterActivityDataReceiver(this);
+ SenseDataReceiverManager.unregisterSmsDataReceiver(this);
+ SenseDataReceiverManager.unregisterAppDataReceiver(this);
+
SenseWakeLock.releaseCPUWakeLock();
super.onDestroy();
}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/SenseDataCollector.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/SenseDataCollector.java
index 4899b29b8..726e55fd4 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/SenseDataCollector.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/SenseDataCollector.java
@@ -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.Speed.SpeedDataReader;
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.
*/
public class SenseDataCollector {
public enum DataType {
- SENSOR, LOCATION,SPEED
+ SENSOR, LOCATION,SPEED, AUDIO
}
public SenseDataCollector(Context ctx, DataType dt) {
@@ -40,6 +41,9 @@ public class SenseDataCollector {
case SPEED:
dr = new SpeedDataReader(ctx);
break;
+ case AUDIO:
+ dr = new AudioDataReader(ctx);
+ break;
}
if (dr != null) {
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/activity/ActivityData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/activity/ActivityData.java
new file mode 100644
index 000000000..772351c5b
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/activity/ActivityData.java
@@ -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;
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/activity/ActivityReceiver.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/activity/ActivityReceiver.java
new file mode 100644
index 000000000..322049198
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/activity/ActivityReceiver.java
@@ -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);
+ }
+ }
+ }
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/application/ApplicationData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/application/ApplicationData.java
new file mode 100644
index 000000000..1443e36b9
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/application/ApplicationData.java
@@ -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;
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/application/ApplicationDataReceiver.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/application/ApplicationDataReceiver.java
new file mode 100644
index 000000000..8cb52550f
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/application/ApplicationDataReceiver.java
@@ -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);
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/audio/AudioData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/audio/AudioData.java
new file mode 100644
index 000000000..0449d3291
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/audio/AudioData.java
@@ -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;
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/audio/AudioDataReader.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/audio/AudioDataReader.java
new file mode 100644
index 000000000..1a5f85c09
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/audio/AudioDataReader.java
@@ -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);
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryData.java
index 666e02a85..7a4d7413a 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryData.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryData.java
@@ -25,6 +25,10 @@ import java.util.Date;
*/
public class BatteryData {
+ public enum State {
+ LOW, OK
+ }
+
private int health;
private int level;
private int plugged;
@@ -34,6 +38,7 @@ public class BatteryData {
private int temperature;
private int voltage;
private long timestamp;
+ private State state;
BatteryData(Intent intent) {
timestamp = new Date().getTime();
@@ -46,7 +51,12 @@ public class BatteryData {
String technology = intent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY);
temperature = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 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() {
@@ -121,4 +131,12 @@ public class BatteryData {
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
+
+ public State getState() {
+ return state;
+ }
+
+ public void setState(State state) {
+ this.state = state;
+ }
}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryDataReceiver.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryDataReceiver.java
index 9fffa1c15..794f69b3d 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryDataReceiver.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/battery/BatteryDataReceiver.java
@@ -32,7 +32,13 @@ public class BatteryDataReceiver extends BroadcastReceiver {
*/
@Override
public void onReceive(Context context, Intent intent) {
- SenseDataHolder.getBatteryDataHolder().add(new BatteryData(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));
+ }
}
}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/call/CallData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/call/CallData.java
new file mode 100644
index 000000000..9f617cdb1
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/call/CallData.java
@@ -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;
+ }
+}
\ No newline at end of file
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/call/CallDataReceiver.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/call/CallDataReceiver.java
new file mode 100644
index 000000000..1988914e8
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/call/CallDataReceiver.java
@@ -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;
+ }
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/screen/ScreenData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/screen/ScreenData.java
new file mode 100644
index 000000000..0c124611f
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/screen/ScreenData.java
@@ -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;
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/screen/ScreenDataReceiver.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/screen/ScreenDataReceiver.java
new file mode 100644
index 000000000..ace9d98fa
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/screen/ScreenDataReceiver.java
@@ -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));
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/sms/SmsData.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/sms/SmsData.java
new file mode 100644
index 000000000..607ca2a85
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/sms/SmsData.java
@@ -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;
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/sms/SmsDataReceiver.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/sms/SmsDataReceiver.java
new file mode 100644
index 000000000..2ada981fb
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/event/streams/sms/SmsDataReceiver.java
@@ -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);
+ }
+ }
+ }
+}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/sensorlisting/SupportedSensors.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/sensorlisting/SupportedSensors.java
index 6d57e6d70..2b0f5351b 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/sensorlisting/SupportedSensors.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/realtimeviewer/sensorlisting/SupportedSensors.java
@@ -60,6 +60,7 @@ public class SupportedSensors {
sensorList.add("Light");
sensorList.add("Gyroscope");
sensorList.add("Proximity");
+ sensorList.add("Pedometer");
}
/**
@@ -74,6 +75,7 @@ public class SupportedSensors {
sensorTypeMap.put("gyroscope", Sensor.TYPE_GYROSCOPE);
sensorTypeMap.put("light", Sensor.TYPE_LIGHT);
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_LIGHT, "light");
typeSensorMap.put(Sensor.TYPE_PROXIMITY, "proximity");
+ typeSensorMap.put(Sensor.TYPE_STEP_COUNTER, "pedometer");
}
/**
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataHolder.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataHolder.java
index 1d33225b9..c3d12cafb 100755
--- a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataHolder.java
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataHolder.java
@@ -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.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.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 java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
-import android.util.Log;
/**
@@ -31,72 +37,123 @@ public class SenseDataHolder {
private static List sensorDataHolder;
private static List batteryDataHolder;
+ private static List callDataHolder;
private static List locationDataHolder;
private static List wordDataHolder;
private static List speedDataHolder;
private static List beaconScanedDataHolder;
-
+ private static List screenDataHolder;
+ private static List audioDataHolder;
+ private static List activityDataHolder;
+ private static List smsDataHolder;
+ private static List applicationDataHolder;
//LocationData gps;
private static final String TAG = SenseDataHolder.class.getName();
- public static List getSensorDataHolder(){
- if(sensorDataHolder == null){
+ public static List getSensorDataHolder() {
+ if (sensorDataHolder == null) {
sensorDataHolder = new CopyOnWriteArrayList<>();
}
return sensorDataHolder;
}
- public static List getBatteryDataHolder(){
- if(batteryDataHolder == null){
+ public static List getBatteryDataHolder() {
+ if (batteryDataHolder == null) {
batteryDataHolder = new CopyOnWriteArrayList<>();
}
return batteryDataHolder;
}
- public static List getLocationDataHolder(){
+ public static List getCallDataHolder() {
+ if (callDataHolder == null) {
+ callDataHolder = new CopyOnWriteArrayList<>();
+ }
+ return callDataHolder;
+ }
+
+ public static List getLocationDataHolder() {
- if(locationDataHolder == null){
+ if (locationDataHolder == null) {
locationDataHolder = new CopyOnWriteArrayList<>();
}
- return locationDataHolder;
+ return locationDataHolder;
}
- public static List getWordDataHolder(){
- if(wordDataHolder == null){
+ public static List getWordDataHolder() {
+ if (wordDataHolder == null) {
wordDataHolder = new CopyOnWriteArrayList<>();
}
return wordDataHolder;
}
- public static List getSpeedDataHolder(){
- if(speedDataHolder == null){
+ public static List getSpeedDataHolder() {
+ if (speedDataHolder == null) {
speedDataHolder = new CopyOnWriteArrayList<>();
}
return speedDataHolder;
}
- public static List getBeaconScanedDataHolder(){
- if(beaconScanedDataHolder == null){
+ public static List getBeaconScanedDataHolder() {
+ if (beaconScanedDataHolder == null) {
beaconScanedDataHolder = new CopyOnWriteArrayList<>();
}
return beaconScanedDataHolder;
}
- public static void resetSensorDataHolder(){
+ public static List getScreenDataHolder() {
+ if (screenDataHolder == null) {
+ screenDataHolder = new CopyOnWriteArrayList<>();
+ }
+ return screenDataHolder;
+ }
+
+ public static List getAudioDataHolder() {
+ if (audioDataHolder == null) {
+ audioDataHolder = new CopyOnWriteArrayList<>();
+ }
+ return audioDataHolder;
+ }
+
+ public static List getActivityDataHolder() {
+ if (activityDataHolder == null) {
+ activityDataHolder = new CopyOnWriteArrayList<>();
+ }
+ return activityDataHolder;
+ }
+
+ public static List getSmsDataHolder() {
+ if (smsDataHolder == null) {
+ smsDataHolder = new CopyOnWriteArrayList<>();
+ }
+ return smsDataHolder;
+ }
+
+ public static List getApplicationDataHolder() {
+ if (applicationDataHolder == null) {
+ applicationDataHolder = new CopyOnWriteArrayList<>();
+ }
+ return applicationDataHolder;
+ }
+
+ public static void resetSensorDataHolder() {
sensorDataHolder = null;
}
- public static void resetBatteryDataHolder(){
+ public static void resetBatteryDataHolder() {
batteryDataHolder = null;
}
- public static void resetLocationDataHolder(){
+ public static void resetCallDataHolder() {
+ callDataHolder = null;
+ }
+
+ public static void resetLocationDataHolder() {
locationDataHolder = null;
}
@@ -112,5 +169,23 @@ public class SenseDataHolder {
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;
+ }
}
diff --git a/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataReceiverManager.java b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataReceiverManager.java
new file mode 100644
index 000000000..a72532464
--- /dev/null
+++ b/components/device-types/androidsense-plugin/org.wso2.carbon.device.mgt.iot.androidsense.agent/app/src/main/java/org/wso2/carbon/iot/android/sense/util/SenseDataReceiverManager.java
@@ -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;
+ }
+ }
+}