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:
Evan Severson
2021-05-05 10:24:16 -07:00
parent c1c3ab17ea
commit 11b564feb1
3 changed files with 33 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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"

View File

@@ -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