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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user