From 554696b85e1dfaa7cc2230f3db8b74482a2fcc16 Mon Sep 17 00:00:00 2001 From: Evan Wilson Date: Fri, 5 Jun 2015 12:35:54 -0700 Subject: Initial commit --- app/.gitignore | 1 + app/app.iml | 92 ++++++++ app/build.gradle | 25 ++ app/proguard-rules.pro | 17 ++ .../com/olio/wakedetector/ApplicationTest.java | 13 ++ app/src/main/AndroidManifest.xml | 23 ++ app/src/main/java/com/olio/util/ALog.java | 254 +++++++++++++++++++++ .../java/com/olio/wakedetector/MainActivity.java | 129 +++++++++++ app/src/main/res/layout/activity_main.xml | 17 ++ app/src/main/res/menu/menu_main.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes app/src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/dimens.xml | 5 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/styles.xml | 8 + 18 files changed, 602 insertions(+) create mode 100644 app/.gitignore create mode 100644 app/app.iml create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/olio/wakedetector/ApplicationTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/olio/util/ALog.java create mode 100644 app/src/main/java/com/olio/wakedetector/MainActivity.java create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/menu/menu_main.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml (limited to 'app') diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/app.iml b/app/app.iml new file mode 100644 index 0000000..f0239d9 --- /dev/null +++ b/app/app.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..0db8940 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "21.1.2" + + defaultConfig { + applicationId "com.olio.wakedetector" + minSdkVersion 19 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:22.0.0' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..961623a --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/ewilson90/Dev/android-sdk/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/com/olio/wakedetector/ApplicationTest.java b/app/src/androidTest/java/com/olio/wakedetector/ApplicationTest.java new file mode 100644 index 0000000..7f32ffa --- /dev/null +++ b/app/src/androidTest/java/com/olio/wakedetector/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.olio.wakedetector; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file 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 @@ + + + + + + + + + + + + + + + + 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 logQueue = new LinkedBlockingQueue(); + 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 @@ + + + + +