package com.dappervision.wearscript.managers; import android.content.Context; import android.hardware.SensorManager; import com.dappervision.wearscript.BackgroundService; import com.dappervision.wearscript.WearScript; import com.dappervision.wearscript.dataproviders.BatteryDataProvider; import com.dappervision.wearscript.dataproviders.DataPoint; import com.dappervision.wearscript.dataproviders.DataProvider; import com.dappervision.wearscript.dataproviders.GPSDataProvider; import com.dappervision.wearscript.dataproviders.NativeDataProvider; import com.dappervision.wearscript.dataproviders.PebbleDataProvider; import com.dappervision.wearscript.dataproviders.RemoteDataProvider; import com.dappervision.wearscript.events.PebbleAccelerometerDataEvent; import com.dappervision.wearscript.events.SensorJSEvent; import java.util.concurrent.ConcurrentHashMap; public class DataManager extends Manager { SensorManager sensorManager; ConcurrentHashMap<Integer, DataProvider> providers; ConcurrentHashMap<Integer, String> jsCallbacks; public DataManager(BackgroundService bs) { super(bs); this.sensorManager = (SensorManager) bs.getSystemService(Context.SENSOR_SERVICE); this.providers = new ConcurrentHashMap<Integer, DataProvider>(); reset(); } public void onEvent(SensorJSEvent e) { if (e.getStatus()) { registerProvider(e.getType(), Math.round(e.getSampleTime() * 1000000000L)); if (e.getCallback() != null) { registerCallback(e.getType(), e.getCallback()); } } else { unregisterCallback(e.getType()); unregisterProvider(e.getType()); } } public void registerProvider(int type, long samplePeriod) { DataProvider dp; if (type > 0) dp = new NativeDataProvider(this, samplePeriod, sensorManager.getDefaultSensor(type)); else if (type == WearScript.SENSOR.GPS.id()) dp = new GPSDataProvider(this, samplePeriod, type); else if (type == WearScript.SENSOR.PUPIL.id()) dp = new RemoteDataProvider(this, samplePeriod, type, "Pupil Eyetracker"); else if (type == WearScript.SENSOR.BATTERY.id()) dp = new BatteryDataProvider(this, samplePeriod); else if (type == WearScript.SENSOR.PEBBLE_ACCELEROMETER.id()) dp = new PebbleDataProvider(this, samplePeriod, type); else throw new RuntimeException("Invalid type: " + type); registerProvider(type, dp); } public void registerProvider(Integer type, DataProvider p) { providers.put(type, p); } public void unregisterProvider(Integer type) { DataProvider dp = providers.remove(type); if (dp != null) dp.unregister(); } public void unregisterProviders() { for (Integer type : providers.keySet()) { unregisterProvider(type); } } public DataProvider getProvider(int id) { return providers.get(id); } public void registerCallback(Integer type, String jsFunction) { jsCallbacks.put(type, jsFunction); } public void unregisterCallback(Integer type) { jsCallbacks.remove(type); } public Context getContext() { return service.getApplicationContext(); } public void queue(DataPoint dp) { service.handleSensor(dp, buildCallbackString(dp)); } public String buildCallbackString(DataPoint dp) { if (dp == null || !jsCallbacks.containsKey(dp.getType())) return null; return String.format("javascript:%s(%s);", jsCallbacks.get(dp.getType()), dp.toJSONString()); } public void reset() { super.reset(); unregisterProviders(); jsCallbacks = new ConcurrentHashMap<Integer, String>(); } public void shutdown() { super.shutdown(); unregisterProviders(); } public SensorManager sensorManager() { return sensorManager; } public void queueRemote(DataPoint dp) { DataProvider provider = providers.get(dp.getType()); if (provider == null) return; provider.remoteSample(dp); } public void onEvent(PebbleAccelerometerDataEvent e) { PebbleDataProvider provider = (PebbleDataProvider)providers.get(WearScript.SENSOR.PEBBLE_ACCELEROMETER.id()); if (provider == null) return; provider.onEvent(e); } }