• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.settings.gestures;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.anyBoolean;
23 import static org.mockito.ArgumentMatchers.anyInt;
24 import static org.mockito.Mockito.times;
25 import static org.mockito.Mockito.verify;
26 
27 import android.content.Context;
28 import android.util.AttributeSet;
29 import android.view.LayoutInflater;
30 import android.view.View;
31 import android.view.ViewGroup;
32 import android.widget.LinearLayout;
33 import android.widget.SeekBar;
34 import android.widget.TextView;
35 
36 import androidx.preference.Preference;
37 import androidx.preference.PreferenceViewHolder;
38 
39 import com.android.settings.R;
40 import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
41 import com.android.settings.testutils.shadow.ShadowUserManager;
42 import com.android.settings.widget.LabeledSeekBarPreference;
43 
44 import org.junit.Before;
45 import org.junit.Ignore;
46 import org.junit.Test;
47 import org.junit.runner.RunWith;
48 import org.mockito.Mock;
49 import org.mockito.Mockito;
50 import org.mockito.MockitoAnnotations;
51 import org.robolectric.Robolectric;
52 import org.robolectric.RobolectricTestRunner;
53 import org.robolectric.RuntimeEnvironment;
54 import org.robolectric.annotation.Config;
55 
56 /**
57  * Tests for {@link LabeledSeekBarPreference}.
58  */
59 @RunWith(RobolectricTestRunner.class)
60 @Config(shadows = {
61         ShadowUserManager.class,
62         ShadowInteractionJankMonitor.class,
63 })
64 public class LabeledSeekBarPreferenceTest {
65 
66     private Context mContext;
67     private PreferenceViewHolder mViewHolder;
68     private SeekBar mSeekBar;
69     private TextView mSummary;
70     private ViewGroup mIconStartFrame;
71     private ViewGroup mIconEndFrame;
72     private View mLabelFrame;
73     private LabeledSeekBarPreference mSeekBarPreference;
74 
75     @Mock
76     private Preference.OnPreferenceChangeListener mListener;
77 
78     @Mock
79     private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener;
80 
81     @Before
setUp()82     public void setUp() {
83         MockitoAnnotations.initMocks(this);
84 
85         mContext = Mockito.spy(RuntimeEnvironment.application);
86         mSeekBarPreference = new LabeledSeekBarPreference(mContext, null);
87         LayoutInflater inflater = LayoutInflater.from(mContext);
88         final View view =
89                 inflater.inflate(mSeekBarPreference.getLayoutResource(),
90                         new LinearLayout(mContext), false);
91         mViewHolder = PreferenceViewHolder.createInstanceForTests(view);
92         mSeekBar = (SeekBar) mViewHolder.findViewById(com.android.internal.R.id.seekbar);
93         mSummary = (TextView) mViewHolder.findViewById(android.R.id.summary);
94         mIconStartFrame = (ViewGroup) mViewHolder.findViewById(R.id.icon_start_frame);
95         mIconEndFrame = (ViewGroup) mViewHolder.findViewById(R.id.icon_end_frame);
96         mLabelFrame = mViewHolder.findViewById(R.id.label_frame);
97     }
98 
99     @Test
seekBarPreferenceOnStopTrackingTouch_callsListener()100     public void seekBarPreferenceOnStopTrackingTouch_callsListener() {
101         mSeekBar.setProgress(2);
102 
103         mSeekBarPreference.setOnPreferenceChangeStopListener(mListener);
104         mSeekBarPreference.onStopTrackingTouch(mSeekBar);
105 
106         verify(mListener, times(1)).onPreferenceChange(mSeekBarPreference, 2);
107     }
108 
109     @Test
seekBarPreferenceSummarySet_returnsValue()110     public void seekBarPreferenceSummarySet_returnsValue() {
111         final String summary = "this is a summary";
112         mSeekBarPreference.setSummary(summary);
113         mSeekBarPreference.onBindViewHolder(mViewHolder);
114 
115         assertThat(mSeekBarPreference.getSummary()).isEqualTo(summary);
116         assertThat(mSummary.getText()).isEqualTo(summary);
117     }
118 
119     @Test
seekBarPreferenceSummaryNull_hidesView()120     public void seekBarPreferenceSummaryNull_hidesView() {
121         mSeekBarPreference.setSummary(null);
122         mSeekBarPreference.onBindViewHolder(mViewHolder);
123 
124         assertThat(mSummary.getText()).isEqualTo("");
125         assertThat(mSummary.getVisibility()).isEqualTo(View.GONE);
126     }
127 
128     @Test
setTextAttributes_textStart_textEnd_labelFrameVisible()129     public void setTextAttributes_textStart_textEnd_labelFrameVisible() {
130         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
131                 .addAttribute(R.attr.textStart, "@string/screen_zoom_make_smaller_desc")
132                 .addAttribute(R.attr.textEnd, "@string/screen_zoom_make_larger_desc")
133                 .build();
134         final LabeledSeekBarPreference seekBarPreference =
135                 new LabeledSeekBarPreference(mContext, attributeSet);
136 
137         seekBarPreference.onBindViewHolder(mViewHolder);
138 
139         assertThat(mLabelFrame.getVisibility()).isEqualTo(View.VISIBLE);
140     }
141 
142     @Test
notSetTextAttributes_labelFrameGone()143     public void notSetTextAttributes_labelFrameGone() {
144         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
145                 .build();
146         final LabeledSeekBarPreference seekBarPreference =
147                 new LabeledSeekBarPreference(mContext, attributeSet);
148 
149         seekBarPreference.onBindViewHolder(mViewHolder);
150 
151         assertThat(mLabelFrame.getVisibility()).isEqualTo(View.GONE);
152     }
153 
154     @Ignore("b/313594999")
155     @Test
setIconAttributes_iconVisible()156     public void setIconAttributes_iconVisible() {
157         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
158                 .addAttribute(R.attr.iconStart, "@drawable/ic_remove_24dp")
159                 .addAttribute(R.attr.iconEnd, "@drawable/ic_add_24dp")
160                 .build();
161         final LabeledSeekBarPreference seekBarPreference =
162                 new LabeledSeekBarPreference(mContext, attributeSet);
163 
164         seekBarPreference.onBindViewHolder(mViewHolder);
165 
166         assertThat(mIconStartFrame.getVisibility()).isEqualTo(View.VISIBLE);
167         assertThat(mIconEndFrame.getVisibility()).isEqualTo(View.VISIBLE);
168     }
169 
170     @Test
notSetIconAttributes_iconGone()171     public void notSetIconAttributes_iconGone() {
172         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
173                 .build();
174         final LabeledSeekBarPreference seekBarPreference =
175                 new LabeledSeekBarPreference(mContext, attributeSet);
176 
177         seekBarPreference.onBindViewHolder(mViewHolder);
178 
179         assertThat(mIconStartFrame.getVisibility()).isEqualTo(View.GONE);
180         assertThat(mIconEndFrame.getVisibility()).isEqualTo(View.GONE);
181     }
182 
183     @Test
setSeekBarListener_success()184     public void setSeekBarListener_success() {
185         mSeekBarPreference.setOnSeekBarChangeListener(mSeekBarChangeListener);
186         mSeekBarPreference.onStartTrackingTouch(mSeekBar);
187         mSeekBarPreference.onProgressChanged(mSeekBar, /* progress= */ 0,
188                 /* fromUser= */ false);
189         mSeekBarPreference.onStopTrackingTouch(mSeekBar);
190 
191         verify(mSeekBarChangeListener).onStartTrackingTouch(any(SeekBar.class));
192         verify(mSeekBarChangeListener).onProgressChanged(any(SeekBar.class), anyInt(),
193                 anyBoolean());
194         verify(mSeekBarChangeListener).onStopTrackingTouch(any(SeekBar.class));
195     }
196 
197     @Test(expected = IllegalArgumentException.class)
setContentDescriptionWithoutIcon_throwException()198     public void setContentDescriptionWithoutIcon_throwException() {
199         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
200                 .addAttribute(R.attr.iconStartContentDescription,
201                         "@string/screen_zoom_make_smaller_desc")
202                 .addAttribute(R.attr.iconEndContentDescription,
203                         "@string/screen_zoom_make_larger_desc")
204                 .build();
205 
206         new LabeledSeekBarPreference(mContext, attributeSet);
207     }
208 
209     @Ignore("b/313594999")
210     @Test
setContentDescriptionWithIcon_success()211     public void setContentDescriptionWithIcon_success() {
212         final String startDescription =
213                 mContext.getResources().getString(R.string.screen_zoom_make_smaller_desc);
214         final String endDescription =
215                 mContext.getResources().getString(R.string.screen_zoom_make_larger_desc);
216         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
217                 .addAttribute(R.attr.iconStart, "@drawable/ic_remove_24dp")
218                 .addAttribute(R.attr.iconEnd, "@drawable/ic_add_24dp")
219                 .addAttribute(R.attr.iconStartContentDescription,
220                         "@string/screen_zoom_make_smaller_desc")
221                 .addAttribute(R.attr.iconEndContentDescription,
222                         "@string/screen_zoom_make_larger_desc")
223                 .build();
224         final LabeledSeekBarPreference seekBarPreference =
225                 new LabeledSeekBarPreference(mContext, attributeSet);
226 
227         seekBarPreference.onBindViewHolder(mViewHolder);
228 
229         assertThat(mIconStartFrame.getContentDescription().toString().contentEquals(
230                 startDescription)).isTrue();
231         assertThat(mIconEndFrame.getContentDescription().toString().contentEquals(
232                 endDescription)).isTrue();
233     }
234 
235     @Test
notSetContentDescriptionAttributes_noDescription()236     public void notSetContentDescriptionAttributes_noDescription() {
237         final AttributeSet attributeSet = Robolectric.buildAttributeSet()
238                 .build();
239         final LabeledSeekBarPreference seekBarPreference =
240                 new LabeledSeekBarPreference(mContext, attributeSet);
241 
242         seekBarPreference.onBindViewHolder(mViewHolder);
243 
244         assertThat(mIconStartFrame.getContentDescription()).isNull();
245         assertThat(mIconEndFrame.getContentDescription()).isNull();
246     }
247 }
248