Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca92e805 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

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
parent 0f779293
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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