Fix headset media button long press cannot reject call.
When making phone call with headset, another call incoming, long press
headset media button to reject new incoming call, call cannot be
rejected and first call will be muted. This is because SHORT_PRESS
should not be judged by ACTION_UP event's repeatCount which will be
always 0. Actually, ACTION_DOWN event's repeatCount only increases when
LONG_PRESS is performed.
Also, swapping SHORT and LONG press actions between MUTE and HANGUP to
match more of the existing devices.
Test: manual
Change-Id: I7a1270925f7148dac81fa5e58b232a886c57236a
Merged-In: I6ec28a2676a86cfa06819e297136ff413c14f169
Fix: 30012668
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index eb42b6d..432eddd 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -1475,24 +1475,32 @@
boolean onMediaButton(int type) {
if (hasAnyCalls()) {
+ Call ringingCall = getFirstCallWithState(CallState.RINGING);
if (HeadsetMediaButton.SHORT_PRESS == type) {
- Call ringingCall = getFirstCallWithState(CallState.RINGING);
if (ringingCall == null) {
- mCallAudioManager.toggleMute();
- return true;
+ Call callToHangup = getFirstCallWithState(CallState.RINGING, CallState.DIALING,
+ CallState.PULLING, CallState.ACTIVE, CallState.ON_HOLD);
+ Log.addEvent(callToHangup, LogUtils.Events.INFO,
+ "media btn short press - end call.");
+ if (callToHangup != null) {
+ callToHangup.disconnect();
+ return true;
+ }
} else {
ringingCall.answer(VideoProfile.STATE_AUDIO_ONLY);
return true;
}
} else if (HeadsetMediaButton.LONG_PRESS == type) {
- Log.d(this, "handleHeadsetHook: longpress -> hangup");
- Call callToHangup = getFirstCallWithState(
- CallState.RINGING, CallState.DIALING, CallState.PULLING, CallState.ACTIVE,
- CallState.ON_HOLD);
- if (callToHangup != null) {
- callToHangup.disconnect();
- return true;
+ if (ringingCall != null) {
+ Log.addEvent( getForegroundCall(), LogUtils.Events.INFO,
+ "media btn long press - reject");
+ ringingCall.reject(false, null);
+ } else {
+ Log.addEvent(getForegroundCall(), LogUtils.Events.INFO,
+ "media btn long press - mute");
+ mCallAudioManager.toggleMute();
}
+ return true;
}
}
return false;
diff --git a/src/com/android/server/telecom/HeadsetMediaButton.java b/src/com/android/server/telecom/HeadsetMediaButton.java
index f9ba60e..7d6a798 100644
--- a/src/com/android/server/telecom/HeadsetMediaButton.java
+++ b/src/com/android/server/telecom/HeadsetMediaButton.java
@@ -93,6 +93,7 @@
private final CallsManager mCallsManager;
private final TelecomSystem.SyncRoot mLock;
private MediaSession mSession;
+ private KeyEvent mLastHookEvent;
public HeadsetMediaButton(
Context context,
@@ -115,10 +116,24 @@
private boolean handleHeadsetHook(KeyEvent event) {
Log.d(this, "handleHeadsetHook()...%s %s", event.getAction(), event.getRepeatCount());
+ // Save ACTION_DOWN Event temporarily.
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ mLastHookEvent = event;
+ }
+
if (event.isLongPress()) {
return mCallsManager.onMediaButton(LONG_PRESS);
- } else if (event.getAction() == KeyEvent.ACTION_UP && event.getRepeatCount() == 0) {
- return mCallsManager.onMediaButton(SHORT_PRESS);
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+ // We should not judge SHORT_PRESS by ACTION_UP event repeatCount, because it always
+ // return 0.
+ // Actually ACTION_DOWN event repeatCount only increases when LONG_PRESS performed.
+ if (mLastHookEvent != null && mLastHookEvent.getRepeatCount() == 0) {
+ return mCallsManager.onMediaButton(SHORT_PRESS);
+ }
+ }
+
+ if (event.getAction() != KeyEvent.ACTION_DOWN) {
+ mLastHookEvent = null;
}
return true;