blob: 9fd26fca0b9dab8a8ac3372776095234e5ea37bd [file] [log] [blame]
Santos Cordondeb8c892014-05-30 01:38:03 -07001/*
2 * Copyright 2014, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.telecomm;
18
Santos Cordondeb8c892014-05-30 01:38:03 -070019import android.content.ComponentName;
20import android.content.Context;
21import android.content.Intent;
22import android.content.IntentFilter;
RoboErik07920f62014-07-21 15:19:41 -070023import android.media.AudioAttributes;
Santos Cordondeb8c892014-05-30 01:38:03 -070024import android.media.AudioManager;
25import android.media.session.MediaSession;
26import android.media.session.MediaSessionManager;
27import android.view.KeyEvent;
28
29/**
30 * Static class to handle listening to the headset media buttons.
31 */
Santos Cordon81289982014-06-03 16:03:08 -070032final class HeadsetMediaButton extends CallsManagerListenerBase {
Santos Cordondeb8c892014-05-30 01:38:03 -070033
Santos Cordondeb8c892014-05-30 01:38:03 -070034 // Types of media button presses
35 static final int SHORT_PRESS = 1;
36 static final int LONG_PRESS = 2;
37
RoboErik07920f62014-07-21 15:19:41 -070038 private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
39 .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
40 .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION).build();
41
Santos Cordondeb8c892014-05-30 01:38:03 -070042 private final MediaSession.Callback mSessionCallback = new MediaSession.Callback() {
43 @Override
RoboErika6e9d752014-08-07 16:10:08 -070044 public boolean onMediaButtonEvent(Intent intent) {
Santos Cordondeb8c892014-05-30 01:38:03 -070045 KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
46 Log.v(this, "SessionCallback.onMediaButton()... event = %s.", event);
47 if ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK)) {
48 Log.v(this, "SessionCallback: HEADSETHOOK");
49 boolean consumed = handleHeadsetHook(event);
50 Log.v(this, "==> handleHeadsetHook(): consumed = %b.", consumed);
RoboErika6e9d752014-08-07 16:10:08 -070051 return consumed;
Santos Cordondeb8c892014-05-30 01:38:03 -070052 }
RoboErika6e9d752014-08-07 16:10:08 -070053 return true;
Santos Cordondeb8c892014-05-30 01:38:03 -070054 }
55 };
56
Santos Cordondeb8c892014-05-30 01:38:03 -070057 private final CallsManager mCallsManager;
58
59 private final MediaSession mSession;
60
61 HeadsetMediaButton(Context context, CallsManager callsManager) {
62 mCallsManager = callsManager;
63
RoboErikb771c432014-07-15 12:44:33 -070064 // Create a MediaSession but don't enable it yet. This is a
Santos Cordondeb8c892014-05-30 01:38:03 -070065 // replacement for MediaButtonReceiver
RoboErikb771c432014-07-15 12:44:33 -070066 mSession = new MediaSession(context, HeadsetMediaButton.class.getSimpleName());
RoboErika6e9d752014-08-07 16:10:08 -070067 mSession.setCallback(mSessionCallback);
Santos Cordondeb8c892014-05-30 01:38:03 -070068 mSession.setFlags(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY
69 | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS);
RoboErik07920f62014-07-21 15:19:41 -070070 mSession.setPlaybackToLocal(AUDIO_ATTRIBUTES);
Santos Cordondeb8c892014-05-30 01:38:03 -070071 }
72
73 /**
74 * Handles the wired headset button while in-call.
75 *
76 * @return true if we consumed the event.
77 */
78 private boolean handleHeadsetHook(KeyEvent event) {
79 Log.d(this, "handleHeadsetHook()...%s %s", event.getAction(), event.getRepeatCount());
80
81 if (event.isLongPress()) {
82 return mCallsManager.onMediaButton(LONG_PRESS);
83 } else if (event.getAction() == KeyEvent.ACTION_UP && event.getRepeatCount() == 0) {
84 return mCallsManager.onMediaButton(SHORT_PRESS);
85 }
86
87 return true;
88 }
Santos Cordon81289982014-06-03 16:03:08 -070089
90 /** ${inheritDoc} */
91 @Override
92 public void onCallAdded(Call call) {
93 if (!mSession.isActive()) {
94 mSession.setActive(true);
95 }
96 }
97
98 /** ${inheritDoc} */
99 @Override
100 public void onCallRemoved(Call call) {
101 if (!mCallsManager.hasAnyCalls()) {
102 if (mSession.isActive()) {
103 mSession.setActive(false);
104 }
105 }
106 }
Santos Cordondeb8c892014-05-30 01:38:03 -0700107}