From c0b8f15e7113ed2adfc81e1b493d96a2eba978c7 Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Thu, 16 Mar 2023 15:56:39 -0700 Subject: [PATCH] Use DreamManager to get initial state. Currently, DreamCondition incorrectly treats the return value of the broadcast receiver registration as sticky. This changelist fixes this error by instead referencing DreamManager to get the initial state. Test: atest DreamManagerTest Bug: 268060399 Change-Id: Ib923e02a76ee37e6dc69d131607cab6a44a03422 --- .../dreams/conditions/DreamCondition.java | 10 ++++-- .../dreams/conditions/DreamConditionTest.java | 33 ++++++++++++++----- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/dreams/conditions/DreamCondition.java b/packages/SystemUI/src/com/android/systemui/dreams/conditions/DreamCondition.java index 2befce7065ec5..5bbfbda829441 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/conditions/DreamCondition.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/conditions/DreamCondition.java @@ -15,6 +15,7 @@ */ package com.android.systemui.dreams.conditions; +import android.app.DreamManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -30,6 +31,7 @@ import javax.inject.Inject; */ public class DreamCondition extends Condition { private final Context mContext; + private final DreamManager mDreamManager; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -39,8 +41,10 @@ public class DreamCondition extends Condition { }; @Inject - public DreamCondition(Context context) { + public DreamCondition(Context context, + DreamManager dreamManager) { mContext = context; + mDreamManager = dreamManager; } private void processIntent(Intent intent) { @@ -62,8 +66,8 @@ public class DreamCondition extends Condition { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_DREAMING_STARTED); filter.addAction(Intent.ACTION_DREAMING_STOPPED); - final Intent stickyIntent = mContext.registerReceiver(mReceiver, filter); - processIntent(stickyIntent); + mContext.registerReceiver(mReceiver, filter); + updateCondition(mDreamManager.isDreaming()); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java index 19347c7685241..58eb7d4f3ea76 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/conditions/DreamConditionTest.java @@ -21,9 +21,11 @@ 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; 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; @@ -50,6 +52,9 @@ public class DreamConditionTest extends SysuiTestCase { @Mock Condition.Callback mCallback; + @Mock + DreamManager mDreamManager; + @Before public void setup() { MockitoAnnotations.initMocks(this); @@ -59,29 +64,39 @@ public class DreamConditionTest extends SysuiTestCase { * Ensure a dreaming state immediately triggers the condition. */ @Test - public void testInitialState() { - final Intent intent = new Intent(Intent.ACTION_DREAMING_STARTED); - when(mContext.registerReceiver(any(), any())).thenReturn(intent); - final DreamCondition condition = new DreamCondition(mContext); + public void testInitialDreamingState() { + when(mDreamManager.isDreaming()).thenReturn(true); + final DreamCondition condition = new DreamCondition(mContext, mDreamManager); condition.addCallback(mCallback); - condition.start(); verify(mCallback).onConditionChanged(eq(condition)); assertThat(condition.isConditionMet()).isTrue(); } + /** + * Ensure a non-dreaming state does not trigger the condition. + */ + @Test + public void testInitialNonDreamingState() { + when(mDreamManager.isDreaming()).thenReturn(false); + final DreamCondition condition = new DreamCondition(mContext, mDreamManager); + condition.addCallback(mCallback); + + verify(mCallback, never()).onConditionChanged(eq(condition)); + assertThat(condition.isConditionMet()).isFalse(); + } + /** * Ensure that changing dream state triggers condition. */ @Test public void testChange() { - final Intent intent = new Intent(Intent.ACTION_DREAMING_STARTED); final ArgumentCaptor receiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); - when(mContext.registerReceiver(receiverCaptor.capture(), any())).thenReturn(intent); - final DreamCondition condition = new DreamCondition(mContext); + when(mDreamManager.isDreaming()).thenReturn(true); + final DreamCondition condition = new DreamCondition(mContext, mDreamManager); condition.addCallback(mCallback); - condition.start(); + verify(mContext).registerReceiver(receiverCaptor.capture(), any()); clearInvocations(mCallback); receiverCaptor.getValue().onReceive(mContext, new Intent(Intent.ACTION_DREAMING_STOPPED)); verify(mCallback).onConditionChanged(eq(condition));