diff options
| author | Evan Wilson <evan@oliodevices.com> | 2015-06-05 12:35:54 -0700 | 
|---|---|---|
| committer | Evan Wilson <evan@oliodevices.com> | 2015-06-05 12:35:54 -0700 | 
| commit | 554696b85e1dfaa7cc2230f3db8b74482a2fcc16 (patch) | |
| tree | 6b6f2157e4502a835f9878dbf5ecf4d7ecc1619f /app/src | |
| download | WakeDetector-554696b85e1dfaa7cc2230f3db8b74482a2fcc16.tar.xz WakeDetector-554696b85e1dfaa7cc2230f3db8b74482a2fcc16.zip | |
Diffstat (limited to 'app/src')
| -rw-r--r-- | app/src/androidTest/java/com/olio/wakedetector/ApplicationTest.java | 13 | ||||
| -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 | 
14 files changed, 467 insertions, 0 deletions
| 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; + +/** + * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> + */ +public class ApplicationTest extends ApplicationTestCase<Application> { +    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 @@ +<?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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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.pngBinary files differ new 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> |