From ca92e80544c12cb12c44a6d256cefe94b0064204 Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Tue, 4 Jul 2023 20:20:42 +0000 Subject: [PATCH] Remove ContentResolver binder call from UI thread Calling mContentResolver.notifyChange was resulting in long binder calls (~30ms) in the sysui main thread during LOCKSCREEN_TRANSITION_TO_AOD. Test: KeyguardSliceProviderTest Bug: 289485377 Change-Id: I5c1ecef9d8144ac5fa30cf10f90b4151a54a09a7 --- .../android/systemui/keyguard/KeyguardSliceProvider.java | 6 +++++- .../systemui/keyguard/KeyguardSliceProviderTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 0511314331431..732102e0cf9e5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -50,6 +50,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.SystemUIAppComponentFactoryBase; +import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationMediaManager; @@ -151,6 +152,9 @@ public class KeyguardSliceProvider extends SliceProvider implements private SystemUIAppComponentFactoryBase.ContextAvailableCallback mContextAvailableCallback; @Inject WakeLockLogger mWakeLockLogger; + @Inject + @Background + Handler mBgHandler; /** * Receiver responsible for time ticking and updating the date format. @@ -502,7 +506,7 @@ public class KeyguardSliceProvider extends SliceProvider implements } protected void notifyChange() { - mContentResolver.notifyChange(mSliceUri, null /* observer */); + mBgHandler.post(() -> mContentResolver.notifyChange(mSliceUri, null /* observer */)); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 729a1ccd30f9b..ce8028c8b37a1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -19,6 +19,7 @@ package com.android.systemui.keyguard; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -31,6 +32,7 @@ import android.content.ContentResolver; import android.media.MediaMetadata; import android.media.session.PlaybackState; import android.net.Uri; +import android.os.Handler; import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -166,6 +168,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void updatesClock() { + clearInvocations(mContentResolver); mProvider.mKeyguardUpdateMonitorCallback.onTimeChanged(); TestableLooper.get(this).processAllMessages(); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); @@ -217,11 +220,13 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { reset(mContentResolver); mProvider.onPrimaryMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); + TestableLooper.get(this).processAllMessages(); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // Hides after waking up reset(mContentResolver); mProvider.onDozingChanged(false); + TestableLooper.get(this).processAllMessages(); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); } @@ -231,6 +236,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mProvider.onPrimaryMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); reset(mContentResolver); + TestableLooper.get(this).processAllMessages(); // Show media when dozing mProvider.onDozingChanged(true); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); @@ -272,6 +278,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mMediaManager = KeyguardSliceProviderTest.this.mNotificationMediaManager; mKeyguardUpdateMonitor = KeyguardSliceProviderTest.this.mKeyguardUpdateMonitor; mUserTracker = KeyguardSliceProviderTest.this.mUserTracker; + mBgHandler = + new Handler(TestableLooper.get(KeyguardSliceProviderTest.this).getLooper()); } @Override