summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-11-28 23:38:13 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-11-28 23:38:13 +0000
commit1dbe2b20920b1beea85034561d0e0f3403c79ecf (patch)
tree94afaf159f104c89cc4cae9e3ddee23fa3beb0b8
parent45db63640c0e334911446aa927eb9baf8a988b36 (diff)
parent1c9c1d53b27cb5e7638b85c1af59dddee63edc1b (diff)
Merge "AudioService: monitor assistant and accessibility services"
-rw-r--r--core/jni/android_media_AudioSystem.cpp31
-rw-r--r--media/java/android/media/AudioSystem.java9
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java46
3 files changed, 86 insertions, 0 deletions
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 2c0158a03434..adab8e2bae39 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -2032,6 +2032,35 @@ static jint android_media_AudioSystem_get_FCC_8(JNIEnv *env, jobject thiz) {
return FCC_8;
}
+static jint
+android_media_AudioSystem_setAssistantUid(JNIEnv *env, jobject thiz, jint uid)
+{
+ status_t status = AudioSystem::setAssistantUid(uid);
+ return (jint)nativeToJavaStatus(status);
+}
+
+static jint
+android_media_AudioSystem_setA11yServicesUids(JNIEnv *env, jobject thiz, jintArray uids) {
+ std::vector<uid_t> nativeUidsVector;
+
+ if (uids != nullptr) {
+ jsize len = env->GetArrayLength(uids);
+
+ if (len > 0) {
+ int *nativeUids = nullptr;
+ nativeUids = env->GetIntArrayElements(uids, 0);
+ if (nativeUids != nullptr) {
+ for (size_t i = 0; i < len; i++) {
+ nativeUidsVector.push_back(nativeUids[i]);
+ }
+ env->ReleaseIntArrayElements(uids, nativeUids, 0);
+ }
+ }
+ }
+ status_t status = AudioSystem::setA11yServicesUids(nativeUidsVector);
+ return (jint)nativeToJavaStatus(status);
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] = {
@@ -2092,6 +2121,8 @@ static const JNINativeMethod gMethods[] = {
{"getMicrophones", "(Ljava/util/ArrayList;)I", (void *)android_media_AudioSystem_getMicrophones},
{"getSurroundFormats", "(Ljava/util/Map;Z)I", (void *)android_media_AudioSystem_getSurroundFormats},
{"setSurroundFormatEnabled", "(IZ)I", (void *)android_media_AudioSystem_setSurroundFormatEnabled},
+ {"setAssistantUid", "(I)I", (void *)android_media_AudioSystem_setAssistantUid},
+ {"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids},
};
static const JNINativeMethod gEventHandlerMethods[] = {
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 1ebe059ad44b..082a375470ee 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -924,6 +924,15 @@ public class AudioSystem
public static native int setSurroundFormatEnabled(int audioFormat, boolean enabled);
+ /**
+ * Communicate UID of active assistant to audio policy service.
+ */
+ public static native int setAssistantUid(int uid);
+ /**
+ * Communicate UIDs of active accessibility services to audio policy service.
+ */
+ public static native int setA11yServicesUids(int[] uids);
+
// Items shared with audio service
/**
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 67d27c94f41b..6cde4adb9f11 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -649,6 +649,9 @@ public class AudioService extends IAudioService.Stub
private String mEnabledSurroundFormats;
private boolean mSurroundModeChanged;
+ @GuardedBy("mSettingsLock")
+ private int mAssistantUid;
+
// Intent "extra" data keys.
public static final String CONNECT_INTENT_KEY_PORT_NAME = "portName";
public static final String CONNECT_INTENT_KEY_STATE = "state";
@@ -1079,6 +1082,10 @@ public class AudioService extends IAudioService.Stub
AudioSystem.setForceUse(AudioSystem.FOR_DOCK, forDock);
sendEncodedSurroundMode(mContentResolver, "onAudioServerDied");
sendEnabledSurroundFormats(mContentResolver, true);
+ updateAssistantUId(true);
+ }
+ synchronized (mAccessibilityServiceUidsLock) {
+ AudioSystem.setA11yServicesUids(mAccessibilityServiceUids);
}
synchronized (mHdmiClientLock) {
if (mHdmiManager != null && mHdmiTvClient != null) {
@@ -1404,6 +1411,39 @@ public class AudioService extends IAudioService.Stub
}
}
+ @GuardedBy("mSettingsLock")
+ private void updateAssistantUId(boolean forceUpdate) {
+ int assistantUid = 0;
+
+ // Consider assistants in the following order of priority:
+ // 1) voice interaction service
+ // 2) assistant
+ String assistantName = Settings.Secure.getStringForUser(
+ mContentResolver,
+ Settings.Secure.VOICE_INTERACTION_SERVICE, UserHandle.USER_CURRENT);
+ if (TextUtils.isEmpty(assistantName)) {
+ assistantName = Settings.Secure.getStringForUser(
+ mContentResolver,
+ Settings.Secure.ASSISTANT, UserHandle.USER_CURRENT);
+ }
+ if (!TextUtils.isEmpty(assistantName)) {
+ String packageName = ComponentName.unflattenFromString(assistantName).getPackageName();
+ if (!TextUtils.isEmpty(packageName)) {
+ try {
+ assistantUid = mContext.getPackageManager().getPackageUid(packageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG,
+ "updateAssistantUId() could not find UID for package: " + packageName);
+ }
+ }
+ }
+
+ if (assistantUid != mAssistantUid || forceUpdate) {
+ AudioSystem.setAssistantUid(assistantUid);
+ mAssistantUid = assistantUid;
+ }
+ }
+
private void readPersistedSettings() {
final ContentResolver cr = mContentResolver;
@@ -1447,6 +1487,7 @@ public class AudioService extends IAudioService.Stub
readDockAudioSettings(cr);
sendEncodedSurroundMode(cr, "readPersistedSettings");
sendEnabledSurroundFormats(cr, true);
+ updateAssistantUId(true);
}
mMuteAffectedStreams = System.getIntForUser(cr,
@@ -5811,6 +5852,9 @@ public class AudioService extends IAudioService.Stub
mContentResolver, Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS);
mContentResolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS), false, this);
+
+ mContentResolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.VOICE_INTERACTION_SERVICE), false, this);
}
@Override
@@ -5832,6 +5876,7 @@ public class AudioService extends IAudioService.Stub
updateMasterMono(mContentResolver);
updateEncodedSurroundOutput();
sendEnabledSurroundFormats(mContentResolver, mSurroundModeChanged);
+ updateAssistantUId(false);
}
}
@@ -7658,6 +7703,7 @@ public class AudioService extends IAudioService.Stub
mAccessibilityServiceUids = uids.toArray();
}
}
+ AudioSystem.setA11yServicesUids(mAccessibilityServiceUids);
}
}
}