MediaButtonIntentReceiver.java revision 05a0cdbe327ce82165bf5fe4010414173fcdaae0
1792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/* 2792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 4792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * you may not use this file except in compliance with the License. 6792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * You may obtain a copy of the License at 7792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 8792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 10792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * See the License for the specific language governing permissions and 14792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * limitations under the License. 15792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */ 16792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 17792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpackage com.android.music; 18792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 19792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.bluetooth.BluetoothA2dp; 20792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.bluetooth.BluetoothError; 21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context; 22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent; 23792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver; 24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.SharedPreferences; 25792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager; 26792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.util.Log; 27792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.KeyEvent; 28792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler; 29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message; 30792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 31792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/** 32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */ 34792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class MediaButtonIntentReceiver extends BroadcastReceiver { 35792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 36792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int MSG_LONGPRESS_TIMEOUT = 1; 37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int LONG_PRESS_DELAY = 1000; 38792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static long mLastClickTime = 0; 40792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static boolean mDown = false; 41792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static boolean mLaunched = false; 42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 43792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static Handler mHandler = new Handler() { 44792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 45792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) { 46792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (msg.what) { 47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case MSG_LONGPRESS_TIMEOUT: 48792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mLaunched) { 49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Context context = (Context)msg.obj; 50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(); 51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra("autoshuffle", "true"); 52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setClass(context, MusicBrowserActivity.class); 53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project context.startActivity(i); 55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLaunched = true; 56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 57792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String intentAction = intent.getAction(); 65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intentAction)) { 66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(context, MediaPlaybackService.class); 67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setAction(MediaPlaybackService.SERVICECMD); 68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaPlaybackService.CMDNAME, MediaPlaybackService.CMDPAUSE); 69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project context.startService(i); 70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { 71792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent event = (KeyEvent) 72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 73792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 74792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (event == null) { 75792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 76792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int keycode = event.getKeyCode(); 79792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int action = event.getAction(); 80792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long eventtime = event.getEventTime(); 81792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 82792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // single quick press: pause/resume. 83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // double press: next track 84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // long press: start auto-shuffle mode. 85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String command = null; 87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (keycode) { 8825078dab32659e384ee6607b476b5a3a96b3798aAndy Stadler case KeyEvent.KEYCODE_MEDIA_STOP: 89792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDSTOP; 90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_HEADSETHOOK: 9225078dab32659e384ee6607b476b5a3a96b3798aAndy Stadler case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDTOGGLEPAUSE; 94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 9525078dab32659e384ee6607b476b5a3a96b3798aAndy Stadler case KeyEvent.KEYCODE_MEDIA_NEXT: 96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDNEXT; 97792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 9825078dab32659e384ee6607b476b5a3a96b3798aAndy Stadler case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDPREVIOUS; 100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (command != null) { 104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (action == KeyEvent.ACTION_DOWN) { 10505a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood if (mDown) { 10605a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood if (MediaPlaybackService.CMDTOGGLEPAUSE.equals(command) 10705a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood && mLastClickTime != 0 10805a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood && eventtime - mLastClickTime > LONG_PRESS_DELAY) { 10905a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood mHandler.sendMessage( 11005a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood mHandler.obtainMessage(MSG_LONGPRESS_TIMEOUT, context)); 111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 11205a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood } else { 11305a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood // if this isn't a repeat event 11405a0cdbe327ce82165bf5fe4010414173fcdaae0Mike Lockwood 115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // The service may or may not be running, but we need to send it 116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // a command. 117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(context, MediaPlaybackService.class); 118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setAction(MediaPlaybackService.SERVICECMD); 119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (keycode == KeyEvent.KEYCODE_HEADSETHOOK && 120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project eventtime - mLastClickTime < 300) { 121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaPlaybackService.CMDNAME, MediaPlaybackService.CMDNEXT); 122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project context.startService(i); 123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastClickTime = 0; 124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaPlaybackService.CMDNAME, command); 126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project context.startService(i); 127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastClickTime = eventtime; 128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLaunched = false; 131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDown = true; 132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.removeMessages(MSG_LONGPRESS_TIMEOUT); 135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDown = false; 136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project abortBroadcast(); 138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project} 142