Add code to maintain a session for phone calls
This creates a session for phone calls and activates/deactivates
it as needed when the phone state changes.
Some extra handling needs to be added to the session service to
make sure this gets priority across all users when active.
Change-Id: Ia2cc75eb52cd131083c98ad9a9fa2e49d58c9075
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 62d542f..cc49c2e 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -34,6 +34,8 @@
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.media.AudioManager;
+import android.media.session.Session;
+import android.media.session.SessionManager;
import android.net.Uri;
import android.os.AsyncResult;
import android.os.Binder;
@@ -216,6 +218,9 @@
// Broadcast receiver purely for ACTION_MEDIA_BUTTON broadcasts
private final BroadcastReceiver mMediaButtonReceiver = new MediaButtonBroadcastReceiver();
+ private final SessionCallback mSessionCallback = new SessionCallback();
+
+ private Session mSession;
/** boolean indicating restoring mute state on InCallScreen.onResume() */
private boolean mShouldRestoreMuteOnInCallResume;
@@ -557,6 +562,14 @@
// audio-mode-related state of our own) is initialized
// correctly, given the current state of the phone.
PhoneUtils.setAudioMode(mCM);
+
+ // Register a MediaSession but don't enable it yet. This is a
+ // replacement for MediaButtonReceiver
+ SessionManager msm = (SessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
+ mSession = msm.createSession(LOG_TAG);
+ mSession.addCallback(mSessionCallback);
+ mSession.setFlags(Session.FLAG_EXCLUSIVE_GLOBAL_PRIORITY
+ | Session.FLAG_HANDLES_MEDIA_BUTTONS);
}
if (TelephonyCapabilities.supportsOtasp(phone)) {
@@ -921,10 +934,16 @@
if (!mUpdateLock.isHeld()) {
mUpdateLock.acquire();
}
+ if (!mSession.isActive()) {
+ mSession.setActive(true);
+ }
} else {
if (mUpdateLock.isHeld()) {
mUpdateLock.release();
}
+ if (mSession.isActive()) {
+ mSession.setActive(false);
+ }
}
}
}
@@ -1083,6 +1102,19 @@
}
}
+ private class SessionCallback extends Session.Callback {
+ @Override
+ public void onMediaButton(Intent intent) {
+ KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
+ if (VDBG) Log.d(LOG_TAG, "SessionCallback.onMediaButton()... event = " + event);
+ if ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK)) {
+ if (VDBG) Log.d(LOG_TAG, "SessionCallback: HEADSETHOOK");
+ boolean consumed = PhoneUtils.handleHeadsetHook(phone, event);
+ if (VDBG) Log.d(LOG_TAG, "==> handleHeadsetHook(): consumed = " + consumed);
+ }
+ }
+ }
+
/**
* Broadcast receiver for the ACTION_MEDIA_BUTTON broadcast intent.
*