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

Commit 1ff5b3e7 authored by Bryce Lee's avatar Bryce Lee
Browse files

Use KeyguardUpdateMonitor in DreamCondition.

This changelist moves DreamCondition away from using dream broadcasts
for dream state updates to instead KeyguardUpdateMonitor. This move
coincides with updates to improve the latency of dream state updates
to KeyguardUpdateMonitor.

Test: atest DreamConditionTest
Fixes: 275108597
Change-Id: Idd362f882a822d3e670eb08e424a5ac145cb9479
parent c45e60c5
Loading
Loading
Loading
Loading
+16 −34
Original line number Diff line number Diff line
@@ -16,12 +16,9 @@
package com.android.systemui.dreams.conditions;

import android.app.DreamManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.TextUtils;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.shared.condition.Condition;

import javax.inject.Inject;
@@ -30,48 +27,33 @@ import javax.inject.Inject;
 * {@link DreamCondition} provides a signal when a dream begins and ends.
 */
public class DreamCondition extends Condition {
    private final Context mContext;
    private final DreamManager mDreamManager;

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    private final KeyguardUpdateMonitor mUpdateMonitor;


    private final KeyguardUpdateMonitorCallback mUpdateCallback =
            new KeyguardUpdateMonitorCallback() {
                @Override
        public void onReceive(Context context, Intent intent) {
            processIntent(intent);
                public void onDreamingStateChanged(boolean dreaming) {
                    updateCondition(dreaming);
                }
            };

    @Inject
    public DreamCondition(Context context,
            DreamManager dreamManager) {
        mContext = context;
    public DreamCondition(DreamManager dreamManager, KeyguardUpdateMonitor monitor) {
        mDreamManager = dreamManager;
    }

    private void processIntent(Intent intent) {
        // In the case of a non-existent sticky broadcast, ignore when there is no intent.
        if (intent == null) {
            return;
        }
        if (TextUtils.equals(intent.getAction(), Intent.ACTION_DREAMING_STARTED)) {
            updateCondition(true);
        } else if (TextUtils.equals(intent.getAction(), Intent.ACTION_DREAMING_STOPPED)) {
            updateCondition(false);
        } else {
            throw new IllegalStateException("unexpected intent:" + intent);
        }
        mUpdateMonitor = monitor;
    }

    @Override
    protected void start() {
        final IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_DREAMING_STARTED);
        filter.addAction(Intent.ACTION_DREAMING_STOPPED);
        mContext.registerReceiver(mReceiver, filter);
        mUpdateMonitor.registerCallback(mUpdateCallback);
        updateCondition(mDreamManager.isDreaming());
    }

    @Override
    protected void stop() {
        mContext.unregisterReceiver(mReceiver);
        mUpdateMonitor.removeCallback(mUpdateCallback);
    }
}
+18 −10
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.dreams.conditions;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
@@ -26,13 +25,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.DreamManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.testing.AndroidTestingRunner;

import androidx.test.filters.SmallTest;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.shared.condition.Condition;

@@ -55,6 +54,9 @@ public class DreamConditionTest extends SysuiTestCase {
    @Mock
    DreamManager mDreamManager;

    @Mock
    KeyguardUpdateMonitor mKeyguardUpdateMonitor;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
@@ -66,7 +68,7 @@ public class DreamConditionTest extends SysuiTestCase {
    @Test
    public void testInitialDreamingState() {
        when(mDreamManager.isDreaming()).thenReturn(true);
        final DreamCondition condition = new DreamCondition(mContext, mDreamManager);
        final DreamCondition condition = new DreamCondition(mDreamManager, mKeyguardUpdateMonitor);
        condition.addCallback(mCallback);

        verify(mCallback).onConditionChanged(eq(condition));
@@ -79,7 +81,7 @@ public class DreamConditionTest extends SysuiTestCase {
    @Test
    public void testInitialNonDreamingState() {
        when(mDreamManager.isDreaming()).thenReturn(false);
        final DreamCondition condition = new DreamCondition(mContext, mDreamManager);
        final DreamCondition condition = new DreamCondition(mDreamManager, mKeyguardUpdateMonitor);
        condition.addCallback(mCallback);

        verify(mCallback, never()).onConditionChanged(eq(condition));
@@ -91,15 +93,21 @@ public class DreamConditionTest extends SysuiTestCase {
     */
    @Test
    public void testChange() {
        final ArgumentCaptor<BroadcastReceiver> receiverCaptor =
                ArgumentCaptor.forClass(BroadcastReceiver.class);
        final ArgumentCaptor<KeyguardUpdateMonitorCallback> callbackCaptor =
                ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback.class);
        when(mDreamManager.isDreaming()).thenReturn(true);
        final DreamCondition condition = new DreamCondition(mContext, mDreamManager);
        final DreamCondition condition = new DreamCondition(mDreamManager, mKeyguardUpdateMonitor);
        condition.addCallback(mCallback);
        verify(mContext).registerReceiver(receiverCaptor.capture(), any());
        verify(mKeyguardUpdateMonitor).registerCallback(callbackCaptor.capture());

        clearInvocations(mCallback);
        receiverCaptor.getValue().onReceive(mContext, new Intent(Intent.ACTION_DREAMING_STOPPED));
        callbackCaptor.getValue().onDreamingStateChanged(false);
        verify(mCallback).onConditionChanged(eq(condition));
        assertThat(condition.isConditionMet()).isFalse();

        clearInvocations(mCallback);
        callbackCaptor.getValue().onDreamingStateChanged(true);
        verify(mCallback).onConditionChanged(eq(condition));
        assertThat(condition.isConditionMet()).isTrue();
    }
}