xref: /aosp_15_r20/cts/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1 /*
2  * Copyright (C) 2006 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 android.content.res.cts;
18 
19 import static junit.framework.TestCase.assertEquals;
20 import static junit.framework.TestCase.assertFalse;
21 import static junit.framework.TestCase.assertNotNull;
22 import static junit.framework.TestCase.assertNull;
23 import static junit.framework.TestCase.assertTrue;
24 
25 import android.content.pm.ActivityInfo;
26 import android.content.res.Configuration;
27 import android.os.LocaleList;
28 import android.os.Parcel;
29 import android.platform.test.annotations.AppModeSdkSandbox;
30 import android.platform.test.ravenwood.RavenwoodRule;
31 import android.view.View;
32 
33 import androidx.test.ext.junit.runners.AndroidJUnit4;
34 
35 import org.junit.Before;
36 import org.junit.Rule;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 
40 import java.util.Locale;
41 
42 @AppModeSdkSandbox(reason = "Allow test in the SDK sandbox (does not prevent other modes).")
43 @RunWith(AndroidJUnit4.class)
44 public class ConfigurationTest {
45     @Rule
46     public final RavenwoodRule mRavenwoodRule = new RavenwoodRule.Builder().build();
47 
48     private Configuration mConfigDefault;
49     private Configuration mConfig;
50 
51     @Before
setUp()52     public void setUp() throws Exception {
53         mConfigDefault = new Configuration();
54         mConfigDefault.setToDefaults();
55         makeConfiguration();
56     }
57 
makeConfiguration()58     private void makeConfiguration() {
59         mConfig = new Configuration();
60         mConfig.fontScale = 2;
61         mConfig.mcc = mConfig.mnc = 1;
62         mConfig.setLocale(Locale.getDefault());
63         mConfig.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
64         mConfig.keyboard = Configuration.KEYBOARD_NOKEYS;
65         mConfig.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
66         mConfig.navigation = Configuration.NAVIGATION_NONAV;
67         mConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
68         mConfig.fontWeightAdjustment = 300;
69     }
70 
71     @Test
testConstructor()72     public void testConstructor() {
73         new Configuration();
74         new Configuration(mConfigDefault);
75     }
76 
77     @Test
testCompareTo()78     public void testCompareTo() {
79         final Configuration cfg1 = new Configuration();
80         final Configuration cfg2 = new Configuration();
81         assertEquals(0, cfg1.compareTo(cfg2));
82 
83         cfg1.fontWeightAdjustment = 1;
84         cfg2.fontWeightAdjustment = 2;
85         assertEquals(-1, cfg1.compareTo(cfg2));
86         cfg1.fontWeightAdjustment = 2;
87         cfg2.fontWeightAdjustment = 1;
88         assertEquals(1, cfg1.compareTo(cfg2));
89 
90         cfg1.colorMode = 2;
91         cfg2.colorMode = 3;
92         assertEquals(-1, cfg1.compareTo(cfg2));
93         cfg1.colorMode = 3;
94         cfg2.colorMode = 2;
95         assertEquals(1, cfg1.compareTo(cfg2));
96 
97         cfg1.orientation = 2;
98         cfg2.orientation = 3;
99         assertEquals(-1, cfg1.compareTo(cfg2));
100         cfg1.orientation = 3;
101         cfg2.orientation = 2;
102         assertEquals(1, cfg1.compareTo(cfg2));
103 
104         cfg1.navigation = 2;
105         cfg2.navigation = 3;
106         assertEquals(-1, cfg1.compareTo(cfg2));
107         cfg1.navigation = 3;
108         cfg2.navigation = 2;
109         assertEquals(1, cfg1.compareTo(cfg2));
110 
111         cfg1.keyboardHidden = 2;
112         cfg2.keyboardHidden = 3;
113         assertEquals(-1, cfg1.compareTo(cfg2));
114         cfg1.keyboardHidden = 3;
115         cfg2.keyboardHidden = 2;
116         assertEquals(1, cfg1.compareTo(cfg2));
117 
118         cfg1.keyboard = 2;
119         cfg2.keyboard = 3;
120         assertEquals(-1, cfg1.compareTo(cfg2));
121         cfg1.keyboard = 3;
122         cfg2.keyboard = 2;
123         assertEquals(1, cfg1.compareTo(cfg2));
124 
125         cfg1.touchscreen = 2;
126         cfg2.touchscreen = 3;
127         assertEquals(-1, cfg1.compareTo(cfg2));
128         cfg1.touchscreen = 3;
129         cfg2.touchscreen = 2;
130         assertEquals(1, cfg1.compareTo(cfg2));
131 
132         cfg1.setGrammaticalGender(Configuration.GRAMMATICAL_GENDER_FEMININE);
133         cfg2.setGrammaticalGender(Configuration.GRAMMATICAL_GENDER_MASCULINE);
134         assertEquals(-1, cfg1.compareTo(cfg2));
135         assertEquals(1, cfg2.compareTo(cfg1));
136 
137         cfg1.setLocales(LocaleList.forLanguageTags("fr"));
138         cfg2.setLocales(LocaleList.forLanguageTags("fr,en"));
139         assertTrue(cfg1.compareTo(cfg2) < 0);
140         cfg1.setLocales(LocaleList.forLanguageTags("fr,en"));
141         cfg2.setLocales(LocaleList.forLanguageTags("fr"));
142         assertTrue(cfg1.compareTo(cfg2) > 0);
143 
144         cfg1.setLocales(LocaleList.forLanguageTags("fr,en"));
145         cfg2.setLocales(LocaleList.forLanguageTags("fr,en-US"));
146         assertTrue(cfg1.compareTo(cfg2) < 0);
147         cfg1.setLocales(LocaleList.forLanguageTags("fr,en-US"));
148         cfg2.setLocales(LocaleList.forLanguageTags("fr,en"));
149         assertTrue(cfg1.compareTo(cfg2) > 0);
150 
151         cfg1.locale = Locale.forLanguageTag("en");
152         cfg2.locale = Locale.forLanguageTag("en-Shaw");
153         assertTrue(cfg1.compareTo(cfg2) < 0);
154         cfg1.locale = Locale.forLanguageTag("en-Shaw");
155         cfg2.locale = Locale.forLanguageTag("en");
156         assertTrue(cfg1.compareTo(cfg2) > 0);
157 
158         cfg1.locale = new Locale("", "", "2");
159         cfg2.locale = new Locale("", "", "3");
160         assertEquals(-1, cfg1.compareTo(cfg2));
161         cfg1.locale = new Locale("", "", "3");
162         cfg2.locale = new Locale("", "", "2");
163         assertEquals(1, cfg1.compareTo(cfg2));
164 
165         cfg1.locale = new Locale("", "2", "");
166         cfg2.locale = new Locale("", "3", "");
167         assertEquals(-1, cfg1.compareTo(cfg2));
168         cfg1.locale = new Locale("", "3", "");
169         cfg2.locale = new Locale("", "2", "");
170         assertEquals(1, cfg1.compareTo(cfg2));
171 
172         cfg1.locale = new Locale("2", "", "");
173         cfg2.locale = new Locale("3", "", "");
174         assertEquals(-1, cfg1.compareTo(cfg2));
175         cfg1.locale = new Locale("3", "", "");
176         cfg2.locale = new Locale("2", "", "");
177         assertEquals(1, cfg1.compareTo(cfg2));
178 
179         cfg1.locale = new Locale("");
180         cfg2.locale = null;
181         assertTrue(cfg1.compareTo(cfg2) < 0);
182         cfg1.locale = null;
183         cfg2.locale = new Locale("");
184         assertTrue(cfg1.compareTo(cfg2) > 0);
185 
186         cfg1.mnc = 2;
187         cfg2.mnc = 3;
188         assertEquals(-1, cfg1.compareTo(cfg2));
189         cfg1.mnc = 3;
190         cfg2.mnc = 2;
191         assertEquals(1, cfg1.compareTo(cfg2));
192 
193         cfg1.mcc = 2;
194         cfg2.mcc = 3;
195         assertEquals(-1, cfg1.compareTo(cfg2));
196         cfg1.mcc = 3;
197         cfg2.mcc = 2;
198         assertEquals(1, cfg1.compareTo(cfg2));
199 
200         cfg1.fontScale = 2;
201         cfg2.fontScale = 3;
202         assertEquals(-1, cfg1.compareTo(cfg2));
203         cfg1.fontScale = 3;
204         cfg2.fontScale = 2;
205         assertEquals(1, cfg1.compareTo(cfg2));
206     }
207 
208     @Test
testGenerateDiff()209     public void testGenerateDiff() {
210         Configuration cfg1 = new Configuration();
211         Configuration cfg2 = new Configuration();
212 
213         cfg1.fontScale = 2;
214         cfg2.fontScale = 3;
215 
216         cfg1.mcc = 2;
217         cfg2.mcc = 3;
218 
219         cfg1.mnc = 2;
220         cfg2.mnc = 3;
221 
222         cfg1.locale = new Locale("1", "2", "3");
223         cfg1.locale = new Locale("3", "2", "1");
224 
225         cfg1.touchscreen = 2;
226         cfg2.touchscreen = 3;
227 
228         cfg1.keyboard = 2;
229         cfg2.keyboard = 3;
230 
231         cfg1.keyboardHidden = 2;
232         cfg2.keyboardHidden = 3;
233 
234         cfg1.navigation = 2;
235         cfg2.navigation = 3;
236 
237         cfg1.navigationHidden = 3;
238         cfg2.navigationHidden = 2;
239 
240         cfg1.orientation = 3;
241         cfg2.orientation = 2;
242 
243         cfg1.screenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL
244                 | Configuration.SCREENLAYOUT_LAYOUTDIR_RTL
245                 | Configuration.SCREENLAYOUT_LONG_NO
246                 | Configuration.SCREENLAYOUT_ROUND_YES;
247         cfg2.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE
248                 | Configuration.SCREENLAYOUT_LAYOUTDIR_LTR
249                 | Configuration.SCREENLAYOUT_LONG_YES
250                 | Configuration.SCREENLAYOUT_ROUND_NO;
251 
252         cfg1.colorMode = Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_YES
253                 | Configuration.COLOR_MODE_HDR_NO;
254         cfg2.colorMode = Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_NO
255                 | Configuration.COLOR_MODE_HDR_YES;
256 
257         cfg1.uiMode = Configuration.UI_MODE_TYPE_WATCH
258                 | Configuration.UI_MODE_NIGHT_NO;
259         cfg2.uiMode = Configuration.UI_MODE_TYPE_NORMAL
260                 | Configuration.UI_MODE_NIGHT_YES;
261 
262         cfg1.screenWidthDp = 500;
263         cfg2.screenWidthDp = 600;
264 
265         cfg1.screenHeightDp = 920;
266         cfg2.screenHeightDp = 900;
267 
268         cfg1.smallestScreenWidthDp = 500;
269         cfg2.smallestScreenWidthDp = 600;
270 
271         cfg1.densityDpi = 200;
272         cfg2.densityDpi = 220;
273 
274         cfg1.assetsSeq = 4;
275         cfg2.assetsSeq = 5;
276 
277         cfg1.fontWeightAdjustment = 2;
278         cfg1.fontWeightAdjustment = 3;
279 
280         Configuration delta = Configuration.generateDelta(cfg1, cfg2);
281         assertEquals(cfg2, delta);
282 
283         delta = Configuration.generateDelta(cfg2, cfg1);
284         assertEquals(cfg1, delta);
285 
286         delta = Configuration.generateDelta(cfg1, cfg1);
287         assertEquals(new Configuration(), delta);
288     }
289 
290     @Test
testDescribeContents()291     public void testDescribeContents() {
292         assertEquals(0, mConfigDefault.describeContents());
293     }
294 
doConfigCompare(int expectedFlags, Configuration c1, Configuration c2)295     private static void doConfigCompare(int expectedFlags, Configuration c1, Configuration c2) {
296         assertEquals(expectedFlags, c1.diff(c2));
297         Configuration tmpc1 = new Configuration(c1);
298         assertEquals(expectedFlags, tmpc1.updateFrom(c2));
299         assertEquals(0, tmpc1.diff(c2));
300     }
301 
302     @Test
testDiff()303     public void testDiff() {
304         Configuration config = new Configuration();
305         config.mcc = 1;
306         doConfigCompare(ActivityInfo.CONFIG_MCC, mConfigDefault, config);
307         config.mnc = 1;
308         doConfigCompare(ActivityInfo.CONFIG_MCC
309                 | ActivityInfo.CONFIG_MNC, mConfigDefault, config);
310         config.locale = Locale.getDefault();
311         config.setLayoutDirection(config.locale);
312         doConfigCompare(ActivityInfo.CONFIG_MCC
313                 | ActivityInfo.CONFIG_MNC
314                 | ActivityInfo.CONFIG_LOCALE
315                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION, mConfigDefault, config);
316         config.setLocales(LocaleList.forLanguageTags("fr,en"));
317         doConfigCompare(ActivityInfo.CONFIG_MCC
318                 | ActivityInfo.CONFIG_MNC
319                 | ActivityInfo.CONFIG_LOCALE
320                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION, mConfigDefault, config);
321         config.screenLayout = 1;
322         doConfigCompare(ActivityInfo.CONFIG_MCC
323                 | ActivityInfo.CONFIG_MNC
324                 | ActivityInfo.CONFIG_LOCALE
325                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
326                 | ActivityInfo.CONFIG_SCREEN_LAYOUT, mConfigDefault, config);
327         config.touchscreen = 1;
328         doConfigCompare(ActivityInfo.CONFIG_MCC
329                 | ActivityInfo.CONFIG_MNC
330                 | ActivityInfo.CONFIG_LOCALE
331                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
332                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
333                 | ActivityInfo.CONFIG_TOUCHSCREEN, mConfigDefault, config);
334         config.keyboard = 1;
335         doConfigCompare(ActivityInfo.CONFIG_MCC
336                 | ActivityInfo.CONFIG_MNC
337                 | ActivityInfo.CONFIG_LOCALE
338                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
339                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
340                 | ActivityInfo.CONFIG_TOUCHSCREEN
341                 | ActivityInfo.CONFIG_KEYBOARD, mConfigDefault, config);
342         config.keyboardHidden = 1;
343         doConfigCompare(ActivityInfo.CONFIG_MCC
344                 | ActivityInfo.CONFIG_MNC
345                 | ActivityInfo.CONFIG_LOCALE
346                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
347                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
348                 | ActivityInfo.CONFIG_TOUCHSCREEN
349                 | ActivityInfo.CONFIG_KEYBOARD
350                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN, mConfigDefault, config);
351         config.keyboardHidden = 0;
352         config.hardKeyboardHidden = 1;
353         doConfigCompare(ActivityInfo.CONFIG_MCC
354                 | ActivityInfo.CONFIG_MNC
355                 | ActivityInfo.CONFIG_LOCALE
356                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
357                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
358                 | ActivityInfo.CONFIG_TOUCHSCREEN
359                 | ActivityInfo.CONFIG_KEYBOARD
360                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN, mConfigDefault, config);
361         config.hardKeyboardHidden = 0;
362         config.navigationHidden = 1;
363         doConfigCompare(ActivityInfo.CONFIG_MCC
364                 | ActivityInfo.CONFIG_MNC
365                 | ActivityInfo.CONFIG_LOCALE
366                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
367                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
368                 | ActivityInfo.CONFIG_TOUCHSCREEN
369                 | ActivityInfo.CONFIG_KEYBOARD
370                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN, mConfigDefault, config);
371         config.navigation = 1;
372         doConfigCompare(ActivityInfo.CONFIG_MCC
373                 | ActivityInfo.CONFIG_MNC
374                 | ActivityInfo.CONFIG_LOCALE
375                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
376                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
377                 | ActivityInfo.CONFIG_TOUCHSCREEN
378                 | ActivityInfo.CONFIG_KEYBOARD
379                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
380                 | ActivityInfo.CONFIG_NAVIGATION, mConfigDefault, config);
381         config.orientation = 1;
382         doConfigCompare(ActivityInfo.CONFIG_MCC
383                 | ActivityInfo.CONFIG_MNC
384                 | ActivityInfo.CONFIG_LOCALE
385                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
386                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
387                 | ActivityInfo.CONFIG_TOUCHSCREEN
388                 | ActivityInfo.CONFIG_KEYBOARD
389                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
390                 | ActivityInfo.CONFIG_NAVIGATION
391                 | ActivityInfo.CONFIG_ORIENTATION, mConfigDefault, config);
392         config.uiMode = 1;
393         doConfigCompare(ActivityInfo.CONFIG_MCC
394                 | ActivityInfo.CONFIG_MNC
395                 | ActivityInfo.CONFIG_LOCALE
396                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
397                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
398                 | ActivityInfo.CONFIG_TOUCHSCREEN
399                 | ActivityInfo.CONFIG_KEYBOARD
400                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
401                 | ActivityInfo.CONFIG_NAVIGATION
402                 | ActivityInfo.CONFIG_ORIENTATION
403                 | ActivityInfo.CONFIG_UI_MODE, mConfigDefault, config);
404         config.fontScale = 2;
405         doConfigCompare(ActivityInfo.CONFIG_MCC
406                 | ActivityInfo.CONFIG_MNC
407                 | ActivityInfo.CONFIG_LOCALE
408                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
409                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
410                 | ActivityInfo.CONFIG_TOUCHSCREEN
411                 | ActivityInfo.CONFIG_KEYBOARD
412                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
413                 | ActivityInfo.CONFIG_NAVIGATION
414                 | ActivityInfo.CONFIG_ORIENTATION
415                 | ActivityInfo.CONFIG_UI_MODE
416                 | ActivityInfo.CONFIG_FONT_SCALE, mConfigDefault, config);
417         config.colorMode = 2;
418         doConfigCompare(ActivityInfo.CONFIG_MCC
419                 | ActivityInfo.CONFIG_MNC
420                 | ActivityInfo.CONFIG_LOCALE
421                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
422                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
423                 | ActivityInfo.CONFIG_TOUCHSCREEN
424                 | ActivityInfo.CONFIG_KEYBOARD
425                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
426                 | ActivityInfo.CONFIG_NAVIGATION
427                 | ActivityInfo.CONFIG_ORIENTATION
428                 | ActivityInfo.CONFIG_UI_MODE
429                 | ActivityInfo.CONFIG_FONT_SCALE
430                 | ActivityInfo.CONFIG_COLOR_MODE, mConfigDefault, config);
431         config.fontWeightAdjustment = 300;
432         doConfigCompare(ActivityInfo.CONFIG_MCC
433                 | ActivityInfo.CONFIG_MNC
434                 | ActivityInfo.CONFIG_LOCALE
435                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
436                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
437                 | ActivityInfo.CONFIG_TOUCHSCREEN
438                 | ActivityInfo.CONFIG_KEYBOARD
439                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
440                 | ActivityInfo.CONFIG_NAVIGATION
441                 | ActivityInfo.CONFIG_ORIENTATION
442                 | ActivityInfo.CONFIG_UI_MODE
443                 | ActivityInfo.CONFIG_FONT_SCALE
444                 | ActivityInfo.CONFIG_COLOR_MODE
445                 | ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT, mConfigDefault, config);
446         config.setGrammaticalGender(Configuration.GRAMMATICAL_GENDER_MASCULINE);
447         doConfigCompare(ActivityInfo.CONFIG_MCC
448                 | ActivityInfo.CONFIG_MNC
449                 | ActivityInfo.CONFIG_LOCALE
450                 | ActivityInfo.CONFIG_LAYOUT_DIRECTION
451                 | ActivityInfo.CONFIG_SCREEN_LAYOUT
452                 | ActivityInfo.CONFIG_TOUCHSCREEN
453                 | ActivityInfo.CONFIG_KEYBOARD
454                 | ActivityInfo.CONFIG_KEYBOARD_HIDDEN
455                 | ActivityInfo.CONFIG_NAVIGATION
456                 | ActivityInfo.CONFIG_ORIENTATION
457                 | ActivityInfo.CONFIG_UI_MODE
458                 | ActivityInfo.CONFIG_FONT_SCALE
459                 | ActivityInfo.CONFIG_COLOR_MODE
460                 | ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT
461                 | ActivityInfo.CONFIG_GRAMMATICAL_GENDER, mConfigDefault, config);
462     }
463 
464     @Test
testEquals()465     public void testEquals() {
466         assertFalse(mConfigDefault.equals(mConfig));
467         assertFalse(mConfigDefault.equals(new Object()));
468     }
469 
470     @Test
testHashCode()471     public void testHashCode() {
472         assertFalse(mConfigDefault.hashCode() == mConfig.hashCode());
473     }
474 
475     @Test
testNeedNewResources()476     public void testNeedNewResources() {
477         assertTrue(Configuration.needNewResources(ActivityInfo.CONFIG_MCC,
478                 ActivityInfo.CONFIG_MCC));
479         assertFalse(Configuration.needNewResources(ActivityInfo.CONFIG_MNC,
480                 ActivityInfo.CONFIG_MCC));
481         assertTrue(Configuration.needNewResources(
482                 ActivityInfo.CONFIG_MNC|ActivityInfo.CONFIG_FONT_SCALE,
483                 ActivityInfo.CONFIG_MCC));
484     }
485 
486     @Test
testSetToDefaults()487     public void testSetToDefaults() {
488         final Configuration config = new Configuration(mConfig);
489         assertFalse(config.equals(mConfigDefault));
490 
491         config.setToDefaults();
492         assertTrue(config.equals(mConfigDefault));
493 
494         assertEquals(1.0f, config.fontScale);
495         assertEquals(0, config.mcc);
496         assertEquals(0, config.mnc);
497         assertTrue(config.getLocales().isEmpty());
498         assertEquals(null, config.locale);
499         assertFalse(config.userSetLocale);
500         assertEquals(Configuration.TOUCHSCREEN_UNDEFINED, config.touchscreen);
501         assertEquals(Configuration.KEYBOARD_UNDEFINED, config.keyboard);
502         assertEquals(Configuration.KEYBOARDHIDDEN_UNDEFINED, config.keyboardHidden);
503         assertEquals(Configuration.HARDKEYBOARDHIDDEN_UNDEFINED, config.hardKeyboardHidden);
504         assertEquals(Configuration.NAVIGATION_UNDEFINED, config.navigation);
505         assertEquals(Configuration.NAVIGATIONHIDDEN_UNDEFINED, config.navigationHidden);
506         assertEquals(Configuration.ORIENTATION_UNDEFINED, config.orientation);
507         assertEquals(Configuration.SCREENLAYOUT_UNDEFINED, config.screenLayout);
508         assertEquals(Configuration.UI_MODE_TYPE_UNDEFINED, config.uiMode);
509         assertEquals(Configuration.SCREEN_WIDTH_DP_UNDEFINED, config.screenWidthDp);
510         assertEquals(Configuration.SCREEN_WIDTH_DP_UNDEFINED, config.compatScreenWidthDp);
511         assertEquals(Configuration.SCREEN_HEIGHT_DP_UNDEFINED, config.screenHeightDp);
512         assertEquals(Configuration.SCREEN_HEIGHT_DP_UNDEFINED, config.compatScreenHeightDp);
513         assertEquals(Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED,
514                 config.smallestScreenWidthDp);
515         assertEquals(Configuration.DENSITY_DPI_UNDEFINED, config.densityDpi);
516         assertEquals(Configuration.COLOR_MODE_UNDEFINED, config.colorMode);
517         assertEquals(Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED, config.fontWeightAdjustment);
518         assertEquals(Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED, config.getGrammaticalGender());
519     }
520 
521     @Test
testUnset()522     public void testUnset() {
523         Configuration config = new Configuration();
524         assertEquals(0.0f, config.fontScale);
525         assertEquals(0, config.mcc);
526         assertEquals(0, config.mnc);
527         assertTrue(config.getLocales().isEmpty());
528         assertEquals(null, config.locale);
529         assertFalse(config.userSetLocale);
530         assertEquals(Configuration.TOUCHSCREEN_UNDEFINED, config.touchscreen);
531         assertEquals(Configuration.KEYBOARD_UNDEFINED, config.keyboard);
532         assertEquals(Configuration.KEYBOARDHIDDEN_UNDEFINED, config.keyboardHidden);
533         assertEquals(Configuration.HARDKEYBOARDHIDDEN_UNDEFINED, config.hardKeyboardHidden);
534         assertEquals(Configuration.NAVIGATION_UNDEFINED, config.navigation);
535         assertEquals(Configuration.NAVIGATIONHIDDEN_UNDEFINED, config.navigationHidden);
536         assertEquals(Configuration.ORIENTATION_UNDEFINED, config.orientation);
537         assertEquals(Configuration.SCREENLAYOUT_UNDEFINED, config.screenLayout);
538         assertEquals(Configuration.UI_MODE_TYPE_UNDEFINED, config.uiMode);
539         assertEquals(Configuration.SCREEN_WIDTH_DP_UNDEFINED, config.screenWidthDp);
540         assertEquals(Configuration.SCREEN_WIDTH_DP_UNDEFINED, config.compatScreenWidthDp);
541         assertEquals(Configuration.SCREEN_HEIGHT_DP_UNDEFINED, config.screenHeightDp);
542         assertEquals(Configuration.SCREEN_HEIGHT_DP_UNDEFINED, config.compatScreenHeightDp);
543         assertEquals(Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED,
544                 config.smallestScreenWidthDp);
545         assertEquals(Configuration.DENSITY_DPI_UNDEFINED, config.densityDpi);
546         assertEquals(Configuration.COLOR_MODE_UNDEFINED, config.colorMode);
547         assertEquals(Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED, config.fontWeightAdjustment);
548         assertEquals(Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED, config.getGrammaticalGender());
549     }
550 
551     @Test
testToString()552     public void testToString() {
553         assertNotNull(mConfigDefault.toString());
554     }
555 
556     @Test
testWriteToParcel()557     public void testWriteToParcel() {
558         assertWriteToParcel(createConfig((Locale) null));
559         assertWriteToParcel(createConfig(new Locale("")));
560         assertWriteToParcel(createConfig(Locale.JAPAN));
561         assertWriteToParcel(createConfig(Locale.forLanguageTag("en-Shaw")));
562         assertWriteToParcel(createConfig(LocaleList.forLanguageTags("fr,en-US")));
563     }
564 
565     @Test
testSetLocale()566     public void testSetLocale() {
567         Configuration config = new Configuration();
568 
569         config.setLocale(null);
570         assertNull(config.locale);
571         assertTrue(config.getLocales().isEmpty());
572 
573         config.setLocale(Locale.getDefault());
574         assertEquals(Locale.getDefault(), config.locale);
575         assertEquals(new LocaleList(Locale.getDefault()), config.getLocales());
576 
577         config.setLocale(Locale.ENGLISH);
578         assertEquals(Locale.ENGLISH, config.locale);
579         assertEquals(new LocaleList(Locale.ENGLISH), config.getLocales());
580         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
581 
582         config.setLocale(Locale.US);
583         assertEquals(Locale.US, config.locale);
584         assertEquals(new LocaleList(Locale.US), config.getLocales());
585         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
586 
587         final Locale arEGLocale = new Locale("ar", "EG");
588         config.setLocale(arEGLocale);
589         assertEquals(arEGLocale, config.locale);
590         assertEquals(new LocaleList(arEGLocale), config.getLocales());
591         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
592 
593         final Locale faIRLocale = new Locale("fa", "IR");
594         config.setLocale(faIRLocale);
595         assertEquals(faIRLocale, config.locale);
596         assertEquals(new LocaleList(faIRLocale), config.getLocales());
597         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
598 
599         final Locale iwILLocale = new Locale("iw", "IL");
600         config.setLocale(iwILLocale);
601         assertEquals(iwILLocale, config.locale);
602         assertEquals(new LocaleList(iwILLocale), config.getLocales());
603         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
604 
605         final Locale urPKLocale = new Locale("ur", "PK");
606         config.setLocale(urPKLocale);
607         assertEquals(urPKLocale, config.locale);
608         assertEquals(new LocaleList(urPKLocale), config.getLocales());
609         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
610     }
611 
612     @Test
testSetGetLayoutDirection()613     public void testSetGetLayoutDirection() {
614         Configuration config = new Configuration();
615 
616         config.setLayoutDirection(Locale.ENGLISH);
617         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
618 
619         config.setLayoutDirection(Locale.US);
620         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
621 
622         final Locale arEGLocale = new Locale("ar", "EG");
623         config.setLayoutDirection(arEGLocale);
624         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
625 
626         final Locale faIRLocale = new Locale("fa", "IR");
627         config.setLayoutDirection(faIRLocale);
628         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
629 
630         final Locale iwILLocale = new Locale("iw", "IL");
631         config.setLayoutDirection(iwILLocale);
632         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
633 
634         final Locale urPKLocale = new Locale("ur", "PK");
635         config.setLayoutDirection(urPKLocale);
636         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
637     }
638 
639     @Test
testIsScreenRound()640     public void testIsScreenRound() {
641         Configuration config = new Configuration();
642         assertFalse(config.isScreenRound());
643 
644         config.screenLayout |= Configuration.SCREENLAYOUT_ROUND_YES;
645         assertTrue(config.isScreenRound());
646     }
647 
648     @Test
testIsScreenHdr()649     public void testIsScreenHdr() {
650         Configuration config = new Configuration();
651         assertFalse(config.isScreenHdr());
652 
653         config.colorMode |= Configuration.COLOR_MODE_HDR_YES;
654         assertTrue(config.isScreenHdr());
655     }
656 
657     @Test
testIsScreenWideColorGamut()658     public void testIsScreenWideColorGamut() {
659         Configuration config = new Configuration();
660         assertFalse(config.isScreenWideColorGamut());
661 
662         config.colorMode |= Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_YES;
663         assertTrue(config.isScreenWideColorGamut());
664     }
665 
666     @Test
testGrammaticalGender()667     public void testGrammaticalGender() {
668         var config = new Configuration();
669         assertEquals(Configuration.GRAMMATICAL_GENDER_NOT_SPECIFIED, config.getGrammaticalGender());
670         config.setGrammaticalGender(Configuration.GRAMMATICAL_GENDER_FEMININE);
671         assertEquals(Configuration.GRAMMATICAL_GENDER_FEMININE, config.getGrammaticalGender());
672     }
673 
674     @Test
testFixUpLocaleList()675     public void testFixUpLocaleList() {
676         Configuration config = new Configuration();
677 
678         config.setLocales(LocaleList.forLanguageTags("fr"));
679         config.locale = null;
680         assertEquals(LocaleList.getEmptyLocaleList(), config.getLocales());
681 
682         config.setLocales(LocaleList.forLanguageTags("fr,en"));
683         config.locale = Locale.forLanguageTag("en");
684         assertEquals(LocaleList.forLanguageTags("en"), config.getLocales());
685 
686         config.setLocales(LocaleList.forLanguageTags("fr,en"));
687         config.locale = Locale.forLanguageTag("fr");
688         assertEquals(LocaleList.forLanguageTags("fr,en"), config.getLocales());
689     }
690 
691     @Test
testSetTo_nullLocale()692     public void testSetTo_nullLocale() {
693         Configuration config1 = new Configuration();
694         Configuration config2 = new Configuration();
695         assertEquals(null, config2.locale);
696 
697         config1.setLocale(Locale.FRENCH);
698         config1.setTo(config2);
699         assertEquals(null, config1.locale);
700     }
701 
702     @Test
testSetTo_localeFixUp()703     public void testSetTo_localeFixUp() {
704         Configuration config1 = new Configuration();
705         Configuration config2 = new Configuration();
706         config2.locale = Locale.FRENCH;
707 
708         config1.setTo(config2);
709         assertEquals(Locale.FRENCH, config1.locale);
710         assertEquals(new LocaleList(Locale.FRENCH), config1.getLocales());
711         assertEquals(new LocaleList(Locale.FRENCH), config2.getLocales());
712     }
713 
714     @Test
testToString_localeFixUp()715     public void testToString_localeFixUp() {
716         Configuration config1 = new Configuration();
717         Configuration config2 = new Configuration();
718         config1.setLocales(LocaleList.forLanguageTags("fr,en"));
719         config1.locale = Locale.forLanguageTag("en");
720         config2.setLocales(LocaleList.forLanguageTags("en"));
721 
722         assertEquals(config1.toString(), config2.toString());
723     }
724 
725     @Test
testUpdateFrom_localeFixUp()726     public void testUpdateFrom_localeFixUp() {
727         Configuration config1, config2;
728         int changed;
729 
730         config1 = new Configuration();
731         config2 = new Configuration();
732         config1.locale = Locale.FRENCH;
733         changed = config1.updateFrom(config2);
734         assertEquals(0, changed);
735         assertEquals(Locale.FRENCH, config1.locale);
736         assertEquals(new LocaleList(Locale.FRENCH), config1.getLocales());
737 
738         config1 = new Configuration();
739         config2 = new Configuration();
740         config2.locale = Locale.FRENCH;
741         changed = config1.updateFrom(config2);
742         assertEquals(ActivityInfo.CONFIG_LOCALE | ActivityInfo.CONFIG_LAYOUT_DIRECTION, changed);
743         assertEquals(Locale.FRENCH, config1.locale);
744         assertEquals(new LocaleList(Locale.FRENCH), config1.getLocales());
745         assertEquals(new LocaleList(Locale.FRENCH), config2.getLocales());
746 
747         config1 = new Configuration();
748         config2 = new Configuration();
749         config1.setLocales(LocaleList.forLanguageTags("en,fr"));
750         config1.locale = Locale.forLanguageTag("fr");
751         config2.setLocales(LocaleList.forLanguageTags("en,de"));
752         config2.locale = Locale.forLanguageTag("fr");
753         changed = config1.updateFrom(config2);
754         assertEquals(0, changed);
755         assertEquals(Locale.forLanguageTag("fr"), config1.locale);
756         assertEquals(LocaleList.forLanguageTags("fr"), config1.getLocales());
757         assertEquals(LocaleList.forLanguageTags("fr"), config2.getLocales());
758     }
759 
760     @Test
testUpdateFrom_layoutDirection()761     public void testUpdateFrom_layoutDirection() {
762         Configuration config1, config2;
763         int changed;
764 
765         config1 = new Configuration();
766         config2 = new Configuration();
767         config1.setLocales(LocaleList.forLanguageTags("fr,en"));
768         config2.setLocales(LocaleList.forLanguageTags("de,en"));
769         changed = config1.updateFrom(config2);
770         assertTrue((changed & ActivityInfo.CONFIG_LAYOUT_DIRECTION) != 0);
771 
772         config1 = new Configuration();
773         config2 = new Configuration();
774         config1.setLocales(LocaleList.forLanguageTags("fr,en"));
775         config2.setLocales(LocaleList.forLanguageTags("fr,de"));
776         changed = config1.updateFrom(config2);
777         assertEquals(0, changed & ActivityInfo.CONFIG_LAYOUT_DIRECTION);
778     }
779 
780     @Test
testDiff_localeFixUp()781     public void testDiff_localeFixUp() {
782         Configuration config1 = new Configuration();
783         Configuration config2 = new Configuration();
784         config1.setLocales(LocaleList.forLanguageTags("en,fr"));
785         config1.locale = Locale.forLanguageTag("fr");
786         config2.setLocales(LocaleList.forLanguageTags("en,de"));
787         config2.locale = Locale.forLanguageTag("fr");
788 
789         int diff = config1.diff(config2);
790         assertEquals(0, diff);
791     }
792 
793     @Test
testCompareTo_localeFixUp()794     public void testCompareTo_localeFixUp() {
795         Configuration config1 = new Configuration();
796         Configuration config2 = new Configuration();
797         config1.setLocales(LocaleList.forLanguageTags("en,fr"));
798         config2.setLocales(LocaleList.forLanguageTags("en,fr"));
799         assertEquals(0, config1.compareTo(config2));
800         config1.locale = new Locale("2");
801         config2.locale = new Locale("3");
802         assertEquals(-1, config1.compareTo(config2));
803     }
804 
805     @Test
testSetLocales_null()806     public void testSetLocales_null() {
807         Configuration config = new Configuration();
808         config.setLocales(null);
809         assertNull(config.locale);
810         assertNotNull(config.getLocales());
811         assertTrue(config.getLocales().isEmpty());
812         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
813     }
814 
815     @Test
testSetLocales_emptyList()816     public void testSetLocales_emptyList() {
817         Configuration config = new Configuration();
818         config.setLocales(LocaleList.getEmptyLocaleList());
819         assertNull(config.locale);
820         assertNotNull(config.getLocales());
821         assertTrue(config.getLocales().isEmpty());
822         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
823     }
824 
825     @Test
testSetLocales_oneLtr()826     public void testSetLocales_oneLtr() {
827         Configuration config = new Configuration();
828         Locale loc = Locale.forLanguageTag("en");
829         LocaleList ll = new LocaleList(loc);
830         config.setLocales(ll);
831         assertEquals(loc, config.locale);
832         assertEquals(ll, config.getLocales());
833         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
834     }
835 
836     @Test
testSetLocales_oneRtl()837     public void testSetLocales_oneRtl() {
838         Configuration config = new Configuration();
839         Locale loc = Locale.forLanguageTag("az-Arab");
840         LocaleList ll = new LocaleList(loc);
841         config.setLocales(ll);
842         assertEquals(loc, config.locale);
843         assertEquals(ll, config.getLocales());
844         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
845     }
846 
847     @Test
testSetLocales_twoLocales()848     public void testSetLocales_twoLocales() {
849         Configuration config = new Configuration();
850         Locale rtlLoc = Locale.forLanguageTag("az-Arab");
851         Locale ltrLoc = Locale.forLanguageTag("en");
852         LocaleList ll = LocaleList.forLanguageTags("az-Arab,en");
853         config.setLocales(ll);
854         assertEquals(rtlLoc, config.locale);
855         assertEquals(ll, config.getLocales());
856         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
857     }
858 
859     @Test
testSetLocales_overridesLocale()860     public void testSetLocales_overridesLocale() {
861         Configuration config = new Configuration();
862         config.locale = Locale.forLanguageTag("en");
863         LocaleList ll = LocaleList.forLanguageTags("az-Arab,en");
864         config.setLocales(ll);
865 
866         assertEquals(Locale.forLanguageTag("az-Arab"), config.locale);
867         assertEquals(ll, config.getLocales());
868         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
869     }
870 
871     @Test
testSetLocales_overridesSetLocale()872     public void testSetLocales_overridesSetLocale() {
873         Configuration config = new Configuration();
874         config.setLocale(Locale.forLanguageTag("en"));
875         LocaleList ll = LocaleList.forLanguageTags("az-Arab,en");
876         config.setLocales(ll);
877 
878         assertEquals(Locale.forLanguageTag("az-Arab"), config.locale);
879         assertEquals(ll, config.getLocales());
880         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
881     }
882 
883     @Test
testSetLocale_overridesSetLocales()884     public void testSetLocale_overridesSetLocales() {
885         Configuration config = new Configuration();
886         config.setLocales(LocaleList.forLanguageTags("az-Arab,en"));
887         config.setLocale(Locale.ENGLISH);
888 
889         assertEquals(Locale.ENGLISH, config.locale);
890         assertEquals(new LocaleList(Locale.ENGLISH), config.getLocales());
891         assertEquals(View.LAYOUT_DIRECTION_LTR, config.getLayoutDirection());
892     }
893 
createConfig(LocaleList list)894     private Configuration createConfig(LocaleList list) {
895         Configuration config = createConfig();
896         config.setLocales(list);
897         return config;
898     }
899 
createConfig(Locale locale)900     private Configuration createConfig(Locale locale) {
901         Configuration config = createConfig();
902         config.locale = locale;
903         return config;
904     }
905 
createConfig()906     private Configuration createConfig() {
907         Configuration config = new Configuration();
908         config.fontScale = 13.37f;
909         config.mcc = 0;
910         config.mnc = 1;
911         config.touchscreen = Configuration.TOUCHSCREEN_STYLUS;
912         config.keyboard = Configuration.KEYBOARD_UNDEFINED;
913         config.keyboardHidden = Configuration.KEYBOARDHIDDEN_YES;
914         config.hardKeyboardHidden = Configuration.KEYBOARDHIDDEN_UNDEFINED;
915         config.navigation = Configuration.NAVIGATION_DPAD;
916         config.navigationHidden = Configuration.NAVIGATIONHIDDEN_UNDEFINED;
917         config.orientation = Configuration.ORIENTATION_PORTRAIT;
918         config.screenLayout = Configuration.SCREENLAYOUT_LONG_UNDEFINED;
919         return config;
920     }
921 
assertWriteToParcel(Configuration config)922     private void assertWriteToParcel(Configuration config) {
923         final Parcel parcel = Parcel.obtain();
924         try {
925             config.writeToParcel(parcel, 0);
926             parcel.setDataPosition(0);
927             Configuration readConf = new Configuration();
928             readConf.readFromParcel(parcel);
929             assertEquals(config, readConf);
930         } finally {
931             parcel.recycle();
932         }
933     }
934 }
935