1 /*
2  * Copyright (C) 2020 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.keyguard;
18 
19 import static org.mockito.Mockito.atLeast;
20 import static org.mockito.Mockito.verify;
21 import static org.mockito.Mockito.when;
22 
23 import android.view.View;
24 import android.view.ViewTreeObserver;
25 import android.widget.FrameLayout;
26 
27 import com.android.keyguard.logging.KeyguardLogger;
28 import com.android.systemui.SysuiTestCase;
29 import com.android.systemui.dump.DumpManager;
30 import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
31 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
32 import com.android.systemui.kosmos.KosmosJavaAdapter;
33 import com.android.systemui.power.data.repository.FakePowerRepository;
34 import com.android.systemui.power.domain.interactor.PowerInteractorFactory;
35 import com.android.systemui.res.R;
36 import com.android.systemui.statusbar.notification.AnimatableProperty;
37 import com.android.systemui.statusbar.phone.DozeParameters;
38 import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
39 import com.android.systemui.statusbar.policy.ConfigurationController;
40 import com.android.systemui.statusbar.policy.KeyguardStateController;
41 
42 import org.junit.Before;
43 import org.mockito.ArgumentCaptor;
44 import org.mockito.Mock;
45 import org.mockito.MockitoAnnotations;
46 
47 public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase {
48 
49     private KosmosJavaAdapter mKosmos;
50     @Mock protected KeyguardStatusView mKeyguardStatusView;
51 
52     @Mock protected KeyguardSliceViewController mKeyguardSliceViewController;
53     @Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController;
54     @Mock protected KeyguardStateController mKeyguardStateController;
55     @Mock protected KeyguardUpdateMonitor mKeyguardUpdateMonitor;
56     @Mock protected ConfigurationController mConfigurationController;
57     @Mock protected DozeParameters mDozeParameters;
58     @Mock protected ScreenOffAnimationController mScreenOffAnimationController;
59     @Mock protected KeyguardLogger mKeyguardLogger;
60     @Mock protected KeyguardStatusViewController mControllerMock;
61     @Mock protected ViewTreeObserver mViewTreeObserver;
62     @Mock protected DumpManager mDumpManager;
63     protected FakeKeyguardRepository mFakeKeyguardRepository;
64     protected FakePowerRepository mFakePowerRepository;
65 
66     protected KeyguardStatusViewController mController;
67 
68     @Mock protected KeyguardClockSwitch mKeyguardClockSwitch;
69     @Mock protected FrameLayout mMediaHostContainer;
70     @Mock protected KeyguardStatusAreaView mKeyguardStatusAreaView;
71 
72     @Before
setup()73     public void setup() {
74         mKosmos = new KosmosJavaAdapter(this);
75         MockitoAnnotations.initMocks(this);
76 
77         KeyguardInteractorFactory.WithDependencies deps = KeyguardInteractorFactory.create();
78         mFakeKeyguardRepository = deps.getRepository();
79         mFakePowerRepository = new FakePowerRepository();
80 
81         mController = new KeyguardStatusViewController(
82                 mKeyguardStatusView,
83                 mKeyguardSliceViewController,
84                 mKeyguardClockSwitchController,
85                 mKeyguardStateController,
86                 mKeyguardUpdateMonitor,
87                 mConfigurationController,
88                 mDozeParameters,
89                 mScreenOffAnimationController,
90                 mKeyguardLogger,
91                 mKosmos.getInteractionJankMonitor(),
92                 deps.getKeyguardInteractor(),
93                 mDumpManager,
94                 PowerInteractorFactory.create(
95                         mFakePowerRepository
96                 ).getPowerInteractor()) {
97                     @Override
98                     void setProperty(
99                             AnimatableProperty property,
100                             float value,
101                             boolean animate) {
102                         // Route into the mock version for verification
103                         mControllerMock.setProperty(property, value, animate);
104                     }
105                 };
106 
107         when(mKeyguardStatusView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
108         when(mKeyguardClockSwitchController.getView()).thenReturn(mKeyguardClockSwitch);
109         when(mKeyguardStatusView.findViewById(R.id.keyguard_status_area))
110                 .thenReturn(mKeyguardStatusAreaView);
111     }
112 
givenViewAttached()113     protected void givenViewAttached() {
114         ArgumentCaptor<View.OnAttachStateChangeListener> captor =
115                 ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class);
116         verify(mKeyguardStatusView, atLeast(1)).addOnAttachStateChangeListener(captor.capture());
117 
118         for (View.OnAttachStateChangeListener listener : captor.getAllValues()) {
119             listener.onViewAttachedToWindow(mKeyguardStatusView);
120         }
121     }
122 }
123