diff options
| author | 2025-03-19 21:08:13 -0700 | |
|---|---|---|
| committer | 2025-03-19 21:08:13 -0700 | |
| commit | be3f79a87aad00b55eded99117bdf90f1bd594ee (patch) | |
| tree | 52c065b04bc334979e91ff6551ffd046fd17ab33 | |
| parent | cf570fc53b377ece25841aa0a85ddd0296603f22 (diff) | |
| parent | a2df950a9b407ecee3324782f6db17b813731d28 (diff) | |
Merge "Move all binder calls to PowerManger#userActivity to bg thread." into main
8 files changed, 108 insertions, 29 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 675c9deaff23..56c018218269 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -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; @@ -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; @@ -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 @@ -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(); diff --git a/packages/SystemUI/src/com/android/keyguard/UserActivityNotifier.kt b/packages/SystemUI/src/com/android/keyguard/UserActivityNotifier.kt index 9b1ddb74c3b2..76c032a616ef 100644 --- a/packages/SystemUI/src/com/android/keyguard/UserActivityNotifier.kt +++ b/packages/SystemUI/src/com/android/keyguard/UserActivityNotifier.kt @@ -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) } } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index dbaa90c10313..9064966b25c6 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -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; @@ -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; @@ -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 @@ -1045,8 +1050,13 @@ public class UdfpsController implements DozeReceiver, Dumpable { mLatencyTracker.onActionStart(ACTION_UDFPS_ILLUMINATE); } // Refresh screen timeout and boost process priority if possible. - mPowerManager.userActivity(mSystemClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + 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(); diff --git a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt index faa77e51ec24..e38a0a78fbfd 100644 --- a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt @@ -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 @@ -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 @@ -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) @@ -163,12 +167,22 @@ constructor( ) } + @SuppressLint("MissingPermission") override fun userTouch(noChangeLights: Boolean) { - manager.userActivity( - systemClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_TOUCH, - if (noChangeLights) PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS else 0, - ) + 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, + pmFlags, + ) + } } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt index 362b5db012e1..c800ab3d0bf2 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt @@ -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 @@ -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) @@ -655,11 +657,17 @@ constructor( } return handled || hubShowing } finally { - powerManager.userActivity( - SystemClock.uptimeMillis(), - PowerManager.USER_ACTIVITY_EVENT_TOUCH, - 0, - ) + if (Flags.bouncerUiRevamp()) { + userActivityNotifier.notifyUserActivity( + event = PowerManager.USER_ACTIVITY_EVENT_TOUCH + ) + } else { + powerManager.userActivity( + SystemClock.uptimeMillis(), + PowerManager.USER_ACTIVITY_EVENT_TOUCH, + 0, + ) + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt index 02a3429f9111..41a099a22085 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt @@ -21,10 +21,14 @@ import android.content.BroadcastReceiver import android.content.Intent import android.content.IntentFilter import android.os.PowerManager +import android.os.powerManager import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.concurrency.fakeExecutor +import com.android.systemui.keyguard.userActivityNotifier +import com.android.systemui.testKosmos import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture @@ -50,10 +54,10 @@ import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidJUnit4::class) class PowerRepositoryImplTest : SysuiTestCase() { - + private val kosmos = testKosmos() private val systemClock = FakeSystemClock() - @Mock private lateinit var manager: PowerManager + val manager: PowerManager = kosmos.powerManager @Mock private lateinit var dispatcher: BroadcastDispatcher @Captor private lateinit var receiverCaptor: ArgumentCaptor<BroadcastReceiver> @Captor private lateinit var filterCaptor: ArgumentCaptor<IntentFilter> @@ -74,6 +78,7 @@ class PowerRepositoryImplTest : SysuiTestCase() { context.applicationContext, systemClock, dispatcher, + kosmos.userActivityNotifier, ) } @@ -198,13 +203,14 @@ class PowerRepositoryImplTest : SysuiTestCase() { systemClock.setUptimeMillis(345000) underTest.userTouch() + kosmos.fakeExecutor.runAllReady() val flagsCaptor = argumentCaptor<Int>() verify(manager) .userActivity( eq(345000L), eq(PowerManager.USER_ACTIVITY_EVENT_TOUCH), - capture(flagsCaptor) + capture(flagsCaptor), ) assertThat(flagsCaptor.value).isNotEqualTo(PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) assertThat(flagsCaptor.value).isNotEqualTo(PowerManager.USER_ACTIVITY_FLAG_INDIRECT) @@ -215,13 +221,14 @@ class PowerRepositoryImplTest : SysuiTestCase() { systemClock.setUptimeMillis(345000) underTest.userTouch(noChangeLights = true) + kosmos.fakeExecutor.runAllReady() val flagsCaptor = argumentCaptor<Int>() verify(manager) .userActivity( eq(345000L), eq(PowerManager.USER_ACTIVITY_EVENT_TOUCH), - capture(flagsCaptor) + capture(flagsCaptor), ) assertThat(flagsCaptor.value).isEqualTo(PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt index ae8b52aa6553..7728f684f0f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt @@ -56,6 +56,7 @@ import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInterac import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.keyguard.userActivityNotifier import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest @@ -137,6 +138,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { keyguardMediaController, lockscreenSmartspaceController, logcatLogBuffer("GlanceableHubContainerControllerTest"), + kosmos.userActivityNotifier, ) } @@ -177,6 +179,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { keyguardMediaController, lockscreenSmartspaceController, logcatLogBuffer("GlanceableHubContainerControllerTest"), + kosmos.userActivityNotifier, ) // First call succeeds. @@ -206,6 +209,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { keyguardMediaController, lockscreenSmartspaceController, logcatLogBuffer("GlanceableHubContainerControllerTest"), + kosmos.userActivityNotifier, ) assertThat(controller.lifecycle.currentState).isEqualTo(Lifecycle.State.INITIALIZED) @@ -231,6 +235,7 @@ class GlanceableHubContainerControllerTest : SysuiTestCase() { keyguardMediaController, lockscreenSmartspaceController, logcatLogBuffer("GlanceableHubContainerControllerTest"), + kosmos.userActivityNotifier, ) // Only initView without attaching a view as we don't want the flows to start collecting diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/UserActivityNotifierKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/UserActivityNotifierKosmos.kt new file mode 100644 index 000000000000..91d15017f75e --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/UserActivityNotifierKosmos.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard + +import android.os.powerManager +import com.android.keyguard.UserActivityNotifier +import com.android.systemui.concurrency.fakeExecutor +import com.android.systemui.kosmos.Kosmos + +var Kosmos.userActivityNotifier by + Kosmos.Fixture { + UserActivityNotifier(uiBgExecutor = fakeExecutor, powerManager = powerManager) + } |