package org.witness.informacam.informa.suckers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.FileObserver;
import android.util.Log;
import org.witness.informacam.informa.SensorLogger;
import org.witness.informacam.models.j3m.ILogPack;
import org.witness.informacam.utils.Constants.Suckers;
import org.witness.informacam.utils.Constants.App.Storage;
import org.witness.informacam.utils.Constants.Logger;
import org.witness.informacam.utils.Constants.Suckers.Device.Keys;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TimerTask;
public class DeviceSucker extends SensorLogger {
private DCIMFileMonitor fileMonitor;
private PlugReceiver plug_receiver;
private final static String LOG = String.format("***** DeviceSucker : %s", Suckers.LOG);
public DeviceSucker(final Context context) {
super(context);
setSucker(this);
fileMonitor = new DCIMFileMonitor(getDCIMAlias());
plug_receiver = new PlugReceiver();
setTask(new TimerTask() {
@Override
public void run() {
// Nothing to do here.
}
});
mContext.registerReceiver(plug_receiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
fileMonitor.start();
getTimer().schedule(getTask(), 0, Suckers.Device.LOG_RATE);
}
private String getDCIMAlias() {
return String.format("%s/%s", System.getenv("EXTERNAL_STORAGE"),
Storage.DCIM.substring(Storage.DCIM.indexOf("DCIM")));
}
private void getPlugState(Intent intent) {
String parse = null;
int plugged_state = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
Logger.d(LOG, String.format("GETTING PLUG STATE: %d", plugged_state));
switch(plugged_state) {
case BatteryManager.BATTERY_PLUGGED_AC:
parse = "battery plugged AC";
break;
case BatteryManager.BATTERY_PLUGGED_USB:
parse = "battery plugged USB";
break;
}
if(parse != null) {
ILogPack logPack = new ILogPack();
logPack.put(Keys.PLUG_EVENT_TYPE, parse);
logPack.put(Keys.PLUG_EVENT_CODE, plugged_state);
sendToBuffer(logPack);
}
}
class PlugReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
DeviceSucker.this.getPlugState(intent);
}
}
class DCIMFileMonitor extends FileObserver {
private String dcim_alias;
public DCIMFileMonitor(String dcim_alias) {
super(dcim_alias, FileObserver.ALL_EVENTS);
this.dcim_alias = dcim_alias;
}
public void start() {
startWatching();
}
public void stop() {
stopWatching();
}
@Override
public void onEvent(int event, String path) {
String parse = null;
switch(event) {
case FileObserver.CREATE:
parse = "file created";
break;
case FileObserver.MODIFY:
parse = "file modified";
break;
case FileObserver.CLOSE_WRITE:
parse = "file closed/writen";
break;
case FileObserver.ACCESS:
//parse = "file accessed";
break;
case FileObserver.DELETE:
parse = "file deleted";
break;
case FileObserver.OPEN:
//parse = "file opened";
break;
case FileObserver.CLOSE_NOWRITE:
//parse = "file closed/not writen";
break;
case FileObserver.ATTRIB:
parse = "file attribs changed";
break;
}
if(parse != null) {
Logger.d(LOG, String.format("EVENT %d ON %s: %s", event, path, parse));
//lsof_r1(path);
ILogPack logPack = new ILogPack();
logPack.put(Keys.FILE_EFFECTED, path);
logPack.put(Keys.ACCESS_TYPE, parse);
logPack.put(Keys.ACCESS_CODE, event);
DeviceSucker.this.sendToBuffer(logPack);
}
}
}
public void stopUpdates() {
setIsRunning(false);
fileMonitor.stop();
mContext.unregisterReceiver(plug_receiver);
Logger.d(LOG, "shutting down DCIMSucker...");
}
}