115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.res; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 197f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinskiimport com.android.internal.util.XmlUtils; 207f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 217f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinskiimport org.xmlpull.v1.XmlPullParser; 227f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinskiimport org.xmlpull.v1.XmlPullParserException; 237f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinskiimport org.xmlpull.v1.XmlSerializer; 247f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 262c749d242759ea36c0229ea933f22b6363337b19Adam Lesinskiimport android.os.Build; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 29d3d9f3f1004dfee2649a26cfe8dba948cd364904Fabrice Di Meglioimport android.text.TextUtils; 303fb824bae3322252a68c1cf8537280a5d2bd356dFabrice Di Meglioimport android.view.View; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 327f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinskiimport java.io.IOException; 332c749d242759ea36c0229ea933f22b6363337b19Adam Lesinskiimport java.util.ArrayList; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Locale; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class describes all device configuration information that can 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * impact the resources the application retrieves. This includes both 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user-specified configuration options (locale and scaling) as well 4063848e3df3a87c111617a81ff3e1f2685de7b031Scott Main * as device configurations (such as input modes, screen size and screen orientation). 4163848e3df3a87c111617a81ff3e1f2685de7b031Scott Main * <p>You can acquire this object from {@link Resources}, using {@link 4263848e3df3a87c111617a81ff3e1f2685de7b031Scott Main * Resources#getConfiguration}. Thus, from an activity, you can get it by chaining the request 4363848e3df3a87c111617a81ff3e1f2685de7b031Scott Main * with {@link android.app.Activity#getResources}:</p> 4463848e3df3a87c111617a81ff3e1f2685de7b031Scott Main * <pre>Configuration config = getResources().getConfiguration();</pre> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Configuration implements Parcelable, Comparable<Configuration> { 47756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn /** @hide */ 48756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn public static final Configuration EMPTY = new Configuration(); 49756220bd1912535840388a6743830d2e59ad4964Dianne Hackborn 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Current user preference for the scaling factor for fonts, relative 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the base density scaling. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float fontScale; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 570cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * IMSI MCC (Mobile Country Code), corresponding to 580cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#MccQualifier">mcc</a> 590cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. 0 if undefined. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mcc; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 640cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * IMSI MNC (Mobile Network Code), corresponding to 650cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#MccQualifier">mnc</a> 661d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson * resource qualifier. 0 if undefined. Note that the actual MNC may be 0; in order to check 671d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson * for this use the {@link #MNC_ZERO} symbol. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mnc; 701d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson 711d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson /** 721d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson * Constant used to to represent MNC (Mobile Network Code) zero. 731d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson * 0 cannot be used, since it is used to represent an undefined MNC. 741d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson */ 751d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson public static final int MNC_ZERO = 0xffff; 761d766b53217f9e45472a01e84d2f1b02af36dec7Mattias Petersson 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 780cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * Current user preference for the locale, corresponding to 790cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#LocaleQualifier">locale</a> 800cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Locale locale; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 85f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * Locale should persist on setting. This is hidden because it is really 86f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * questionable whether this is the right way to expose the functionality. 87f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * @hide 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean userSetLocale; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 912f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn /** Constant for {@link #screenLayout}: bits that encode the size. */ 92c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_SIZE_MASK = 0x0f; 932f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_SIZE_MASK} 942f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * value indicating that no size has been set. */ 95c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_SIZE_UNDEFINED = 0x00; 962f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_SIZE_MASK} 970cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating the screen is at least approximately 320x426 dp units, 980cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponds to the 990cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenSizeQualifier">small</a> 1000cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. 1012f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * See <a href="{@docRoot}guide/practices/screens_support.html">Supporting 1022f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * Multiple Screens</a> for more information. */ 103c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_SIZE_SMALL = 0x01; 1042f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_SIZE_MASK} 1050cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating the screen is at least approximately 320x470 dp units, 1060cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponds to the 1070cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenSizeQualifier">normal</a> 1080cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. 1092f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * See <a href="{@docRoot}guide/practices/screens_support.html">Supporting 1102f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * Multiple Screens</a> for more information. */ 111c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_SIZE_NORMAL = 0x02; 1122f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_SIZE_MASK} 1130cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating the screen is at least approximately 480x640 dp units, 1140cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponds to the 1150cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenSizeQualifier">large</a> 1160cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. 1172f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * See <a href="{@docRoot}guide/practices/screens_support.html">Supporting 1182f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * Multiple Screens</a> for more information. */ 119c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_SIZE_LARGE = 0x03; 1202f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_SIZE_MASK} 1210cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating the screen is at least approximately 720x960 dp units, 1220cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponds to the 1230cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenSizeQualifier">xlarge</a> 1240cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. 1252f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * See <a href="{@docRoot}guide/practices/screens_support.html">Supporting 1262f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * Multiple Screens</a> for more information.*/ 12714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn public static final int SCREENLAYOUT_SIZE_XLARGE = 0x04; 1280cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn 1290cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #screenLayout}: bits that encode the aspect ratio. */ 130c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_LONG_MASK = 0x30; 1310cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_LONG_MASK} 1320cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating that no size has been set. */ 133c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_LONG_UNDEFINED = 0x00; 1340cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_LONG_MASK} 1350cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 1360cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenAspectQualifier">notlong</a> 1370cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 138c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_LONG_NO = 0x10; 1390cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_LONG_MASK} 1400cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 1410cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenAspectQualifier">long</a> 1420cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 143c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_LONG_YES = 0x20; 1445f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 1455f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** Constant for {@link #screenLayout}: bits that encode the layout direction. */ 1465f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public static final int SCREENLAYOUT_LAYOUTDIR_MASK = 0xC0; 1475f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** Constant for {@link #screenLayout}: bits shift to get the layout direction. */ 1485f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public static final int SCREENLAYOUT_LAYOUTDIR_SHIFT = 6; 1495f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_LAYOUTDIR_MASK} 1505f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * value indicating that no layout dir has been set. */ 1515f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public static final int SCREENLAYOUT_LAYOUTDIR_UNDEFINED = 0x00; 1525f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_LAYOUTDIR_MASK} 1535f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * value indicating that a layout dir has been set to LTR. */ 1545f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public static final int SCREENLAYOUT_LAYOUTDIR_LTR = 0x01 << SCREENLAYOUT_LAYOUTDIR_SHIFT; 1555f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** Constant for {@link #screenLayout}: a {@link #SCREENLAYOUT_LAYOUTDIR_MASK} 1565f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * value indicating that a layout dir has been set to RTL. */ 1575f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public static final int SCREENLAYOUT_LAYOUTDIR_RTL = 0x02 << SCREENLAYOUT_LAYOUTDIR_SHIFT; 1585f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 1595f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** Constant for {@link #screenLayout}: a value indicating that screenLayout is undefined */ 1605f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public static final int SCREENLAYOUT_UNDEFINED = SCREENLAYOUT_SIZE_UNDEFINED | 1615f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio SCREENLAYOUT_LONG_UNDEFINED | SCREENLAYOUT_LAYOUTDIR_UNDEFINED; 1625f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 163c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn /** 164c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * Special flag we generate to indicate that the screen layout requires 165c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * us to use a compatibility mode for apps that are not modern layout 166c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * aware. 167c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * @hide 168c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn */ 169c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public static final int SCREENLAYOUT_COMPAT_NEEDED = 0x10000000; 170c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn 171c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn /** 172c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * Bit mask of overall layout of the screen. Currently there are two 173c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * fields: 174c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * <p>The {@link #SCREENLAYOUT_SIZE_MASK} bits define the overall size 175c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * of the screen. They may be one of 176c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * {@link #SCREENLAYOUT_SIZE_SMALL}, {@link #SCREENLAYOUT_SIZE_NORMAL}, 17714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn * {@link #SCREENLAYOUT_SIZE_LARGE}, or {@link #SCREENLAYOUT_SIZE_XLARGE}. 178c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * 179c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * <p>The {@link #SCREENLAYOUT_LONG_MASK} defines whether the screen 180c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * is wider/taller than normal. They may be one of 181c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn * {@link #SCREENLAYOUT_LONG_NO} or {@link #SCREENLAYOUT_LONG_YES}. 1822f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * 1835f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * <p>The {@link #SCREENLAYOUT_LAYOUTDIR_MASK} defines whether the screen layout 1845f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * is either LTR or RTL. They may be one of 1855f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * {@link #SCREENLAYOUT_LAYOUTDIR_LTR} or {@link #SCREENLAYOUT_LAYOUTDIR_RTL}. 1865f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * 1872f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * <p>See <a href="{@docRoot}guide/practices/screens_support.html">Supporting 1882f98f2670828a42ef93fe782b5be82b1dfeba6ceDianne Hackborn * Multiple Screens</a> for more information. 189c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn */ 190c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn public int screenLayout; 191fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 192fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn /** @hide */ 193fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn static public int resetScreenLayout(int curLayout) { 194fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn return (curLayout&~(SCREENLAYOUT_LONG_MASK | SCREENLAYOUT_SIZE_MASK 195fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn | SCREENLAYOUT_COMPAT_NEEDED)) 196fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn | (SCREENLAYOUT_LONG_YES | SCREENLAYOUT_SIZE_XLARGE); 197fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 198fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 199fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn /** @hide */ 200fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn static public int reduceScreenLayout(int curLayout, int longSizeDp, int shortSizeDp) { 201fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn int screenLayoutSize; 202fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn boolean screenLayoutLong; 203fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn boolean screenLayoutCompatNeeded; 204fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 205fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // These semi-magic numbers define our compatibility modes for 206fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // applications with different screens. These are guarantees to 207fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // app developers about the space they can expect for a particular 208fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // configuration. DO NOT CHANGE! 209fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (longSizeDp < 470) { 210fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // This is shorter than an HVGA normal density screen (which 211fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // is 480 pixels on its long side). 212fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutSize = SCREENLAYOUT_SIZE_SMALL; 213fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutLong = false; 214fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutCompatNeeded = false; 215fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } else { 216fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // What size is this screen screen? 217fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (longSizeDp >= 960 && shortSizeDp >= 720) { 218fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // 1.5xVGA or larger screens at medium density are the point 219fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // at which we consider it to be an extra large screen. 220fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutSize = SCREENLAYOUT_SIZE_XLARGE; 221fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } else if (longSizeDp >= 640 && shortSizeDp >= 480) { 222fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // VGA or larger screens at medium density are the point 223fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // at which we consider it to be a large screen. 224fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutSize = SCREENLAYOUT_SIZE_LARGE; 225fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } else { 226fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutSize = SCREENLAYOUT_SIZE_NORMAL; 227fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 228fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 229fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // If this screen is wider than normal HVGA, or taller 230fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // than FWVGA, then for old apps we want to run in size 231fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // compatibility mode. 232fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (shortSizeDp > 321 || longSizeDp > 570) { 233fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutCompatNeeded = true; 234fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } else { 235fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutCompatNeeded = false; 236fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 237fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 238fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // Is this a long screen? 239fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (((longSizeDp*3)/5) >= (shortSizeDp-1)) { 240fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // Anything wider than WVGA (5:3) is considering to be long. 241fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutLong = true; 242fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } else { 243fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn screenLayoutLong = false; 244fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 245fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 246fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 247fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // Now reduce the last screenLayout to not be better than what we 248fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn // have found. 249fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (!screenLayoutLong) { 250fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn curLayout = (curLayout&~SCREENLAYOUT_LONG_MASK) | SCREENLAYOUT_LONG_NO; 251fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 252fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (screenLayoutCompatNeeded) { 253fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn curLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED; 254fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 255fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn int curSize = curLayout&SCREENLAYOUT_SIZE_MASK; 256fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn if (screenLayoutSize < curSize) { 257fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn curLayout = (curLayout&~SCREENLAYOUT_SIZE_MASK) | screenLayoutSize; 258fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 259fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn return curLayout; 260fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn } 261fe37f8f51d90fc4c6230e54dcd1270df5fcc6be3Dianne Hackborn 262711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn /** 263711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * Check if the Configuration's current {@link #screenLayout} is at 264711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * least the given size. 265711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * 266711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * @param size The desired size, either {@link #SCREENLAYOUT_SIZE_SMALL}, 267711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * {@link #SCREENLAYOUT_SIZE_NORMAL}, {@link #SCREENLAYOUT_SIZE_LARGE}, or 268711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * {@link #SCREENLAYOUT_SIZE_XLARGE}. 269711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * @return Returns true if the current screen layout size is at least 270711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn * the given size. 271711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn */ 272711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn public boolean isLayoutSizeAtLeast(int size) { 273711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn int cur = screenLayout&SCREENLAYOUT_SIZE_MASK; 274711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn if (cur == SCREENLAYOUT_SIZE_UNDEFINED) return false; 2757d3a5bcf300aea7bffb1d46f28e244ca807f5e82Dianne Hackborn return cur >= size; 276711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn } 277711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn 2780cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #touchscreen}: a value indicating that no value has been set. */ 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TOUCHSCREEN_UNDEFINED = 0; 2800cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #touchscreen}, value corresponding to the 2810cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#TouchscreenQualifier">notouch</a> 2820cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TOUCHSCREEN_NOTOUCH = 1; 2840cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** @deprecated Not currently supported or used. */ 2850cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn @Deprecated public static final int TOUCHSCREEN_STYLUS = 2; 2860cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #touchscreen}, value corresponding to the 2870cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#TouchscreenQualifier">finger</a> 2880cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int TOUCHSCREEN_FINGER = 3; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The kind of touch screen attached to the device. 2930cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * One of: {@link #TOUCHSCREEN_NOTOUCH}, {@link #TOUCHSCREEN_FINGER}. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int touchscreen; 2960cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn 2970cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboard}: a value indicating that no value has been set. */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARD_UNDEFINED = 0; 2990cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboard}, value corresponding to the 3000cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ImeQualifier">nokeys</a> 3010cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARD_NOKEYS = 1; 3030cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboard}, value corresponding to the 3040cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ImeQualifier">qwerty</a> 3050cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARD_QWERTY = 2; 3070cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboard}, value corresponding to the 3080cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ImeQualifier">12key</a> 3090cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARD_12KEY = 3; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The kind of keyboard attached to the device. 314507f8ed2e05f97b20307b900fbc7308e0f8fdb83Kenny Root * One of: {@link #KEYBOARD_NOKEYS}, {@link #KEYBOARD_QWERTY}, 315507f8ed2e05f97b20307b900fbc7308e0f8fdb83Kenny Root * {@link #KEYBOARD_12KEY}. 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int keyboard; 3180cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn 3190cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboardHidden}: a value indicating that no value has been set. */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARDHIDDEN_UNDEFINED = 0; 3210cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboardHidden}, value corresponding to the 3220cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#KeyboardAvailQualifier">keysexposed</a> 3230cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARDHIDDEN_NO = 1; 3250cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #keyboardHidden}, value corresponding to the 3260cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#KeyboardAvailQualifier">keyshidden</a> 3270cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARDHIDDEN_YES = 2; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Constant matching actual resource implementation. {@hide} */ 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int KEYBOARDHIDDEN_SOFT = 3; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A flag indicating whether any keyboard is available. Unlike 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #hardKeyboardHidden}, this also takes into account a soft 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * keyboard, so if the hard keyboard is hidden but there is soft 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * keyboard available, it will be set to NO. Value is one of: 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #KEYBOARDHIDDEN_NO}, {@link #KEYBOARDHIDDEN_YES}. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int keyboardHidden; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3410cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #hardKeyboardHidden}: a value indicating that no value has been set. */ 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; 3430cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #hardKeyboardHidden}, value corresponding to the 3440cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * physical keyboard being exposed. */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HARDKEYBOARDHIDDEN_NO = 1; 3460cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #hardKeyboardHidden}, value corresponding to the 3470cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * physical keyboard being hidden. */ 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int HARDKEYBOARDHIDDEN_YES = 2; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A flag indicating whether the hard keyboard has been hidden. This will 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be set on a device with a mechanism to hide the keyboard from the 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user, when that mechanism is closed. One of: 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #HARDKEYBOARDHIDDEN_NO}, {@link #HARDKEYBOARDHIDDEN_YES}. 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hardKeyboardHidden; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3580cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigation}: a value indicating that no value has been set. */ 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NAVIGATION_UNDEFINED = 0; 3600cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigation}, value corresponding to the 3610cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NavigationQualifier">nonav</a> 3620cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NAVIGATION_NONAV = 1; 3640cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigation}, value corresponding to the 3650cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NavigationQualifier">dpad</a> 3660cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NAVIGATION_DPAD = 2; 3680cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigation}, value corresponding to the 3690cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NavigationQualifier">trackball</a> 3700cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NAVIGATION_TRACKBALL = 3; 3720cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigation}, value corresponding to the 3730cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NavigationQualifier">wheel</a> 3740cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int NAVIGATION_WHEEL = 4; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The kind of navigation method available on the device. 379507f8ed2e05f97b20307b900fbc7308e0f8fdb83Kenny Root * One of: {@link #NAVIGATION_NONAV}, {@link #NAVIGATION_DPAD}, 380507f8ed2e05f97b20307b900fbc7308e0f8fdb83Kenny Root * {@link #NAVIGATION_TRACKBALL}, {@link #NAVIGATION_WHEEL}. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int navigation; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3840cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigationHidden}: a value indicating that no value has been set. */ 38593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn public static final int NAVIGATIONHIDDEN_UNDEFINED = 0; 3860cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigationHidden}, value corresponding to the 3870cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NavAvailQualifier">navexposed</a> 3880cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 38993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn public static final int NAVIGATIONHIDDEN_NO = 1; 3900cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #navigationHidden}, value corresponding to the 3910cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NavAvailQualifier">navhidden</a> 3920cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 39393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn public static final int NAVIGATIONHIDDEN_YES = 2; 39493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 39593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn /** 39693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn * A flag indicating whether any 5-way or DPAD navigation available. 39793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn * This will be set on a device with a mechanism to hide the navigation 39893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn * controls from the user, when that mechanism is closed. One of: 39993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn * {@link #NAVIGATIONHIDDEN_NO}, {@link #NAVIGATIONHIDDEN_YES}. 40093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn */ 40193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn public int navigationHidden; 40293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn 4030cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #orientation}: a value indicating that no value has been set. */ 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ORIENTATION_UNDEFINED = 0; 4050cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #orientation}, value corresponding to the 4060cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#OrientationQualifier">port</a> 4070cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ORIENTATION_PORTRAIT = 1; 4090cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #orientation}, value corresponding to the 4100cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#OrientationQualifier">land</a> 4110cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ORIENTATION_LANDSCAPE = 2; 4130cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** @deprecated Not currently supported or used. */ 4140cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn @Deprecated public static final int ORIENTATION_SQUARE = 3; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Overall orientation of the screen. May be one of 4180cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * {@link #ORIENTATION_LANDSCAPE}, {@link #ORIENTATION_PORTRAIT}. 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int orientation; 42127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 4220cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: bits that encode the mode type. */ 42327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel public static final int UI_MODE_TYPE_MASK = 0x0f; 4240cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4250cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating that no mode type has been set. */ 426ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn public static final int UI_MODE_TYPE_UNDEFINED = 0x00; 4270cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4280cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to 4290cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#UiModeQualifier">no 4300cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * UI mode</a> resource qualifier specified. */ 431ef05e076ced1a32c5c0aaee28403779834adb2baDianne Hackborn public static final int UI_MODE_TYPE_NORMAL = 0x01; 4320cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4330cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 4340cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#UiModeQualifier">desk</a> 4350cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 4367299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn public static final int UI_MODE_TYPE_DESK = 0x02; 4370cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4380cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 4390cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#UiModeQualifier">car</a> 4400cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 4417299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn public static final int UI_MODE_TYPE_CAR = 0x03; 4420cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4430cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 4440cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#UiModeQualifier">television</a> 4450cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 446e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn public static final int UI_MODE_TYPE_TELEVISION = 0x04; 4470cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4480cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 4490cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#UiModeQualifier">appliance</a> 4500cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 45144fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato public static final int UI_MODE_TYPE_APPLIANCE = 0x05; 4526c191299a73388cd593809c0b66bafbd08fd2982John Spurlock /** Constant for {@link #uiMode}: a {@link #UI_MODE_TYPE_MASK} 4536c191299a73388cd593809c0b66bafbd08fd2982John Spurlock * value that corresponds to the 4546c191299a73388cd593809c0b66bafbd08fd2982John Spurlock * <a href="{@docRoot}guide/topics/resources/providing-resources.html#UiModeQualifier">watch</a> 4556c191299a73388cd593809c0b66bafbd08fd2982John Spurlock * resource qualifier. */ 4566c191299a73388cd593809c0b66bafbd08fd2982John Spurlock public static final int UI_MODE_TYPE_WATCH = 0x06; 45727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 4580cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: bits that encode the night mode. */ 45927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel public static final int UI_MODE_NIGHT_MASK = 0x30; 4600cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_NIGHT_MASK} 4610cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value indicating that no mode type has been set. */ 46227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel public static final int UI_MODE_NIGHT_UNDEFINED = 0x00; 4630cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_NIGHT_MASK} 4640cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 4650cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NightQualifier">notnight</a> 4660cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 46727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel public static final int UI_MODE_NIGHT_NO = 0x10; 4680cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn /** Constant for {@link #uiMode}: a {@link #UI_MODE_NIGHT_MASK} 4690cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * value that corresponds to the 4700cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#NightQualifier">night</a> 4710cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * resource qualifier. */ 47227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel public static final int UI_MODE_NIGHT_YES = 0x20; 47327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 47427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel /** 47527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel * Bit mask of the ui mode. Currently there are two fields: 47627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel * <p>The {@link #UI_MODE_TYPE_MASK} bits define the overall ui mode of the 4777299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn * device. They may be one of {@link #UI_MODE_TYPE_UNDEFINED}, 4787299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn * {@link #UI_MODE_TYPE_NORMAL}, {@link #UI_MODE_TYPE_DESK}, 4796c191299a73388cd593809c0b66bafbd08fd2982John Spurlock * {@link #UI_MODE_TYPE_CAR}, {@link #UI_MODE_TYPE_TELEVISION}, 4806c191299a73388cd593809c0b66bafbd08fd2982John Spurlock * {@link #UI_MODE_TYPE_APPLIANCE}, or {@link #UI_MODE_TYPE_WATCH}. 48127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel * 48227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel * <p>The {@link #UI_MODE_NIGHT_MASK} defines whether the screen 4837299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn * is in a special mode. They may be one of {@link #UI_MODE_NIGHT_UNDEFINED}, 48427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel * {@link #UI_MODE_NIGHT_NO} or {@link #UI_MODE_NIGHT_YES}. 48527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel */ 48627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel public int uiMode; 48727b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel 488908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn /** 489908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * Default value for {@link #screenWidthDp} indicating that no width 490908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * has been specified. 491908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn */ 492ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn public static final int SCREEN_WIDTH_DP_UNDEFINED = 0; 493ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 494ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn /** 4950cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * The current width of the available screen space, in dp units, 4960cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponding to 4970cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenWidthQualifier">screen 498908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * width</a> resource qualifier. Set to 499908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * {@link #SCREEN_WIDTH_DP_UNDEFINED} if no width is specified. 500ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn */ 501ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn public int screenWidthDp; 502ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 503908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn /** 504908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * Default value for {@link #screenHeightDp} indicating that no width 505908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * has been specified. 506908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn */ 507ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn public static final int SCREEN_HEIGHT_DP_UNDEFINED = 0; 508ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 509ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn /** 5100cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * The current height of the available screen space, in dp units, 5110cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponding to 5120cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenHeightQualifier">screen 513908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * height</a> resource qualifier. Set to 514908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * {@link #SCREEN_HEIGHT_DP_UNDEFINED} if no height is specified. 515ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn */ 516ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn public int screenHeightDp; 517ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 518908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn /** 519908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * Default value for {@link #smallestScreenWidthDp} indicating that no width 520908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * has been specified. 521908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn */ 52269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn public static final int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED = 0; 52369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 52469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn /** 5250cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * The smallest screen size an application will see in normal operation, 5260cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * corresponding to 5270cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#SmallestScreenWidthQualifier">smallest 5280cf2c8a53350a800055e76c1c9bf0a6d44480768Dianne Hackborn * screen width</a> resource qualifier. 52969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn * This is the smallest value of both screenWidthDp and screenHeightDp 530908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * in both portrait and landscape. Set to 531908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * {@link #SMALLEST_SCREEN_WIDTH_DP_UNDEFINED} if no width is specified. 53269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn */ 53369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn public int smallestScreenWidthDp; 53469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 535908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn /** 536908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * Default value for {@link #densityDpi} indicating that no width 537908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * has been specified. 538908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn */ 539908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn public static final int DENSITY_DPI_UNDEFINED = 0; 540908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn 541908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn /** 54231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * Value for {@link #densityDpi} for resources that scale to any density (vector drawables). 54331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * {@hide} 54431245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski */ 54531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski public static final int DENSITY_DPI_ANY = 0xfffe; 54631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 54731245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski /** 54831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * Value for {@link #densityDpi} for resources that are not meant to be scaled. 54931245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski * {@hide} 55031245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski */ 55131245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski public static final int DENSITY_DPI_NONE = 0xffff; 55231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski 55331245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski /** 554908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * The target screen density being rendered to, 555908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * corresponding to 556908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * <a href="{@docRoot}guide/topics/resources/providing-resources.html#DensityQualifier">density</a> 557908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * resource qualifier. Set to 558908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn * {@link #DENSITY_DPI_UNDEFINED} if no density is specified. 559908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn */ 560908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn public int densityDpi; 561908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn 5625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn /** @hide Hack to get this information from WM to app running in compat mode. */ 5635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn public int compatScreenWidthDp; 5645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn /** @hide Hack to get this information from WM to app running in compat mode. */ 5655fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn public int compatScreenHeightDp; 5665fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn /** @hide Hack to get this information from WM to app running in compat mode. */ 5675fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn public int compatSmallestScreenWidthDp; 5685fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 570e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * @hide Internal book-keeping. 571e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn */ 572e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn public int seq; 5731d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn 5741d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for MCC config; DO NOT USE UNLESS YOU ARE SURE. */ 5751d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_MCC = 0x0001; 5761d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for MNC config; DO NOT USE UNLESS YOU ARE SURE. */ 5771d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_MNC = 0x0002; 5781d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for LOCALE config; DO NOT USE UNLESS YOU ARE SURE. */ 5791d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_LOCALE = 0x0004; 5801d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for TOUCHSCREEN config; DO NOT USE UNLESS YOU ARE SURE. */ 5811d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_TOUCHSCREEN = 0x0008; 5821d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for KEYBOARD config; DO NOT USE UNLESS YOU ARE SURE. */ 5831d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_KEYBOARD = 0x0010; 5841d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for KEYBOARD_HIDDEN config; DO NOT USE UNLESS YOU 5851d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn * ARE SURE. */ 5861d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_KEYBOARD_HIDDEN = 0x0020; 5871d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for NAVIGATION config; DO NOT USE UNLESS YOU ARE SURE. */ 5881d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_NAVIGATION = 0x0040; 5891d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for ORIENTATION config; DO NOT USE UNLESS YOU ARE SURE. */ 5901d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_ORIENTATION = 0x0080; 5911d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for DENSITY config; DO NOT USE UNLESS YOU ARE SURE. */ 5921d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_DENSITY = 0x0100; 5931d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for SCREEN_SIZE config; DO NOT USE UNLESS YOU ARE SURE. */ 5941d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_SCREEN_SIZE = 0x0200; 5951d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for VERSION config; DO NOT USE UNLESS YOU ARE SURE. */ 5961d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_VERSION = 0x0400; 5971d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for SCREEN_LAYOUT config; DO NOT USE UNLESS YOU ARE SURE. */ 5981d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_SCREEN_LAYOUT = 0x0800; 5991d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for UI_MODE config; DO NOT USE UNLESS YOU ARE SURE. */ 6001d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_UI_MODE = 0x1000; 6011d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for SMALLEST_SCREEN_SIZE config; DO NOT USE UNLESS YOU 6021d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn * ARE SURE. */ 6031d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_SMALLEST_SCREEN_SIZE = 0x2000; 6041d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn /** @hide Native-specific bit mask for LAYOUTDIR config ; DO NOT USE UNLESS YOU ARE SURE.*/ 6051d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn public static final int NATIVE_CONFIG_LAYOUTDIR = 0x4000; 6061d0b177754c81a20e272b91c6f703a634fe5c856Dianne Hackborn 607e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn /** 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct an invalid Configuration. You must call {@link #setToDefaults} 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this object to be valid. {@more} 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration() { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setToDefaults(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes a deep copy suitable for modification. 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration(Configuration o) { 619694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn setTo(o); 620694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 621694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn 622694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn public void setTo(Configuration o) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fontScale = o.fontScale; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mcc = o.mcc; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mnc = o.mnc; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (o.locale != null) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locale = (Locale) o.locale.clone(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userSetLocale = o.userSetLocale; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project touchscreen = o.touchscreen; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboard = o.keyboard; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboardHidden = o.keyboardHidden; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hardKeyboardHidden = o.hardKeyboardHidden; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project navigation = o.navigation; 63593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn navigationHidden = o.navigationHidden; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientation = o.orientation; 637723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn screenLayout = o.screenLayout; 63827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel uiMode = o.uiMode; 639ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn screenWidthDp = o.screenWidthDp; 640ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn screenHeightDp = o.screenHeightDp; 64169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn smallestScreenWidthDp = o.smallestScreenWidthDp; 642908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn densityDpi = o.densityDpi; 6435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatScreenWidthDp = o.compatScreenWidthDp; 6445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatScreenHeightDp = o.compatScreenHeightDp; 6455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatSmallestScreenWidthDp = o.compatSmallestScreenWidthDp; 646e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn seq = o.seq; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 648694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 6501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn StringBuilder sb = new StringBuilder(128); 65129735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn sb.append("{"); 6521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(fontScale); 6535be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn sb.append(" "); 654908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn if (mcc != 0) { 655908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append(mcc); 656908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append("mcc"); 657908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } else { 658908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append("?mcc"); 659908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } 660908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn if (mnc != 0) { 661908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append(mnc); 662908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append("mnc"); 663908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } else { 664908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append("?mnc"); 665908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } 6669a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn if (locale != null) { 6679a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn sb.append(" "); 6689a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn sb.append(locale); 6699a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } else { 670908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append(" ?locale"); 6719a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 6725f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio int layoutDir = (screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK); 6735f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio switch (layoutDir) { 6745f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio case SCREENLAYOUT_LAYOUTDIR_UNDEFINED: sb.append(" ?layoutDir"); break; 6758a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio case SCREENLAYOUT_LAYOUTDIR_LTR: sb.append(" ldltr"); break; 6768a802dbdabdfd27692c2e38b2c3adafe95566106Fabrice Di Meglio case SCREENLAYOUT_LAYOUTDIR_RTL: sb.append(" ldrtl"); break; 6775f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio default: sb.append(" layoutDir="); 6785f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio sb.append(layoutDir >> SCREENLAYOUT_LAYOUTDIR_SHIFT); break; 6797a736fbf69dd6f03db968d7d8182024eebc0e508Fabrice Di Meglio } 68069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) { 68169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn sb.append(" sw"); sb.append(smallestScreenWidthDp); sb.append("dp"); 68269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } else { 6832f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn sb.append(" ?swdp"); 68469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 68569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) { 68669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn sb.append(" w"); sb.append(screenWidthDp); sb.append("dp"); 68769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } else { 6882f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn sb.append(" ?wdp"); 68969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 69069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) { 69169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn sb.append(" h"); sb.append(screenHeightDp); sb.append("dp"); 69269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } else { 6932f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn sb.append(" ?hdp"); 69469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 695908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn if (densityDpi != DENSITY_DPI_UNDEFINED) { 696908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append(" "); sb.append(densityDpi); sb.append("dpi"); 697908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } else { 698908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn sb.append(" ?density"); 699908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } 70069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn switch ((screenLayout&SCREENLAYOUT_SIZE_MASK)) { 70169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_SIZE_UNDEFINED: sb.append(" ?lsize"); break; 70269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_SIZE_SMALL: sb.append(" smll"); break; 70369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_SIZE_NORMAL: sb.append(" nrml"); break; 70469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_SIZE_LARGE: sb.append(" lrg"); break; 70569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_SIZE_XLARGE: sb.append(" xlrg"); break; 70669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn default: sb.append(" layoutSize="); 70769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn sb.append(screenLayout&SCREENLAYOUT_SIZE_MASK); break; 70869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 70969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn switch ((screenLayout&SCREENLAYOUT_LONG_MASK)) { 71069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_LONG_UNDEFINED: sb.append(" ?long"); break; 71169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_LONG_NO: /* not-long is not interesting to print */ break; 71269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case SCREENLAYOUT_LONG_YES: sb.append(" long"); break; 71369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn default: sb.append(" layoutLong="); 71469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn sb.append(screenLayout&SCREENLAYOUT_LONG_MASK); break; 71569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 71669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn switch (orientation) { 71769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case ORIENTATION_UNDEFINED: sb.append(" ?orien"); break; 71869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case ORIENTATION_LANDSCAPE: sb.append(" land"); break; 71969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case ORIENTATION_PORTRAIT: sb.append(" port"); break; 72069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn default: sb.append(" orien="); sb.append(orientation); break; 72169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 72269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn switch ((uiMode&UI_MODE_TYPE_MASK)) { 72369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_TYPE_UNDEFINED: sb.append(" ?uimode"); break; 72469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_TYPE_NORMAL: /* normal is not interesting to print */ break; 72569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_TYPE_DESK: sb.append(" desk"); break; 72669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_TYPE_CAR: sb.append(" car"); break; 727e360bb6bd8ea84b8d37604fc11dfc744b18fb0deDianne Hackborn case UI_MODE_TYPE_TELEVISION: sb.append(" television"); break; 72844fcb83b38b062a650ddf556fe7f5e34905df9eaJoe Onorato case UI_MODE_TYPE_APPLIANCE: sb.append(" appliance"); break; 7296c191299a73388cd593809c0b66bafbd08fd2982John Spurlock case UI_MODE_TYPE_WATCH: sb.append(" watch"); break; 73069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn default: sb.append(" uimode="); sb.append(uiMode&UI_MODE_TYPE_MASK); break; 73169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 73269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn switch ((uiMode&UI_MODE_NIGHT_MASK)) { 73369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_NIGHT_UNDEFINED: sb.append(" ?night"); break; 73469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_NIGHT_NO: /* not-night is not interesting to print */ break; 73569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn case UI_MODE_NIGHT_YES: sb.append(" night"); break; 73669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn default: sb.append(" night="); sb.append(uiMode&UI_MODE_NIGHT_MASK); break; 73769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 7389a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn switch (touchscreen) { 7399a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case TOUCHSCREEN_UNDEFINED: sb.append(" ?touch"); break; 7409a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case TOUCHSCREEN_NOTOUCH: sb.append(" -touch"); break; 7419a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case TOUCHSCREEN_STYLUS: sb.append(" stylus"); break; 7429a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case TOUCHSCREEN_FINGER: sb.append(" finger"); break; 7439a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn default: sb.append(" touch="); sb.append(touchscreen); break; 7449a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 7459a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn switch (keyboard) { 7469a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARD_UNDEFINED: sb.append(" ?keyb"); break; 7479a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARD_NOKEYS: sb.append(" -keyb"); break; 7489a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARD_QWERTY: sb.append(" qwerty"); break; 7499a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARD_12KEY: sb.append(" 12key"); break; 7509a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn default: sb.append(" keys="); sb.append(keyboard); break; 7519a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 7529a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn switch (keyboardHidden) { 7539a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARDHIDDEN_UNDEFINED: sb.append("/?"); break; 7549a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARDHIDDEN_NO: sb.append("/v"); break; 7559a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARDHIDDEN_YES: sb.append("/h"); break; 7569a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case KEYBOARDHIDDEN_SOFT: sb.append("/s"); break; 7579a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn default: sb.append("/"); sb.append(keyboardHidden); break; 7589a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 7599a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn switch (hardKeyboardHidden) { 7609a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case HARDKEYBOARDHIDDEN_UNDEFINED: sb.append("/?"); break; 7619a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case HARDKEYBOARDHIDDEN_NO: sb.append("/v"); break; 7629a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case HARDKEYBOARDHIDDEN_YES: sb.append("/h"); break; 7639a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn default: sb.append("/"); sb.append(hardKeyboardHidden); break; 7649a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 7659a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn switch (navigation) { 7669a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATION_UNDEFINED: sb.append(" ?nav"); break; 7679a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATION_NONAV: sb.append(" -nav"); break; 7689a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATION_DPAD: sb.append(" dpad"); break; 7699a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATION_TRACKBALL: sb.append(" tball"); break; 7709a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATION_WHEEL: sb.append(" wheel"); break; 7719a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn default: sb.append(" nav="); sb.append(navigation); break; 7729a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 7739a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn switch (navigationHidden) { 7749a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATIONHIDDEN_UNDEFINED: sb.append("/?"); break; 7759a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATIONHIDDEN_NO: sb.append("/v"); break; 7769a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn case NAVIGATIONHIDDEN_YES: sb.append("/h"); break; 7779a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn default: sb.append("/"); sb.append(navigationHidden); break; 7789a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn } 779e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (seq != 0) { 7809a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn sb.append(" s."); 781e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn sb.append(seq); 782e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 7831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append('}'); 7841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return sb.toString(); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this object to the system defaults. 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setToDefaults() { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fontScale = 1; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mcc = mnc = 0; 793e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn locale = null; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userSetLocale = false; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project touchscreen = TOUCHSCREEN_UNDEFINED; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboard = KEYBOARD_UNDEFINED; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboardHidden = KEYBOARDHIDDEN_UNDEFINED; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hardKeyboardHidden = HARDKEYBOARDHIDDEN_UNDEFINED; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project navigation = NAVIGATION_UNDEFINED; 80093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn navigationHidden = NAVIGATIONHIDDEN_UNDEFINED; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientation = ORIENTATION_UNDEFINED; 8025f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio screenLayout = SCREENLAYOUT_UNDEFINED; 8037299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn uiMode = UI_MODE_TYPE_UNDEFINED; 8045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED; 8055fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED; 8065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED; 807908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn densityDpi = DENSITY_DPI_UNDEFINED; 808e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn seq = 0; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** {@hide} */ 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated public void makeDefault() { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setToDefaults(); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy the fields from delta into this Configuration object, keeping 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * track of which ones have changed. Any undefined fields in 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>delta</var> are ignored and not copied in to the current 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Configuration. 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a bit mask of the changed fields, as per 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #diff}. 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int updateFrom(Configuration delta) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int changed = 0; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.fontScale > 0 && fontScale != delta.fontScale) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_FONT_SCALE; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fontScale = delta.fontScale; 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.mcc != 0 && mcc != delta.mcc) { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_MCC; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mcc = delta.mcc; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.mnc != 0 && mnc != delta.mnc) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_MNC; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mnc = delta.mnc; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.locale != null 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (locale == null || !locale.equals(delta.locale))) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_LOCALE; 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locale = delta.locale != null 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (Locale) delta.locale.clone() : null; 8435f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // If locale has changed, then layout direction is also changed ... 8445f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; 8455f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // ... and we need to update the layout direction (represented by the first 8465f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // 2 most significant bits in screenLayout). 8475f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio setLayoutDirection(locale); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84931678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner final int deltaScreenLayoutDir = delta.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK; 85031678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner if (deltaScreenLayoutDir != SCREENLAYOUT_LAYOUTDIR_UNDEFINED && 85131678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner deltaScreenLayoutDir != (screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK)) { 85231678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner screenLayout = (screenLayout & ~SCREENLAYOUT_LAYOUTDIR_MASK) | deltaScreenLayoutDir; 853d8415f4bf061000b049143b4f48b96b2005450bbAmith Yamasani changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; 854d8415f4bf061000b049143b4f48b96b2005450bbAmith Yamasani } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.userSetLocale && (!userSetLocale || ((changed & ActivityInfo.CONFIG_LOCALE) != 0))) 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_LOCALE; 858d8415f4bf061000b049143b4f48b96b2005450bbAmith Yamasani userSetLocale = true; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.touchscreen != TOUCHSCREEN_UNDEFINED 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && touchscreen != delta.touchscreen) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_TOUCHSCREEN; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project touchscreen = delta.touchscreen; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.keyboard != KEYBOARD_UNDEFINED 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && keyboard != delta.keyboard) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_KEYBOARD; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboard = delta.keyboard; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.keyboardHidden != KEYBOARDHIDDEN_UNDEFINED 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && keyboardHidden != delta.keyboardHidden) { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboardHidden = delta.keyboardHidden; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.hardKeyboardHidden != HARDKEYBOARDHIDDEN_UNDEFINED 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && hardKeyboardHidden != delta.hardKeyboardHidden) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hardKeyboardHidden = delta.hardKeyboardHidden; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.navigation != NAVIGATION_UNDEFINED 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && navigation != delta.navigation) { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_NAVIGATION; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project navigation = delta.navigation; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (delta.navigationHidden != NAVIGATIONHIDDEN_UNDEFINED 88693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn && navigationHidden != delta.navigationHidden) { 88793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn changed |= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; 88893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn navigationHidden = delta.navigationHidden; 88993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.orientation != ORIENTATION_UNDEFINED 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && orientation != delta.orientation) { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_ORIENTATION; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientation = delta.orientation; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8955f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (getScreenLayoutNoDirection(delta.screenLayout) != 8965f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio (SCREENLAYOUT_SIZE_UNDEFINED | SCREENLAYOUT_LONG_UNDEFINED) 8975f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio && (getScreenLayoutNoDirection(screenLayout) != 8985f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio getScreenLayoutNoDirection(delta.screenLayout))) { 899723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn changed |= ActivityInfo.CONFIG_SCREEN_LAYOUT; 9005f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // We need to preserve the previous layout dir bits if they were defined 9015f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if ((delta.screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK) == 0) { 9025f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio screenLayout = (screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK)|delta.screenLayout; 9035f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } else { 9045f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio screenLayout = delta.screenLayout; 9055f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 906723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 9077299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn if (delta.uiMode != (UI_MODE_TYPE_UNDEFINED|UI_MODE_NIGHT_UNDEFINED) 90827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel && uiMode != delta.uiMode) { 90927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel changed |= ActivityInfo.CONFIG_UI_MODE; 9107299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn if ((delta.uiMode&UI_MODE_TYPE_MASK) != UI_MODE_TYPE_UNDEFINED) { 9117299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn uiMode = (uiMode&~UI_MODE_TYPE_MASK) 9127299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn | (delta.uiMode&UI_MODE_TYPE_MASK); 9137299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn } 9147299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn if ((delta.uiMode&UI_MODE_NIGHT_MASK) != UI_MODE_NIGHT_UNDEFINED) { 9157299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn uiMode = (uiMode&~UI_MODE_NIGHT_MASK) 9167299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn | (delta.uiMode&UI_MODE_NIGHT_MASK); 9177299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn } 91827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 919ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (delta.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED 920ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn && screenWidthDp != delta.screenWidthDp) { 921ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn changed |= ActivityInfo.CONFIG_SCREEN_SIZE; 922ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn screenWidthDp = delta.screenWidthDp; 923ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 924ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (delta.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED 925ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn && screenHeightDp != delta.screenHeightDp) { 926ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn changed |= ActivityInfo.CONFIG_SCREEN_SIZE; 927ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn screenHeightDp = delta.screenHeightDp; 928ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 929e7123a660182c6a5869f46579e596e2b90983a6bDanny Baumann if (delta.smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED 930e7123a660182c6a5869f46579e596e2b90983a6bDanny Baumann && smallestScreenWidthDp != delta.smallestScreenWidthDp) { 931e7123a660182c6a5869f46579e596e2b90983a6bDanny Baumann changed |= ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; 93269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn smallestScreenWidthDp = delta.smallestScreenWidthDp; 93369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 934e7123a660182c6a5869f46579e596e2b90983a6bDanny Baumann if (delta.densityDpi != DENSITY_DPI_UNDEFINED && 935e7123a660182c6a5869f46579e596e2b90983a6bDanny Baumann densityDpi != delta.densityDpi) { 936908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn changed |= ActivityInfo.CONFIG_DENSITY; 937908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn densityDpi = delta.densityDpi; 938908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } 9395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (delta.compatScreenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) { 9405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatScreenWidthDp = delta.compatScreenWidthDp; 9415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 9425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (delta.compatScreenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) { 9435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatScreenHeightDp = delta.compatScreenHeightDp; 9445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 9455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (delta.compatSmallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) { 9465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatSmallestScreenWidthDp = delta.compatSmallestScreenWidthDp; 9475fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 948e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (delta.seq != 0) { 949e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn seq = delta.seq; 950e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 951e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a bit mask of the differences between this Configuration 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object and the given one. Does not change the values of either. Any 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * undefined fields in <var>delta</var> are ignored. 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a bit mask indicating which configuration 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values has changed, containing any combination of 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_FONT_SCALE 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PackageManager.ActivityInfo.CONFIG_FONT_SCALE}, 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_MCC 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PackageManager.ActivityInfo.CONFIG_MCC}, 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_MNC 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PackageManager.ActivityInfo.CONFIG_MNC}, 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_LOCALE 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PackageManager.ActivityInfo.CONFIG_LOCALE}, 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_TOUCHSCREEN 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PackageManager.ActivityInfo.CONFIG_TOUCHSCREEN}, 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_KEYBOARD 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PackageManager.ActivityInfo.CONFIG_KEYBOARD}, 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_NAVIGATION 974723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn * PackageManager.ActivityInfo.CONFIG_NAVIGATION}, 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.pm.ActivityInfo#CONFIG_ORIENTATION 976ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn * PackageManager.ActivityInfo.CONFIG_ORIENTATION}, 977723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn * {@link android.content.pm.ActivityInfo#CONFIG_SCREEN_LAYOUT 978ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn * PackageManager.ActivityInfo.CONFIG_SCREEN_LAYOUT}, or 979ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn * {@link android.content.pm.ActivityInfo#CONFIG_SCREEN_SIZE 98069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn * PackageManager.ActivityInfo.CONFIG_SCREEN_SIZE}, or 98169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn * {@link android.content.pm.ActivityInfo#CONFIG_SMALLEST_SCREEN_SIZE 98269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn * PackageManager.ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE}. 9835f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * {@link android.content.pm.ActivityInfo#CONFIG_LAYOUT_DIRECTION 9845f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * PackageManager.ActivityInfo.CONFIG_LAYOUT_DIRECTION}. 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int diff(Configuration delta) { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int changed = 0; 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.fontScale > 0 && fontScale != delta.fontScale) { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_FONT_SCALE; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.mcc != 0 && mcc != delta.mcc) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_MCC; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.mnc != 0 && mnc != delta.mnc) { 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_MNC; 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.locale != null 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (locale == null || !locale.equals(delta.locale))) { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_LOCALE; 10005f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 100231678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner final int deltaScreenLayoutDir = delta.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK; 100331678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner if (deltaScreenLayoutDir != SCREENLAYOUT_LAYOUTDIR_UNDEFINED && 100431678b52e4b65e8e4d22ef5dced713424e5deadaCraig Mautner deltaScreenLayoutDir != (screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK)) { 1005d8415f4bf061000b049143b4f48b96b2005450bbAmith Yamasani changed |= ActivityInfo.CONFIG_LAYOUT_DIRECTION; 1006d8415f4bf061000b049143b4f48b96b2005450bbAmith Yamasani } 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.touchscreen != TOUCHSCREEN_UNDEFINED 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && touchscreen != delta.touchscreen) { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_TOUCHSCREEN; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.keyboard != KEYBOARD_UNDEFINED 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && keyboard != delta.keyboard) { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_KEYBOARD; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.keyboardHidden != KEYBOARDHIDDEN_UNDEFINED 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && keyboardHidden != delta.keyboardHidden) { 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.hardKeyboardHidden != HARDKEYBOARDHIDDEN_UNDEFINED 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && hardKeyboardHidden != delta.hardKeyboardHidden) { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.navigation != NAVIGATION_UNDEFINED 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && navigation != delta.navigation) { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_NAVIGATION; 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 102793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (delta.navigationHidden != NAVIGATIONHIDDEN_UNDEFINED 102893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn && navigationHidden != delta.navigationHidden) { 102993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn changed |= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; 103093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delta.orientation != ORIENTATION_UNDEFINED 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && orientation != delta.orientation) { 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed |= ActivityInfo.CONFIG_ORIENTATION; 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10355f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio if (getScreenLayoutNoDirection(delta.screenLayout) != 10365f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio (SCREENLAYOUT_SIZE_UNDEFINED | SCREENLAYOUT_LONG_UNDEFINED) 10375f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio && getScreenLayoutNoDirection(screenLayout) != 10385f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio getScreenLayoutNoDirection(delta.screenLayout)) { 1039723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn changed |= ActivityInfo.CONFIG_SCREEN_LAYOUT; 1040723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 10417299c41630935a2b106e73e5603579a7747f7535Dianne Hackborn if (delta.uiMode != (UI_MODE_TYPE_UNDEFINED|UI_MODE_NIGHT_UNDEFINED) 104227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel && uiMode != delta.uiMode) { 104327b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel changed |= ActivityInfo.CONFIG_UI_MODE; 104427b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel } 1045ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (delta.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED 1046ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn && screenWidthDp != delta.screenWidthDp) { 1047ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn changed |= ActivityInfo.CONFIG_SCREEN_SIZE; 1048ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 1049ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (delta.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED 1050ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn && screenHeightDp != delta.screenHeightDp) { 1051ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn changed |= ActivityInfo.CONFIG_SCREEN_SIZE; 1052ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn } 105369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (delta.smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED 105469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn && smallestScreenWidthDp != delta.smallestScreenWidthDp) { 105569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn changed |= ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; 105669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 1057908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn if (delta.densityDpi != DENSITY_DPI_UNDEFINED 1058908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn && densityDpi != delta.densityDpi) { 1059908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn changed |= ActivityInfo.CONFIG_DENSITY; 1060908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn } 10615f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determine if a new resource needs to be loaded from the bit set of 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * configuration changes returned by {@link #updateFrom(Configuration)}. 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param configChanges The mask of changes configurations as returned by 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #updateFrom(Configuration)}. 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interestingChanges The configuration changes that the resource 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can handled, as given in {@link android.util.TypedValue#changingConfigurations}. 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Return true if the resource needs to be loaded, else false. 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean needNewResources(int configChanges, int interestingChanges) { 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (configChanges & (interestingChanges|ActivityInfo.CONFIG_FONT_SCALE)) != 0; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079d8415f4bf061000b049143b4f48b96b2005450bbAmith Yamasani 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1081e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * @hide Return true if the sequence of 'other' is better than this. Assumes 1082e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * that 'this' is your current sequence and 'other' is a new one you have 1083e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * received some how and want to compare with what you have. 1084e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn */ 1085e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn public boolean isOtherSeqNewer(Configuration other) { 1086e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (other == null) { 1087e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // Sanity check. 1088e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return false; 1089e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 1090e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (other.seq == 0) { 1091e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If the other sequence is not specified, then we must assume 1092e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // it is newer since we don't know any better. 1093e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return true; 1094e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 1095e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (seq == 0) { 1096e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this sequence is not specified, then we also consider the 1097e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // other is better. Yes we have a preference for other. Sue us. 1098e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return true; 1099e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 1100e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int diff = other.seq - seq; 1101e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (diff > 0x10000) { 1102e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If there has been a sufficiently large jump, assume the 1103e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // sequence has wrapped around. 1104e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return false; 1105e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 1106e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return diff > 0; 1107e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 1108e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 1109e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn /** 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable methods 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeFloat(fontScale); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mcc); 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mnc); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (locale == null) { 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(locale.getLanguage()); 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(locale.getCountry()); 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(locale.getVariant()); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(userSetLocale) { 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(touchscreen); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(keyboard); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(keyboardHidden); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(hardKeyboardHidden); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(navigation); 113893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn dest.writeInt(navigationHidden); 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(orientation); 1140723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn dest.writeInt(screenLayout); 114127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel dest.writeInt(uiMode); 1142ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn dest.writeInt(screenWidthDp); 1143ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn dest.writeInt(screenHeightDp); 114469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn dest.writeInt(smallestScreenWidthDp); 1145908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn dest.writeInt(densityDpi); 11465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn dest.writeInt(compatScreenWidthDp); 11475fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn dest.writeInt(compatScreenHeightDp); 11485fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn dest.writeInt(compatSmallestScreenWidthDp); 1149e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn dest.writeInt(seq); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1152694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn public void readFromParcel(Parcel source) { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fontScale = source.readFloat(); 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mcc = source.readInt(); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mnc = source.readInt(); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source.readInt() != 0) { 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project locale = new Locale(source.readString(), source.readString(), 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source.readString()); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userSetLocale = (source.readInt()==1); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project touchscreen = source.readInt(); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboard = source.readInt(); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project keyboardHidden = source.readInt(); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hardKeyboardHidden = source.readInt(); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project navigation = source.readInt(); 116693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn navigationHidden = source.readInt(); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientation = source.readInt(); 1168723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn screenLayout = source.readInt(); 116927b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel uiMode = source.readInt(); 1170ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn screenWidthDp = source.readInt(); 1171ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn screenHeightDp = source.readInt(); 117269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn smallestScreenWidthDp = source.readInt(); 1173908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn densityDpi = source.readInt(); 11745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatScreenWidthDp = source.readInt(); 11755fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatScreenHeightDp = source.readInt(); 11765fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn compatSmallestScreenWidthDp = source.readInt(); 1177e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn seq = source.readInt(); 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn 1180694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn public static final Parcelable.Creator<Configuration> CREATOR 1181694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn = new Parcelable.Creator<Configuration>() { 1182694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn public Configuration createFromParcel(Parcel source) { 1183694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn return new Configuration(source); 1184694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 1185694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn 1186694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn public Configuration[] newArray(int size) { 1187694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn return new Configuration[size]; 1188694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 1189694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn }; 1190694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn 1191694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn /** 1192694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn * Construct this Configuration object, reading from the Parcel. 1193694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn */ 1194694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn private Configuration(Parcel source) { 1195694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn readFromParcel(source); 1196694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int compareTo(Configuration that) { 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n; 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float a = this.fontScale; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float b = that.fontScale; 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a < b) return -1; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a > b) return 1; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.mcc - that.mcc; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.mnc - that.mnc; 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 1208a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn if (this.locale == null) { 1209a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn if (that.locale != null) return 1; 1210a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn } else if (that.locale == null) { 1211a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn return -1; 1212a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn } else { 1213a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn n = this.locale.getLanguage().compareTo(that.locale.getLanguage()); 1214a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn if (n != 0) return n; 1215a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn n = this.locale.getCountry().compareTo(that.locale.getCountry()); 1216a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn if (n != 0) return n; 1217a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn n = this.locale.getVariant().compareTo(that.locale.getVariant()); 1218a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn if (n != 0) return n; 1219a839703e0dec352bba9c7e4165e91b9083f58185Dianne Hackborn } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.touchscreen - that.touchscreen; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.keyboard - that.keyboard; 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.keyboardHidden - that.keyboardHidden; 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.hardKeyboardHidden - that.hardKeyboardHidden; 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.navigation - that.navigation; 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (n != 0) return n; 123093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn n = this.navigationHidden - that.navigationHidden; 123193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (n != 0) return n; 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project n = this.orientation - that.orientation; 1233723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (n != 0) return n; 1234723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn n = this.screenLayout - that.screenLayout; 123527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel if (n != 0) return n; 123627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel n = this.uiMode - that.uiMode; 1237ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (n != 0) return n; 1238ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn n = this.screenWidthDp - that.screenWidthDp; 1239ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn if (n != 0) return n; 1240ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn n = this.screenHeightDp - that.screenHeightDp; 124169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (n != 0) return n; 124269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn n = this.smallestScreenWidthDp - that.smallestScreenWidthDp; 1243908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn if (n != 0) return n; 1244908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn n = this.densityDpi - that.densityDpi; 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (n != 0) return n; 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return n; 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Configuration that) { 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (that == null) return false; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (that == this) return true; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.compareTo(that) == 0; 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object that) { 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return equals((Configuration)that); 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassCastException e) { 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hashCode() { 1264e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int result = 17; 1265e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + Float.floatToIntBits(fontScale); 1266e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + mcc; 1267e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + mnc; 1268e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + (locale != null ? locale.hashCode() : 0); 1269e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + touchscreen; 1270e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + keyboard; 1271e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + keyboardHidden; 1272e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + hardKeyboardHidden; 1273e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + navigation; 1274e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + navigationHidden; 1275e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + orientation; 1276e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + screenLayout; 1277e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn result = 31 * result + uiMode; 1278ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn result = 31 * result + screenWidthDp; 1279ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn result = 31 * result + screenHeightDp; 128069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn result = 31 * result + smallestScreenWidthDp; 1281908aecc3a63c5520d5b11da14a9383f885b7d126Dianne Hackborn result = 31 * result + densityDpi; 1282e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn return result; 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12845f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 12855f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** 12865f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * Set the locale. This is the preferred way for setting up the locale (instead of using the 12875f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * direct accessor). This will also set the userLocale and layout direction according to 12885f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * the locale. 12895f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * 12905f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * @param loc The locale. Can be null. 12915f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio */ 12925f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public void setLocale(Locale loc) { 12935f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio locale = loc; 12945f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio userSetLocale = true; 12955f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio setLayoutDirection(locale); 12965f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 12975f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 12985f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** 12995f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * Return the layout direction. Will be either {@link View#LAYOUT_DIRECTION_LTR} or 13005f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * {@link View#LAYOUT_DIRECTION_RTL}. 13015f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * 1302f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn * @return Returns {@link View#LAYOUT_DIRECTION_RTL} if the configuration 1303f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn * is {@link #SCREENLAYOUT_LAYOUTDIR_RTL}, otherwise {@link View#LAYOUT_DIRECTION_LTR}. 13045f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio */ 13055f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public int getLayoutDirection() { 1306f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn return (screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK) == SCREENLAYOUT_LAYOUTDIR_RTL 1307f1ae269c0665f266b904db7c9ef4511e11459f44Dianne Hackborn ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR; 13085f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 13095f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 13105f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio /** 13115f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * Set the layout direction from the Locale. 13125f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * 13135f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * @param locale The Locale. If null will set the layout direction to 13145f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * {@link View#LAYOUT_DIRECTION_LTR}. If not null will set it to the layout direction 13155f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * corresponding to the Locale. 13165f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * 13175f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio * @see {@link View#LAYOUT_DIRECTION_LTR} and {@link View#LAYOUT_DIRECTION_RTL} 13185f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio */ 13195f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio public void setLayoutDirection(Locale locale) { 13205f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // There is a "1" difference between the configuration values for 13215f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio // layout direction and View constants for layout direction, just add "1". 1322d3d9f3f1004dfee2649a26cfe8dba948cd364904Fabrice Di Meglio final int layoutDirection = 1 + TextUtils.getLayoutDirectionFromLocale(locale); 13235f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio screenLayout = (screenLayout&~SCREENLAYOUT_LAYOUTDIR_MASK)| 13245f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio (layoutDirection << SCREENLAYOUT_LAYOUTDIR_SHIFT); 13255f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 13265f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio 13275f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio private static int getScreenLayoutNoDirection(int screenLayout) { 13285f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio return screenLayout&~SCREENLAYOUT_LAYOUTDIR_MASK; 13295f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio } 13302c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13312c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski /** 13322c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski * 13332c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski * @hide 13342c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski */ 13352c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski public static String localeToResourceQualifier(Locale locale) { 13362c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski StringBuilder sb = new StringBuilder(); 13372c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski boolean l = (locale.getLanguage().length() != 0); 13382c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski boolean c = (locale.getCountry().length() != 0); 13392c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski boolean s = (locale.getScript().length() != 0); 13402c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski boolean v = (locale.getVariant().length() != 0); 13412c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13422c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (l) { 13432c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski sb.append(locale.getLanguage()); 13442c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (c) { 13452c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski sb.append("-r").append(locale.getCountry()); 13462c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (s) { 13472c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski sb.append("-s").append(locale.getScript()); 13482c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (v) { 13492c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski sb.append("-v").append(locale.getVariant()); 13502c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13512c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13522c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13532c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13542c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski return sb.toString(); 13552c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13562c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13572c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13582c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski /** 13592c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski * Returns a string representation of the configuration that can be parsed 13602c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski * by build tools (like AAPT). 13612c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski * 13622c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski * @hide 13632c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski */ 13642c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski public static String resourceQualifierString(Configuration config) { 13652c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski ArrayList<String> parts = new ArrayList<String>(); 13662c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13672c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (config.mcc != 0) { 13689086562a6a524cc0c96231411863cd65d8785bfeAdam Lesinski parts.add("mcc" + config.mcc); 13692c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (config.mnc != 0) { 13709086562a6a524cc0c96231411863cd65d8785bfeAdam Lesinski parts.add("mnc" + config.mnc); 13712c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13722c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13732c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13741bb18c435dbf967f3a9bc9d680411471b8bab4acAdam Lesinski if (config.locale != null && !config.locale.getLanguage().isEmpty()) { 13752c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add(localeToResourceQualifier(config.locale)); 13762c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13772c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13782c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.screenLayout & Configuration.SCREENLAYOUT_LAYOUTDIR_MASK) { 13792c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_LAYOUTDIR_LTR: 13802c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("ldltr"); 13812c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 13822c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_LAYOUTDIR_RTL: 13832c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("ldrtl"); 13842c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 13852c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 13862c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 13872c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13882c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13892c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (config.smallestScreenWidthDp != 0) { 13902c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("sw" + config.smallestScreenWidthDp + "dp"); 13912c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13922c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13932c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (config.screenWidthDp != 0) { 13942c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("w" + config.screenWidthDp + "dp"); 13952c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 13962c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 13972c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski if (config.screenHeightDp != 0) { 13982c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("h" + config.screenHeightDp + "dp"); 13992c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 14002c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 14012c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) { 14022c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_SIZE_SMALL: 14032c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("small"); 14042c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14052c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_SIZE_NORMAL: 14062c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("normal"); 14072c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14082c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_SIZE_LARGE: 14092c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("large"); 14102c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14112c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_SIZE_XLARGE: 14122c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("xlarge"); 14132c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14142c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 14152c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14162c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 14172c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 14182c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.screenLayout & Configuration.SCREENLAYOUT_LONG_MASK) { 14192c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_LONG_YES: 14202c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("long"); 14212c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14222c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.SCREENLAYOUT_LONG_NO: 14232c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("notlong"); 14242c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14252c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 14262c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14272c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 14282c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 14292c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.orientation) { 14302c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.ORIENTATION_LANDSCAPE: 14312c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("land"); 14322c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14332c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.ORIENTATION_PORTRAIT: 14342c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("port"); 14352c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14362c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 14372c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14382c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 14392c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 14402c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.uiMode & Configuration.UI_MODE_TYPE_MASK) { 14412c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_TYPE_APPLIANCE: 14422c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("appliance"); 14432c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14442c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_TYPE_DESK: 14452c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("desk"); 14462c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14472c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_TYPE_TELEVISION: 14482c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("television"); 14492c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14502c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_TYPE_CAR: 14512c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("car"); 14522c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14532c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_TYPE_WATCH: 14542c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("watch"); 14552c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14562c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 14572c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14582c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 14592c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 14602c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.uiMode & Configuration.UI_MODE_NIGHT_MASK) { 14612c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_NIGHT_YES: 14622c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("night"); 14632c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14642c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.UI_MODE_NIGHT_NO: 14652c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("notnight"); 14662c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14672c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 14682c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14692c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 14702c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 14712c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.densityDpi) { 147231245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski case DENSITY_DPI_UNDEFINED: 14732c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14742c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case 120: 14752c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("ldpi"); 14762c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14772c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case 160: 14782c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("mdpi"); 14792c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14802c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case 213: 14812c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("tvdpi"); 14822c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14832c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case 240: 14842c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("hdpi"); 14852c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 14862c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case 320: 14872c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("xhdpi"); 14882c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 1489ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski case 480: 1490ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski parts.add("xxhdpi"); 1491ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski break; 1492ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski case 640: 1493ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski parts.add("xxxhdpi"); 1494ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski break; 149531245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski case DENSITY_DPI_ANY: 149631245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski parts.add("anydpi"); 149731245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski break; 149831245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski case DENSITY_DPI_NONE: 149931245b4f06003f1c8cd44c31b387c96ab4e282f9Adam Lesinski parts.add("nodpi"); 15002c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 15012c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add(config.densityDpi + "dpi"); 15022c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15032c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15042c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 15052c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.touchscreen) { 15062c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.TOUCHSCREEN_NOTOUCH: 15072c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("notouch"); 15082c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15092c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.TOUCHSCREEN_FINGER: 15102c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("finger"); 15112c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15122c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 15132c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15142c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15152c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 15162c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.keyboardHidden) { 15172c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.KEYBOARDHIDDEN_NO: 15182c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("keysexposed"); 15192c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15202c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.KEYBOARDHIDDEN_YES: 15212c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("keyshidden"); 15222c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15232c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.KEYBOARDHIDDEN_SOFT: 15242c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("keyssoft"); 15252c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15262c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 15272c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15282c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15292c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 15302c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.keyboard) { 15312c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.KEYBOARD_NOKEYS: 15322c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("nokeys"); 15332c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15342c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.KEYBOARD_QWERTY: 15352c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("qwerty"); 15362c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15372c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.KEYBOARD_12KEY: 15382c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("12key"); 15392c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15402c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 15412c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15422c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15432c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 15442c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.navigationHidden) { 15452c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.NAVIGATIONHIDDEN_NO: 15462c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("navexposed"); 15472c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15482c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.NAVIGATIONHIDDEN_YES: 15492c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("navhidden"); 15502c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15512c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 15522c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15532c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15542c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 15552c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski switch (config.navigation) { 15562c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.NAVIGATION_NONAV: 15572c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("nonav"); 15582c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15592c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.NAVIGATION_DPAD: 15602c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("dpad"); 15612c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15622c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.NAVIGATION_TRACKBALL: 15632c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("trackball"); 15642c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15652c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski case Configuration.NAVIGATION_WHEEL: 15662c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski parts.add("wheel"); 15672c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15682c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski default: 15692c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski break; 15702c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15712c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski 1572ebc3e4cbf14f62a2134aded9068e147ea8cbc23bAdam Lesinski parts.add("v" + Build.VERSION.RESOURCES_SDK_INT); 15732c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski return TextUtils.join("-", parts); 15742c749d242759ea36c0229ea933f22b6363337b19Adam Lesinski } 15757f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 15767f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski /** 15777f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * Generate a delta Configuration between <code>base</code> and <code>change</code>. The 15787f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * resulting delta can be used with {@link #updateFrom(Configuration)}. 15797f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * <p /> 15807f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * Caveat: If the any of the Configuration's members becomes undefined, then 15817f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * {@link #updateFrom(Configuration)} will treat it as a no-op and not update that member. 15827f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * 15837f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * This is fine for device configurations as no member is ever undefined. 15847f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * {@hide} 15857f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski */ 15867f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski public static Configuration generateDelta(Configuration base, Configuration change) { 15877f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski final Configuration delta = new Configuration(); 15887f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.fontScale != change.fontScale) { 15897f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.fontScale = change.fontScale; 15907f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 15917f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 15927f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.mcc != change.mcc) { 15937f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.mcc = change.mcc; 15947f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 15957f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 15967f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.mnc != change.mnc) { 15977f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.mnc = change.mnc; 15987f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 15997f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16007f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if ((base.locale == null && change.locale != null) || 16017f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski (base.locale != null && !base.locale.equals(change.locale))) { 16027f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.locale = change.locale; 16037f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16047f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16057f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.touchscreen != change.touchscreen) { 16067f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.touchscreen = change.touchscreen; 16077f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16087f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16097f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.keyboard != change.keyboard) { 16107f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.keyboard = change.keyboard; 16117f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16127f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16137f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.keyboardHidden != change.keyboardHidden) { 16147f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.keyboardHidden = change.keyboardHidden; 16157f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16167f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16177f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.navigation != change.navigation) { 16187f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.navigation = change.navigation; 16197f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16207f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16217f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.navigationHidden != change.navigationHidden) { 16227f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.navigationHidden = change.navigationHidden; 16237f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16247f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16257f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.orientation != change.orientation) { 16267f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.orientation = change.orientation; 16277f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16287f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16297f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if ((base.screenLayout & SCREENLAYOUT_SIZE_MASK) != 16307f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski (change.screenLayout & SCREENLAYOUT_SIZE_MASK)) { 16317f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.screenLayout |= change.screenLayout & SCREENLAYOUT_SIZE_MASK; 16327f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16337f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16347f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if ((base.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK) != 16357f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski (change.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK)) { 16367f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.screenLayout |= change.screenLayout & SCREENLAYOUT_LAYOUTDIR_MASK; 16377f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16387f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16397f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if ((base.screenLayout & SCREENLAYOUT_LONG_MASK) != 16407f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski (change.screenLayout & SCREENLAYOUT_LONG_MASK)) { 16417f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.screenLayout |= change.screenLayout & SCREENLAYOUT_LONG_MASK; 16427f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16437f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16447f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if ((base.uiMode & UI_MODE_TYPE_MASK) != (change.uiMode & UI_MODE_TYPE_MASK)) { 16457f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.uiMode |= change.uiMode & UI_MODE_TYPE_MASK; 16467f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16477f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16487f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if ((base.uiMode & UI_MODE_NIGHT_MASK) != (change.uiMode & UI_MODE_NIGHT_MASK)) { 16497f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.uiMode |= change.uiMode & UI_MODE_NIGHT_MASK; 16507f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16517f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16527f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.screenWidthDp != change.screenWidthDp) { 16537f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.screenWidthDp = change.screenWidthDp; 16547f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16557f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16567f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.screenHeightDp != change.screenHeightDp) { 16577f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.screenHeightDp = change.screenHeightDp; 16587f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16597f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16607f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.smallestScreenWidthDp != change.smallestScreenWidthDp) { 16617f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.smallestScreenWidthDp = change.smallestScreenWidthDp; 16627f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16637f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16647f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (base.densityDpi != change.densityDpi) { 16657f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski delta.densityDpi = change.densityDpi; 16667f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16677f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski return delta; 16687f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 16697f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16707f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_FONT_SCALE = "fs"; 16717f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_MCC = "mcc"; 16727f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_MNC = "mnc"; 16737f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_LOCALE = "locale"; 16747f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_TOUCHSCREEN = "touch"; 16757f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_KEYBOARD = "key"; 16767f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_KEYBOARD_HIDDEN = "keyHid"; 16777f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_HARD_KEYBOARD_HIDDEN = "hardKeyHid"; 16787f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_NAVIGATION = "nav"; 16797f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_NAVIGATION_HIDDEN = "navHid"; 16807f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_ORIENTATION = "ori"; 16817f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_SCREEN_LAYOUT = "scrLay"; 16827f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_UI_MODE = "ui"; 16837f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_SCREEN_WIDTH = "width"; 16847f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_SCREEN_HEIGHT = "height"; 16857f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_SMALLEST_WIDTH = "sw"; 16867f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski private static final String XML_ATTR_DENSITY = "density"; 16877f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 16887f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski /** 16897f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * Reads the attributes corresponding to Configuration member fields from the Xml parser. 16907f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * The parser is expected to be on a tag which has Configuration attributes. 16917f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * 16927f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * @param parser The Xml parser from which to read attributes. 16937f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * @param configOut The Configuration to populate from the Xml attributes. 16947f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * {@hide} 16957f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski */ 16967f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski public static void readXmlAttrs(XmlPullParser parser, Configuration configOut) 16977f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski throws XmlPullParserException, IOException { 16987f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.fontScale = Float.intBitsToFloat( 16997f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.readIntAttribute(parser, XML_ATTR_FONT_SCALE, 0)); 17007f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.mcc = XmlUtils.readIntAttribute(parser, XML_ATTR_MCC, 0); 17017f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.mnc = XmlUtils.readIntAttribute(parser, XML_ATTR_MNC, 0); 17027f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 17037f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski final String localeStr = XmlUtils.readStringAttribute(parser, XML_ATTR_LOCALE); 17047f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (localeStr != null) { 17057f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.locale = Locale.forLanguageTag(localeStr); 17067f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17077f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 17087f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.touchscreen = XmlUtils.readIntAttribute(parser, XML_ATTR_TOUCHSCREEN, 17097f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski TOUCHSCREEN_UNDEFINED); 17107f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.keyboard = XmlUtils.readIntAttribute(parser, XML_ATTR_KEYBOARD, 17117f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski KEYBOARD_UNDEFINED); 17127f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.keyboardHidden = XmlUtils.readIntAttribute(parser, XML_ATTR_KEYBOARD_HIDDEN, 17137f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski KEYBOARDHIDDEN_UNDEFINED); 17147f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.hardKeyboardHidden = 17157f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.readIntAttribute(parser, XML_ATTR_HARD_KEYBOARD_HIDDEN, 17167f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski HARDKEYBOARDHIDDEN_UNDEFINED); 17177f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.navigation = XmlUtils.readIntAttribute(parser, XML_ATTR_NAVIGATION, 17187f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski NAVIGATION_UNDEFINED); 17197f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.navigationHidden = XmlUtils.readIntAttribute(parser, XML_ATTR_NAVIGATION_HIDDEN, 17207f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski NAVIGATIONHIDDEN_UNDEFINED); 17217f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.orientation = XmlUtils.readIntAttribute(parser, XML_ATTR_ORIENTATION, 17227f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski ORIENTATION_UNDEFINED); 17237f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.screenLayout = XmlUtils.readIntAttribute(parser, XML_ATTR_SCREEN_LAYOUT, 17247f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski SCREENLAYOUT_UNDEFINED); 17257f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.uiMode = XmlUtils.readIntAttribute(parser, XML_ATTR_UI_MODE, 0); 17267f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.screenWidthDp = XmlUtils.readIntAttribute(parser, XML_ATTR_SCREEN_WIDTH, 17277f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski SCREEN_WIDTH_DP_UNDEFINED); 17287f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.screenHeightDp = XmlUtils.readIntAttribute(parser, XML_ATTR_SCREEN_HEIGHT, 17297f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski SCREEN_HEIGHT_DP_UNDEFINED); 17307f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.smallestScreenWidthDp = 17317f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.readIntAttribute(parser, XML_ATTR_SMALLEST_WIDTH, 17327f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski SMALLEST_SCREEN_WIDTH_DP_UNDEFINED); 17337f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski configOut.densityDpi = XmlUtils.readIntAttribute(parser, XML_ATTR_DENSITY, 17347f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski DENSITY_DPI_UNDEFINED); 17357f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17367f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 17377f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski 17387f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski /** 17397f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * Writes the Configuration's member fields as attributes into the XmlSerializer. 17407f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * The serializer is expected to have already started a tag so that attributes can be 17417f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * immediately written. 17427f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * 17437f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * @param xml The serializer to which to write the attributes. 17447f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * @param config The Configuration whose member fields to write. 17457f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski * {@hide} 17467f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski */ 17477f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski public static void writeXmlAttrs(XmlSerializer xml, Configuration config) throws IOException { 17487f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_FONT_SCALE, 17497f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski Float.floatToIntBits(config.fontScale)); 17507f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.mcc != 0) { 17517f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_MCC, config.mcc); 17527f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17537f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.mnc != 0) { 17547f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_MNC, config.mnc); 17557f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17567f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.locale != null) { 17577f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeStringAttribute(xml, XML_ATTR_LOCALE, config.locale.toLanguageTag()); 17587f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17597f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.touchscreen != TOUCHSCREEN_UNDEFINED) { 17607f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_TOUCHSCREEN, config.touchscreen); 17617f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17627f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.keyboard != KEYBOARD_UNDEFINED) { 17637f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_KEYBOARD, config.keyboard); 17647f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17657f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.keyboardHidden != KEYBOARDHIDDEN_UNDEFINED) { 17667f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_KEYBOARD_HIDDEN, config.keyboardHidden); 17677f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17687f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.hardKeyboardHidden != HARDKEYBOARDHIDDEN_UNDEFINED) { 17697f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_HARD_KEYBOARD_HIDDEN, 17707f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski config.hardKeyboardHidden); 17717f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17727f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.navigation != NAVIGATION_UNDEFINED) { 17737f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_NAVIGATION, config.navigation); 17747f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17757f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.navigationHidden != NAVIGATIONHIDDEN_UNDEFINED) { 17767f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_NAVIGATION_HIDDEN, config.navigationHidden); 17777f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17787f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.orientation != ORIENTATION_UNDEFINED) { 17797f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_ORIENTATION, config.orientation); 17807f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17817f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.screenLayout != SCREENLAYOUT_UNDEFINED) { 17827f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_SCREEN_LAYOUT, config.screenLayout); 17837f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17847f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.uiMode != 0) { 17857f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_UI_MODE, config.uiMode); 17867f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17877f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) { 17887f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_SCREEN_WIDTH, config.screenWidthDp); 17897f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17907f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) { 17917f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_SCREEN_HEIGHT, config.screenHeightDp); 17927f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17937f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) { 17947f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_SMALLEST_WIDTH, config.smallestScreenWidthDp); 17957f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17967f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski if (config.densityDpi != DENSITY_DPI_UNDEFINED) { 17977f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski XmlUtils.writeIntAttribute(xml, XML_ATTR_DENSITY, config.densityDpi); 17987f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 17997f61e96db7c90c1f4418359672aa4656aebee500Adam Lesinski } 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1801