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