diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt index 1ba0220bdae7..eb87505df6a5 100644 --- a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt @@ -45,6 +45,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * Hosts application business logic related to user authentication. @@ -227,6 +228,10 @@ constructor( // Since authentication succeeded, we should refresh throttling to make sure that our // state is completely reflecting the upstream source of truth. refreshThrottling() + + // Force a garbage collection in an attempt to erase any credentials left in memory. + // Do it after a 5-sec delay to avoid making the bouncer dismiss animation janky. + initiateGarbageCollection(delayMs = 5000) } return if (authenticationResult.isSuccessful) { @@ -310,6 +315,15 @@ constructor( } } + private suspend fun initiateGarbageCollection(delayMs: Long) { + withContext(backgroundDispatcher) { + delay(delayMs) + System.gc() + System.runFinalization() + System.gc() + } + } + companion object { const val TAG = "AuthenticationInteractor" } |