Allow DEFAULT_INPUT_METHOD to capture audio during RTT call
The UID of the current InputMethodService (DEFAULT_INPUT_METHOD) is
pushed from AudioService to AudioPolicyService via AudioSystem.
Allow capture audio if:
- the UID is the current InputMethodService's UID,
- AND a RTT call is active,
- AND the source is AUDIO_SOURCE_VOICE_RECOGNITION.
Bug: 147037345
Test: use voice input with Gboard 9.1.4 during a simulated RTT call.
Change-Id: Ib32ec25e962833eddd0320742e177e3c1e0e5c05
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 57b23b7..6d79c94 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -1420,6 +1420,13 @@
return NO_ERROR;
}
+status_t AudioPolicyService::setCurrentImeUid(uid_t uid)
+{
+ Mutex::Autolock _l(mLock);
+ mUidPolicy->setCurrentImeUid(uid);
+ return NO_ERROR;
+}
+
bool AudioPolicyService::isHapticPlaybackSupported()
{
if (mAudioPolicyManager == NULL) {
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index dd46ffb..cbe6eb9 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -437,6 +437,8 @@
// OR all active clients are using HOTWORD source
// AND no call is active
// OR client has CAPTURE_AUDIO_OUTPUT privileged permission
+// OR the client is the current InputMethodService
+// AND a RTT call is active AND the source is VOICE_RECOGNITION
// OR Any client
// AND The assistant is not on TOP
// AND is on TOP or latest started
@@ -627,6 +629,12 @@
&& canCaptureIfInCallOrCommunication(current)) {
allowCapture = true;
}
+ } else if (mUidPolicy->isCurrentImeUid(current->uid)) {
+ // For current InputMethodService allow capture if:
+ // A RTT call is active AND the source is VOICE_RECOGNITION
+ if (rttCallActive && source == AUDIO_SOURCE_VOICE_RECOGNITION) {
+ allowCapture = true;
+ }
}
setAppState_l(current->portId,
allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(current->uid)) :
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 9a619dd..3f24276 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -261,6 +261,7 @@
virtual status_t setAssistantUid(uid_t uid);
virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids);
+ virtual status_t setCurrentImeUid(uid_t uid);
virtual bool isHapticPlaybackSupported();
@@ -371,7 +372,7 @@
public:
explicit UidPolicy(wp<AudioPolicyService> service)
: mService(service), mObserverRegistered(false),
- mAssistantUid(0), mRttEnabled(false) {}
+ mAssistantUid(0), mCurrentImeUid(0), mRttEnabled(false) {}
void registerSelf();
void unregisterSelf();
@@ -386,6 +387,8 @@
void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
bool isA11yUid(uid_t uid);
bool isA11yOnTop();
+ void setCurrentImeUid(uid_t uid) { mCurrentImeUid = uid; }
+ bool isCurrentImeUid(uid_t uid) { return uid == mCurrentImeUid; }
void setRttEnabled(bool enabled) { mRttEnabled = enabled; }
bool isRttEnabled() { return mRttEnabled; }
@@ -417,6 +420,7 @@
std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
uid_t mAssistantUid;
std::vector<uid_t> mA11yUids;
+ uid_t mCurrentImeUid;
bool mRttEnabled;
};