FileDocCategorySizeDatePackage
MediaButtonIntentReceiver.javaAPI DocAndroid 1.5 API6192Wed May 06 22:42:46 BST 2009com.android.music

MediaButtonIntentReceiver

public class MediaButtonIntentReceiver extends android.content.BroadcastReceiver

Fields Summary
private static final int
MSG_LONGPRESS_TIMEOUT
private static final int
LONG_PRESS_DELAY
private static long
mLastClickTime
private static boolean
mDown
private static boolean
mLaunched
private static android.os.Handler
mHandler
Constructors Summary
Methods Summary
public voidonReceive(android.content.Context context, android.content.Intent intent)

    
    
          
        String intentAction = intent.getAction();
        if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intentAction)) {
            Intent i = new Intent(context, MediaPlaybackService.class);
            i.setAction(MediaPlaybackService.SERVICECMD);
            i.putExtra(MediaPlaybackService.CMDNAME, MediaPlaybackService.CMDPAUSE);
            context.startService(i);
        } else if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            KeyEvent event = (KeyEvent)
                    intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
            
            if (event == null) {
                return;
            }

            int keycode = event.getKeyCode();
            int action = event.getAction();
            long eventtime = event.getEventTime();

            // single quick press: pause/resume. 
            // double press: next track
            // long press: start auto-shuffle mode.
            
            String command = null;
            switch (keycode) {
                case KeyEvent.KEYCODE_MEDIA_STOP:
                    command = MediaPlaybackService.CMDSTOP;
                    break;
                case KeyEvent.KEYCODE_HEADSETHOOK:
                case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
                    command = MediaPlaybackService.CMDTOGGLEPAUSE;
                    break;
                case KeyEvent.KEYCODE_MEDIA_NEXT:
                    command = MediaPlaybackService.CMDNEXT;
                    break;
                case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
                    command = MediaPlaybackService.CMDPREVIOUS;
                    break;
            }

            if (command != null) {
                if (action == KeyEvent.ACTION_DOWN) {
                    if (!mDown) {
                        // only if this isn't a repeat event
                        
                        if (MediaPlaybackService.CMDTOGGLEPAUSE.equals(command)) {
                            // We're not using the original time of the event as the
                            // base here, because in some cases it can take more than
                            // one second for us to receive the event, in which case
                            // we would go immediately to auto shuffle mode, even if
                            // the user didn't long press.
                            mHandler.sendMessageDelayed(
                                    mHandler.obtainMessage(MSG_LONGPRESS_TIMEOUT, context),
                                    LONG_PRESS_DELAY);
                        }
                        
                        SharedPreferences pref = context.getSharedPreferences("Music", 
                                Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
                        String q = pref.getString("queue", "");
                        // The service may or may not be running, but we need to send it
                        // a command.
                        Intent i = new Intent(context, MediaPlaybackService.class);
                        i.setAction(MediaPlaybackService.SERVICECMD);
                        if (keycode == KeyEvent.KEYCODE_HEADSETHOOK &&
                                eventtime - mLastClickTime < 300) {
                            i.putExtra(MediaPlaybackService.CMDNAME, MediaPlaybackService.CMDNEXT);
                            context.startService(i);
                            mLastClickTime = 0;
                        } else {
                            i.putExtra(MediaPlaybackService.CMDNAME, command);
                            context.startService(i);
                            mLastClickTime = eventtime;
                        }

                        mLaunched = false;
                        mDown = true;
                    }
                } else {
                    mHandler.removeMessages(MSG_LONGPRESS_TIMEOUT);
                    mDown = false;
                }
                abortBroadcast();
            }
        }