1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.complication; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.mock; 22 import static org.mockito.Mockito.verify; 23 24 import android.testing.AndroidTestingRunner; 25 import android.testing.TestableLooper; 26 27 import androidx.lifecycle.Observer; 28 import androidx.test.filters.SmallTest; 29 30 import com.android.systemui.SysuiTestCase; 31 import com.android.systemui.dreams.DreamOverlayStateController; 32 import com.android.systemui.flags.FakeFeatureFlags; 33 import com.android.systemui.flags.Flags; 34 import com.android.systemui.log.core.FakeLogBuffer; 35 import com.android.systemui.util.concurrency.FakeExecutor; 36 import com.android.systemui.util.time.FakeSystemClock; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.mockito.ArgumentCaptor; 42 import org.mockito.Mock; 43 import org.mockito.Mockito; 44 import org.mockito.MockitoAnnotations; 45 46 import java.util.Collection; 47 import java.util.HashSet; 48 49 @SmallTest 50 @RunWith(AndroidTestingRunner.class) 51 @TestableLooper.RunWithLooper(setAsMainLooper = true) 52 public class ComplicationCollectionLiveDataTest extends SysuiTestCase { 53 54 private FakeExecutor mExecutor; 55 private DreamOverlayStateController mStateController; 56 private ComplicationCollectionLiveData mLiveData; 57 private FakeFeatureFlags mFeatureFlags; 58 @Mock 59 private Observer mObserver; 60 61 @Before setUp()62 public void setUp() { 63 MockitoAnnotations.initMocks(this); 64 mFeatureFlags = new FakeFeatureFlags(); 65 mExecutor = new FakeExecutor(new FakeSystemClock()); 66 mFeatureFlags.set(Flags.ALWAYS_SHOW_HOME_CONTROLS_ON_DREAMS, true); 67 mStateController = new DreamOverlayStateController( 68 mExecutor, 69 /* overlayEnabled= */ true, 70 mFeatureFlags, 71 FakeLogBuffer.Factory.Companion.create()); 72 mLiveData = new ComplicationCollectionLiveData(mStateController); 73 } 74 75 @Test 76 /** 77 * Ensures registration and callback lifecycles are respected. 78 */ testLifecycle()79 public void testLifecycle() { 80 final HashSet<Complication> complications = new HashSet<>(); 81 mLiveData.observeForever(mObserver); 82 mExecutor.runAllReady(); 83 // Verify observer called with empty complications 84 assertObserverCalledWith(complications); 85 86 addComplication(mock(Complication.class), complications); 87 assertObserverCalledWith(complications); 88 89 addComplication(mock(Complication.class), complications); 90 assertObserverCalledWith(complications); 91 92 mStateController.setAvailableComplicationTypes(0); 93 mExecutor.runAllReady(); 94 assertObserverCalledWith(complications); 95 mLiveData.removeObserver(mObserver); 96 } 97 assertObserverCalledWith(Collection<Complication> targetCollection)98 private void assertObserverCalledWith(Collection<Complication> targetCollection) { 99 ArgumentCaptor<Collection<Complication>> collectionCaptor = 100 ArgumentCaptor.forClass(Collection.class); 101 102 verify(mObserver).onChanged(collectionCaptor.capture()); 103 104 final Collection<Complication> collection = collectionCaptor.getValue(); 105 106 assertThat(collection.containsAll(targetCollection) 107 && targetCollection.containsAll(collection)).isTrue(); 108 Mockito.clearInvocations(mObserver); 109 } 110 addComplication(Complication complication, Collection<Complication> complications)111 private void addComplication(Complication complication, 112 Collection<Complication> complications) { 113 complications.add(complication); 114 mStateController.addComplication(complication); 115 mExecutor.runAllReady(); 116 } 117 } 118