diff options
Diffstat (limited to 'app/src/main')
| -rw-r--r-- | app/src/main/AndroidManifest.xml | 23 | ||||
| -rw-r--r-- | app/src/main/java/com/olio/util/ALog.java | 254 | ||||
| -rw-r--r-- | app/src/main/java/com/olio/wakedetector/MainActivity.java | 129 | ||||
| -rw-r--r-- | app/src/main/res/layout/activity_main.xml | 17 | ||||
| -rw-r--r-- | app/src/main/res/menu/menu_main.xml | 6 | ||||
| -rw-r--r-- | app/src/main/res/mipmap-hdpi/ic_launcher.png | bin | 0 -> 3418 bytes | |||
| -rw-r--r-- | app/src/main/res/mipmap-mdpi/ic_launcher.png | bin | 0 -> 2206 bytes | |||
| -rw-r--r-- | app/src/main/res/mipmap-xhdpi/ic_launcher.png | bin | 0 -> 4842 bytes | |||
| -rw-r--r-- | app/src/main/res/mipmap-xxhdpi/ic_launcher.png | bin | 0 -> 7718 bytes | |||
| -rw-r--r-- | app/src/main/res/values-w820dp/dimens.xml | 6 | ||||
| -rw-r--r-- | app/src/main/res/values/dimens.xml | 5 | ||||
| -rw-r--r-- | app/src/main/res/values/strings.xml | 6 | ||||
| -rw-r--r-- | app/src/main/res/values/styles.xml | 8 |
13 files changed, 454 insertions, 0 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7e8a9ec --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.olio.wakedetector" > + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:theme="@style/AppTheme"> + <activity + android:name=".MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + + <uses-permission android:name="android.permission.WAKE_LOCK"/> + <uses-permission android:name="android.permission.VIBRATE" /> +</manifest> diff --git a/app/src/main/java/com/olio/util/ALog.java b/app/src/main/java/com/olio/util/ALog.java new file mode 100644 index 0000000..cbf0b46 --- /dev/null +++ b/app/src/main/java/com/olio/util/ALog.java @@ -0,0 +1,254 @@ +package com.olio.util; + +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.net.UnknownHostException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * Created by ewilson90 on 5/22/14. + * + * Taken from: http://zerocredibility.wordpress.com/2012/03/08/android-advanced-logger/ + */ +public class ALog { + private static class LogContext { + LogContext(StackTraceElement element) { + // this.className = element.getClassName(); + this.simpleClassName = getSimpleClassName(element.getClassName()); + this.methodName = element.getMethodName(); + this.lineNumber = element.getLineNumber(); + } + + // String className; + String simpleClassName; + String methodName; + int lineNumber; + } + + public enum Level { + V(1), D(2), I(3), W(4), E(5); + + private int value; + + private Level(int value) { + this.value = value; + } + + int getValue() { + return value; + } + }; + + private static final DateFormat FLOG_FORMAT = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss.SSS"); + private static final File LOG_DIR = new File( + Environment.getExternalStorageDirectory() + File.separator + "alog"); + private static boolean fileLogging = false; + private static String tag = ""; + private static Level level = Level.V; + private static final BlockingQueue<String> logQueue = new LinkedBlockingQueue<String>(); + private static Runnable queueRunner = new Runnable() { + @Override + public void run() { + String line; + try { + while ((line = logQueue.take()) != null) { + + if (!Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED)) { + continue; + } + if (!LOG_DIR.exists() && !LOG_DIR.mkdirs()) { + continue; + } + + File logFile = new File(LOG_DIR, tag + ".log"); + Writer w = null; + try { + w = new FileWriter(logFile, true); + w.write(line); + w.close(); + } catch (IOException e) { + } finally { + if (w != null) { + try { + w.close(); + } catch (IOException e1) { + } + } + } + } + } catch (InterruptedException e) { + } + } + }; + + static { + new Thread(queueRunner).start(); + } + + private static LogContext getContext() { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + StackTraceElement element = trace[5]; // frame below us; the caller + LogContext context = new LogContext(element); + return context; + } + + private static final String getMessage(String s, Object... args) { + s = String.format(s, args); + LogContext c = getContext(); + String msg = c.simpleClassName + "." + c.methodName + "@" + + c.lineNumber + ": " + s; + return msg; + } + + private static String getSimpleClassName(String className) { + int i = className.lastIndexOf("."); + if (i == -1) { + return className; + } + return className.substring(i + 1); + } + + public static void setLevel(Level l) { + level = l; + } + + public static void setTag(String t) { + tag = t; + } + + public static void setFileLogging(boolean enable) { + fileLogging = enable; + } + + public static void v(String format, Object... args) { + if (level.getValue() > Level.V.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.v(tag, msg); + if (fileLogging) { + flog(Level.V, msg); + } + } + + public static void d(String format, Object... args) { + if (level.getValue() > Level.D.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.d(tag, msg); + if (fileLogging) { + flog(Level.D, msg); + } + } + + public static void i(String format, Object... args) { + if (level.getValue() > Level.I.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.i(tag, msg); + if (fileLogging) { + flog(Level.I, msg); + } + } + + public static void w(String format, Object... args) { + if (level.getValue() > Level.W.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.w(tag, msg); + if (fileLogging) { + flog(Level.W, msg); + } + } + + public static void w(String format, Throwable t, Object... args) { + if (level.getValue() > Level.W.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.w(msg, t); + if (fileLogging) { + flog(Level.W, msg, t); + } + } + + public static void e(String format, Object... args) { + if (level.getValue() > Level.E.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.e(tag, msg); + if (fileLogging) { + flog(Level.E, msg); + } + } + + public static void e(String format, Throwable t, Object... args) { + if (level.getValue() > Level.E.getValue()) { + return; + } + String msg = getMessage(format, args); + Log.e(tag, msg, t); + if (fileLogging) { + flog(Level.E, msg, t); + } + } + + public static void trace() { + try { + throw new Throwable("dumping stack trace ..."); + } catch (Throwable t) { + ALog.e("trace:", t); + } + } + + public static String getStackTraceString(Throwable tr) { + if (tr == null) { + return ""; + } + + Throwable t = tr; + while (t != null) { + if (t instanceof UnknownHostException) { + return ""; + } + t = t.getCause(); + } + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + tr.printStackTrace(pw); + return sw.toString(); + } + + private static void flog(Level l, String msg) { + flog(l, msg, null); + } + + private static void flog(Level l, String msg, Throwable t) { + String timeString = FLOG_FORMAT.format(new Date()); + String line = timeString + " " + l.toString() + "/" + tag + ": " + msg + + "\n"; + if (t != null) { + line += getStackTraceString(t) + "\n"; + } + logQueue.offer(line); + } +} + diff --git a/app/src/main/java/com/olio/wakedetector/MainActivity.java b/app/src/main/java/com/olio/wakedetector/MainActivity.java new file mode 100644 index 0000000..747c974 --- /dev/null +++ b/app/src/main/java/com/olio/wakedetector/MainActivity.java @@ -0,0 +1,129 @@ +package com.olio.wakedetector; + +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.hardware.TriggerEvent; +import android.hardware.TriggerEventListener; +import android.os.PowerManager; +import android.os.Vibrator; +import android.support.v7.app.ActionBarActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import com.olio.util.ALog; + + +public class MainActivity extends ActionBarActivity { + + private SensorManager mSensorManager = null; + private Sensor mSigMotionSensor = null; + private TriggerEventListener mTriggerEventListener = null; + + private PowerManager mPowerManager = null; + private PowerManager.WakeLock mWakeLock = null; + + private Vibrator mVibrator; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); + mPowerManager = (PowerManager) getSystemService(POWER_SERVICE); + mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); + + for(Sensor sensor : mSensorManager.getSensorList(Sensor.TYPE_ALL)) { + String sensorType; + switch(sensor.getType()) { + case Sensor.TYPE_ACCELEROMETER: + sensorType = Sensor.STRING_TYPE_ACCELEROMETER; + break; + case Sensor.TYPE_GYROSCOPE: + sensorType = Sensor.STRING_TYPE_GYROSCOPE; + break; + case Sensor.TYPE_GYROSCOPE_UNCALIBRATED: + sensorType = Sensor.STRING_TYPE_GYROSCOPE_UNCALIBRATED; + break; + case Sensor.TYPE_ROTATION_VECTOR: + sensorType = Sensor.STRING_TYPE_ROTATION_VECTOR; + break; + case Sensor.TYPE_GRAVITY: + sensorType = Sensor.STRING_TYPE_GRAVITY; + break; + case Sensor.TYPE_SIGNIFICANT_MOTION: + sensorType = Sensor.STRING_TYPE_SIGNIFICANT_MOTION; + break; + case Sensor.TYPE_STEP_COUNTER: + sensorType = Sensor.STRING_TYPE_STEP_COUNTER; + break; + case Sensor.TYPE_STEP_DETECTOR: + sensorType = Sensor.STRING_TYPE_STEP_DETECTOR; + break; + default: + sensorType = ""+sensor.getType(); + } + ALog.d("Found sensor: %s, Type: %s", sensor.getName(), sensorType); + + if(sensor.getType() == Sensor.TYPE_SIGNIFICANT_MOTION) { + ALog.d("Got significant motion sensor."); + mSigMotionSensor = sensor; + if(mTriggerEventListener != null) { + ALog.d("Sig motion sensor already registered."); + return; + } + + mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "com.olio.wakedetector"); + mTriggerEventListener = new SigMotionTriggerListener(); + mSensorManager.requestTriggerSensor(mTriggerEventListener, mSigMotionSensor); + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(mTriggerEventListener != null && mSensorManager != null) { + mSensorManager.cancelTriggerSensor(mTriggerEventListener, mSigMotionSensor); + mTriggerEventListener = null; + } + } + + public void onVibrateClick(View v) { + ALog.d("Vibrating."); + mVibrator.vibrate(new long[]{250, 500, 100, 500}, -1); + } + private class SigMotionTriggerListener extends TriggerEventListener { + @Override + public void onTrigger(TriggerEvent event) { + ALog.d("Got significant motion trigger. Re-registering."); + mWakeLock.acquire(5000); + mSensorManager.requestTriggerSensor(mTriggerEventListener, mSigMotionSensor); + } + }; + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..e12fe68 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,17 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> + + <TextView android:text="@string/hello_world" android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + + <Button + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Vibrate" + android:onClick="onVibrateClick"/> + +</RelativeLayout> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..b1cb908 --- /dev/null +++ b/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,6 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> + <item android:id="@+id/action_settings" android:title="@string/action_settings" + android:orderInCategory="100" app:showAsAction="never" /> +</menu> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000..cde69bc --- /dev/null +++ b/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000..c133a0c --- /dev/null +++ b/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000..bfa42f0 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000..324e72c --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 0000000..63fc816 --- /dev/null +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ +<resources> + <!-- Example customization of dimensions originally defined in res/values/dimens.xml + (such as screen margins) for screens with more than 820dp of available width. This + would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> + <dimen name="activity_horizontal_margin">64dp</dimen> +</resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..47c8224 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ +<resources> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..f8a03d1 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ +<resources> + <string name="app_name">WakeDetector</string> + + <string name="hello_world">Hello world!</string> + <string name="action_settings">Settings</string> +</resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..766ab99 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <!-- Customize your theme here. --> + </style> + +</resources> |