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
This commit is contained in:
Bryce Lee
2023-04-01 01:57:21 +00:00
parent c45e60c5ad
commit 1ff5b3e7cf
2 changed files with 34 additions and 44 deletions

View File

@@ -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() {
@Override
public void onReceive(Context context, Intent intent) {
processIntent(intent);
}
};
private final KeyguardUpdateMonitor mUpdateMonitor;
private final KeyguardUpdateMonitorCallback mUpdateCallback =
new KeyguardUpdateMonitorCallback() {
@Override
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);
}
}

View File

@@ -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();
}
}