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