MediaButtonIntentReceiver.java revision 792a2206a4f05f6bd13fce902d3663892d2947af
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) { 88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_STOP: 89792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDSTOP; 90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_HEADSETHOOK: 92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_PLAYPAUSE: 93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDTOGGLEPAUSE; 94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_NEXTSONG: 96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project command = MediaPlaybackService.CMDNEXT; 97792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_PREVIOUSSONG: 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) { 105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mDown) { 106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // only if this isn't a repeat event 107792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (MediaPlaybackService.CMDTOGGLEPAUSE.equals(command)) { 109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // We're not using the original time of the event as the 110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // base here, because in some cases it can take more than 111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // one second for us to receive the event, in which case 112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // we would go immediately to auto shuffle mode, even if 113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // the user didn't long press. 114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.sendMessageDelayed( 115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.obtainMessage(MSG_LONGPRESS_TIMEOUT, context), 116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project LONG_PRESS_DELAY); 117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project SharedPreferences pref = context.getSharedPreferences("Music", 120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE); 121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String q = pref.getString("queue", ""); 122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // The service may or may not be running, but we need to send it 123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // a command. 124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(context, MediaPlaybackService.class); 125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setAction(MediaPlaybackService.SERVICECMD); 126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (keycode == KeyEvent.KEYCODE_HEADSETHOOK && 127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project eventtime - mLastClickTime < 300) { 128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaPlaybackService.CMDNAME, MediaPlaybackService.CMDNEXT); 129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project context.startService(i); 130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastClickTime = 0; 131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaPlaybackService.CMDNAME, command); 133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project context.startService(i); 134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastClickTime = eventtime; 135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLaunched = false; 138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDown = true; 139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.removeMessages(MSG_LONGPRESS_TIMEOUT); 142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDown = false; 143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project abortBroadcast(); 145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project} 149