package interdroid.swan.sensors.impl; import interdroid.swan.R; import interdroid.swan.sensors.AbstractConfigurationActivity; import interdroid.swan.sensors.AbstractSwanSensor; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import android.os.Bundle; import android.util.Log; public class LogCatSensor extends AbstractSwanSensor { private static final String TAG = "LogCat Sensor"; /** * The configuration activity for this sensor. * * @author nick <palmer@cs.vu.nl> * */ public static class ConfigurationActivity extends AbstractConfigurationActivity { @Override public int getPreferencesXML() { return R.xml.logcat_preferences; } } public static final String LOG_FIELD = "log"; public static final String LOGCAT_PARAMETERS = "logcat_parameters"; public static final String DEFAULT_LOGCAT_PARAMETERS = "*:I"; private Map<String, LogcatPoller> activeThreads = new HashMap<String, LogcatPoller>(); @Override public String[] getValuePaths() { return new String[] { LOG_FIELD }; } @Override public void initDefaultConfiguration(Bundle DEFAULT_CONFIGURATION) { DEFAULT_CONFIGURATION.putString(LOGCAT_PARAMETERS, DEFAULT_LOGCAT_PARAMETERS); } @Override public void onConnected() { SENSOR_NAME = "LogCat Sensor"; } @Override public final void register(String id, String valuePath, Bundle configuration) { Log.d(TAG, "Logcat got registration for: " + id + ", conf: " + configuration.getString(LOGCAT_PARAMETERS)); LogcatPoller logcatPoller = new LogcatPoller(id, valuePath, configuration); activeThreads.put(id, logcatPoller); logcatPoller.start(); } @Override public final void unregister(String id) { activeThreads.remove(id).terminate(); } class LogcatPoller extends Thread { private String id; private Bundle configuration; private String valuePath; private Process process; LogcatPoller(String id, String valuePath, Bundle configuration) { this.id = id; this.configuration = configuration; this.valuePath = valuePath; } public void terminate() { process.destroy(); } public void run() { new Thread() { public void run() { String parameters = configuration .getString(LOGCAT_PARAMETERS); if (parameters == null) { parameters = mDefaultConfiguration .getString(LOGCAT_PARAMETERS); } try { process = Runtime .getRuntime() .exec(new String[] { "/system/bin/sh", "-c", "/system/bin/logcat -s " + parameters }); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { System.out.println("line: " + line); long now = System.currentTimeMillis(); putValueTrimSize(valuePath, id, now, line); } reader.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } @Override public void onDestroySensor() { for (LogcatPoller logcatPoller : activeThreads.values()) { logcatPoller.terminate(); } super.onDestroySensor(); }; }