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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user