diff options
3 files changed, 39 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index f9f56ee4d134..266093229186 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -316,6 +316,8 @@ public class FingerprintAuthenticationClient if (getBiometricContext().isAwake()) { mALSProbeCallback.getProbe().enable(); + } else { + mALSProbeCallback.getProbe().disable(); } } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index f02a3fff12f5..1ebc856af2d8 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -197,6 +197,16 @@ public class MediaSessionService extends SystemService implements Monitor { @GuardedBy("mLock") private final Map<Integer, Set<Notification>> mMediaNotifications = new HashMap<>(); + /** + * Holds all {@link MediaSessionRecordImpl} which we've reported as being {@link + * ActivityManagerInternal#startForegroundServiceDelegate user engaged}. + * + * <p>This map simply prevents invoking {@link + * ActivityManagerInternal#startForegroundServiceDelegate} more than once per session. + */ + @GuardedBy("mLock") + private final Set<MediaSessionRecordImpl> mFgsAllowedMediaSessionRecords = new HashSet<>(); + // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile) // It's always not null after the MediaSessionService is started. private FullUserRecord mCurrentFullUserRecord; @@ -704,15 +714,23 @@ public class MediaSessionService extends SystemService implements Monitor { int uid = mediaSessionRecord.getUid(); for (Notification mediaNotification : mMediaNotifications.getOrDefault(uid, Set.of())) { if (mediaSessionRecord.isLinkedToNotification(mediaNotification)) { - startFgsDelegate(mediaSessionRecord.getForegroundServiceDelegationOptions()); + startFgsDelegateLocked(mediaSessionRecord); return; } } } } - private void startFgsDelegate( - ForegroundServiceDelegationOptions foregroundServiceDelegationOptions) { + @GuardedBy("mLock") + private void startFgsDelegateLocked(MediaSessionRecordImpl mediaSessionRecord) { + ForegroundServiceDelegationOptions foregroundServiceDelegationOptions = + mediaSessionRecord.getForegroundServiceDelegationOptions(); + if (foregroundServiceDelegationOptions == null) { + return; // This record doesn't support FGS. Typically a MediaSession2 record. + } + if (!mFgsAllowedMediaSessionRecords.add(mediaSessionRecord)) { + return; // This record is already FGS-started. + } final long token = Binder.clearCallingIdentity(); try { Log.i( @@ -754,12 +772,21 @@ public class MediaSessionService extends SystemService implements Monitor { } } - stopFgsDelegate(foregroundServiceDelegationOptions); + stopFgsDelegateLocked(mediaSessionRecord); } } - private void stopFgsDelegate( - ForegroundServiceDelegationOptions foregroundServiceDelegationOptions) { + @GuardedBy("mLock") + private void stopFgsDelegateLocked(MediaSessionRecordImpl mediaSessionRecord) { + ForegroundServiceDelegationOptions foregroundServiceDelegationOptions = + mediaSessionRecord.getForegroundServiceDelegationOptions(); + if (foregroundServiceDelegationOptions == null) { + return; // This record doesn't support FGS. Typically a MediaSession2 record. + } + if (!mFgsAllowedMediaSessionRecords.remove(mediaSessionRecord)) { + return; // This record is not FGS-started. No need to stop it. + } + final long token = Binder.clearCallingIdentity(); try { Log.i( @@ -3209,11 +3236,8 @@ public class MediaSessionService extends SystemService implements Monitor { mMediaNotifications.get(uid).add(postedNotification); for (MediaSessionRecordImpl mediaSessionRecord : mUserEngagedSessionsForFgs.getOrDefault(uid, Set.of())) { - ForegroundServiceDelegationOptions foregroundServiceDelegationOptions = - mediaSessionRecord.getForegroundServiceDelegationOptions(); - if (foregroundServiceDelegationOptions != null - && mediaSessionRecord.isLinkedToNotification(postedNotification)) { - startFgsDelegate(foregroundServiceDelegationOptions); + if (mediaSessionRecord.isLinkedToNotification(postedNotification)) { + startFgsDelegateLocked(mediaSessionRecord); return; } } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java index 40de1b253dea..182d60328440 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java @@ -320,7 +320,7 @@ public class FingerprintAuthenticationClientTest { } @Test - public void luxProbeNotEnabledOnStartWhenNotWake() throws RemoteException { + public void luxProbeDisabledOnStartWhenNotWake() throws RemoteException { luxProbeEnabledOnStart(false /* isAwake */); } @@ -337,6 +337,7 @@ public class FingerprintAuthenticationClientTest { .getValue().toAidlContext()); verify(mLuxProbe, isAwake ? times(1) : never()).enable(); + verify(mLuxProbe, isAwake ? never() : times(1)).disable(); } @Test |