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