From 59d1062e8cd7ef514feffb3925f82b29c5101f6b Mon Sep 17 00:00:00 2001 From: Artem Chep Date: Tue, 8 Jan 2013 10:36:33 -0500 Subject: DeskClock: Add back flip and shake actions Cherry-picked and ported from: * http://review.cyanogenmod.org/#/c/29894/ Signed-off-by: Jorge Ruesga Conflicts: res/xml/settings.xml src/com/android/deskclock/SettingsActivity.java src/com/android/deskclock/alarms/AlarmService.java CRs-Fixed: 1014635 Change-Id: I9be82187559ccd483b8e4da068890f532e60b8f7 --- res/xml/settings.xml | 16 ++ src/com/android/deskclock/alarms/AlarmService.java | 188 +++++++++++++++++++++ .../deskclock/settings/SettingsActivity.java | 28 +++ 3 files changed, 232 insertions(+) diff --git a/res/xml/settings.xml b/res/xml/settings.xml index 4baddc8de..405ab4ae9 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -48,6 +48,7 @@ + + + + FACE_UP_LOWER_LIMIT + && y < FACE_UP_UPPER_LIMIT + && z > TILT_LOWER_LIMIT && z < TILT_UPPER_LIMIT; + + // The device first needs to be face up. + boolean faceUp = true; + for (boolean sample : mSamples) { + faceUp = faceUp && sample; + } + if (faceUp) { + mWasFaceUp = true; + for (int i = 0; i < SENSOR_SAMPLES; i++) { + mSamples[i] = false; + } + } + } else { + // Check if its face down enough. Note that wanted + // values go from FACE_DOWN_UPPER_LIMIT to 180 + // and from -180 to FACE_DOWN_LOWER_LIMIT + mSamples[mSampleIndex] = (y > FACE_DOWN_UPPER_LIMIT || y < FACE_DOWN_LOWER_LIMIT) + && z > TILT_LOWER_LIMIT + && z < TILT_UPPER_LIMIT; + + boolean faceDown = true; + for (boolean sample : mSamples) { + faceDown = faceDown && sample; + } + if (faceDown) { + handleAction(mFlipAction); + } + } + + mSampleIndex = ((mSampleIndex + 1) % SENSOR_SAMPLES); + } + }; + + private final SensorEventListener mShakeListener = new SensorEventListener() { + private static final float SENSITIVITY = 16; + private static final int BUFFER = 5; + private float[] gravity = new float[3]; + private float average = 0; + private int fill = 0; + + @Override + public void onAccuracyChanged(Sensor sensor, int acc) { + } + + public void onSensorChanged(SensorEvent event) { + final float alpha = 0.8F; + + for (int i = 0; i < 3; i++) { + gravity[i] = alpha * gravity[i] + (1 - alpha) * event.values[i]; + } + + float x = event.values[0] - gravity[0]; + float y = event.values[1] - gravity[1]; + float z = event.values[2] - gravity[2]; + + if (fill <= BUFFER) { + average += Math.abs(x) + Math.abs(y) + Math.abs(z); + fill++; + } else { + if (average / BUFFER >= SENSITIVITY) { + handleAction(mShakeAction); + } + average = 0; + fill = 0; + } + } + }; + + private void attachListeners() { + if (mFlipAction != ALARM_NO_ACTION) { + mSensorManager.registerListener(mFlipListener, + mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), + SensorManager.SENSOR_DELAY_NORMAL, + 300 * 1000); //batch every 300 milliseconds + } + + if (mShakeAction != ALARM_NO_ACTION) { + mSensorManager.registerListener(mShakeListener, + mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), + SensorManager.SENSOR_DELAY_GAME, + 50 * 1000); //batch every 50 milliseconds + } + } + + private void detachListeners() { + if (mFlipAction != ALARM_NO_ACTION) { + mSensorManager.unregisterListener(mFlipListener); + } + if (mShakeAction != ALARM_NO_ACTION) { + mSensorManager.unregisterListener(mShakeListener); + } + } + + private void handleAction(int action) { + switch (action) { + case ALARM_SNOOZE: + // Setup Snooze Action + Intent snoozeIntent = AlarmStateManager.createStateChangeIntent(this, "SNOOZE_TAG", + mCurrentAlarm, AlarmInstance.SNOOZE_STATE); + sendBroadcast(snoozeIntent); + break; + case ALARM_DISMISS: + // Setup Dismiss Action + Intent dismissIntent = AlarmStateManager.createStateChangeIntent(this, "DISMISS_TAG", + mCurrentAlarm, AlarmInstance.DISMISSED_STATE); + sendBroadcast(dismissIntent); + break; + case ALARM_NO_ACTION: + default: + break; + } + } + } diff --git a/src/com/android/deskclock/settings/SettingsActivity.java b/src/com/android/deskclock/settings/SettingsActivity.java index c5d228484..82f4fa5dd 100644 --- a/src/com/android/deskclock/settings/SettingsActivity.java +++ b/src/com/android/deskclock/settings/SettingsActivity.java @@ -20,6 +20,8 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.hardware.Sensor; +import android.hardware.SensorManager; import android.media.AudioManager; import android.os.Bundle; import android.preference.ListPreference; @@ -65,8 +67,12 @@ public final class SettingsActivity extends BaseActivity { public static final String KEY_VOLUME_BUTTONS = "volume_button_setting"; public static final String KEY_WEEK_START = "week_start"; + public static final String KEY_FLIP_ACTION = "flip_action"; + public static final String KEY_SHAKE_ACTION = "shake_action"; + public static final String TIMEZONE_LOCALE = "tz_locale"; + public static final String DEFAULT_VOLUME_BEHAVIOR = "0"; public static final String VOLUME_BEHAVIOR_SNOOZE = "1"; public static final String VOLUME_BEHAVIOR_DISMISS = "2"; @@ -169,12 +175,26 @@ public final class SettingsActivity extends BaseActivity { findPreference(KEY_TIMER_RINGTONE); timerRingtonePref.setSummary(DataModel.getDataModel().getTimerRingtoneTitle()); break; + case KEY_FLIP_ACTION: + final ListPreference listPref = (ListPreference) pref; + updateActionSummary(listPref, (String) newValue, R.string.flip_action_summary); + break; + case KEY_SHAKE_ACTION: + final ListPreference listPref = (ListPreference) pref; + updateActionSummary(listPref, (String) newValue, R.string.shake_action_summary); + break; } // Set result so DeskClock knows to refresh itself getActivity().setResult(RESULT_OK); return true; } + private void updateActionSummary(ListPreference listPref, String action, int summaryResId) { + int i = Integer.parseInt(action); + listPref.setSummary(getString(summaryResId, + getResources().getStringArray(R.array.action_summary_entries)[i])); + } + @Override public boolean onPreferenceClick(Preference pref) { final Activity activity = getActivity(); @@ -302,6 +322,14 @@ public final class SettingsActivity extends BaseActivity { (RingtonePreference) findPreference(KEY_TIMER_RINGTONE); timerRingtonePref.setSummary(DataModel.getDataModel().getTimerRingtoneTitle()); timerRingtonePref.setOnPreferenceChangeListener(this); + + listPref = (ListPreference) findPreference(KEY_FLIP_ACTION); + updateActionSummary(listPref, listPref.getValue(), R.string.flip_action_summary); + listPref.setOnPreferenceChangeListener(this); + + listPref = (ListPreference) findPreference(KEY_SHAKE_ACTION); + updateActionSummary(listPref, listPref.getValue(), R.string.shake_action_summary); + listPref.setOnPreferenceChangeListener(this); } private void updateAutoSnoozeSummary(ListPreference listPref, String delay) { -- cgit v1.2.3