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