1 /*
2  * Copyright (C) 2019 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.globalactions;
18 
19 import static junit.framework.Assert.assertEquals;
20 
21 import static org.mockito.Mockito.doReturn;
22 import static org.mockito.Mockito.spy;
23 import static org.mockito.Mockito.times;
24 import static org.mockito.Mockito.verify;
25 
26 import android.testing.AndroidTestingRunner;
27 import android.view.Gravity;
28 import android.view.LayoutInflater;
29 import android.view.View;
30 
31 import androidx.test.filters.SmallTest;
32 
33 import com.android.systemui.SysuiTestCase;
34 import com.android.systemui.res.R;
35 import com.android.systemui.util.leak.RotationUtils;
36 
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.junit.runner.RunWith;
40 
41 /**
42  * Tests for {@link ListGridLayout}.
43  */
44 @SmallTest
45 @RunWith(AndroidTestingRunner.class)
46 public class GlobalActionsColumnLayoutTest extends SysuiTestCase {
47 
48     private GlobalActionsColumnLayout mColumnLayout;
49 
50     @Before
setUp()51     public void setUp() throws Exception {
52         mColumnLayout = spy((GlobalActionsColumnLayout)
53                 LayoutInflater.from(mContext).inflate(R.layout.global_actions_column, null));
54     }
55 
56     @Test
testShouldReverseListItems()57     public void testShouldReverseListItems() {
58         doReturn(View.LAYOUT_DIRECTION_LTR).when(mColumnLayout).getCurrentLayoutDirection();
59 
60         doReturn(RotationUtils.ROTATION_LANDSCAPE).when(mColumnLayout).getCurrentRotation();
61         assertEquals(false, mColumnLayout.shouldReverseListItems());
62 
63         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
64         assertEquals(false, mColumnLayout.shouldReverseListItems());
65 
66         doReturn(RotationUtils.ROTATION_SEASCAPE).when(mColumnLayout).getCurrentRotation();
67         assertEquals(true, mColumnLayout.shouldReverseListItems());
68 
69         doReturn(View.LAYOUT_DIRECTION_RTL).when(mColumnLayout).getCurrentLayoutDirection();
70 
71         doReturn(RotationUtils.ROTATION_LANDSCAPE).when(mColumnLayout).getCurrentRotation();
72         assertEquals(true, mColumnLayout.shouldReverseListItems());
73 
74         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
75         assertEquals(false, mColumnLayout.shouldReverseListItems());
76 
77         doReturn(RotationUtils.ROTATION_SEASCAPE).when(mColumnLayout).getCurrentRotation();
78         assertEquals(false, mColumnLayout.shouldReverseListItems());
79     }
80 
81     @Test
testGetAnimationOffsetX()82     public void testGetAnimationOffsetX() {
83         doReturn(50f).when(mColumnLayout).getAnimationDistance();
84 
85         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
86         assertEquals(50f, mColumnLayout.getAnimationOffsetX(), .01);
87 
88         doReturn(RotationUtils.ROTATION_LANDSCAPE).when(mColumnLayout).getCurrentRotation();
89         assertEquals(0, mColumnLayout.getAnimationOffsetX(), .01);
90 
91         doReturn(RotationUtils.ROTATION_SEASCAPE).when(mColumnLayout).getCurrentRotation();
92         assertEquals(0, mColumnLayout.getAnimationOffsetX(), .01);
93     }
94 
95     @Test
testGetAnimationOffsetY()96     public void testGetAnimationOffsetY() {
97         doReturn(50f).when(mColumnLayout).getAnimationDistance();
98 
99         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
100         assertEquals(0, mColumnLayout.getAnimationOffsetY(), .01);
101 
102         doReturn(RotationUtils.ROTATION_LANDSCAPE).when(mColumnLayout).getCurrentRotation();
103         assertEquals(-50f, mColumnLayout.getAnimationOffsetY(), .01);
104 
105         doReturn(RotationUtils.ROTATION_SEASCAPE).when(mColumnLayout).getCurrentRotation();
106         assertEquals(50f, mColumnLayout.getAnimationOffsetY(), .01);
107     }
108 
109     @Test
testSnapToPowerButton_portrait()110     public void testSnapToPowerButton_portrait() {
111         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
112         doReturn(50).when(mColumnLayout).getPowerButtonOffsetDistance();
113 
114         mColumnLayout.snapToPowerButton();
115         assertEquals(Gravity.TOP | Gravity.RIGHT, mColumnLayout.getGravity());
116         assertEquals(50, mColumnLayout.getPaddingTop(), .01);
117     }
118 
119     @Test
testCenterAlongEdge_portrait()120     public void testCenterAlongEdge_portrait() {
121         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
122 
123         mColumnLayout.centerAlongEdge();
124         assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mColumnLayout.getGravity());
125         assertEquals(0, mColumnLayout.getPaddingTop(), .01);
126     }
127 
128     @Test
testUpdateSnap_initialState()129     public void testUpdateSnap_initialState() {
130         doReturn(false).when(mColumnLayout).shouldSnapToPowerButton();
131 
132         mColumnLayout.updateSnap(); // should do nothing, since snap has not changed from init state
133 
134         verify(mColumnLayout, times(0)).snapToPowerButton();
135         verify(mColumnLayout, times(0)).centerAlongEdge();
136     }
137 
138     @Test
testUpdateSnap_snapThenSnap()139     public void testUpdateSnap_snapThenSnap() {
140         doReturn(true).when(mColumnLayout).shouldSnapToPowerButton();
141 
142         mColumnLayout.updateSnap(); // should snap to power button
143 
144         verify(mColumnLayout, times(1)).snapToPowerButton();
145         verify(mColumnLayout, times(0)).centerAlongEdge();
146 
147         mColumnLayout.updateSnap(); // should do nothing, since this is the same state as last time
148 
149         verify(mColumnLayout, times(1)).snapToPowerButton();
150         verify(mColumnLayout, times(0)).centerAlongEdge();
151     }
152 
153     @Test
testUpdateSnap_snapThenCenter()154     public void testUpdateSnap_snapThenCenter() {
155         doReturn(true).when(mColumnLayout).shouldSnapToPowerButton();
156 
157         mColumnLayout.updateSnap(); // should snap to power button
158 
159         verify(mColumnLayout, times(1)).snapToPowerButton();
160         verify(mColumnLayout, times(0)).centerAlongEdge();
161 
162         doReturn(false).when(mColumnLayout).shouldSnapToPowerButton();
163 
164         mColumnLayout.updateSnap(); // should center to edge
165 
166         verify(mColumnLayout, times(1)).snapToPowerButton();
167         verify(mColumnLayout, times(1)).centerAlongEdge();
168     }
169 
170     @Test
testShouldSnapToPowerButton_vertical()171     public void testShouldSnapToPowerButton_vertical() {
172         doReturn(RotationUtils.ROTATION_NONE).when(mColumnLayout).getCurrentRotation();
173         doReturn(300).when(mColumnLayout).getPowerButtonOffsetDistance();
174         doReturn(1000).when(mColumnLayout).getMeasuredHeight();
175         View wrapper = spy(new View(mContext, null));
176         doReturn(wrapper).when(mColumnLayout).getWrapper();
177         doReturn(500).when(wrapper).getMeasuredHeight();
178 
179         assertEquals(true, mColumnLayout.shouldSnapToPowerButton());
180 
181         doReturn(600).when(mColumnLayout).getMeasuredHeight();
182 
183         assertEquals(false, mColumnLayout.shouldSnapToPowerButton());
184     }
185 
186     @Test
testShouldSnapToPowerButton_horizontal()187     public void testShouldSnapToPowerButton_horizontal() {
188         doReturn(RotationUtils.ROTATION_LANDSCAPE).when(mColumnLayout).getCurrentRotation();
189         doReturn(300).when(mColumnLayout).getPowerButtonOffsetDistance();
190         doReturn(1000).when(mColumnLayout).getMeasuredWidth();
191         View wrapper = spy(new View(mContext, null));
192         doReturn(wrapper).when(mColumnLayout).getWrapper();
193         doReturn(500).when(wrapper).getMeasuredWidth();
194 
195         assertEquals(true, mColumnLayout.shouldSnapToPowerButton());
196 
197         doReturn(600).when(mColumnLayout).getMeasuredWidth();
198 
199         assertEquals(false, mColumnLayout.shouldSnapToPowerButton());
200     }
201 }
202