From 11b564feb1554e7562a2589e277bd4147e2af6db Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 5 May 2021 10:24:16 -0700 Subject: [PATCH] Show sensor usage dialog for assistant The problem is that the assistant doesn't draw its own UI in some cases so even though it's in the background the user considers it as a foreground app. We can check if the app trying to access the microphone currently has a voice interaction session which should be a good indicator that the user intends to user the app. Test: Use the assistant, observe dialog Bug: 178243539 Change-Id: Ie17f6e47a002e75467cce23fd74f5fcbc92aa577 --- .../voice/VoiceInteractionManagerInternal.java | 5 +++++ .../android/server/SensorPrivacyService.java | 11 +++++++++++ .../VoiceInteractionManagerService.java | 17 +++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/core/java/android/service/voice/VoiceInteractionManagerInternal.java b/core/java/android/service/voice/VoiceInteractionManagerInternal.java index b38067b9975a1..f5c959137d9b7 100644 --- a/core/java/android/service/voice/VoiceInteractionManagerInternal.java +++ b/core/java/android/service/voice/VoiceInteractionManagerInternal.java @@ -41,4 +41,9 @@ public abstract class VoiceInteractionManagerInternal { public abstract boolean supportsLocalVoiceInteraction(); public abstract void stopLocalVoiceInteraction(IBinder callingActivity); + + /** + * Returns whether the given package is currently in an active session + */ + public abstract boolean hasActiveSession(String packageName); } \ No newline at end of file diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index baec5449d8960..9314ed74f9c8a 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -76,6 +76,7 @@ import android.provider.Settings; import android.service.SensorPrivacyIndividualEnabledSensorProto; import android.service.SensorPrivacyServiceDumpProto; import android.service.SensorPrivacyUserProto; +import android.service.voice.VoiceInteractionManagerInternal; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.telephony.emergency.EmergencyNumber; @@ -172,6 +173,7 @@ public final class SensorPrivacyService extends SystemService { mActivityManager = context.getSystemService(ActivityManager.class); mActivityTaskManager = context.getSystemService(ActivityTaskManager.class); mTelephonyManager = context.getSystemService(TelephonyManager.class); + mSensorPrivacyServiceImpl = new SensorPrivacyServiceImpl(); } @@ -402,6 +404,15 @@ public final class SensorPrivacyService extends SystemService { } } + VoiceInteractionManagerInternal voiceInteractionManagerInternal = + LocalServices.getService(VoiceInteractionManagerInternal.class); + + if (sensor == MICROPHONE && voiceInteractionManagerInternal != null + && voiceInteractionManagerInternal.hasActiveSession(packageName)) { + enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor); + return; + } + Log.i(TAG, packageName + "/" + uid + " started using sensor " + sensor + " but no activity or foreground service was running. The user will not be" + " informed. System components should check if sensor privacy is enabled for" diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 92cfe49803880..f3d80b13f2900 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -234,6 +234,23 @@ public class VoiceInteractionManagerService extends SystemService { VoiceInteractionManagerService.this.mServiceStub.stopLocalVoiceInteraction( callingActivity); } + + @Override + public boolean hasActiveSession(String packageName) { + VoiceInteractionManagerServiceImpl impl = + VoiceInteractionManagerService.this.mServiceStub.mImpl; + if (impl == null) { + return false; + } + + VoiceInteractionSessionConnection session = + impl.mActiveSession; + if (session == null) { + return false; + } + + return TextUtils.equals(packageName, session.mSessionComponentName.getPackageName()); + } } // implementation entry point and binder service