Loading packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +7 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.biometrics; import static com.android.systemui.SysuiTestCaseExtKt.testKosmos; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; Loading Loading @@ -69,7 +71,9 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInt import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.UserActivityNotifierKosmosKt; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.kosmos.Kosmos; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; Loading Loading @@ -115,7 +119,7 @@ import java.util.List; @RunWith(AndroidJUnit4.class) @RunWithLooper(setAsMainLooper = true) public class UdfpsControllerTest extends SysuiTestCase { private final Kosmos mKosmos = testKosmos(this); private static final long TEST_REQUEST_ID = 70; @Rule Loading Loading @@ -325,7 +329,8 @@ public class UdfpsControllerTest extends SysuiTestCase { mDefaultUdfpsTouchOverlayViewModel, mUdfpsOverlayInteractor, mPowerInteractor, mock(CoroutineScope.class) mock(CoroutineScope.class), UserActivityNotifierKosmosKt.getUserActivityNotifier(mKosmos) ); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); mOverlayController = mOverlayCaptor.getValue(); Loading packages/SystemUI/src/com/android/keyguard/UserActivityNotifier.kt +12 −9 Original line number Diff line number Diff line Loading @@ -15,27 +15,30 @@ */ package com.android.keyguard import android.annotation.SuppressLint import android.os.PowerManager import android.os.SystemClock import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.UiBackground import java.util.concurrent.Executor import javax.inject.Inject /** Wrapper class for notifying the system about user activity in the background. */ @SysUISingleton class UserActivityNotifier @Inject constructor( @UiBackground private val uiBgExecutor: Executor, private val powerManager: PowerManager private val powerManager: PowerManager, ) { fun notifyUserActivity() { uiBgExecutor.execute { powerManager.userActivity( SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER, 0 ) } @SuppressLint("MissingPermission") @JvmOverloads fun notifyUserActivity( timeOfActivity: Long = SystemClock.uptimeMillis(), event: Int = PowerManager.USER_ACTIVITY_EVENT_OTHER, flags: Int = 0, ) { uiBgExecutor.execute { powerManager.userActivity(timeOfActivity, event, flags) } } } packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +13 −3 Original line number Diff line number Diff line Loading @@ -69,7 +69,9 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.util.LatencyTracker; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.UserActivityNotifier; import com.android.systemui.Dumpable; import com.android.systemui.Flags; import com.android.systemui.animation.ActivityTransitionAnimator; import com.android.systemui.biometrics.dagger.BiometricsBackground; import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor; Loading Loading @@ -146,6 +148,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { private final Execution mExecution; private final FingerprintManager mFingerprintManager; @NonNull private final LayoutInflater mInflater; private final UserActivityNotifier mUserActivityNotifier; private final WindowManager mWindowManager; private final DelayableExecutor mFgExecutor; @NonNull private final Executor mBiometricExecutor; Loading Loading @@ -696,11 +699,13 @@ public class UdfpsController implements DozeReceiver, Dumpable { Lazy<DefaultUdfpsTouchOverlayViewModel> defaultUdfpsTouchOverlayViewModel, @NonNull UdfpsOverlayInteractor udfpsOverlayInteractor, @NonNull PowerInteractor powerInteractor, @Application CoroutineScope scope) { @Application CoroutineScope scope, UserActivityNotifier userActivityNotifier) { mContext = context; mExecution = execution; mVibrator = vibrator; mInflater = inflater; mUserActivityNotifier = userActivityNotifier; mIgnoreRefreshRate = mContext.getResources() .getBoolean(R.bool.config_ignoreUdfpsVote); // The fingerprint manager is queried for UDFPS before this class is constructed, so the Loading Loading @@ -1045,8 +1050,13 @@ public class UdfpsController implements DozeReceiver, Dumpable { mLatencyTracker.onActionStart(ACTION_UDFPS_ILLUMINATE); } // Refresh screen timeout and boost process priority if possible. if (Flags.bouncerUiRevamp()) { mUserActivityNotifier.notifyUserActivity(mSystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH); } else { mPowerManager.userActivity(mSystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); } if (!mOnFingerDown) { playStartHaptic(); Loading packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt +20 −6 Original line number Diff line number Diff line Loading @@ -17,14 +17,16 @@ package com.android.systemui.power.data.repository import android.annotation.SuppressLint import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.PowerManager import com.android.keyguard.UserActivityNotifier import com.android.systemui.Flags import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.power.shared.model.DozeScreenStateModel Loading @@ -33,6 +35,7 @@ import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessModel import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.util.time.SystemClock import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow Loading Loading @@ -102,6 +105,7 @@ constructor( @Application private val applicationContext: Context, private val systemClock: SystemClock, dispatcher: BroadcastDispatcher, private val userActivityNotifier: UserActivityNotifier, ) : PowerRepository { override val dozeScreenState = MutableStateFlow(DozeScreenStateModel.UNKNOWN) Loading Loading @@ -163,13 +167,23 @@ constructor( ) } @SuppressLint("MissingPermission") override fun userTouch(noChangeLights: Boolean) { val pmFlags = if (noChangeLights) PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS else 0 if (Flags.bouncerUiRevamp()) { userActivityNotifier.notifyUserActivity( timeOfActivity = systemClock.uptimeMillis(), event = PowerManager.USER_ACTIVITY_EVENT_TOUCH, flags = pmFlags, ) } else { manager.userActivity( systemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, if (noChangeLights) PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS else 0, pmFlags, ) } } companion object { private const val TAG = "PowerRepository" Loading packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt +13 −5 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.compose.theme.PlatformTheme import com.android.internal.annotations.VisibleForTesting import com.android.keyguard.UserActivityNotifier import com.android.systemui.Flags import com.android.systemui.ambient.touch.TouchMonitor import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent Loading Loading @@ -101,6 +102,7 @@ constructor( private val keyguardMediaController: KeyguardMediaController, private val lockscreenSmartspaceController: LockscreenSmartspaceController, @CommunalTouchLog logBuffer: LogBuffer, private val userActivityNotifier: UserActivityNotifier, ) : LifecycleOwner { private val logger = Logger(logBuffer, TAG) Loading Loading @@ -655,6 +657,11 @@ constructor( } return handled || hubShowing } finally { if (Flags.bouncerUiRevamp()) { userActivityNotifier.notifyUserActivity( event = PowerManager.USER_ACTIVITY_EVENT_TOUCH ) } else { powerManager.userActivity( SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, Loading @@ -662,6 +669,7 @@ constructor( ) } } } override val lifecycle: Lifecycle get() = lifecycleRegistry Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +7 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui.biometrics; import static com.android.systemui.SysuiTestCaseExtKt.testKosmos; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; Loading Loading @@ -69,7 +71,9 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInt import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.UserActivityNotifierKosmosKt; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.kosmos.Kosmos; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; Loading Loading @@ -115,7 +119,7 @@ import java.util.List; @RunWith(AndroidJUnit4.class) @RunWithLooper(setAsMainLooper = true) public class UdfpsControllerTest extends SysuiTestCase { private final Kosmos mKosmos = testKosmos(this); private static final long TEST_REQUEST_ID = 70; @Rule Loading Loading @@ -325,7 +329,8 @@ public class UdfpsControllerTest extends SysuiTestCase { mDefaultUdfpsTouchOverlayViewModel, mUdfpsOverlayInteractor, mPowerInteractor, mock(CoroutineScope.class) mock(CoroutineScope.class), UserActivityNotifierKosmosKt.getUserActivityNotifier(mKosmos) ); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); mOverlayController = mOverlayCaptor.getValue(); Loading
packages/SystemUI/src/com/android/keyguard/UserActivityNotifier.kt +12 −9 Original line number Diff line number Diff line Loading @@ -15,27 +15,30 @@ */ package com.android.keyguard import android.annotation.SuppressLint import android.os.PowerManager import android.os.SystemClock import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.UiBackground import java.util.concurrent.Executor import javax.inject.Inject /** Wrapper class for notifying the system about user activity in the background. */ @SysUISingleton class UserActivityNotifier @Inject constructor( @UiBackground private val uiBgExecutor: Executor, private val powerManager: PowerManager private val powerManager: PowerManager, ) { fun notifyUserActivity() { uiBgExecutor.execute { powerManager.userActivity( SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_OTHER, 0 ) } @SuppressLint("MissingPermission") @JvmOverloads fun notifyUserActivity( timeOfActivity: Long = SystemClock.uptimeMillis(), event: Int = PowerManager.USER_ACTIVITY_EVENT_OTHER, flags: Int = 0, ) { uiBgExecutor.execute { powerManager.userActivity(timeOfActivity, event, flags) } } }
packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +13 −3 Original line number Diff line number Diff line Loading @@ -69,7 +69,9 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.internal.util.LatencyTracker; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.UserActivityNotifier; import com.android.systemui.Dumpable; import com.android.systemui.Flags; import com.android.systemui.animation.ActivityTransitionAnimator; import com.android.systemui.biometrics.dagger.BiometricsBackground; import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor; Loading Loading @@ -146,6 +148,7 @@ public class UdfpsController implements DozeReceiver, Dumpable { private final Execution mExecution; private final FingerprintManager mFingerprintManager; @NonNull private final LayoutInflater mInflater; private final UserActivityNotifier mUserActivityNotifier; private final WindowManager mWindowManager; private final DelayableExecutor mFgExecutor; @NonNull private final Executor mBiometricExecutor; Loading Loading @@ -696,11 +699,13 @@ public class UdfpsController implements DozeReceiver, Dumpable { Lazy<DefaultUdfpsTouchOverlayViewModel> defaultUdfpsTouchOverlayViewModel, @NonNull UdfpsOverlayInteractor udfpsOverlayInteractor, @NonNull PowerInteractor powerInteractor, @Application CoroutineScope scope) { @Application CoroutineScope scope, UserActivityNotifier userActivityNotifier) { mContext = context; mExecution = execution; mVibrator = vibrator; mInflater = inflater; mUserActivityNotifier = userActivityNotifier; mIgnoreRefreshRate = mContext.getResources() .getBoolean(R.bool.config_ignoreUdfpsVote); // The fingerprint manager is queried for UDFPS before this class is constructed, so the Loading Loading @@ -1045,8 +1050,13 @@ public class UdfpsController implements DozeReceiver, Dumpable { mLatencyTracker.onActionStart(ACTION_UDFPS_ILLUMINATE); } // Refresh screen timeout and boost process priority if possible. if (Flags.bouncerUiRevamp()) { mUserActivityNotifier.notifyUserActivity(mSystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH); } else { mPowerManager.userActivity(mSystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); } if (!mOnFingerDown) { playStartHaptic(); Loading
packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt +20 −6 Original line number Diff line number Diff line Loading @@ -17,14 +17,16 @@ package com.android.systemui.power.data.repository import android.annotation.SuppressLint import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.PowerManager import com.android.keyguard.UserActivityNotifier import com.android.systemui.Flags import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.power.shared.model.DozeScreenStateModel Loading @@ -33,6 +35,7 @@ import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.power.shared.model.WakefulnessModel import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.util.time.SystemClock import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow Loading Loading @@ -102,6 +105,7 @@ constructor( @Application private val applicationContext: Context, private val systemClock: SystemClock, dispatcher: BroadcastDispatcher, private val userActivityNotifier: UserActivityNotifier, ) : PowerRepository { override val dozeScreenState = MutableStateFlow(DozeScreenStateModel.UNKNOWN) Loading Loading @@ -163,13 +167,23 @@ constructor( ) } @SuppressLint("MissingPermission") override fun userTouch(noChangeLights: Boolean) { val pmFlags = if (noChangeLights) PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS else 0 if (Flags.bouncerUiRevamp()) { userActivityNotifier.notifyUserActivity( timeOfActivity = systemClock.uptimeMillis(), event = PowerManager.USER_ACTIVITY_EVENT_TOUCH, flags = pmFlags, ) } else { manager.userActivity( systemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, if (noChangeLights) PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS else 0, pmFlags, ) } } companion object { private const val TAG = "PowerRepository" Loading
packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt +13 −5 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.compose.theme.PlatformTheme import com.android.internal.annotations.VisibleForTesting import com.android.keyguard.UserActivityNotifier import com.android.systemui.Flags import com.android.systemui.ambient.touch.TouchMonitor import com.android.systemui.ambient.touch.dagger.AmbientTouchComponent Loading Loading @@ -101,6 +102,7 @@ constructor( private val keyguardMediaController: KeyguardMediaController, private val lockscreenSmartspaceController: LockscreenSmartspaceController, @CommunalTouchLog logBuffer: LogBuffer, private val userActivityNotifier: UserActivityNotifier, ) : LifecycleOwner { private val logger = Logger(logBuffer, TAG) Loading Loading @@ -655,6 +657,11 @@ constructor( } return handled || hubShowing } finally { if (Flags.bouncerUiRevamp()) { userActivityNotifier.notifyUserActivity( event = PowerManager.USER_ACTIVITY_EVENT_TOUCH ) } else { powerManager.userActivity( SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_TOUCH, Loading @@ -662,6 +669,7 @@ constructor( ) } } } override val lifecycle: Lifecycle get() = lifecycleRegistry Loading