summaryrefslogtreecommitdiffstats
path: root/src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java')
-rw-r--r--src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java160
1 files changed, 9 insertions, 151 deletions
diff --git a/src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java b/src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java
index d4b8bc7..b7982e7 100644
--- a/src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java
+++ b/src/com/cyanogenmod/eleven/MediaButtonIntentReceiver.java
@@ -14,81 +14,14 @@ package com.cyanogenmod.eleven;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
import android.support.v4.content.WakefulBroadcastReceiver;
import android.util.Log;
import android.view.KeyEvent;
-import com.cyanogenmod.eleven.ui.activities.HomeActivity;
-
-/**
- * Used to control headset playback.
- * Single press: pause/resume
- * Double press: next track
- * Triple press: previous track
- * Long press: voice search
- */
public class MediaButtonIntentReceiver extends WakefulBroadcastReceiver {
private static final boolean DEBUG = false;
private static final String TAG = "MediaButtonIntentReceiver";
- private static final int MSG_LONGPRESS_TIMEOUT = 1;
- private static final int MSG_HEADSET_DOUBLE_CLICK_TIMEOUT = 2;
-
- private static final int LONG_PRESS_DELAY = 1000;
- private static final int DOUBLE_CLICK = 800;
-
- private static WakeLock mWakeLock = null;
- private static int mClickCounter = 0;
- private static long mLastClickTime = 0;
- private static boolean mDown = false;
- private static boolean mLaunched = false;
-
- private static Handler mHandler = new Handler() {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void handleMessage(final Message msg) {
- switch (msg.what) {
- case MSG_LONGPRESS_TIMEOUT:
- if (DEBUG) Log.v(TAG, "Handling longpress timeout, launched " + mLaunched);
- if (!mLaunched) {
- final Context context = (Context)msg.obj;
- final Intent i = new Intent();
- i.setClass(context, HomeActivity.class);
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- context.startActivity(i);
- mLaunched = true;
- }
- break;
-
- case MSG_HEADSET_DOUBLE_CLICK_TIMEOUT:
- final int clickCount = msg.arg1;
- final String command;
-
- if (DEBUG) Log.v(TAG, "Handling headset click, count = " + clickCount);
- switch (clickCount) {
- case 1: command = MusicPlaybackService.CMDTOGGLEPAUSE; break;
- case 2: command = MusicPlaybackService.CMDNEXT; break;
- case 3: command = MusicPlaybackService.CMDPREVIOUS; break;
- default: command = null; break;
- }
-
- if (command != null) {
- final Context context = (Context)msg.obj;
- startService(context, command);
- }
- break;
- }
- releaseWakeLockIfHandlerIdle();
- }
- };
-
/**
* {@inheritDoc}
*/
@@ -97,23 +30,21 @@ public class MediaButtonIntentReceiver extends WakefulBroadcastReceiver {
if (DEBUG) Log.v(TAG, "Received intent: " + intent);
final String intentAction = intent.getAction();
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intentAction)) {
- startService(context, MusicPlaybackService.CMDPAUSE);
+ startService(context, MusicPlaybackService.CMDPAUSE, System.currentTimeMillis());
} else if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
final KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- if (event == null) {
+ if (event == null || event.getAction() != KeyEvent.ACTION_UP) {
return;
}
- final int keycode = event.getKeyCode();
- final int action = event.getAction();
- final long eventtime = event.getEventTime();
-
String command = null;
- switch (keycode) {
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_HEADSETHOOK:
+ command = MusicPlaybackService.CMDHEADSETHOOK;
+ break;
case KeyEvent.KEYCODE_MEDIA_STOP:
command = MusicPlaybackService.CMDSTOP;
break;
- case KeyEvent.KEYCODE_HEADSETHOOK:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
command = MusicPlaybackService.CMDTOGGLEPAUSE;
break;
@@ -131,93 +62,20 @@ public class MediaButtonIntentReceiver extends WakefulBroadcastReceiver {
break;
}
if (command != null) {
- if (action == KeyEvent.ACTION_DOWN) {
- if (mDown) {
- if (MusicPlaybackService.CMDTOGGLEPAUSE.equals(command)
- || MusicPlaybackService.CMDPLAY.equals(command)) {
- if (mLastClickTime != 0
- && eventtime - mLastClickTime > LONG_PRESS_DELAY) {
- acquireWakeLockAndSendMessage(context,
- mHandler.obtainMessage(MSG_LONGPRESS_TIMEOUT, context), 0);
- }
- }
- } else if (event.getRepeatCount() == 0) {
- // Only consider the first event in a sequence, not the repeat events,
- // so that we don't trigger in cases where the first event went to
- // a different app (e.g. when the user ends a phone call by
- // long pressing the headset button)
-
- // The service may or may not be running, but we need to send it
- // a command.
- if (keycode == KeyEvent.KEYCODE_HEADSETHOOK) {
- if (eventtime - mLastClickTime >= DOUBLE_CLICK) {
- mClickCounter = 0;
- }
-
- mClickCounter++;
- if (DEBUG) Log.v(TAG, "Got headset click, count = " + mClickCounter);
- mHandler.removeMessages(MSG_HEADSET_DOUBLE_CLICK_TIMEOUT);
-
- Message msg = mHandler.obtainMessage(
- MSG_HEADSET_DOUBLE_CLICK_TIMEOUT, mClickCounter, 0, context);
-
- long delay = mClickCounter < 3 ? DOUBLE_CLICK : 0;
- if (mClickCounter >= 3) {
- mClickCounter = 0;
- }
- mLastClickTime = eventtime;
- acquireWakeLockAndSendMessage(context, msg, delay);
- } else {
- startService(context, command);
- }
- mLaunched = false;
- mDown = true;
- }
- } else {
- mHandler.removeMessages(MSG_LONGPRESS_TIMEOUT);
- mDown = false;
- }
+ startService(context, command, event.getEventTime());
if (isOrderedBroadcast()) {
abortBroadcast();
}
- releaseWakeLockIfHandlerIdle();
}
}
}
- private static void startService(Context context, String command) {
+ private static void startService(Context context, String command, long timestamp) {
final Intent i = new Intent(context, MusicPlaybackService.class);
i.setAction(MusicPlaybackService.SERVICECMD);
i.putExtra(MusicPlaybackService.CMDNAME, command);
i.putExtra(MusicPlaybackService.FROM_MEDIA_BUTTON, true);
+ i.putExtra(MusicPlaybackService.TIMESTAMP, timestamp);
startWakefulService(context, i);
}
-
- private static void acquireWakeLockAndSendMessage(Context context, Message msg, long delay) {
- if (mWakeLock == null) {
- Context appContext = context.getApplicationContext();
- PowerManager pm = (PowerManager) appContext.getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Eleven headset button");
- mWakeLock.setReferenceCounted(false);
- }
- if (DEBUG) Log.v(TAG, "Acquiring wake lock and sending " + msg.what);
- // Make sure we don't indefinitely hold the wake lock under any circumstances
- mWakeLock.acquire(10000);
-
- mHandler.sendMessageDelayed(msg, delay);
- }
-
- private static void releaseWakeLockIfHandlerIdle() {
- if (mHandler.hasMessages(MSG_LONGPRESS_TIMEOUT)
- || mHandler.hasMessages(MSG_HEADSET_DOUBLE_CLICK_TIMEOUT)) {
- if (DEBUG) Log.v(TAG, "Handler still has messages pending, not releasing wake lock");
- return;
- }
-
- if (mWakeLock != null) {
- if (DEBUG) Log.v(TAG, "Releasing wake lock");
- mWakeLock.release();
- mWakeLock = null;
- }
- }
}