Home | History | Annotate | Download | only in provider
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.provider;
     18 
     19 import com.google.android.collect.Maps;
     20 
     21 import org.apache.commons.codec.binary.Base64;
     22 
     23 import android.annotation.SdkConstant;
     24 import android.annotation.SdkConstant.SdkConstantType;
     25 import android.content.ComponentName;
     26 import android.content.ContentQueryMap;
     27 import android.content.ContentResolver;
     28 import android.content.ContentValues;
     29 import android.content.Context;
     30 import android.content.IContentProvider;
     31 import android.content.Intent;
     32 import android.content.pm.ActivityInfo;
     33 import android.content.pm.PackageManager;
     34 import android.content.pm.ResolveInfo;
     35 import android.content.res.Configuration;
     36 import android.content.res.Resources;
     37 import android.database.Cursor;
     38 import android.database.SQLException;
     39 import android.net.Uri;
     40 import android.os.*;
     41 import android.telephony.TelephonyManager;
     42 import android.text.TextUtils;
     43 import android.util.AndroidException;
     44 import android.util.Config;
     45 import android.util.Log;
     46 
     47 import java.net.URISyntaxException;
     48 import java.security.MessageDigest;
     49 import java.security.NoSuchAlgorithmException;
     50 import java.util.Collections;
     51 import java.util.HashMap;
     52 import java.util.HashSet;
     53 import java.util.Map;
     54 
     55 
     56 /**
     57  * The Settings provider contains global system-level device preferences.
     58  */
     59 public final class Settings {
     60 
     61     // Intent actions for Settings
     62 
     63     /**
     64      * Activity Action: Show system settings.
     65      * <p>
     66      * Input: Nothing.
     67      * <p>
     68      * Output: nothing.
     69      */
     70     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     71     public static final String ACTION_SETTINGS = "android.settings.SETTINGS";
     72 
     73     /**
     74      * Activity Action: Show settings to allow configuration of APNs.
     75      * <p>
     76      * Input: Nothing.
     77      * <p>
     78      * Output: nothing.
     79      */
     80     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     81     public static final String ACTION_APN_SETTINGS = "android.settings.APN_SETTINGS";
     82 
     83     /**
     84      * Activity Action: Show settings to allow configuration of current location
     85      * sources.
     86      * <p>
     87      * In some cases, a matching Activity may not exist, so ensure you
     88      * safeguard against this.
     89      * <p>
     90      * Input: Nothing.
     91      * <p>
     92      * Output: Nothing.
     93      */
     94     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     95     public static final String ACTION_LOCATION_SOURCE_SETTINGS =
     96             "android.settings.LOCATION_SOURCE_SETTINGS";
     97 
     98     /**
     99      * Activity Action: Show settings to allow configuration of wireless controls
    100      * such as Wi-Fi, Bluetooth and Mobile networks.
    101      * <p>
    102      * In some cases, a matching Activity may not exist, so ensure you
    103      * safeguard against this.
    104      * <p>
    105      * Input: Nothing.
    106      * <p>
    107      * Output: Nothing.
    108      */
    109     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    110     public static final String ACTION_WIRELESS_SETTINGS =
    111             "android.settings.WIRELESS_SETTINGS";
    112 
    113     /**
    114      * Activity Action: Show settings to allow entering/exiting airplane mode.
    115      * <p>
    116      * In some cases, a matching Activity may not exist, so ensure you
    117      * safeguard against this.
    118      * <p>
    119      * Input: Nothing.
    120      * <p>
    121      * Output: Nothing.
    122      */
    123     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    124     public static final String ACTION_AIRPLANE_MODE_SETTINGS =
    125             "android.settings.AIRPLANE_MODE_SETTINGS";
    126 
    127     /**
    128      * Activity Action: Show settings for accessibility modules.
    129      * <p>
    130      * In some cases, a matching Activity may not exist, so ensure you
    131      * safeguard against this.
    132      * <p>
    133      * Input: Nothing.
    134      * <p>
    135      * Output: Nothing.
    136      */
    137     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    138     public static final String ACTION_ACCESSIBILITY_SETTINGS =
    139             "android.settings.ACCESSIBILITY_SETTINGS";
    140 
    141     /**
    142      * Activity Action: Show settings to allow configuration of security and
    143      * location privacy.
    144      * <p>
    145      * In some cases, a matching Activity may not exist, so ensure you
    146      * safeguard against this.
    147      * <p>
    148      * Input: Nothing.
    149      * <p>
    150      * Output: Nothing.
    151      */
    152     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    153     public static final String ACTION_SECURITY_SETTINGS =
    154             "android.settings.SECURITY_SETTINGS";
    155 
    156     /**
    157      * Activity Action: Show settings to allow configuration of privacy options.
    158      * <p>
    159      * In some cases, a matching Activity may not exist, so ensure you
    160      * safeguard against this.
    161      * <p>
    162      * Input: Nothing.
    163      * <p>
    164      * Output: Nothing.
    165      */
    166     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    167     public static final String ACTION_PRIVACY_SETTINGS =
    168             "android.settings.PRIVACY_SETTINGS";
    169 
    170     /**
    171      * Activity Action: Show settings to allow configuration of Wi-Fi.
    172 
    173      * <p>
    174      * In some cases, a matching Activity may not exist, so ensure you
    175      * safeguard against this.
    176      * <p>
    177      * Input: Nothing.
    178      * <p>
    179      * Output: Nothing.
    180 
    181      */
    182     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    183     public static final String ACTION_WIFI_SETTINGS =
    184             "android.settings.WIFI_SETTINGS";
    185 
    186     /**
    187      * Activity Action: Show settings to allow configuration of a static IP
    188      * address for Wi-Fi.
    189      * <p>
    190      * In some cases, a matching Activity may not exist, so ensure you safeguard
    191      * against this.
    192      * <p>
    193      * Input: Nothing.
    194      * <p>
    195      * Output: Nothing.
    196      */
    197     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    198     public static final String ACTION_WIFI_IP_SETTINGS =
    199             "android.settings.WIFI_IP_SETTINGS";
    200 
    201     /**
    202      * Activity Action: Show settings to allow configuration of Bluetooth.
    203      * <p>
    204      * In some cases, a matching Activity may not exist, so ensure you
    205      * safeguard against this.
    206      * <p>
    207      * Input: Nothing.
    208      * <p>
    209      * Output: Nothing.
    210      */
    211     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    212     public static final String ACTION_BLUETOOTH_SETTINGS =
    213             "android.settings.BLUETOOTH_SETTINGS";
    214 
    215     /**
    216      * Activity Action: Show settings to allow configuration of date and time.
    217      * <p>
    218      * In some cases, a matching Activity may not exist, so ensure you
    219      * safeguard against this.
    220      * <p>
    221      * Input: Nothing.
    222      * <p>
    223      * Output: Nothing.
    224      */
    225     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    226     public static final String ACTION_DATE_SETTINGS =
    227             "android.settings.DATE_SETTINGS";
    228 
    229     /**
    230      * Activity Action: Show settings to allow configuration of sound and volume.
    231      * <p>
    232      * In some cases, a matching Activity may not exist, so ensure you
    233      * safeguard against this.
    234      * <p>
    235      * Input: Nothing.
    236      * <p>
    237      * Output: Nothing.
    238      */
    239     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    240     public static final String ACTION_SOUND_SETTINGS =
    241             "android.settings.SOUND_SETTINGS";
    242 
    243     /**
    244      * Activity Action: Show settings to allow configuration of display.
    245      * <p>
    246      * In some cases, a matching Activity may not exist, so ensure you
    247      * safeguard against this.
    248      * <p>
    249      * Input: Nothing.
    250      * <p>
    251      * Output: Nothing.
    252      */
    253     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    254     public static final String ACTION_DISPLAY_SETTINGS =
    255             "android.settings.DISPLAY_SETTINGS";
    256 
    257     /**
    258      * Activity Action: Show settings to allow configuration of locale.
    259      * <p>
    260      * In some cases, a matching Activity may not exist, so ensure you
    261      * safeguard against this.
    262      * <p>
    263      * Input: Nothing.
    264      * <p>
    265      * Output: Nothing.
    266      */
    267     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    268     public static final String ACTION_LOCALE_SETTINGS =
    269             "android.settings.LOCALE_SETTINGS";
    270 
    271     /**
    272      * Activity Action: Show settings to configure input methods, in particular
    273      * allowing the user to enable input methods.
    274      * <p>
    275      * In some cases, a matching Activity may not exist, so ensure you
    276      * safeguard against this.
    277      * <p>
    278      * Input: Nothing.
    279      * <p>
    280      * Output: Nothing.
    281      */
    282     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    283     public static final String ACTION_INPUT_METHOD_SETTINGS =
    284             "android.settings.INPUT_METHOD_SETTINGS";
    285 
    286     /**
    287      * Activity Action: Show settings to manage the user input dictionary.
    288      * <p>
    289      * In some cases, a matching Activity may not exist, so ensure you
    290      * safeguard against this.
    291      * <p>
    292      * Input: Nothing.
    293      * <p>
    294      * Output: Nothing.
    295      */
    296     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    297     public static final String ACTION_USER_DICTIONARY_SETTINGS =
    298             "android.settings.USER_DICTIONARY_SETTINGS";
    299 
    300     /**
    301      * Activity Action: Show settings to allow configuration of application-related settings.
    302      * <p>
    303      * In some cases, a matching Activity may not exist, so ensure you
    304      * safeguard against this.
    305      * <p>
    306      * Input: Nothing.
    307      * <p>
    308      * Output: Nothing.
    309      */
    310     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    311     public static final String ACTION_APPLICATION_SETTINGS =
    312             "android.settings.APPLICATION_SETTINGS";
    313 
    314     /**
    315      * Activity Action: Show settings to allow configuration of application
    316      * development-related settings.
    317      * <p>
    318      * In some cases, a matching Activity may not exist, so ensure you safeguard
    319      * against this.
    320      * <p>
    321      * Input: Nothing.
    322      * <p>
    323      * Output: Nothing.
    324      */
    325     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    326     public static final String ACTION_APPLICATION_DEVELOPMENT_SETTINGS =
    327             "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
    328 
    329     /**
    330      * Activity Action: Show settings to allow configuration of quick launch shortcuts.
    331      * <p>
    332      * In some cases, a matching Activity may not exist, so ensure you
    333      * safeguard against this.
    334      * <p>
    335      * Input: Nothing.
    336      * <p>
    337      * Output: Nothing.
    338      */
    339     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    340     public static final String ACTION_QUICK_LAUNCH_SETTINGS =
    341             "android.settings.QUICK_LAUNCH_SETTINGS";
    342 
    343     /**
    344      * Activity Action: Show settings to manage installed applications.
    345      * <p>
    346      * In some cases, a matching Activity may not exist, so ensure you
    347      * safeguard against this.
    348      * <p>
    349      * Input: Nothing.
    350      * <p>
    351      * Output: Nothing.
    352      */
    353     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    354     public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS =
    355             "android.settings.MANAGE_APPLICATIONS_SETTINGS";
    356 
    357     /**
    358      * Activity Action: Show settings for system update functionality.
    359      * <p>
    360      * In some cases, a matching Activity may not exist, so ensure you
    361      * safeguard against this.
    362      * <p>
    363      * Input: Nothing.
    364      * <p>
    365      * Output: Nothing.
    366      *
    367      * @hide
    368      */
    369     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    370     public static final String ACTION_SYSTEM_UPDATE_SETTINGS =
    371             "android.settings.SYSTEM_UPDATE_SETTINGS";
    372 
    373     /**
    374      * Activity Action: Show settings to allow configuration of sync settings.
    375      * <p>
    376      * In some cases, a matching Activity may not exist, so ensure you
    377      * safeguard against this.
    378      * <p>
    379      * The account types available to add via the add account button may be restricted by adding an
    380      * {@link #EXTRA_AUTHORITIES} extra to this Intent with one or more syncable content provider's
    381      * authorities. Only account types which can sync with that content provider will be offered to
    382      * the user.
    383      * <p>
    384      * Input: Nothing.
    385      * <p>
    386      * Output: Nothing.
    387      */
    388     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    389     public static final String ACTION_SYNC_SETTINGS =
    390             "android.settings.SYNC_SETTINGS";
    391 
    392     /**
    393      * Activity Action: Show add account screen for creating a new account.
    394      * <p>
    395      * In some cases, a matching Activity may not exist, so ensure you
    396      * safeguard against this.
    397      * <p>
    398      * The account types available to add may be restricted by adding an {@link #EXTRA_AUTHORITIES}
    399      * extra to the Intent with one or more syncable content provider's authorities.  Only account
    400      * types which can sync with that content provider will be offered to the user.
    401      * <p>
    402      * Input: Nothing.
    403      * <p>
    404      * Output: Nothing.
    405      */
    406     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    407     public static final String ACTION_ADD_ACCOUNT =
    408             "android.settings.ADD_ACCOUNT_SETTINGS";
    409 
    410     /**
    411      * Activity Action: Show settings for selecting the network operator.
    412      * <p>
    413      * In some cases, a matching Activity may not exist, so ensure you
    414      * safeguard against this.
    415      * <p>
    416      * Input: Nothing.
    417      * <p>
    418      * Output: Nothing.
    419      */
    420     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    421     public static final String ACTION_NETWORK_OPERATOR_SETTINGS =
    422             "android.settings.NETWORK_OPERATOR_SETTINGS";
    423 
    424     /**
    425      * Activity Action: Show settings for selection of 2G/3G.
    426      * <p>
    427      * In some cases, a matching Activity may not exist, so ensure you
    428      * safeguard against this.
    429      * <p>
    430      * Input: Nothing.
    431      * <p>
    432      * Output: Nothing.
    433      */
    434     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    435     public static final String ACTION_DATA_ROAMING_SETTINGS =
    436             "android.settings.DATA_ROAMING_SETTINGS";
    437 
    438     /**
    439      * Activity Action: Show settings for internal storage.
    440      * <p>
    441      * In some cases, a matching Activity may not exist, so ensure you
    442      * safeguard against this.
    443      * <p>
    444      * Input: Nothing.
    445      * <p>
    446      * Output: Nothing.
    447      */
    448     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    449     public static final String ACTION_INTERNAL_STORAGE_SETTINGS =
    450             "android.settings.INTERNAL_STORAGE_SETTINGS";
    451     /**
    452      * Activity Action: Show settings for memory card storage.
    453      * <p>
    454      * In some cases, a matching Activity may not exist, so ensure you
    455      * safeguard against this.
    456      * <p>
    457      * Input: Nothing.
    458      * <p>
    459      * Output: Nothing.
    460      */
    461     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    462     public static final String ACTION_MEMORY_CARD_SETTINGS =
    463             "android.settings.MEMORY_CARD_SETTINGS";
    464 
    465     /**
    466      * Activity Action: Show settings for global search.
    467      * <p>
    468      * In some cases, a matching Activity may not exist, so ensure you
    469      * safeguard against this.
    470      * <p>
    471      * Input: Nothing.
    472      * <p>
    473      * Output: Nothing
    474      */
    475     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    476     public static final String ACTION_SEARCH_SETTINGS =
    477         "android.search.action.SEARCH_SETTINGS";
    478 
    479     /**
    480      * Activity Action: Show general device information settings (serial
    481      * number, software version, phone number, etc.).
    482      * <p>
    483      * In some cases, a matching Activity may not exist, so ensure you
    484      * safeguard against this.
    485      * <p>
    486      * Input: Nothing.
    487      * <p>
    488      * Output: Nothing
    489      */
    490     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    491     public static final String ACTION_DEVICE_INFO_SETTINGS =
    492         "android.settings.DEVICE_INFO_SETTINGS";
    493 
    494     // End of Intent actions for Settings
    495 
    496     /**
    497      * @hide - Private call() method on SettingsProvider to read from 'system' table.
    498      */
    499     public static final String CALL_METHOD_GET_SYSTEM = "GET_system";
    500 
    501     /**
    502      * @hide - Private call() method on SettingsProvider to read from 'secure' table.
    503      */
    504     public static final String CALL_METHOD_GET_SECURE = "GET_secure";
    505 
    506     /**
    507      * Activity Extra: Limit available options in launched activity based on the given authority.
    508      * <p>
    509      * This can be passed as an extra field in an Activity Intent with one or more syncable content
    510      * provider's authorities as a String[]. This field is used by some intents to alter the
    511      * behavior of the called activity.
    512      * <p>
    513      * Example: The {@link #ACTION_ADD_ACCOUNT} intent restricts the account types available based
    514      * on the authority given.
    515      */
    516     public static final String EXTRA_AUTHORITIES =
    517             "authorities";
    518 
    519     private static final String JID_RESOURCE_PREFIX = "android";
    520 
    521     public static final String AUTHORITY = "settings";
    522 
    523     private static final String TAG = "Settings";
    524     private static final boolean LOCAL_LOGV = Config.LOGV || false;
    525 
    526     public static class SettingNotFoundException extends AndroidException {
    527         public SettingNotFoundException(String msg) {
    528             super(msg);
    529         }
    530     }
    531 
    532     /**
    533      * Common base for tables of name/value settings.
    534      */
    535     public static class NameValueTable implements BaseColumns {
    536         public static final String NAME = "name";
    537         public static final String VALUE = "value";
    538 
    539         protected static boolean putString(ContentResolver resolver, Uri uri,
    540                 String name, String value) {
    541             // The database will take care of replacing duplicates.
    542             try {
    543                 ContentValues values = new ContentValues();
    544                 values.put(NAME, name);
    545                 values.put(VALUE, value);
    546                 resolver.insert(uri, values);
    547                 return true;
    548             } catch (SQLException e) {
    549                 Log.w(TAG, "Can't set key " + name + " in " + uri, e);
    550                 return false;
    551             }
    552         }
    553 
    554         public static Uri getUriFor(Uri uri, String name) {
    555             return Uri.withAppendedPath(uri, name);
    556         }
    557     }
    558 
    559     // Thread-safe.
    560     private static class NameValueCache {
    561         private final String mVersionSystemProperty;
    562         private final Uri mUri;
    563 
    564         private static final String[] SELECT_VALUE =
    565             new String[] { Settings.NameValueTable.VALUE };
    566         private static final String NAME_EQ_PLACEHOLDER = "name=?";
    567 
    568         // Must synchronize on 'this' to access mValues and mValuesVersion.
    569         private final HashMap<String, String> mValues = new HashMap<String, String>();
    570         private long mValuesVersion = 0;
    571 
    572         // Initially null; set lazily and held forever.  Synchronized on 'this'.
    573         private IContentProvider mContentProvider = null;
    574 
    575         // The method we'll call (or null, to not use) on the provider
    576         // for the fast path of retrieving settings.
    577         private final String mCallCommand;
    578 
    579         public NameValueCache(String versionSystemProperty, Uri uri, String callCommand) {
    580             mVersionSystemProperty = versionSystemProperty;
    581             mUri = uri;
    582             mCallCommand = callCommand;
    583         }
    584 
    585         public String getString(ContentResolver cr, String name) {
    586             long newValuesVersion = SystemProperties.getLong(mVersionSystemProperty, 0);
    587 
    588             synchronized (this) {
    589                 if (mValuesVersion != newValuesVersion) {
    590                     if (LOCAL_LOGV) {
    591                         Log.v(TAG, "invalidate [" + mUri.getLastPathSegment() + "]: current " +
    592                                 newValuesVersion + " != cached " + mValuesVersion);
    593                     }
    594 
    595                     mValues.clear();
    596                     mValuesVersion = newValuesVersion;
    597                 }
    598 
    599                 if (mValues.containsKey(name)) {
    600                     return mValues.get(name);  // Could be null, that's OK -- negative caching
    601                 }
    602             }
    603 
    604             IContentProvider cp = null;
    605             synchronized (this) {
    606                 cp = mContentProvider;
    607                 if (cp == null) {
    608                     cp = mContentProvider = cr.acquireProvider(mUri.getAuthority());
    609                 }
    610             }
    611 
    612             // Try the fast path first, not using query().  If this
    613             // fails (alternate Settings provider that doesn't support
    614             // this interface?) then we fall back to the query/table
    615             // interface.
    616             if (mCallCommand != null) {
    617                 try {
    618                     Bundle b = cp.call(mCallCommand, name, null);
    619                     if (b != null) {
    620                         String value = b.getPairValue();
    621                         synchronized (this) {
    622                             mValues.put(name, value);
    623                         }
    624                         return value;
    625                     }
    626                     // If the response Bundle is null, we fall through
    627                     // to the query interface below.
    628                 } catch (RemoteException e) {
    629                     // Not supported by the remote side?  Fall through
    630                     // to query().
    631                 }
    632             }
    633 
    634             Cursor c = null;
    635             try {
    636                 c = cp.query(mUri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
    637                              new String[]{name}, null);
    638                 if (c == null) {
    639                     Log.w(TAG, "Can't get key " + name + " from " + mUri);
    640                     return null;
    641                 }
    642 
    643                 String value = c.moveToNext() ? c.getString(0) : null;
    644                 synchronized (this) {
    645                     mValues.put(name, value);
    646                 }
    647                 if (LOCAL_LOGV) {
    648                     Log.v(TAG, "cache miss [" + mUri.getLastPathSegment() + "]: " +
    649                             name + " = " + (value == null ? "(null)" : value));
    650                 }
    651                 return value;
    652             } catch (RemoteException e) {
    653                 Log.w(TAG, "Can't get key " + name + " from " + mUri, e);
    654                 return null;  // Return null, but don't cache it.
    655             } finally {
    656                 if (c != null) c.close();
    657             }
    658         }
    659     }
    660 
    661     /**
    662      * System settings, containing miscellaneous system preferences.  This
    663      * table holds simple name/value pairs.  There are convenience
    664      * functions for accessing individual settings entries.
    665      */
    666     public static final class System extends NameValueTable {
    667         public static final String SYS_PROP_SETTING_VERSION = "sys.settings_system_version";
    668 
    669         // Populated lazily, guarded by class object:
    670         private static NameValueCache sNameValueCache = null;
    671 
    672         private static final HashSet<String> MOVED_TO_SECURE;
    673         static {
    674             MOVED_TO_SECURE = new HashSet<String>(30);
    675             MOVED_TO_SECURE.add(Secure.ADB_ENABLED);
    676             MOVED_TO_SECURE.add(Secure.ANDROID_ID);
    677             MOVED_TO_SECURE.add(Secure.BLUETOOTH_ON);
    678             MOVED_TO_SECURE.add(Secure.DATA_ROAMING);
    679             MOVED_TO_SECURE.add(Secure.DEVICE_PROVISIONED);
    680             MOVED_TO_SECURE.add(Secure.HTTP_PROXY);
    681             MOVED_TO_SECURE.add(Secure.INSTALL_NON_MARKET_APPS);
    682             MOVED_TO_SECURE.add(Secure.LOCATION_PROVIDERS_ALLOWED);
    683             MOVED_TO_SECURE.add(Secure.LOCK_PATTERN_ENABLED);
    684             MOVED_TO_SECURE.add(Secure.LOCK_PATTERN_VISIBLE);
    685             MOVED_TO_SECURE.add(Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED);
    686             MOVED_TO_SECURE.add(Secure.LOGGING_ID);
    687             MOVED_TO_SECURE.add(Secure.PARENTAL_CONTROL_ENABLED);
    688             MOVED_TO_SECURE.add(Secure.PARENTAL_CONTROL_LAST_UPDATE);
    689             MOVED_TO_SECURE.add(Secure.PARENTAL_CONTROL_REDIRECT_URL);
    690             MOVED_TO_SECURE.add(Secure.SETTINGS_CLASSNAME);
    691             MOVED_TO_SECURE.add(Secure.USB_MASS_STORAGE_ENABLED);
    692             MOVED_TO_SECURE.add(Secure.USE_GOOGLE_MAIL);
    693             MOVED_TO_SECURE.add(Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON);
    694             MOVED_TO_SECURE.add(Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY);
    695             MOVED_TO_SECURE.add(Secure.WIFI_NUM_OPEN_NETWORKS_KEPT);
    696             MOVED_TO_SECURE.add(Secure.WIFI_ON);
    697             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE);
    698             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_AP_COUNT);
    699             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS);
    700             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED);
    701             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS);
    702             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT);
    703             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_MAX_AP_CHECKS);
    704             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_ON);
    705             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_COUNT);
    706             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_DELAY_MS);
    707             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS);
    708         }
    709 
    710         /**
    711          * Look up a name in the database.
    712          * @param resolver to access the database with
    713          * @param name to look up in the table
    714          * @return the corresponding value, or null if not present
    715          */
    716         public synchronized static String getString(ContentResolver resolver, String name) {
    717             if (MOVED_TO_SECURE.contains(name)) {
    718                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
    719                         + " to android.provider.Settings.Secure, returning read-only value.");
    720                 return Secure.getString(resolver, name);
    721             }
    722             if (sNameValueCache == null) {
    723                 sNameValueCache = new NameValueCache(SYS_PROP_SETTING_VERSION, CONTENT_URI,
    724                                                      CALL_METHOD_GET_SYSTEM);
    725             }
    726             return sNameValueCache.getString(resolver, name);
    727         }
    728 
    729         /**
    730          * Store a name/value pair into the database.
    731          * @param resolver to access the database with
    732          * @param name to store
    733          * @param value to associate with the name
    734          * @return true if the value was set, false on database errors
    735          */
    736         public static boolean putString(ContentResolver resolver, String name, String value) {
    737             if (MOVED_TO_SECURE.contains(name)) {
    738                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
    739                         + " to android.provider.Settings.Secure, value is unchanged.");
    740                 return false;
    741             }
    742             return putString(resolver, CONTENT_URI, name, value);
    743         }
    744 
    745         /**
    746          * Construct the content URI for a particular name/value pair,
    747          * useful for monitoring changes with a ContentObserver.
    748          * @param name to look up in the table
    749          * @return the corresponding content URI, or null if not present
    750          */
    751         public static Uri getUriFor(String name) {
    752             if (MOVED_TO_SECURE.contains(name)) {
    753                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
    754                     + " to android.provider.Settings.Secure, returning Secure URI.");
    755                 return Secure.getUriFor(Secure.CONTENT_URI, name);
    756             }
    757             return getUriFor(CONTENT_URI, name);
    758         }
    759 
    760         /**
    761          * Convenience function for retrieving a single system settings value
    762          * as an integer.  Note that internally setting values are always
    763          * stored as strings; this function converts the string to an integer
    764          * for you.  The default value will be returned if the setting is
    765          * not defined or not an integer.
    766          *
    767          * @param cr The ContentResolver to access.
    768          * @param name The name of the setting to retrieve.
    769          * @param def Value to return if the setting is not defined.
    770          *
    771          * @return The setting's current value, or 'def' if it is not defined
    772          * or not a valid integer.
    773          */
    774         public static int getInt(ContentResolver cr, String name, int def) {
    775             String v = getString(cr, name);
    776             try {
    777                 return v != null ? Integer.parseInt(v) : def;
    778             } catch (NumberFormatException e) {
    779                 return def;
    780             }
    781         }
    782 
    783         /**
    784          * Convenience function for retrieving a single system settings value
    785          * as an integer.  Note that internally setting values are always
    786          * stored as strings; this function converts the string to an integer
    787          * for you.
    788          * <p>
    789          * This version does not take a default value.  If the setting has not
    790          * been set, or the string value is not a number,
    791          * it throws {@link SettingNotFoundException}.
    792          *
    793          * @param cr The ContentResolver to access.
    794          * @param name The name of the setting to retrieve.
    795          *
    796          * @throws SettingNotFoundException Thrown if a setting by the given
    797          * name can't be found or the setting value is not an integer.
    798          *
    799          * @return The setting's current value.
    800          */
    801         public static int getInt(ContentResolver cr, String name)
    802                 throws SettingNotFoundException {
    803             String v = getString(cr, name);
    804             try {
    805                 return Integer.parseInt(v);
    806             } catch (NumberFormatException e) {
    807                 throw new SettingNotFoundException(name);
    808             }
    809         }
    810 
    811         /**
    812          * Convenience function for updating a single settings value as an
    813          * integer. This will either create a new entry in the table if the
    814          * given name does not exist, or modify the value of the existing row
    815          * with that name.  Note that internally setting values are always
    816          * stored as strings, so this function converts the given value to a
    817          * string before storing it.
    818          *
    819          * @param cr The ContentResolver to access.
    820          * @param name The name of the setting to modify.
    821          * @param value The new value for the setting.
    822          * @return true if the value was set, false on database errors
    823          */
    824         public static boolean putInt(ContentResolver cr, String name, int value) {
    825             return putString(cr, name, Integer.toString(value));
    826         }
    827 
    828         /**
    829          * Convenience function for retrieving a single system settings value
    830          * as a {@code long}.  Note that internally setting values are always
    831          * stored as strings; this function converts the string to a {@code long}
    832          * for you.  The default value will be returned if the setting is
    833          * not defined or not a {@code long}.
    834          *
    835          * @param cr The ContentResolver to access.
    836          * @param name The name of the setting to retrieve.
    837          * @param def Value to return if the setting is not defined.
    838          *
    839          * @return The setting's current value, or 'def' if it is not defined
    840          * or not a valid {@code long}.
    841          */
    842         public static long getLong(ContentResolver cr, String name, long def) {
    843             String valString = getString(cr, name);
    844             long value;
    845             try {
    846                 value = valString != null ? Long.parseLong(valString) : def;
    847             } catch (NumberFormatException e) {
    848                 value = def;
    849             }
    850             return value;
    851         }
    852 
    853         /**
    854          * Convenience function for retrieving a single system settings value
    855          * as a {@code long}.  Note that internally setting values are always
    856          * stored as strings; this function converts the string to a {@code long}
    857          * for you.
    858          * <p>
    859          * This version does not take a default value.  If the setting has not
    860          * been set, or the string value is not a number,
    861          * it throws {@link SettingNotFoundException}.
    862          *
    863          * @param cr The ContentResolver to access.
    864          * @param name The name of the setting to retrieve.
    865          *
    866          * @return The setting's current value.
    867          * @throws SettingNotFoundException Thrown if a setting by the given
    868          * name can't be found or the setting value is not an integer.
    869          */
    870         public static long getLong(ContentResolver cr, String name)
    871                 throws SettingNotFoundException {
    872             String valString = getString(cr, name);
    873             try {
    874                 return Long.parseLong(valString);
    875             } catch (NumberFormatException e) {
    876                 throw new SettingNotFoundException(name);
    877             }
    878         }
    879 
    880         /**
    881          * Convenience function for updating a single settings value as a long
    882          * integer. This will either create a new entry in the table if the
    883          * given name does not exist, or modify the value of the existing row
    884          * with that name.  Note that internally setting values are always
    885          * stored as strings, so this function converts the given value to a
    886          * string before storing it.
    887          *
    888          * @param cr The ContentResolver to access.
    889          * @param name The name of the setting to modify.
    890          * @param value The new value for the setting.
    891          * @return true if the value was set, false on database errors
    892          */
    893         public static boolean putLong(ContentResolver cr, String name, long value) {
    894             return putString(cr, name, Long.toString(value));
    895         }
    896 
    897         /**
    898          * Convenience function for retrieving a single system settings value
    899          * as a floating point number.  Note that internally setting values are
    900          * always stored as strings; this function converts the string to an
    901          * float for you. The default value will be returned if the setting
    902          * is not defined or not a valid float.
    903          *
    904          * @param cr The ContentResolver to access.
    905          * @param name The name of the setting to retrieve.
    906          * @param def Value to return if the setting is not defined.
    907          *
    908          * @return The setting's current value, or 'def' if it is not defined
    909          * or not a valid float.
    910          */
    911         public static float getFloat(ContentResolver cr, String name, float def) {
    912             String v = getString(cr, name);
    913             try {
    914                 return v != null ? Float.parseFloat(v) : def;
    915             } catch (NumberFormatException e) {
    916                 return def;
    917             }
    918         }
    919 
    920         /**
    921          * Convenience function for retrieving a single system settings value
    922          * as a float.  Note that internally setting values are always
    923          * stored as strings; this function converts the string to a float
    924          * for you.
    925          * <p>
    926          * This version does not take a default value.  If the setting has not
    927          * been set, or the string value is not a number,
    928          * it throws {@link SettingNotFoundException}.
    929          *
    930          * @param cr The ContentResolver to access.
    931          * @param name The name of the setting to retrieve.
    932          *
    933          * @throws SettingNotFoundException Thrown if a setting by the given
    934          * name can't be found or the setting value is not a float.
    935          *
    936          * @return The setting's current value.
    937          */
    938         public static float getFloat(ContentResolver cr, String name)
    939                 throws SettingNotFoundException {
    940             String v = getString(cr, name);
    941             try {
    942                 return Float.parseFloat(v);
    943             } catch (NumberFormatException e) {
    944                 throw new SettingNotFoundException(name);
    945             }
    946         }
    947 
    948         /**
    949          * Convenience function for updating a single settings value as a
    950          * floating point number. This will either create a new entry in the
    951          * table if the given name does not exist, or modify the value of the
    952          * existing row with that name.  Note that internally setting values
    953          * are always stored as strings, so this function converts the given
    954          * value to a string before storing it.
    955          *
    956          * @param cr The ContentResolver to access.
    957          * @param name The name of the setting to modify.
    958          * @param value The new value for the setting.
    959          * @return true if the value was set, false on database errors
    960          */
    961         public static boolean putFloat(ContentResolver cr, String name, float value) {
    962             return putString(cr, name, Float.toString(value));
    963         }
    964 
    965         /**
    966          * Convenience function to read all of the current
    967          * configuration-related settings into a
    968          * {@link Configuration} object.
    969          *
    970          * @param cr The ContentResolver to access.
    971          * @param outConfig Where to place the configuration settings.
    972          */
    973         public static void getConfiguration(ContentResolver cr, Configuration outConfig) {
    974             outConfig.fontScale = Settings.System.getFloat(
    975                 cr, FONT_SCALE, outConfig.fontScale);
    976             if (outConfig.fontScale < 0) {
    977                 outConfig.fontScale = 1;
    978             }
    979         }
    980 
    981         /**
    982          * Convenience function to write a batch of configuration-related
    983          * settings from a {@link Configuration} object.
    984          *
    985          * @param cr The ContentResolver to access.
    986          * @param config The settings to write.
    987          * @return true if the values were set, false on database errors
    988          */
    989         public static boolean putConfiguration(ContentResolver cr, Configuration config) {
    990             return Settings.System.putFloat(cr, FONT_SCALE, config.fontScale);
    991         }
    992 
    993         /** @hide */
    994         public static boolean hasInterestingConfigurationChanges(int changes) {
    995             return (changes&ActivityInfo.CONFIG_FONT_SCALE) != 0;
    996         }
    997 
    998         public static boolean getShowGTalkServiceStatus(ContentResolver cr) {
    999             return getInt(cr, SHOW_GTALK_SERVICE_STATUS, 0) != 0;
   1000         }
   1001 
   1002         public static void setShowGTalkServiceStatus(ContentResolver cr, boolean flag) {
   1003             putInt(cr, SHOW_GTALK_SERVICE_STATUS, flag ? 1 : 0);
   1004         }
   1005 
   1006         /**
   1007          * The content:// style URL for this table
   1008          */
   1009         public static final Uri CONTENT_URI =
   1010             Uri.parse("content://" + AUTHORITY + "/system");
   1011 
   1012         /**
   1013          * Whether we keep the device on while the device is plugged in.
   1014          * Supported values are:
   1015          * <ul>
   1016          * <li>{@code 0} to never stay on while plugged in</li>
   1017          * <li>{@link BatteryManager#BATTERY_PLUGGED_AC} to stay on for AC charger</li>
   1018          * <li>{@link BatteryManager#BATTERY_PLUGGED_USB} to stay on for USB charger</li>
   1019          * </ul>
   1020          * These values can be OR-ed together.
   1021          */
   1022         public static final String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
   1023 
   1024         /**
   1025          * What happens when the user presses the end call button if they're not
   1026          * on a call.<br/>
   1027          * <b>Values:</b><br/>
   1028          * 0 - The end button does nothing.<br/>
   1029          * 1 - The end button goes to the home screen.<br/>
   1030          * 2 - The end button puts the device to sleep and locks the keyguard.<br/>
   1031          * 3 - The end button goes to the home screen.  If the user is already on the
   1032          * home screen, it puts the device to sleep.
   1033          */
   1034         public static final String END_BUTTON_BEHAVIOR = "end_button_behavior";
   1035 
   1036         /**
   1037          * END_BUTTON_BEHAVIOR value for "go home".
   1038          * @hide
   1039          */
   1040         public static final int END_BUTTON_BEHAVIOR_HOME = 0x1;
   1041 
   1042         /**
   1043          * END_BUTTON_BEHAVIOR value for "go to sleep".
   1044          * @hide
   1045          */
   1046         public static final int END_BUTTON_BEHAVIOR_SLEEP = 0x2;
   1047 
   1048         /**
   1049          * END_BUTTON_BEHAVIOR default value.
   1050          * @hide
   1051          */
   1052         public static final int END_BUTTON_BEHAVIOR_DEFAULT = END_BUTTON_BEHAVIOR_SLEEP;
   1053 
   1054         /**
   1055          * Whether Airplane Mode is on.
   1056          */
   1057         public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
   1058 
   1059         /**
   1060          * Constant for use in AIRPLANE_MODE_RADIOS to specify Bluetooth radio.
   1061          */
   1062         public static final String RADIO_BLUETOOTH = "bluetooth";
   1063 
   1064         /**
   1065          * Constant for use in AIRPLANE_MODE_RADIOS to specify Wi-Fi radio.
   1066          */
   1067         public static final String RADIO_WIFI = "wifi";
   1068 
   1069         /**
   1070          * Constant for use in AIRPLANE_MODE_RADIOS to specify Cellular radio.
   1071          */
   1072         public static final String RADIO_CELL = "cell";
   1073 
   1074         /**
   1075          * A comma separated list of radios that need to be disabled when airplane mode
   1076          * is on. This overrides WIFI_ON and BLUETOOTH_ON, if Wi-Fi and bluetooth are
   1077          * included in the comma separated list.
   1078          */
   1079         public static final String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
   1080 
   1081         /**
   1082          * A comma separated list of radios that should to be disabled when airplane mode
   1083          * is on, but can be manually reenabled by the user.  For example, if RADIO_WIFI is
   1084          * added to both AIRPLANE_MODE_RADIOS and AIRPLANE_MODE_TOGGLEABLE_RADIOS, then Wifi
   1085          * will be turned off when entering airplane mode, but the user will be able to reenable
   1086          * Wifi in the Settings app.
   1087          *
   1088          * {@hide}
   1089          */
   1090         public static final String AIRPLANE_MODE_TOGGLEABLE_RADIOS = "airplane_mode_toggleable_radios";
   1091 
   1092         /**
   1093          * The policy for deciding when Wi-Fi should go to sleep (which will in
   1094          * turn switch to using the mobile data as an Internet connection).
   1095          * <p>
   1096          * Set to one of {@link #WIFI_SLEEP_POLICY_DEFAULT},
   1097          * {@link #WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED}, or
   1098          * {@link #WIFI_SLEEP_POLICY_NEVER}.
   1099          */
   1100         public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
   1101 
   1102         /**
   1103          * Value for {@link #WIFI_SLEEP_POLICY} to use the default Wi-Fi sleep
   1104          * policy, which is to sleep shortly after the turning off
   1105          * according to the {@link #STAY_ON_WHILE_PLUGGED_IN} setting.
   1106          */
   1107         public static final int WIFI_SLEEP_POLICY_DEFAULT = 0;
   1108 
   1109         /**
   1110          * Value for {@link #WIFI_SLEEP_POLICY} to use the default policy when
   1111          * the device is on battery, and never go to sleep when the device is
   1112          * plugged in.
   1113          */
   1114         public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1;
   1115 
   1116         /**
   1117          * Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep.
   1118          */
   1119         public static final int WIFI_SLEEP_POLICY_NEVER = 2;
   1120 
   1121         /**
   1122          * Whether to use static IP and other static network attributes.
   1123          * <p>
   1124          * Set to 1 for true and 0 for false.
   1125          */
   1126         public static final String WIFI_USE_STATIC_IP = "wifi_use_static_ip";
   1127 
   1128         /**
   1129          * The static IP address.
   1130          * <p>
   1131          * Example: "192.168.1.51"
   1132          */
   1133         public static final String WIFI_STATIC_IP = "wifi_static_ip";
   1134 
   1135         /**
   1136          * If using static IP, the gateway's IP address.
   1137          * <p>
   1138          * Example: "192.168.1.1"
   1139          */
   1140         public static final String WIFI_STATIC_GATEWAY = "wifi_static_gateway";
   1141 
   1142         /**
   1143          * If using static IP, the net mask.
   1144          * <p>
   1145          * Example: "255.255.255.0"
   1146          */
   1147         public static final String WIFI_STATIC_NETMASK = "wifi_static_netmask";
   1148 
   1149         /**
   1150          * If using static IP, the primary DNS's IP address.
   1151          * <p>
   1152          * Example: "192.168.1.1"
   1153          */
   1154         public static final String WIFI_STATIC_DNS1 = "wifi_static_dns1";
   1155 
   1156         /**
   1157          * If using static IP, the secondary DNS's IP address.
   1158          * <p>
   1159          * Example: "192.168.1.2"
   1160          */
   1161         public static final String WIFI_STATIC_DNS2 = "wifi_static_dns2";
   1162 
   1163         /**
   1164          * The number of radio channels that are allowed in the local
   1165          * 802.11 regulatory domain.
   1166          * @hide
   1167          */
   1168         public static final String WIFI_NUM_ALLOWED_CHANNELS = "wifi_num_allowed_channels";
   1169 
   1170         /**
   1171          * Determines whether remote devices may discover and/or connect to
   1172          * this device.
   1173          * <P>Type: INT</P>
   1174          * 2 -- discoverable and connectable
   1175          * 1 -- connectable but not discoverable
   1176          * 0 -- neither connectable nor discoverable
   1177          */
   1178         public static final String BLUETOOTH_DISCOVERABILITY =
   1179             "bluetooth_discoverability";
   1180 
   1181         /**
   1182          * Bluetooth discoverability timeout.  If this value is nonzero, then
   1183          * Bluetooth becomes discoverable for a certain number of seconds,
   1184          * after which is becomes simply connectable.  The value is in seconds.
   1185          */
   1186         public static final String BLUETOOTH_DISCOVERABILITY_TIMEOUT =
   1187             "bluetooth_discoverability_timeout";
   1188 
   1189         /**
   1190          * @deprecated Use {@link android.provider.Settings.Secure#LOCK_PATTERN_ENABLED}
   1191          * instead
   1192          */
   1193         @Deprecated
   1194         public static final String LOCK_PATTERN_ENABLED = Secure.LOCK_PATTERN_ENABLED;
   1195 
   1196         /**
   1197          * @deprecated Use {@link android.provider.Settings.Secure#LOCK_PATTERN_VISIBLE}
   1198          * instead
   1199          */
   1200         @Deprecated
   1201         public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
   1202 
   1203         /**
   1204          * @deprecated Use
   1205          * {@link android.provider.Settings.Secure#LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED}
   1206          * instead
   1207          */
   1208         @Deprecated
   1209         public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED =
   1210             "lock_pattern_tactile_feedback_enabled";
   1211 
   1212 
   1213         /**
   1214          * A formatted string of the next alarm that is set, or the empty string
   1215          * if there is no alarm set.
   1216          */
   1217         public static final String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
   1218 
   1219         /**
   1220          * Scaling factor for fonts, float.
   1221          */
   1222         public static final String FONT_SCALE = "font_scale";
   1223 
   1224         /**
   1225          * Name of an application package to be debugged.
   1226          */
   1227         public static final String DEBUG_APP = "debug_app";
   1228 
   1229         /**
   1230          * If 1, when launching DEBUG_APP it will wait for the debugger before
   1231          * starting user code.  If 0, it will run normally.
   1232          */
   1233         public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
   1234 
   1235         /**
   1236          * Whether or not to dim the screen. 0=no  1=yes
   1237          */
   1238         public static final String DIM_SCREEN = "dim_screen";
   1239 
   1240         /**
   1241          * The timeout before the screen turns off.
   1242          */
   1243         public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
   1244 
   1245         /**
   1246          * If 0, the compatibility mode is off for all applications.
   1247          * If 1, older applications run under compatibility mode.
   1248          * TODO: remove this settings before code freeze (bug/1907571)
   1249          * @hide
   1250          */
   1251         public static final String COMPATIBILITY_MODE = "compatibility_mode";
   1252 
   1253         /**
   1254          * The screen backlight brightness between 0 and 255.
   1255          */
   1256         public static final String SCREEN_BRIGHTNESS = "screen_brightness";
   1257 
   1258         /**
   1259          * Control whether to enable automatic brightness mode.
   1260          */
   1261         public static final String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
   1262 
   1263         /**
   1264          * SCREEN_BRIGHTNESS_MODE value for manual mode.
   1265          */
   1266         public static final int SCREEN_BRIGHTNESS_MODE_MANUAL = 0;
   1267 
   1268         /**
   1269          * SCREEN_BRIGHTNESS_MODE value for manual mode.
   1270          */
   1271         public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1;
   1272 
   1273         /**
   1274          * Control whether the process CPU usage meter should be shown.
   1275          */
   1276         public static final String SHOW_PROCESSES = "show_processes";
   1277 
   1278         /**
   1279          * If 1, the activity manager will aggressively finish activities and
   1280          * processes as soon as they are no longer needed.  If 0, the normal
   1281          * extended lifetime is used.
   1282          */
   1283         public static final String ALWAYS_FINISH_ACTIVITIES =
   1284                 "always_finish_activities";
   1285 
   1286 
   1287         /**
   1288          * Ringer mode. This is used internally, changing this value will not
   1289          * change the ringer mode. See AudioManager.
   1290          */
   1291         public static final String MODE_RINGER = "mode_ringer";
   1292 
   1293         /**
   1294          * Determines which streams are affected by ringer mode changes. The
   1295          * stream type's bit should be set to 1 if it should be muted when going
   1296          * into an inaudible ringer mode.
   1297          */
   1298         public static final String MODE_RINGER_STREAMS_AFFECTED = "mode_ringer_streams_affected";
   1299 
   1300          /**
   1301           * Determines which streams are affected by mute. The
   1302           * stream type's bit should be set to 1 if it should be muted when a mute request
   1303           * is received.
   1304           */
   1305          public static final String MUTE_STREAMS_AFFECTED = "mute_streams_affected";
   1306 
   1307         /**
   1308          * Whether vibrate is on for different events. This is used internally,
   1309          * changing this value will not change the vibrate. See AudioManager.
   1310          */
   1311         public static final String VIBRATE_ON = "vibrate_on";
   1312 
   1313         /**
   1314          * Ringer volume. This is used internally, changing this value will not
   1315          * change the volume. See AudioManager.
   1316          */
   1317         public static final String VOLUME_RING = "volume_ring";
   1318 
   1319         /**
   1320          * System/notifications volume. This is used internally, changing this
   1321          * value will not change the volume. See AudioManager.
   1322          */
   1323         public static final String VOLUME_SYSTEM = "volume_system";
   1324 
   1325         /**
   1326          * Voice call volume. This is used internally, changing this value will
   1327          * not change the volume. See AudioManager.
   1328          */
   1329         public static final String VOLUME_VOICE = "volume_voice";
   1330 
   1331         /**
   1332          * Music/media/gaming volume. This is used internally, changing this
   1333          * value will not change the volume. See AudioManager.
   1334          */
   1335         public static final String VOLUME_MUSIC = "volume_music";
   1336 
   1337         /**
   1338          * Alarm volume. This is used internally, changing this
   1339          * value will not change the volume. See AudioManager.
   1340          */
   1341         public static final String VOLUME_ALARM = "volume_alarm";
   1342 
   1343         /**
   1344          * Notification volume. This is used internally, changing this
   1345          * value will not change the volume. See AudioManager.
   1346          */
   1347         public static final String VOLUME_NOTIFICATION = "volume_notification";
   1348 
   1349         /**
   1350          * Bluetooth Headset volume. This is used internally, changing this value will
   1351          * not change the volume. See AudioManager.
   1352          */
   1353         public static final String VOLUME_BLUETOOTH_SCO = "volume_bluetooth_sco";
   1354 
   1355         /**
   1356          * Whether the notifications should use the ring volume (value of 1) or
   1357          * a separate notification volume (value of 0). In most cases, users
   1358          * will have this enabled so the notification and ringer volumes will be
   1359          * the same. However, power users can disable this and use the separate
   1360          * notification volume control.
   1361          * <p>
   1362          * Note: This is a one-off setting that will be removed in the future
   1363          * when there is profile support. For this reason, it is kept hidden
   1364          * from the public APIs.
   1365          *
   1366          * @hide
   1367          */
   1368         public static final String NOTIFICATIONS_USE_RING_VOLUME =
   1369             "notifications_use_ring_volume";
   1370 
   1371         /**
   1372          * Whether silent mode should allow vibration feedback. This is used
   1373          * internally in AudioService and the Sound settings activity to
   1374          * coordinate decoupling of vibrate and silent modes. This setting
   1375          * will likely be removed in a future release with support for
   1376          * audio/vibe feedback profiles.
   1377          *
   1378          * @hide
   1379          */
   1380         public static final String VIBRATE_IN_SILENT = "vibrate_in_silent";
   1381 
   1382         /**
   1383          * The mapping of stream type (integer) to its setting.
   1384          */
   1385         public static final String[] VOLUME_SETTINGS = {
   1386             VOLUME_VOICE, VOLUME_SYSTEM, VOLUME_RING, VOLUME_MUSIC,
   1387             VOLUME_ALARM, VOLUME_NOTIFICATION, VOLUME_BLUETOOTH_SCO
   1388         };
   1389 
   1390         /**
   1391          * Appended to various volume related settings to record the previous
   1392          * values before they the settings were affected by a silent/vibrate
   1393          * ringer mode change.
   1394          */
   1395         public static final String APPEND_FOR_LAST_AUDIBLE = "_last_audible";
   1396 
   1397         /**
   1398          * Persistent store for the system-wide default ringtone URI.
   1399          * <p>
   1400          * If you need to play the default ringtone at any given time, it is recommended
   1401          * you give {@link #DEFAULT_RINGTONE_URI} to the media player.  It will resolve
   1402          * to the set default ringtone at the time of playing.
   1403          *
   1404          * @see #DEFAULT_RINGTONE_URI
   1405          */
   1406         public static final String RINGTONE = "ringtone";
   1407 
   1408         /**
   1409          * A {@link Uri} that will point to the current default ringtone at any
   1410          * given time.
   1411          * <p>
   1412          * If the current default ringtone is in the DRM provider and the caller
   1413          * does not have permission, the exception will be a
   1414          * FileNotFoundException.
   1415          */
   1416         public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE);
   1417 
   1418         /**
   1419          * Persistent store for the system-wide default notification sound.
   1420          *
   1421          * @see #RINGTONE
   1422          * @see #DEFAULT_NOTIFICATION_URI
   1423          */
   1424         public static final String NOTIFICATION_SOUND = "notification_sound";
   1425 
   1426         /**
   1427          * A {@link Uri} that will point to the current default notification
   1428          * sound at any given time.
   1429          *
   1430          * @see #DEFAULT_RINGTONE_URI
   1431          */
   1432         public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND);
   1433 
   1434         /**
   1435          * Persistent store for the system-wide default alarm alert.
   1436          *
   1437          * @see #RINGTONE
   1438          * @see #DEFAULT_ALARM_ALERT_URI
   1439          */
   1440         public static final String ALARM_ALERT = "alarm_alert";
   1441 
   1442         /**
   1443          * A {@link Uri} that will point to the current default alarm alert at
   1444          * any given time.
   1445          *
   1446          * @see #DEFAULT_ALARM_ALERT_URI
   1447          */
   1448         public static final Uri DEFAULT_ALARM_ALERT_URI = getUriFor(ALARM_ALERT);
   1449 
   1450         /**
   1451          * Setting to enable Auto Replace (AutoText) in text editors. 1 = On, 0 = Off
   1452          */
   1453         public static final String TEXT_AUTO_REPLACE = "auto_replace";
   1454 
   1455         /**
   1456          * Setting to enable Auto Caps in text editors. 1 = On, 0 = Off
   1457          */
   1458         public static final String TEXT_AUTO_CAPS = "auto_caps";
   1459 
   1460         /**
   1461          * Setting to enable Auto Punctuate in text editors. 1 = On, 0 = Off. This
   1462          * feature converts two spaces to a "." and space.
   1463          */
   1464         public static final String TEXT_AUTO_PUNCTUATE = "auto_punctuate";
   1465 
   1466         /**
   1467          * Setting to showing password characters in text editors. 1 = On, 0 = Off
   1468          */
   1469         public static final String TEXT_SHOW_PASSWORD = "show_password";
   1470 
   1471         public static final String SHOW_GTALK_SERVICE_STATUS =
   1472                 "SHOW_GTALK_SERVICE_STATUS";
   1473 
   1474         /**
   1475          * Name of activity to use for wallpaper on the home screen.
   1476          */
   1477         public static final String WALLPAPER_ACTIVITY = "wallpaper_activity";
   1478 
   1479         /**
   1480          * Value to specify if the user prefers the date, time and time zone
   1481          * to be automatically fetched from the network (NITZ). 1=yes, 0=no
   1482          */
   1483         public static final String AUTO_TIME = "auto_time";
   1484 
   1485         /**
   1486          * Display times as 12 or 24 hours
   1487          *   12
   1488          *   24
   1489          */
   1490         public static final String TIME_12_24 = "time_12_24";
   1491 
   1492         /**
   1493          * Date format string
   1494          *   mm/dd/yyyy
   1495          *   dd/mm/yyyy
   1496          *   yyyy/mm/dd
   1497          */
   1498         public static final String DATE_FORMAT = "date_format";
   1499 
   1500         /**
   1501          * Whether the setup wizard has been run before (on first boot), or if
   1502          * it still needs to be run.
   1503          *
   1504          * nonzero = it has been run in the past
   1505          * 0 = it has not been run in the past
   1506          */
   1507         public static final String SETUP_WIZARD_HAS_RUN = "setup_wizard_has_run";
   1508 
   1509         /**
   1510          * Scaling factor for normal window animations. Setting to 0 will disable window
   1511          * animations.
   1512          */
   1513         public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
   1514 
   1515         /**
   1516          * Scaling factor for activity transition animations. Setting to 0 will disable window
   1517          * animations.
   1518          */
   1519         public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
   1520 
   1521         /**
   1522          * Scaling factor for normal window animations. Setting to 0 will disable window
   1523          * animations.
   1524          * @hide
   1525          */
   1526         public static final String FANCY_IME_ANIMATIONS = "fancy_ime_animations";
   1527 
   1528         /**
   1529          * Control whether the accelerometer will be used to change screen
   1530          * orientation.  If 0, it will not be used unless explicitly requested
   1531          * by the application; if 1, it will be used by default unless explicitly
   1532          * disabled by the application.
   1533          */
   1534         public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";
   1535 
   1536         /**
   1537          * Whether the audible DTMF tones are played by the dialer when dialing. The value is
   1538          * boolean (1 or 0).
   1539          */
   1540         public static final String DTMF_TONE_WHEN_DIALING = "dtmf_tone";
   1541 
   1542         /**
   1543          * CDMA only settings
   1544          * DTMF tone type played by the dialer when dialing.
   1545          *                 0 = Normal
   1546          *                 1 = Long
   1547          * @hide
   1548          */
   1549         public static final String DTMF_TONE_TYPE_WHEN_DIALING = "dtmf_tone_type";
   1550 
   1551         /**
   1552          * CDMA only settings
   1553          * Emergency Tone  0 = Off
   1554          *                 1 = Alert
   1555          *                 2 = Vibrate
   1556          * @hide
   1557          */
   1558         public static final String EMERGENCY_TONE = "emergency_tone";
   1559 
   1560         /**
   1561          * CDMA only settings
   1562          * Whether the auto retry is enabled. The value is
   1563          * boolean (1 or 0).
   1564          * @hide
   1565          */
   1566         public static final String CALL_AUTO_RETRY = "call_auto_retry";
   1567 
   1568         /**
   1569          * Whether the hearing aid is enabled. The value is
   1570          * boolean (1 or 0).
   1571          * @hide
   1572          */
   1573         public static final String HEARING_AID = "hearing_aid";
   1574 
   1575         /**
   1576          * CDMA only settings
   1577          * TTY Mode
   1578          * 0 = OFF
   1579          * 1 = FULL
   1580          * 2 = VCO
   1581          * 3 = HCO
   1582          * @hide
   1583          */
   1584         public static final String TTY_MODE = "tty_mode";
   1585 
   1586         /**
   1587          * Whether the sounds effects (key clicks, lid open ...) are enabled. The value is
   1588          * boolean (1 or 0).
   1589          */
   1590         public static final String SOUND_EFFECTS_ENABLED = "sound_effects_enabled";
   1591 
   1592         /**
   1593          * Whether the haptic feedback (long presses, ...) are enabled. The value is
   1594          * boolean (1 or 0).
   1595          */
   1596         public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
   1597 
   1598         /**
   1599          * Whether live web suggestions while the user types into search dialogs are
   1600          * enabled. Browsers and other search UIs should respect this, as it allows
   1601          * a user to avoid sending partial queries to a search engine, if it poses
   1602          * any privacy concern. The value is boolean (1 or 0).
   1603          */
   1604         public static final String SHOW_WEB_SUGGESTIONS = "show_web_suggestions";
   1605 
   1606         /**
   1607          * Whether the notification LED should repeatedly flash when a notification is
   1608          * pending. The value is boolean (1 or 0).
   1609          * @hide
   1610          */
   1611         public static final String NOTIFICATION_LIGHT_PULSE = "notification_light_pulse";
   1612 
   1613         /**
   1614          * Show pointer location on screen?
   1615          * 0 = no
   1616          * 1 = yes
   1617          * @hide
   1618          */
   1619         public static final String POINTER_LOCATION = "pointer_location";
   1620 
   1621         /**
   1622          * Whether to play a sound for low-battery alerts.
   1623          * @hide
   1624          */
   1625         public static final String POWER_SOUNDS_ENABLED = "power_sounds_enabled";
   1626 
   1627         /**
   1628          * Whether to play a sound for dock events.
   1629          * @hide
   1630          */
   1631         public static final String DOCK_SOUNDS_ENABLED = "dock_sounds_enabled";
   1632 
   1633         /**
   1634          * Whether to play sounds when the keyguard is shown and dismissed.
   1635          * @hide
   1636          */
   1637         public static final String LOCKSCREEN_SOUNDS_ENABLED = "lockscreen_sounds_enabled";
   1638 
   1639         /**
   1640          * URI for the low battery sound file.
   1641          * @hide
   1642          */
   1643         public static final String LOW_BATTERY_SOUND = "low_battery_sound";
   1644 
   1645         /**
   1646          * URI for the desk dock "in" event sound.
   1647          * @hide
   1648          */
   1649         public static final String DESK_DOCK_SOUND = "desk_dock_sound";
   1650 
   1651         /**
   1652          * URI for the desk dock "out" event sound.
   1653          * @hide
   1654          */
   1655         public static final String DESK_UNDOCK_SOUND = "desk_undock_sound";
   1656 
   1657         /**
   1658          * URI for the car dock "in" event sound.
   1659          * @hide
   1660          */
   1661         public static final String CAR_DOCK_SOUND = "car_dock_sound";
   1662 
   1663         /**
   1664          * URI for the car dock "out" event sound.
   1665          * @hide
   1666          */
   1667         public static final String CAR_UNDOCK_SOUND = "car_undock_sound";
   1668 
   1669         /**
   1670          * URI for the "device locked" (keyguard shown) sound.
   1671          * @hide
   1672          */
   1673         public static final String LOCK_SOUND = "lock_sound";
   1674 
   1675         /**
   1676          * URI for the "device unlocked" (keyguard dismissed) sound.
   1677          * @hide
   1678          */
   1679         public static final String UNLOCK_SOUND = "unlock_sound";
   1680 
   1681         /**
   1682          * Settings to backup. This is here so that it's in the same place as the settings
   1683          * keys and easy to update.
   1684          * @hide
   1685          */
   1686         public static final String[] SETTINGS_TO_BACKUP = {
   1687             STAY_ON_WHILE_PLUGGED_IN,
   1688             WIFI_SLEEP_POLICY,
   1689             WIFI_USE_STATIC_IP,
   1690             WIFI_STATIC_IP,
   1691             WIFI_STATIC_GATEWAY,
   1692             WIFI_STATIC_NETMASK,
   1693             WIFI_STATIC_DNS1,
   1694             WIFI_STATIC_DNS2,
   1695             BLUETOOTH_DISCOVERABILITY,
   1696             BLUETOOTH_DISCOVERABILITY_TIMEOUT,
   1697             DIM_SCREEN,
   1698             SCREEN_OFF_TIMEOUT,
   1699             SCREEN_BRIGHTNESS,
   1700             SCREEN_BRIGHTNESS_MODE,
   1701             VIBRATE_ON,
   1702             NOTIFICATIONS_USE_RING_VOLUME,
   1703             MODE_RINGER,
   1704             MODE_RINGER_STREAMS_AFFECTED,
   1705             MUTE_STREAMS_AFFECTED,
   1706             VOLUME_VOICE,
   1707             VOLUME_SYSTEM,
   1708             VOLUME_RING,
   1709             VOLUME_MUSIC,
   1710             VOLUME_ALARM,
   1711             VOLUME_NOTIFICATION,
   1712             VOLUME_BLUETOOTH_SCO,
   1713             VOLUME_VOICE + APPEND_FOR_LAST_AUDIBLE,
   1714             VOLUME_SYSTEM + APPEND_FOR_LAST_AUDIBLE,
   1715             VOLUME_RING + APPEND_FOR_LAST_AUDIBLE,
   1716             VOLUME_MUSIC + APPEND_FOR_LAST_AUDIBLE,
   1717             VOLUME_ALARM + APPEND_FOR_LAST_AUDIBLE,
   1718             VOLUME_NOTIFICATION + APPEND_FOR_LAST_AUDIBLE,
   1719             VOLUME_BLUETOOTH_SCO + APPEND_FOR_LAST_AUDIBLE,
   1720             VIBRATE_IN_SILENT,
   1721             TEXT_AUTO_REPLACE,
   1722             TEXT_AUTO_CAPS,
   1723             TEXT_AUTO_PUNCTUATE,
   1724             TEXT_SHOW_PASSWORD,
   1725             AUTO_TIME,
   1726             TIME_12_24,
   1727             DATE_FORMAT,
   1728             ACCELEROMETER_ROTATION,
   1729             DTMF_TONE_WHEN_DIALING,
   1730             DTMF_TONE_TYPE_WHEN_DIALING,
   1731             EMERGENCY_TONE,
   1732             CALL_AUTO_RETRY,
   1733             HEARING_AID,
   1734             TTY_MODE,
   1735             SOUND_EFFECTS_ENABLED,
   1736             HAPTIC_FEEDBACK_ENABLED,
   1737             POWER_SOUNDS_ENABLED,
   1738             DOCK_SOUNDS_ENABLED,
   1739             LOCKSCREEN_SOUNDS_ENABLED,
   1740             SHOW_WEB_SUGGESTIONS,
   1741             NOTIFICATION_LIGHT_PULSE
   1742         };
   1743 
   1744         // Settings moved to Settings.Secure
   1745 
   1746         /**
   1747          * @deprecated Use {@link android.provider.Settings.Secure#ADB_ENABLED}
   1748          * instead
   1749          */
   1750         @Deprecated
   1751         public static final String ADB_ENABLED = Secure.ADB_ENABLED;
   1752 
   1753         /**
   1754          * @deprecated Use {@link android.provider.Settings.Secure#ANDROID_ID} instead
   1755          */
   1756         @Deprecated
   1757         public static final String ANDROID_ID = Secure.ANDROID_ID;
   1758 
   1759         /**
   1760          * @deprecated Use {@link android.provider.Settings.Secure#BLUETOOTH_ON} instead
   1761          */
   1762         @Deprecated
   1763         public static final String BLUETOOTH_ON = Secure.BLUETOOTH_ON;
   1764 
   1765         /**
   1766          * @deprecated Use {@link android.provider.Settings.Secure#DATA_ROAMING} instead
   1767          */
   1768         @Deprecated
   1769         public static final String DATA_ROAMING = Secure.DATA_ROAMING;
   1770 
   1771         /**
   1772          * @deprecated Use {@link android.provider.Settings.Secure#DEVICE_PROVISIONED} instead
   1773          */
   1774         @Deprecated
   1775         public static final String DEVICE_PROVISIONED = Secure.DEVICE_PROVISIONED;
   1776 
   1777         /**
   1778          * @deprecated Use {@link android.provider.Settings.Secure#HTTP_PROXY} instead
   1779          */
   1780         @Deprecated
   1781         public static final String HTTP_PROXY = Secure.HTTP_PROXY;
   1782 
   1783         /**
   1784          * @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
   1785          */
   1786         @Deprecated
   1787         public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
   1788 
   1789         /**
   1790          * @deprecated Use {@link android.provider.Settings.Secure#LOCATION_PROVIDERS_ALLOWED}
   1791          * instead
   1792          */
   1793         @Deprecated
   1794         public static final String LOCATION_PROVIDERS_ALLOWED = Secure.LOCATION_PROVIDERS_ALLOWED;
   1795 
   1796         /**
   1797          * @deprecated Use {@link android.provider.Settings.Secure#LOGGING_ID} instead
   1798          */
   1799         @Deprecated
   1800         public static final String LOGGING_ID = Secure.LOGGING_ID;
   1801 
   1802         /**
   1803          * @deprecated Use {@link android.provider.Settings.Secure#NETWORK_PREFERENCE} instead
   1804          */
   1805         @Deprecated
   1806         public static final String NETWORK_PREFERENCE = Secure.NETWORK_PREFERENCE;
   1807 
   1808         /**
   1809          * @deprecated Use {@link android.provider.Settings.Secure#PARENTAL_CONTROL_ENABLED}
   1810          * instead
   1811          */
   1812         @Deprecated
   1813         public static final String PARENTAL_CONTROL_ENABLED = Secure.PARENTAL_CONTROL_ENABLED;
   1814 
   1815         /**
   1816          * @deprecated Use {@link android.provider.Settings.Secure#PARENTAL_CONTROL_LAST_UPDATE}
   1817          * instead
   1818          */
   1819         @Deprecated
   1820         public static final String PARENTAL_CONTROL_LAST_UPDATE = Secure.PARENTAL_CONTROL_LAST_UPDATE;
   1821 
   1822         /**
   1823          * @deprecated Use {@link android.provider.Settings.Secure#PARENTAL_CONTROL_REDIRECT_URL}
   1824          * instead
   1825          */
   1826         @Deprecated
   1827         public static final String PARENTAL_CONTROL_REDIRECT_URL =
   1828             Secure.PARENTAL_CONTROL_REDIRECT_URL;
   1829 
   1830         /**
   1831          * @deprecated Use {@link android.provider.Settings.Secure#SETTINGS_CLASSNAME} instead
   1832          */
   1833         @Deprecated
   1834         public static final String SETTINGS_CLASSNAME = Secure.SETTINGS_CLASSNAME;
   1835 
   1836         /**
   1837          * @deprecated Use {@link android.provider.Settings.Secure#USB_MASS_STORAGE_ENABLED} instead
   1838          */
   1839         @Deprecated
   1840         public static final String USB_MASS_STORAGE_ENABLED = Secure.USB_MASS_STORAGE_ENABLED;
   1841 
   1842         /**
   1843          * @deprecated Use {@link android.provider.Settings.Secure#USE_GOOGLE_MAIL} instead
   1844          */
   1845         @Deprecated
   1846         public static final String USE_GOOGLE_MAIL = Secure.USE_GOOGLE_MAIL;
   1847 
   1848        /**
   1849          * @deprecated Use
   1850          * {@link android.provider.Settings.Secure#WIFI_MAX_DHCP_RETRY_COUNT} instead
   1851          */
   1852         @Deprecated
   1853         public static final String WIFI_MAX_DHCP_RETRY_COUNT = Secure.WIFI_MAX_DHCP_RETRY_COUNT;
   1854 
   1855         /**
   1856          * @deprecated Use
   1857          * {@link android.provider.Settings.Secure#WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS} instead
   1858          */
   1859         @Deprecated
   1860         public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
   1861                 Secure.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS;
   1862 
   1863         /**
   1864          * @deprecated Use
   1865          * {@link android.provider.Settings.Secure#WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON} instead
   1866          */
   1867         @Deprecated
   1868         public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
   1869             Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON;
   1870 
   1871         /**
   1872          * @deprecated Use
   1873          * {@link android.provider.Settings.Secure#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY} instead
   1874          */
   1875         @Deprecated
   1876         public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
   1877             Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY;
   1878 
   1879         /**
   1880          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_NUM_OPEN_NETWORKS_KEPT}
   1881          * instead
   1882          */
   1883         @Deprecated
   1884         public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = Secure.WIFI_NUM_OPEN_NETWORKS_KEPT;
   1885 
   1886         /**
   1887          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_ON} instead
   1888          */
   1889         @Deprecated
   1890         public static final String WIFI_ON = Secure.WIFI_ON;
   1891 
   1892         /**
   1893          * @deprecated Use
   1894          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE}
   1895          * instead
   1896          */
   1897         @Deprecated
   1898         public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE =
   1899                 Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE;
   1900 
   1901         /**
   1902          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_AP_COUNT} instead
   1903          */
   1904         @Deprecated
   1905         public static final String WIFI_WATCHDOG_AP_COUNT = Secure.WIFI_WATCHDOG_AP_COUNT;
   1906 
   1907         /**
   1908          * @deprecated Use
   1909          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS} instead
   1910          */
   1911         @Deprecated
   1912         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
   1913                 Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS;
   1914 
   1915         /**
   1916          * @deprecated Use
   1917          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED} instead
   1918          */
   1919         @Deprecated
   1920         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED =
   1921                 Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED;
   1922 
   1923         /**
   1924          * @deprecated Use
   1925          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS}
   1926          * instead
   1927          */
   1928         @Deprecated
   1929         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS =
   1930                 Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS;
   1931 
   1932         /**
   1933          * @deprecated Use
   1934          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT} instead
   1935          */
   1936         @Deprecated
   1937         public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT =
   1938             Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT;
   1939 
   1940         /**
   1941          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_MAX_AP_CHECKS}
   1942          * instead
   1943          */
   1944         @Deprecated
   1945         public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = Secure.WIFI_WATCHDOG_MAX_AP_CHECKS;
   1946 
   1947         /**
   1948          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_ON} instead
   1949          */
   1950         @Deprecated
   1951         public static final String WIFI_WATCHDOG_ON = Secure.WIFI_WATCHDOG_ON;
   1952 
   1953         /**
   1954          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_COUNT} instead
   1955          */
   1956         @Deprecated
   1957         public static final String WIFI_WATCHDOG_PING_COUNT = Secure.WIFI_WATCHDOG_PING_COUNT;
   1958 
   1959         /**
   1960          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_DELAY_MS}
   1961          * instead
   1962          */
   1963         @Deprecated
   1964         public static final String WIFI_WATCHDOG_PING_DELAY_MS = Secure.WIFI_WATCHDOG_PING_DELAY_MS;
   1965 
   1966         /**
   1967          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_TIMEOUT_MS}
   1968          * instead
   1969          */
   1970         @Deprecated
   1971         public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS =
   1972             Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS;
   1973     }
   1974 
   1975     /**
   1976      * Secure system settings, containing system preferences that applications
   1977      * can read but are not allowed to write.  These are for preferences that
   1978      * the user must explicitly modify through the system UI or specialized
   1979      * APIs for those values, not modified directly by applications.
   1980      */
   1981     public static final class Secure extends NameValueTable {
   1982         public static final String SYS_PROP_SETTING_VERSION = "sys.settings_secure_version";
   1983 
   1984         // Populated lazily, guarded by class object:
   1985         private static NameValueCache sNameValueCache = null;
   1986 
   1987         /**
   1988          * Look up a name in the database.
   1989          * @param resolver to access the database with
   1990          * @param name to look up in the table
   1991          * @return the corresponding value, or null if not present
   1992          */
   1993         public synchronized static String getString(ContentResolver resolver, String name) {
   1994             if (sNameValueCache == null) {
   1995                 sNameValueCache = new NameValueCache(SYS_PROP_SETTING_VERSION, CONTENT_URI,
   1996                                                      CALL_METHOD_GET_SECURE);
   1997             }
   1998             return sNameValueCache.getString(resolver, name);
   1999         }
   2000 
   2001         /**
   2002          * Store a name/value pair into the database.
   2003          * @param resolver to access the database with
   2004          * @param name to store
   2005          * @param value to associate with the name
   2006          * @return true if the value was set, false on database errors
   2007          */
   2008         public static boolean putString(ContentResolver resolver,
   2009                 String name, String value) {
   2010             return putString(resolver, CONTENT_URI, name, value);
   2011         }
   2012 
   2013         /**
   2014          * Construct the content URI for a particular name/value pair,
   2015          * useful for monitoring changes with a ContentObserver.
   2016          * @param name to look up in the table
   2017          * @return the corresponding content URI, or null if not present
   2018          */
   2019         public static Uri getUriFor(String name) {
   2020             return getUriFor(CONTENT_URI, name);
   2021         }
   2022 
   2023         /**
   2024          * Convenience function for retrieving a single secure settings value
   2025          * as an integer.  Note that internally setting values are always
   2026          * stored as strings; this function converts the string to an integer
   2027          * for you.  The default value will be returned if the setting is
   2028          * not defined or not an integer.
   2029          *
   2030          * @param cr The ContentResolver to access.
   2031          * @param name The name of the setting to retrieve.
   2032          * @param def Value to return if the setting is not defined.
   2033          *
   2034          * @return The setting's current value, or 'def' if it is not defined
   2035          * or not a valid integer.
   2036          */
   2037         public static int getInt(ContentResolver cr, String name, int def) {
   2038             String v = getString(cr, name);
   2039             try {
   2040                 return v != null ? Integer.parseInt(v) : def;
   2041             } catch (NumberFormatException e) {
   2042                 return def;
   2043             }
   2044         }
   2045 
   2046         /**
   2047          * Convenience function for retrieving a single secure settings value
   2048          * as an integer.  Note that internally setting values are always
   2049          * stored as strings; this function converts the string to an integer
   2050          * for you.
   2051          * <p>
   2052          * This version does not take a default value.  If the setting has not
   2053          * been set, or the string value is not a number,
   2054          * it throws {@link SettingNotFoundException}.
   2055          *
   2056          * @param cr The ContentResolver to access.
   2057          * @param name The name of the setting to retrieve.
   2058          *
   2059          * @throws SettingNotFoundException Thrown if a setting by the given
   2060          * name can't be found or the setting value is not an integer.
   2061          *
   2062          * @return The setting's current value.
   2063          */
   2064         public static int getInt(ContentResolver cr, String name)
   2065                 throws SettingNotFoundException {
   2066             String v = getString(cr, name);
   2067             try {
   2068                 return Integer.parseInt(v);
   2069             } catch (NumberFormatException e) {
   2070                 throw new SettingNotFoundException(name);
   2071             }
   2072         }
   2073 
   2074         /**
   2075          * Convenience function for updating a single settings value as an
   2076          * integer. This will either create a new entry in the table if the
   2077          * given name does not exist, or modify the value of the existing row
   2078          * with that name.  Note that internally setting values are always
   2079          * stored as strings, so this function converts the given value to a
   2080          * string before storing it.
   2081          *
   2082          * @param cr The ContentResolver to access.
   2083          * @param name The name of the setting to modify.
   2084          * @param value The new value for the setting.
   2085          * @return true if the value was set, false on database errors
   2086          */
   2087         public static boolean putInt(ContentResolver cr, String name, int value) {
   2088             return putString(cr, name, Integer.toString(value));
   2089         }
   2090 
   2091         /**
   2092          * Convenience function for retrieving a single secure settings value
   2093          * as a {@code long}.  Note that internally setting values are always
   2094          * stored as strings; this function converts the string to a {@code long}
   2095          * for you.  The default value will be returned if the setting is
   2096          * not defined or not a {@code long}.
   2097          *
   2098          * @param cr The ContentResolver to access.
   2099          * @param name The name of the setting to retrieve.
   2100          * @param def Value to return if the setting is not defined.
   2101          *
   2102          * @return The setting's current value, or 'def' if it is not defined
   2103          * or not a valid {@code long}.
   2104          */
   2105         public static long getLong(ContentResolver cr, String name, long def) {
   2106             String valString = getString(cr, name);
   2107             long value;
   2108             try {
   2109                 value = valString != null ? Long.parseLong(valString) : def;
   2110             } catch (NumberFormatException e) {
   2111                 value = def;
   2112             }
   2113             return value;
   2114         }
   2115 
   2116         /**
   2117          * Convenience function for retrieving a single secure settings value
   2118          * as a {@code long}.  Note that internally setting values are always
   2119          * stored as strings; this function converts the string to a {@code long}
   2120          * for you.
   2121          * <p>
   2122          * This version does not take a default value.  If the setting has not
   2123          * been set, or the string value is not a number,
   2124          * it throws {@link SettingNotFoundException}.
   2125          *
   2126          * @param cr The ContentResolver to access.
   2127          * @param name The name of the setting to retrieve.
   2128          *
   2129          * @return The setting's current value.
   2130          * @throws SettingNotFoundException Thrown if a setting by the given
   2131          * name can't be found or the setting value is not an integer.
   2132          */
   2133         public static long getLong(ContentResolver cr, String name)
   2134                 throws SettingNotFoundException {
   2135             String valString = getString(cr, name);
   2136             try {
   2137                 return Long.parseLong(valString);
   2138             } catch (NumberFormatException e) {
   2139                 throw new SettingNotFoundException(name);
   2140             }
   2141         }
   2142 
   2143         /**
   2144          * Convenience function for updating a secure settings value as a long
   2145          * integer. This will either create a new entry in the table if the
   2146          * given name does not exist, or modify the value of the existing row
   2147          * with that name.  Note that internally setting values are always
   2148          * stored as strings, so this function converts the given value to a
   2149          * string before storing it.
   2150          *
   2151          * @param cr The ContentResolver to access.
   2152          * @param name The name of the setting to modify.
   2153          * @param value The new value for the setting.
   2154          * @return true if the value was set, false on database errors
   2155          */
   2156         public static boolean putLong(ContentResolver cr, String name, long value) {
   2157             return putString(cr, name, Long.toString(value));
   2158         }
   2159 
   2160         /**
   2161          * Convenience function for retrieving a single secure settings value
   2162          * as a floating point number.  Note that internally setting values are
   2163          * always stored as strings; this function converts the string to an
   2164          * float for you. The default value will be returned if the setting
   2165          * is not defined or not a valid float.
   2166          *
   2167          * @param cr The ContentResolver to access.
   2168          * @param name The name of the setting to retrieve.
   2169          * @param def Value to return if the setting is not defined.
   2170          *
   2171          * @return The setting's current value, or 'def' if it is not defined
   2172          * or not a valid float.
   2173          */
   2174         public static float getFloat(ContentResolver cr, String name, float def) {
   2175             String v = getString(cr, name);
   2176             try {
   2177                 return v != null ? Float.parseFloat(v) : def;
   2178             } catch (NumberFormatException e) {
   2179                 return def;
   2180             }
   2181         }
   2182 
   2183         /**
   2184          * Convenience function for retrieving a single secure settings value
   2185          * as a float.  Note that internally setting values are always
   2186          * stored as strings; this function converts the string to a float
   2187          * for you.
   2188          * <p>
   2189          * This version does not take a default value.  If the setting has not
   2190          * been set, or the string value is not a number,
   2191          * it throws {@link SettingNotFoundException}.
   2192          *
   2193          * @param cr The ContentResolver to access.
   2194          * @param name The name of the setting to retrieve.
   2195          *
   2196          * @throws SettingNotFoundException Thrown if a setting by the given
   2197          * name can't be found or the setting value is not a float.
   2198          *
   2199          * @return The setting's current value.
   2200          */
   2201         public static float getFloat(ContentResolver cr, String name)
   2202                 throws SettingNotFoundException {
   2203             String v = getString(cr, name);
   2204             try {
   2205                 return Float.parseFloat(v);
   2206             } catch (NumberFormatException e) {
   2207                 throw new SettingNotFoundException(name);
   2208             }
   2209         }
   2210 
   2211         /**
   2212          * Convenience function for updating a single settings value as a
   2213          * floating point number. This will either create a new entry in the
   2214          * table if the given name does not exist, or modify the value of the
   2215          * existing row with that name.  Note that internally setting values
   2216          * are always stored as strings, so this function converts the given
   2217          * value to a string before storing it.
   2218          *
   2219          * @param cr The ContentResolver to access.
   2220          * @param name The name of the setting to modify.
   2221          * @param value The new value for the setting.
   2222          * @return true if the value was set, false on database errors
   2223          */
   2224         public static boolean putFloat(ContentResolver cr, String name, float value) {
   2225             return putString(cr, name, Float.toString(value));
   2226         }
   2227 
   2228         /**
   2229          * The content:// style URL for this table
   2230          */
   2231         public static final Uri CONTENT_URI =
   2232             Uri.parse("content://" + AUTHORITY + "/secure");
   2233 
   2234         /**
   2235          * Whether ADB is enabled.
   2236          */
   2237         public static final String ADB_ENABLED = "adb_enabled";
   2238 
   2239         /**
   2240          * Setting to allow mock locations and location provider status to be injected into the
   2241          * LocationManager service for testing purposes during application development.  These
   2242          * locations and status values  override actual location and status information generated
   2243          * by network, gps, or other location providers.
   2244          */
   2245         public static final String ALLOW_MOCK_LOCATION = "mock_location";
   2246 
   2247         /**
   2248          * A 64-bit number (as a hex string) that is randomly
   2249          * generated on the device's first boot and should remain
   2250          * constant for the lifetime of the device.  (The value may
   2251          * change if a factory reset is performed on the device.)
   2252          */
   2253         public static final String ANDROID_ID = "android_id";
   2254 
   2255         /**
   2256          * Whether bluetooth is enabled/disabled
   2257          * 0=disabled. 1=enabled.
   2258          */
   2259         public static final String BLUETOOTH_ON = "bluetooth_on";
   2260 
   2261         /**
   2262          * Get the key that retrieves a bluetooth headset's priority.
   2263          * @hide
   2264          */
   2265         public static final String getBluetoothHeadsetPriorityKey(String address) {
   2266             return ("bluetooth_headset_priority_" + address.toUpperCase());
   2267         }
   2268 
   2269         /**
   2270          * Get the key that retrieves a bluetooth a2dp sink's priority.
   2271          * @hide
   2272          */
   2273         public static final String getBluetoothA2dpSinkPriorityKey(String address) {
   2274             return ("bluetooth_a2dp_sink_priority_" + address.toUpperCase());
   2275         }
   2276 
   2277         /**
   2278          * Whether or not data roaming is enabled. (0 = false, 1 = true)
   2279          */
   2280         public static final String DATA_ROAMING = "data_roaming";
   2281 
   2282         /**
   2283          * Setting to record the input method used by default, holding the ID
   2284          * of the desired method.
   2285          */
   2286         public static final String DEFAULT_INPUT_METHOD = "default_input_method";
   2287 
   2288         /**
   2289          * Whether the device has been provisioned (0 = false, 1 = true)
   2290          */
   2291         public static final String DEVICE_PROVISIONED = "device_provisioned";
   2292 
   2293         /**
   2294          * List of input methods that are currently enabled.  This is a string
   2295          * containing the IDs of all enabled input methods, each ID separated
   2296          * by ':'.
   2297          */
   2298         public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
   2299 
   2300         /**
   2301          * List of system input methods that are currently disabled.  This is a string
   2302          * containing the IDs of all disabled input methods, each ID separated
   2303          * by ':'.
   2304          * @hide
   2305          */
   2306         public static final String DISABLED_SYSTEM_INPUT_METHODS = "disabled_system_input_methods";
   2307 
   2308         /**
   2309          * Host name and port for a user-selected proxy.
   2310          */
   2311         public static final String HTTP_PROXY = "http_proxy";
   2312 
   2313         /**
   2314          * Whether the package installer should allow installation of apps downloaded from
   2315          * sources other than the Android Market (vending machine).
   2316          *
   2317          * 1 = allow installing from other sources
   2318          * 0 = only allow installing from the Android Market
   2319          */
   2320         public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
   2321 
   2322         /**
   2323          * Comma-separated list of location providers that activities may access.
   2324          */
   2325         public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
   2326 
   2327         /**
   2328          * Whether autolock is enabled (0 = false, 1 = true)
   2329          */
   2330         public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
   2331 
   2332         /**
   2333          * Whether lock pattern is visible as user enters (0 = false, 1 = true)
   2334          */
   2335         public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
   2336 
   2337         /**
   2338          * Whether lock pattern will vibrate as user enters (0 = false, 1 = true)
   2339          */
   2340         public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED =
   2341             "lock_pattern_tactile_feedback_enabled";
   2342 
   2343         /**
   2344          * Whether assisted GPS should be enabled or not.
   2345          * @hide
   2346          */
   2347         public static final String ASSISTED_GPS_ENABLED = "assisted_gps_enabled";
   2348 
   2349         /**
   2350          * The Logging ID (a unique 64-bit value) as a hex string.
   2351          * Used as a pseudonymous identifier for logging.
   2352          * @deprecated This identifier is poorly initialized and has
   2353          * many collisions.  It should not be used.
   2354          */
   2355         @Deprecated
   2356         public static final String LOGGING_ID = "logging_id";
   2357 
   2358         /**
   2359          * User preference for which network(s) should be used. Only the
   2360          * connectivity service should touch this.
   2361          */
   2362         public static final String NETWORK_PREFERENCE = "network_preference";
   2363 
   2364         /**
   2365          * Used to disable Tethering on a device - defaults to true
   2366          * @hide
   2367          */
   2368         public static final String TETHER_SUPPORTED = "tether_supported";
   2369 
   2370         /**
   2371          * Used to require DUN APN on the device or not - defaults to a build config value
   2372          * which defaults to false
   2373          * @hide
   2374          */
   2375         public static final String TETHER_DUN_REQUIRED = "tether_dun_required";
   2376 
   2377         /**
   2378          * Used to hold a gservices-provisioned apn value for DUN.  If set, or the
   2379          * corresponding build config values are set it will override the APN DB
   2380          * values.
   2381          * Consists of a comma seperated list of strings:
   2382          * "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
   2383          * note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN"
   2384          * @hide
   2385          */
   2386         public static final String TETHER_DUN_APN = "tether_dun_apn";
   2387 
   2388         /**
   2389          * No longer supported.
   2390          */
   2391         public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
   2392 
   2393         /**
   2394          * No longer supported.
   2395          */
   2396         public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
   2397 
   2398         /**
   2399          * No longer supported.
   2400          */
   2401         public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
   2402 
   2403         /**
   2404          * Settings classname to launch when Settings is clicked from All
   2405          * Applications.  Needed because of user testing between the old
   2406          * and new Settings apps.
   2407          */
   2408         // TODO: 881807
   2409         public static final String SETTINGS_CLASSNAME = "settings_classname";
   2410 
   2411         /**
   2412          * USB Mass Storage Enabled
   2413          */
   2414         public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
   2415 
   2416         /**
   2417          * If this setting is set (to anything), then all references
   2418          * to Gmail on the device must change to Google Mail.
   2419          */
   2420         public static final String USE_GOOGLE_MAIL = "use_google_mail";
   2421 
   2422         /**
   2423          * If accessibility is enabled.
   2424          */
   2425         public static final String ACCESSIBILITY_ENABLED = "accessibility_enabled";
   2426 
   2427         /**
   2428          * List of the enabled accessibility providers.
   2429          */
   2430         public static final String ENABLED_ACCESSIBILITY_SERVICES =
   2431             "enabled_accessibility_services";
   2432 
   2433         /**
   2434          * Setting to always use the default text-to-speech settings regardless
   2435          * of the application settings.
   2436          * 1 = override application settings,
   2437          * 0 = use application settings (if specified).
   2438          */
   2439         public static final String TTS_USE_DEFAULTS = "tts_use_defaults";
   2440 
   2441         /**
   2442          * Default text-to-speech engine speech rate. 100 = 1x
   2443          */
   2444         public static final String TTS_DEFAULT_RATE = "tts_default_rate";
   2445 
   2446         /**
   2447          * Default text-to-speech engine pitch. 100 = 1x
   2448          */
   2449         public static final String TTS_DEFAULT_PITCH = "tts_default_pitch";
   2450 
   2451         /**
   2452          * Default text-to-speech engine.
   2453          */
   2454         public static final String TTS_DEFAULT_SYNTH = "tts_default_synth";
   2455 
   2456         /**
   2457          * Default text-to-speech language.
   2458          */
   2459         public static final String TTS_DEFAULT_LANG = "tts_default_lang";
   2460 
   2461         /**
   2462          * Default text-to-speech country.
   2463          */
   2464         public static final String TTS_DEFAULT_COUNTRY = "tts_default_country";
   2465 
   2466         /**
   2467          * Default text-to-speech locale variant.
   2468          */
   2469         public static final String TTS_DEFAULT_VARIANT = "tts_default_variant";
   2470 
   2471         /**
   2472          * Space delimited list of plugin packages that are enabled.
   2473          */
   2474         public static final String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
   2475 
   2476         /**
   2477          * Whether to notify the user of open networks.
   2478          * <p>
   2479          * If not connected and the scan results have an open network, we will
   2480          * put this notification up. If we attempt to connect to a network or
   2481          * the open network(s) disappear, we remove the notification. When we
   2482          * show the notification, we will not show it again for
   2483          * {@link android.provider.Settings.Secure#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY} time.
   2484          */
   2485         public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
   2486                 "wifi_networks_available_notification_on";
   2487 
   2488         /**
   2489          * Delay (in seconds) before repeating the Wi-Fi networks available notification.
   2490          * Connecting to a network will reset the timer.
   2491          */
   2492         public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
   2493                 "wifi_networks_available_repeat_delay";
   2494 
   2495         /**
   2496          * The number of radio channels that are allowed in the local
   2497          * 802.11 regulatory domain.
   2498          * @hide
   2499          */
   2500         public static final String WIFI_NUM_ALLOWED_CHANNELS = "wifi_num_allowed_channels";
   2501 
   2502         /**
   2503          * When the number of open networks exceeds this number, the
   2504          * least-recently-used excess networks will be removed.
   2505          */
   2506         public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
   2507 
   2508         /**
   2509          * Whether the Wi-Fi should be on.  Only the Wi-Fi service should touch this.
   2510          */
   2511         public static final String WIFI_ON = "wifi_on";
   2512 
   2513         /**
   2514          * Used to save the Wifi_ON state prior to tethering.
   2515          * This state will be checked to restore Wifi after
   2516          * the user turns off tethering.
   2517          *
   2518          * @hide
   2519          */
   2520         public static final String WIFI_SAVED_STATE = "wifi_saved_state";
   2521 
   2522         /**
   2523          * AP SSID
   2524          *
   2525          * @hide
   2526          */
   2527         public static final String WIFI_AP_SSID = "wifi_ap_ssid";
   2528 
   2529         /**
   2530          * AP security
   2531          *
   2532          * @hide
   2533          */
   2534         public static final String WIFI_AP_SECURITY = "wifi_ap_security";
   2535 
   2536         /**
   2537          * AP passphrase
   2538          *
   2539          * @hide
   2540          */
   2541         public static final String WIFI_AP_PASSWD = "wifi_ap_passwd";
   2542 
   2543         /**
   2544          * The acceptable packet loss percentage (range 0 - 100) before trying
   2545          * another AP on the same network.
   2546          */
   2547         public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE =
   2548                 "wifi_watchdog_acceptable_packet_loss_percentage";
   2549 
   2550         /**
   2551          * The number of access points required for a network in order for the
   2552          * watchdog to monitor it.
   2553          */
   2554         public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
   2555 
   2556         /**
   2557          * The delay between background checks.
   2558          */
   2559         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
   2560                 "wifi_watchdog_background_check_delay_ms";
   2561 
   2562         /**
   2563          * Whether the Wi-Fi watchdog is enabled for background checking even
   2564          * after it thinks the user has connected to a good access point.
   2565          */
   2566         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED =
   2567                 "wifi_watchdog_background_check_enabled";
   2568 
   2569         /**
   2570          * The timeout for a background ping
   2571          */
   2572         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS =
   2573                 "wifi_watchdog_background_check_timeout_ms";
   2574 
   2575         /**
   2576          * The number of initial pings to perform that *may* be ignored if they
   2577          * fail. Again, if these fail, they will *not* be used in packet loss
   2578          * calculation. For example, one network always seemed to time out for
   2579          * the first couple pings, so this is set to 3 by default.
   2580          */
   2581         public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT =
   2582             "wifi_watchdog_initial_ignored_ping_count";
   2583 
   2584         /**
   2585          * The maximum number of access points (per network) to attempt to test.
   2586          * If this number is reached, the watchdog will no longer monitor the
   2587          * initial connection state for the network. This is a safeguard for
   2588          * networks containing multiple APs whose DNS does not respond to pings.
   2589          */
   2590         public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
   2591 
   2592         /**
   2593          * Whether the Wi-Fi watchdog is enabled.
   2594          */
   2595         public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
   2596 
   2597         /**
   2598          * A comma-separated list of SSIDs for which the Wi-Fi watchdog should be enabled.
   2599          */
   2600         public static final String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
   2601 
   2602         /**
   2603          * The number of pings to test if an access point is a good connection.
   2604          */
   2605         public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
   2606 
   2607         /**
   2608          * The delay between pings.
   2609          */
   2610         public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
   2611 
   2612         /**
   2613          * The timeout per ping.
   2614          */
   2615         public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
   2616 
   2617         /**
   2618          * The maximum number of times we will retry a connection to an access
   2619          * point for which we have failed in acquiring an IP address from DHCP.
   2620          * A value of N means that we will make N+1 connection attempts in all.
   2621          */
   2622         public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
   2623 
   2624         /**
   2625          * Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile
   2626          * data connectivity to be established after a disconnect from Wi-Fi.
   2627          */
   2628         public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
   2629             "wifi_mobile_data_transition_wakelock_timeout_ms";
   2630 
   2631         /**
   2632          * Whether background data usage is allowed by the user. See
   2633          * ConnectivityManager for more info.
   2634          */
   2635         public static final String BACKGROUND_DATA = "background_data";
   2636 
   2637         /**
   2638          * Origins for which browsers should allow geolocation by default.
   2639          * The value is a space-separated list of origins.
   2640          */
   2641         public static final String ALLOWED_GEOLOCATION_ORIGINS
   2642                 = "allowed_geolocation_origins";
   2643 
   2644         /**
   2645          * Whether mobile data connections are allowed by the user.  See
   2646          * ConnectivityManager for more info.
   2647          * @hide
   2648          */
   2649         public static final String MOBILE_DATA = "mobile_data";
   2650 
   2651         /**
   2652          * The CDMA roaming mode 0 = Home Networks, CDMA default
   2653          *                       1 = Roaming on Affiliated networks
   2654          *                       2 = Roaming on any networks
   2655          * @hide
   2656          */
   2657         public static final String CDMA_ROAMING_MODE = "roaming_settings";
   2658 
   2659         /**
   2660          * The CDMA subscription mode 0 = RUIM/SIM (default)
   2661          *                                1 = NV
   2662          * @hide
   2663          */
   2664         public static final String CDMA_SUBSCRIPTION_MODE = "subscription_mode";
   2665 
   2666         /**
   2667          * The preferred network mode   7 = Global
   2668          *                              6 = EvDo only
   2669          *                              5 = CDMA w/o EvDo
   2670          *                              4 = CDMA / EvDo auto
   2671          *                              3 = GSM / WCDMA auto
   2672          *                              2 = WCDMA only
   2673          *                              1 = GSM only
   2674          *                              0 = GSM / WCDMA preferred
   2675          * @hide
   2676          */
   2677         public static final String PREFERRED_NETWORK_MODE =
   2678                 "preferred_network_mode";
   2679 
   2680         /**
   2681          * The preferred TTY mode     0 = TTy Off, CDMA default
   2682          *                            1 = TTY Full
   2683          *                            2 = TTY HCO
   2684          *                            3 = TTY VCO
   2685          * @hide
   2686          */
   2687         public static final String PREFERRED_TTY_MODE =
   2688                 "preferred_tty_mode";
   2689 
   2690 
   2691         /**
   2692          * CDMA Cell Broadcast SMS
   2693          *                            0 = CDMA Cell Broadcast SMS disabled
   2694          *                            1 = CDMA Cell Broadcast SMS enabled
   2695          * @hide
   2696          */
   2697         public static final String CDMA_CELL_BROADCAST_SMS =
   2698                 "cdma_cell_broadcast_sms";
   2699 
   2700         /**
   2701          * The cdma subscription 0 = Subscription from RUIM, when available
   2702          *                       1 = Subscription from NV
   2703          * @hide
   2704          */
   2705         public static final String PREFERRED_CDMA_SUBSCRIPTION =
   2706                 "preferred_cdma_subscription";
   2707 
   2708         /**
   2709          * Whether the enhanced voice privacy mode is enabled.
   2710          * 0 = normal voice privacy
   2711          * 1 = enhanced voice privacy
   2712          * @hide
   2713          */
   2714         public static final String ENHANCED_VOICE_PRIVACY_ENABLED = "enhanced_voice_privacy_enabled";
   2715 
   2716         /**
   2717          * Whether the TTY mode mode is enabled.
   2718          * 0 = disabled
   2719          * 1 = enabled
   2720          * @hide
   2721          */
   2722         public static final String TTY_MODE_ENABLED = "tty_mode_enabled";
   2723 
   2724         /**
   2725          * Controls whether settings backup is enabled.
   2726          * Type: int ( 0 = disabled, 1 = enabled )
   2727          * @hide
   2728          */
   2729         public static final String BACKUP_ENABLED = "backup_enabled";
   2730 
   2731         /**
   2732          * Controls whether application data is automatically restored from backup
   2733          * at install time.
   2734          * Type: int ( 0 = disabled, 1 = enabled )
   2735          * @hide
   2736          */
   2737         public static final String BACKUP_AUTO_RESTORE = "backup_auto_restore";
   2738 
   2739         /**
   2740          * Indicates whether settings backup has been fully provisioned.
   2741          * Type: int ( 0 = unprovisioned, 1 = fully provisioned )
   2742          * @hide
   2743          */
   2744         public static final String BACKUP_PROVISIONED = "backup_provisioned";
   2745 
   2746         /**
   2747          * Component of the transport to use for backup/restore.
   2748          * @hide
   2749          */
   2750         public static final String BACKUP_TRANSPORT = "backup_transport";
   2751 
   2752         /**
   2753          * Version for which the setup wizard was last shown.  Bumped for
   2754          * each release when there is new setup information to show.
   2755          * @hide
   2756          */
   2757         public static final String LAST_SETUP_SHOWN = "last_setup_shown";
   2758 
   2759         /**
   2760          * How frequently (in seconds) to check the memory status of the
   2761          * device.
   2762          * @hide
   2763          */
   2764         public static final String MEMCHECK_INTERVAL = "memcheck_interval";
   2765 
   2766         /**
   2767          * Max frequency (in seconds) to log memory check stats, in realtime
   2768          * seconds.  This allows for throttling of logs when the device is
   2769          * running for large amounts of time.
   2770          * @hide
   2771          */
   2772         public static final String MEMCHECK_LOG_REALTIME_INTERVAL =
   2773                 "memcheck_log_realtime_interval";
   2774 
   2775         /**
   2776          * Boolean indicating whether rebooting due to system memory checks
   2777          * is enabled.
   2778          * @hide
   2779          */
   2780         public static final String MEMCHECK_SYSTEM_ENABLED = "memcheck_system_enabled";
   2781 
   2782         /**
   2783          * How many bytes the system process must be below to avoid scheduling
   2784          * a soft reboot.  This reboot will happen when it is next determined
   2785          * to be a good time.
   2786          * @hide
   2787          */
   2788         public static final String MEMCHECK_SYSTEM_SOFT_THRESHOLD = "memcheck_system_soft";
   2789 
   2790         /**
   2791          * How many bytes the system process must be below to avoid scheduling
   2792          * a hard reboot.  This reboot will happen immediately.
   2793          * @hide
   2794          */
   2795         public static final String MEMCHECK_SYSTEM_HARD_THRESHOLD = "memcheck_system_hard";
   2796 
   2797         /**
   2798          * How many bytes the phone process must be below to avoid scheduling
   2799          * a soft restart.  This restart will happen when it is next determined
   2800          * to be a good time.
   2801          * @hide
   2802          */
   2803         public static final String MEMCHECK_PHONE_SOFT_THRESHOLD = "memcheck_phone_soft";
   2804 
   2805         /**
   2806          * How many bytes the phone process must be below to avoid scheduling
   2807          * a hard restart.  This restart will happen immediately.
   2808          * @hide
   2809          */
   2810         public static final String MEMCHECK_PHONE_HARD_THRESHOLD = "memcheck_phone_hard";
   2811 
   2812         /**
   2813          * Boolean indicating whether restarting the phone process due to
   2814          * memory checks is enabled.
   2815          * @hide
   2816          */
   2817         public static final String MEMCHECK_PHONE_ENABLED = "memcheck_phone_enabled";
   2818 
   2819         /**
   2820          * First time during the day it is okay to kill processes
   2821          * or reboot the device due to low memory situations.  This number is
   2822          * in seconds since midnight.
   2823          * @hide
   2824          */
   2825         public static final String MEMCHECK_EXEC_START_TIME = "memcheck_exec_start_time";
   2826 
   2827         /**
   2828          * Last time during the day it is okay to kill processes
   2829          * or reboot the device due to low memory situations.  This number is
   2830          * in seconds since midnight.
   2831          * @hide
   2832          */
   2833         public static final String MEMCHECK_EXEC_END_TIME = "memcheck_exec_end_time";
   2834 
   2835         /**
   2836          * How long the screen must have been off in order to kill processes
   2837          * or reboot.  This number is in seconds.  A value of -1 means to
   2838          * entirely disregard whether the screen is on.
   2839          * @hide
   2840          */
   2841         public static final String MEMCHECK_MIN_SCREEN_OFF = "memcheck_min_screen_off";
   2842 
   2843         /**
   2844          * How much time there must be until the next alarm in order to kill processes
   2845          * or reboot.  This number is in seconds.  Note: this value must be
   2846          * smaller than {@link #MEMCHECK_RECHECK_INTERVAL} or else it will
   2847          * always see an alarm scheduled within its time.
   2848          * @hide
   2849          */
   2850         public static final String MEMCHECK_MIN_ALARM = "memcheck_min_alarm";
   2851 
   2852         /**
   2853          * How frequently to check whether it is a good time to restart things,
   2854          * if the device is in a bad state.  This number is in seconds.  Note:
   2855          * this value must be larger than {@link #MEMCHECK_MIN_ALARM} or else
   2856          * the alarm to schedule the recheck will always appear within the
   2857          * minimum "do not execute now" time.
   2858          * @hide
   2859          */
   2860         public static final String MEMCHECK_RECHECK_INTERVAL = "memcheck_recheck_interval";
   2861 
   2862         /**
   2863          * How frequently (in DAYS) to reboot the device.  If 0, no reboots
   2864          * will occur.
   2865          * @hide
   2866          */
   2867         public static final String REBOOT_INTERVAL = "reboot_interval";
   2868 
   2869         /**
   2870          * First time during the day it is okay to force a reboot of the
   2871          * device (if REBOOT_INTERVAL is set).  This number is
   2872          * in seconds since midnight.
   2873          * @hide
   2874          */
   2875         public static final String REBOOT_START_TIME = "reboot_start_time";
   2876 
   2877         /**
   2878          * The window of time (in seconds) after each REBOOT_INTERVAL in which
   2879          * a reboot can be executed.  If 0, a reboot will always be executed at
   2880          * exactly the given time.  Otherwise, it will only be executed if
   2881          * the device is idle within the window.
   2882          * @hide
   2883          */
   2884         public static final String REBOOT_WINDOW = "reboot_window";
   2885 
   2886         /**
   2887          * Threshold values for the duration and level of a discharge cycle, under
   2888          * which we log discharge cycle info.
   2889          * @hide
   2890          */
   2891         public static final String BATTERY_DISCHARGE_DURATION_THRESHOLD =
   2892                 "battery_discharge_duration_threshold";
   2893         /** @hide */
   2894         public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
   2895 
   2896         /**
   2897          * Flag for allowing ActivityManagerService to send ACTION_APP_ERROR intents
   2898          * on application crashes and ANRs. If this is disabled, the crash/ANR dialog
   2899          * will never display the "Report" button.
   2900          * Type: int ( 0 = disallow, 1 = allow )
   2901          * @hide
   2902          */
   2903         public static final String SEND_ACTION_APP_ERROR = "send_action_app_error";
   2904 
   2905         /**
   2906          * Nonzero causes Log.wtf() to crash.
   2907          * @hide
   2908          */
   2909         public static final String WTF_IS_FATAL = "wtf_is_fatal";
   2910 
   2911         /**
   2912          * Maximum age of entries kept by {@link android.os.IDropBox}.
   2913          * @hide
   2914          */
   2915         public static final String DROPBOX_AGE_SECONDS =
   2916                 "dropbox_age_seconds";
   2917         /**
   2918          * Maximum number of entry files which {@link android.os.IDropBox} will keep around.
   2919          * @hide
   2920          */
   2921         public static final String DROPBOX_MAX_FILES =
   2922                 "dropbox_max_files";
   2923         /**
   2924          * Maximum amount of disk space used by {@link android.os.IDropBox} no matter what.
   2925          * @hide
   2926          */
   2927         public static final String DROPBOX_QUOTA_KB =
   2928                 "dropbox_quota_kb";
   2929         /**
   2930          * Percent of free disk (excluding reserve) which {@link android.os.IDropBox} will use.
   2931          * @hide
   2932          */
   2933         public static final String DROPBOX_QUOTA_PERCENT =
   2934                 "dropbox_quota_percent";
   2935         /**
   2936          * Percent of total disk which {@link android.os.IDropBox} will never dip into.
   2937          * @hide
   2938          */
   2939         public static final String DROPBOX_RESERVE_PERCENT =
   2940                 "dropbox_reserve_percent";
   2941         /**
   2942          * Prefix for per-tag dropbox disable/enable settings.
   2943          * @hide
   2944          */
   2945         public static final String DROPBOX_TAG_PREFIX =
   2946                 "dropbox:";
   2947         /**
   2948          * Lines of logcat to include with system crash/ANR/etc. reports,
   2949          * as a prefix of the dropbox tag of the report type.
   2950          * For example, "logcat_for_system_server_anr" controls the lines
   2951          * of logcat captured with system server ANR reports.  0 to disable.
   2952          * @hide
   2953          */
   2954         public static final String ERROR_LOGCAT_PREFIX =
   2955                 "logcat_for_";
   2956 
   2957 
   2958         /**
   2959          * Screen timeout in milliseconds corresponding to the
   2960          * PowerManager's POKE_LOCK_SHORT_TIMEOUT flag (i.e. the fastest
   2961          * possible screen timeout behavior.)
   2962          * @hide
   2963          */
   2964         public static final String SHORT_KEYLIGHT_DELAY_MS =
   2965                 "short_keylight_delay_ms";
   2966 
   2967         /**
   2968          * The interval in minutes after which the amount of free storage left on the
   2969          * device is logged to the event log
   2970          * @hide
   2971          */
   2972         public static final String SYS_FREE_STORAGE_LOG_INTERVAL =
   2973                 "sys_free_storage_log_interval";
   2974 
   2975         /**
   2976          * Threshold for the amount of change in disk free space required to report the amount of
   2977          * free space. Used to prevent spamming the logs when the disk free space isn't changing
   2978          * frequently.
   2979          * @hide
   2980          */
   2981         public static final String DISK_FREE_CHANGE_REPORTING_THRESHOLD =
   2982                 "disk_free_change_reporting_threshold";
   2983 
   2984 
   2985         /**
   2986          * Minimum percentage of free storage on the device that is used to determine if
   2987          * the device is running low on storage.
   2988          * Say this value is set to 10, the device is considered running low on storage
   2989          * if 90% or more of the device storage is filled up.
   2990          * @hide
   2991          */
   2992         public static final String SYS_STORAGE_THRESHOLD_PERCENTAGE =
   2993                 "sys_storage_threshold_percentage";
   2994 
   2995         /**
   2996          * The interval in milliseconds after which Wi-Fi is considered idle.
   2997          * When idle, it is possible for the device to be switched from Wi-Fi to
   2998          * the mobile data network.
   2999          * @hide
   3000          */
   3001         public static final String WIFI_IDLE_MS = "wifi_idle_ms";
   3002 
   3003         /**
   3004          * The interval in milliseconds at which to check packet counts on the
   3005          * mobile data interface when screen is on, to detect possible data
   3006          * connection problems.
   3007          * @hide
   3008          */
   3009         public static final String PDP_WATCHDOG_POLL_INTERVAL_MS =
   3010                 "pdp_watchdog_poll_interval_ms";
   3011 
   3012         /**
   3013          * The interval in milliseconds at which to check packet counts on the
   3014          * mobile data interface when screen is off, to detect possible data
   3015          * connection problems.
   3016          * @hide
   3017          */
   3018         public static final String PDP_WATCHDOG_LONG_POLL_INTERVAL_MS =
   3019                 "pdp_watchdog_long_poll_interval_ms";
   3020 
   3021         /**
   3022          * The interval in milliseconds at which to check packet counts on the
   3023          * mobile data interface after {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT}
   3024          * outgoing packets has been reached without incoming packets.
   3025          * @hide
   3026          */
   3027         public static final String PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS =
   3028                 "pdp_watchdog_error_poll_interval_ms";
   3029 
   3030         /**
   3031          * The number of outgoing packets sent without seeing an incoming packet
   3032          * that triggers a countdown (of {@link #PDP_WATCHDOG_ERROR_POLL_COUNT}
   3033          * device is logged to the event log
   3034          * @hide
   3035          */
   3036         public static final String PDP_WATCHDOG_TRIGGER_PACKET_COUNT =
   3037                 "pdp_watchdog_trigger_packet_count";
   3038 
   3039         /**
   3040          * The number of polls to perform (at {@link #PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS})
   3041          * after hitting {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT} before
   3042          * attempting data connection recovery.
   3043          * @hide
   3044          */
   3045         public static final String PDP_WATCHDOG_ERROR_POLL_COUNT =
   3046                 "pdp_watchdog_error_poll_count";
   3047 
   3048         /**
   3049          * The number of failed PDP reset attempts before moving to something more
   3050          * drastic: re-registering to the network.
   3051          * @hide
   3052          */
   3053         public static final String PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT =
   3054                 "pdp_watchdog_max_pdp_reset_fail_count";
   3055 
   3056         /**
   3057          * Address to ping as a last sanity check before attempting any recovery.
   3058          * Unset or set to "0.0.0.0" to skip this check.
   3059          * @hide
   3060          */
   3061         public static final String PDP_WATCHDOG_PING_ADDRESS = "pdp_watchdog_ping_address";
   3062 
   3063         /**
   3064          * The "-w deadline" parameter for the ping, ie, the max time in
   3065          * seconds to spend pinging.
   3066          * @hide
   3067          */
   3068         public static final String PDP_WATCHDOG_PING_DEADLINE = "pdp_watchdog_ping_deadline";
   3069 
   3070         /**
   3071          * The interval in milliseconds at which to check gprs registration
   3072          * after the first registration mismatch of gprs and voice service,
   3073          * to detect possible data network registration problems.
   3074          *
   3075          * @hide
   3076          */
   3077         public static final String GPRS_REGISTER_CHECK_PERIOD_MS =
   3078                 "gprs_register_check_period_ms";
   3079 
   3080         /**
   3081          * The length of time in milli-seconds that automatic small adjustments to
   3082          * SystemClock are ignored if NITZ_UPDATE_DIFF is not exceeded.
   3083          * @hide
   3084          */
   3085         public static final String NITZ_UPDATE_SPACING = "nitz_update_spacing";
   3086 
   3087         /**
   3088          * If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment
   3089          * to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been
   3090          * exceeded.
   3091          * @hide
   3092          */
   3093         public static final String NITZ_UPDATE_DIFF = "nitz_update_diff";
   3094 
   3095         /**
   3096          * The maximum reconnect delay for short network outages or when the network is suspended
   3097          * due to phone use.
   3098          * @hide
   3099          */
   3100         public static final String SYNC_MAX_RETRY_DELAY_IN_SECONDS =
   3101                 "sync_max_retry_delay_in_seconds";
   3102 
   3103         /**
   3104          * The interval in milliseconds at which to check the number of SMS sent
   3105          * out without asking for use permit, to limit the un-authorized SMS
   3106          * usage.
   3107          * @hide
   3108          */
   3109         public static final String SMS_OUTGOING_CHECK_INTERVAL_MS =
   3110                 "sms_outgoing_check_interval_ms";
   3111 
   3112         /**
   3113          * The number of outgoing SMS sent without asking for user permit
   3114          * (of {@link #SMS_OUTGOING_CHECK_INTERVAL_MS}
   3115          * @hide
   3116          */
   3117         public static final String SMS_OUTGOING_CHECK_MAX_COUNT =
   3118                 "sms_outgoing_check_max_count";
   3119 
   3120         /**
   3121          * The number of promoted sources in GlobalSearch.
   3122          * @hide
   3123          */
   3124         public static final String SEARCH_NUM_PROMOTED_SOURCES = "search_num_promoted_sources";
   3125         /**
   3126          * The maximum number of suggestions returned by GlobalSearch.
   3127          * @hide
   3128          */
   3129         public static final String SEARCH_MAX_RESULTS_TO_DISPLAY = "search_max_results_to_display";
   3130         /**
   3131          * The number of suggestions GlobalSearch will ask each non-web search source for.
   3132          * @hide
   3133          */
   3134         public static final String SEARCH_MAX_RESULTS_PER_SOURCE = "search_max_results_per_source";
   3135         /**
   3136          * The number of suggestions the GlobalSearch will ask the web search source for.
   3137          * @hide
   3138          */
   3139         public static final String SEARCH_WEB_RESULTS_OVERRIDE_LIMIT =
   3140                 "search_web_results_override_limit";
   3141         /**
   3142          * The number of milliseconds that GlobalSearch will wait for suggestions from
   3143          * promoted sources before continuing with all other sources.
   3144          * @hide
   3145          */
   3146         public static final String SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS =
   3147                 "search_promoted_source_deadline_millis";
   3148         /**
   3149          * The number of milliseconds before GlobalSearch aborts search suggesiton queries.
   3150          * @hide
   3151          */
   3152         public static final String SEARCH_SOURCE_TIMEOUT_MILLIS = "search_source_timeout_millis";
   3153         /**
   3154          * The maximum number of milliseconds that GlobalSearch shows the previous results
   3155          * after receiving a new query.
   3156          * @hide
   3157          */
   3158         public static final String SEARCH_PREFILL_MILLIS = "search_prefill_millis";
   3159         /**
   3160          * The maximum age of log data used for shortcuts in GlobalSearch.
   3161          * @hide
   3162          */
   3163         public static final String SEARCH_MAX_STAT_AGE_MILLIS = "search_max_stat_age_millis";
   3164         /**
   3165          * The maximum age of log data used for source ranking in GlobalSearch.
   3166          * @hide
   3167          */
   3168         public static final String SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS =
   3169                 "search_max_source_event_age_millis";
   3170         /**
   3171          * The minimum number of impressions needed to rank a source in GlobalSearch.
   3172          * @hide
   3173          */
   3174         public static final String SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING =
   3175                 "search_min_impressions_for_source_ranking";
   3176         /**
   3177          * The minimum number of clicks needed to rank a source in GlobalSearch.
   3178          * @hide
   3179          */
   3180         public static final String SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING =
   3181                 "search_min_clicks_for_source_ranking";
   3182         /**
   3183          * The maximum number of shortcuts shown by GlobalSearch.
   3184          * @hide
   3185          */
   3186         public static final String SEARCH_MAX_SHORTCUTS_RETURNED = "search_max_shortcuts_returned";
   3187         /**
   3188          * The size of the core thread pool for suggestion queries in GlobalSearch.
   3189          * @hide
   3190          */
   3191         public static final String SEARCH_QUERY_THREAD_CORE_POOL_SIZE =
   3192                 "search_query_thread_core_pool_size";
   3193         /**
   3194          * The maximum size of the thread pool for suggestion queries in GlobalSearch.
   3195          * @hide
   3196          */
   3197         public static final String SEARCH_QUERY_THREAD_MAX_POOL_SIZE =
   3198                 "search_query_thread_max_pool_size";
   3199         /**
   3200          * The size of the core thread pool for shortcut refreshing in GlobalSearch.
   3201          * @hide
   3202          */
   3203         public static final String SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE =
   3204                 "search_shortcut_refresh_core_pool_size";
   3205         /**
   3206          * The maximum size of the thread pool for shortcut refreshing in GlobalSearch.
   3207          * @hide
   3208          */
   3209         public static final String SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE =
   3210                 "search_shortcut_refresh_max_pool_size";
   3211         /**
   3212          * The maximun time that excess threads in the GlobalSeach thread pools will
   3213          * wait before terminating.
   3214          * @hide
   3215          */
   3216         public static final String SEARCH_THREAD_KEEPALIVE_SECONDS =
   3217                 "search_thread_keepalive_seconds";
   3218         /**
   3219          * The maximum number of concurrent suggestion queries to each source.
   3220          * @hide
   3221          */
   3222         public static final String SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT =
   3223                 "search_per_source_concurrent_query_limit";
   3224 
   3225         /**
   3226          * Whether or not alert sounds are played on MountService events. (0 = false, 1 = true)
   3227          * @hide
   3228          */
   3229         public static final String MOUNT_PLAY_NOTIFICATION_SND = "mount_play_not_snd";
   3230 
   3231         /**
   3232          * Whether or not UMS auto-starts on UMS host detection. (0 = false, 1 = true)
   3233          * @hide
   3234          */
   3235         public static final String MOUNT_UMS_AUTOSTART = "mount_ums_autostart";
   3236 
   3237         /**
   3238          * Whether or not a notification is displayed on UMS host detection. (0 = false, 1 = true)
   3239          * @hide
   3240          */
   3241         public static final String MOUNT_UMS_PROMPT = "mount_ums_prompt";
   3242 
   3243         /**
   3244          * Whether or not a notification is displayed while UMS is enabled. (0 = false, 1 = true)
   3245          * @hide
   3246          */
   3247         public static final String MOUNT_UMS_NOTIFY_ENABLED = "mount_ums_notify_enabled";
   3248 
   3249         /**
   3250          * If nonzero, ANRs in invisible background processes bring up a dialog.
   3251          * Otherwise, the process will be silently killed.
   3252          * @hide
   3253          */
   3254         public static final String ANR_SHOW_BACKGROUND = "anr_show_background";
   3255 
   3256         /**
   3257          * The {@link ComponentName} string of the service to be used as the voice recognition
   3258          * service.
   3259          *
   3260          * @hide
   3261          */
   3262         public static final String VOICE_RECOGNITION_SERVICE = "voice_recognition_service";
   3263 
   3264         /**
   3265          * What happens when the user presses the Power button while in-call
   3266          * and the screen is on.<br/>
   3267          * <b>Values:</b><br/>
   3268          * 1 - The Power button turns off the screen and locks the device. (Default behavior)<br/>
   3269          * 2 - The Power button hangs up the current call.<br/>
   3270          *
   3271          * @hide
   3272          */
   3273         public static final String INCALL_POWER_BUTTON_BEHAVIOR = "incall_power_button_behavior";
   3274 
   3275         /**
   3276          * INCALL_POWER_BUTTON_BEHAVIOR value for "turn off screen".
   3277          * @hide
   3278          */
   3279         public static final int INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF = 0x1;
   3280 
   3281         /**
   3282          * INCALL_POWER_BUTTON_BEHAVIOR value for "hang up".
   3283          * @hide
   3284          */
   3285         public static final int INCALL_POWER_BUTTON_BEHAVIOR_HANGUP = 0x2;
   3286 
   3287         /**
   3288          * INCALL_POWER_BUTTON_BEHAVIOR default value.
   3289          * @hide
   3290          */
   3291         public static final int INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT =
   3292                 INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF;
   3293 
   3294         /**
   3295          * The current night mode that has been selected by the user.  Owned
   3296          * and controlled by UiModeManagerService.  Constants are as per
   3297          * UiModeManager.
   3298          * @hide
   3299          */
   3300         public static final String UI_NIGHT_MODE = "ui_night_mode";
   3301 
   3302         /**
   3303          * Let user pick default install location.
   3304          * @hide
   3305          */
   3306         public static final String SET_INSTALL_LOCATION = "set_install_location";
   3307 
   3308         /**
   3309          * Default install location value.
   3310          * 0 = auto, let system decide
   3311          * 1 = internal
   3312          * 2 = sdcard
   3313          * @hide
   3314          */
   3315         public static final String DEFAULT_INSTALL_LOCATION = "default_install_location";
   3316 
   3317         /**
   3318          * The bandwidth throttle polling freqency in seconds
   3319          * @hide
   3320          */
   3321         public static final String THROTTLE_POLLING_SEC = "throttle_polling_sec";
   3322 
   3323         /**
   3324          * The bandwidth throttle threshold (long)
   3325          * @hide
   3326          */
   3327         public static final String THROTTLE_THRESHOLD_BYTES = "throttle_threshold_bytes";
   3328 
   3329         /**
   3330          * The bandwidth throttle value (kbps)
   3331          * @hide
   3332          */
   3333         public static final String THROTTLE_VALUE_KBITSPS = "throttle_value_kbitsps";
   3334 
   3335         /**
   3336          * The bandwidth throttle reset calendar day (1-28)
   3337          * @hide
   3338          */
   3339         public static final String THROTTLE_RESET_DAY = "throttle_reset_day";
   3340 
   3341         /**
   3342          * The throttling notifications we should send
   3343          * @hide
   3344          */
   3345         public static final String THROTTLE_NOTIFICATION_TYPE = "throttle_notification_type";
   3346 
   3347         /**
   3348          * Help URI for data throttling policy
   3349          * @hide
   3350          */
   3351         public static final String THROTTLE_HELP_URI = "throttle_help_uri";
   3352 
   3353         /**
   3354          * The length of time in Sec that we allow our notion of NTP time
   3355          * to be cached before we refresh it
   3356          * @hide
   3357          */
   3358         public static final String THROTTLE_MAX_NTP_CACHE_AGE_SEC =
   3359                 "throttle_max_ntp_cache_age_sec";
   3360 
   3361 
   3362         /**
   3363          * @hide
   3364          */
   3365         public static final String[] SETTINGS_TO_BACKUP = {
   3366             ADB_ENABLED,
   3367             ALLOW_MOCK_LOCATION,
   3368             PARENTAL_CONTROL_ENABLED,
   3369             PARENTAL_CONTROL_REDIRECT_URL,
   3370             USB_MASS_STORAGE_ENABLED,
   3371             ACCESSIBILITY_ENABLED,
   3372             BACKUP_AUTO_RESTORE,
   3373             ENABLED_ACCESSIBILITY_SERVICES,
   3374             TTS_USE_DEFAULTS,
   3375             TTS_DEFAULT_RATE,
   3376             TTS_DEFAULT_PITCH,
   3377             TTS_DEFAULT_SYNTH,
   3378             TTS_DEFAULT_LANG,
   3379             TTS_DEFAULT_COUNTRY,
   3380             TTS_ENABLED_PLUGINS,
   3381             WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
   3382             WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
   3383             WIFI_NUM_ALLOWED_CHANNELS,
   3384             WIFI_NUM_OPEN_NETWORKS_KEPT,
   3385             MOUNT_PLAY_NOTIFICATION_SND,
   3386             MOUNT_UMS_AUTOSTART,
   3387             MOUNT_UMS_PROMPT,
   3388             MOUNT_UMS_NOTIFY_ENABLED,
   3389             UI_NIGHT_MODE
   3390         };
   3391 
   3392         /**
   3393          * Helper method for determining if a location provider is enabled.
   3394          * @param cr the content resolver to use
   3395          * @param provider the location provider to query
   3396          * @return true if the provider is enabled
   3397          */
   3398         public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) {
   3399             String allowedProviders = Settings.Secure.getString(cr, LOCATION_PROVIDERS_ALLOWED);
   3400             if (allowedProviders != null) {
   3401                 return (allowedProviders.equals(provider) ||
   3402                         allowedProviders.contains("," + provider + ",") ||
   3403                         allowedProviders.startsWith(provider + ",") ||
   3404                         allowedProviders.endsWith("," + provider));
   3405             }
   3406             return false;
   3407         }
   3408 
   3409         /**
   3410          * Thread-safe method for enabling or disabling a single location provider.
   3411          * @param cr the content resolver to use
   3412          * @param provider the location provider to enable or disable
   3413          * @param enabled true if the provider should be enabled
   3414          */
   3415         public static final void setLocationProviderEnabled(ContentResolver cr,
   3416                 String provider, boolean enabled) {
   3417             // to ensure thread safety, we write the provider name with a '+' or '-'
   3418             // and let the SettingsProvider handle it rather than reading and modifying
   3419             // the list of enabled providers.
   3420             if (enabled) {
   3421                 provider = "+" + provider;
   3422             } else {
   3423                 provider = "-" + provider;
   3424             }
   3425             putString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider);
   3426         }
   3427     }
   3428 
   3429     /**
   3430      * User-defined bookmarks and shortcuts.  The target of each bookmark is an
   3431      * Intent URL, allowing it to be either a web page or a particular
   3432      * application activity.
   3433      *
   3434      * @hide
   3435      */
   3436     public static final class Bookmarks implements BaseColumns
   3437     {
   3438         private static final String TAG = "Bookmarks";
   3439 
   3440         /**
   3441          * The content:// style URL for this table
   3442          */
   3443         public static final Uri CONTENT_URI =
   3444             Uri.parse("content://" + AUTHORITY + "/bookmarks");
   3445 
   3446         /**
   3447          * The row ID.
   3448          * <p>Type: INTEGER</p>
   3449          */
   3450         public static final String ID = "_id";
   3451 
   3452         /**
   3453          * Descriptive name of the bookmark that can be displayed to the user.
   3454          * If this is empty, the title should be resolved at display time (use
   3455          * {@link #getTitle(Context, Cursor)} any time you want to display the
   3456          * title of a bookmark.)
   3457          * <P>
   3458          * Type: TEXT
   3459          * </P>
   3460          */
   3461         public static final String TITLE = "title";
   3462 
   3463         /**
   3464          * Arbitrary string (displayed to the user) that allows bookmarks to be
   3465          * organized into categories.  There are some special names for
   3466          * standard folders, which all start with '@'.  The label displayed for
   3467          * the folder changes with the locale (via {@link #getLabelForFolder}) but
   3468          * the folder name does not change so you can consistently query for
   3469          * the folder regardless of the current locale.
   3470          *
   3471          * <P>Type: TEXT</P>
   3472          *
   3473          */
   3474         public static final String FOLDER = "folder";
   3475 
   3476         /**
   3477          * The Intent URL of the bookmark, describing what it points to.  This
   3478          * value is given to {@link android.content.Intent#getIntent} to create
   3479          * an Intent that can be launched.
   3480          * <P>Type: TEXT</P>
   3481          */
   3482         public static final String INTENT = "intent";
   3483 
   3484         /**
   3485          * Optional shortcut character associated with this bookmark.
   3486          * <P>Type: INTEGER</P>
   3487          */
   3488         public static final String SHORTCUT = "shortcut";
   3489 
   3490         /**
   3491          * The order in which the bookmark should be displayed
   3492          * <P>Type: INTEGER</P>
   3493          */
   3494         public static final String ORDERING = "ordering";
   3495 
   3496         private static final String[] sIntentProjection = { INTENT };
   3497         private static final String[] sShortcutProjection = { ID, SHORTCUT };
   3498         private static final String sShortcutSelection = SHORTCUT + "=?";
   3499 
   3500         /**
   3501          * Convenience function to retrieve the bookmarked Intent for a
   3502          * particular shortcut key.
   3503          *
   3504          * @param cr The ContentResolver to query.
   3505          * @param shortcut The shortcut key.
   3506          *
   3507          * @return Intent The bookmarked URL, or null if there is no bookmark
   3508          *         matching the given shortcut.
   3509          */
   3510         public static Intent getIntentForShortcut(ContentResolver cr, char shortcut)
   3511         {
   3512             Intent intent = null;
   3513 
   3514             Cursor c = cr.query(CONTENT_URI,
   3515                     sIntentProjection, sShortcutSelection,
   3516                     new String[] { String.valueOf((int) shortcut) }, ORDERING);
   3517             // Keep trying until we find a valid shortcut
   3518             try {
   3519                 while (intent == null && c.moveToNext()) {
   3520                     try {
   3521                         String intentURI = c.getString(c.getColumnIndexOrThrow(INTENT));
   3522                         intent = Intent.getIntent(intentURI);
   3523                     } catch (java.net.URISyntaxException e) {
   3524                         // The stored URL is bad...  ignore it.
   3525                     } catch (IllegalArgumentException e) {
   3526                         // Column not found
   3527                         Log.w(TAG, "Intent column not found", e);
   3528                     }
   3529                 }
   3530             } finally {
   3531                 if (c != null) c.close();
   3532             }
   3533 
   3534             return intent;
   3535         }
   3536 
   3537         /**
   3538          * Add a new bookmark to the system.
   3539          *
   3540          * @param cr The ContentResolver to query.
   3541          * @param intent The desired target of the bookmark.
   3542          * @param title Bookmark title that is shown to the user; null if none
   3543          *            or it should be resolved to the intent's title.
   3544          * @param folder Folder in which to place the bookmark; null if none.
   3545          * @param shortcut Shortcut that will invoke the bookmark; 0 if none. If
   3546          *            this is non-zero and there is an existing bookmark entry
   3547          *            with this same shortcut, then that existing shortcut is
   3548          *            cleared (the bookmark is not removed).
   3549          * @return The unique content URL for the new bookmark entry.
   3550          */
   3551         public static Uri add(ContentResolver cr,
   3552                                            Intent intent,
   3553                                            String title,
   3554                                            String folder,
   3555                                            char shortcut,
   3556                                            int ordering)
   3557         {
   3558             // If a shortcut is supplied, and it is already defined for
   3559             // another bookmark, then remove the old definition.
   3560             if (shortcut != 0) {
   3561                 Cursor c = cr.query(CONTENT_URI,
   3562                         sShortcutProjection, sShortcutSelection,
   3563                         new String[] { String.valueOf((int) shortcut) }, null);
   3564                 try {
   3565                     if (c.moveToFirst()) {
   3566                         while (c.getCount() > 0) {
   3567                             if (!c.deleteRow()) {
   3568                                 Log.w(TAG, "Could not delete existing shortcut row");
   3569                             }
   3570                         }
   3571                     }
   3572                 } finally {
   3573                     if (c != null) c.close();
   3574                 }
   3575             }
   3576 
   3577             ContentValues values = new ContentValues();
   3578             if (title != null) values.put(TITLE, title);
   3579             if (folder != null) values.put(FOLDER, folder);
   3580             values.put(INTENT, intent.toURI());
   3581             if (shortcut != 0) values.put(SHORTCUT, (int) shortcut);
   3582             values.put(ORDERING, ordering);
   3583             return cr.insert(CONTENT_URI, values);
   3584         }
   3585 
   3586         /**
   3587          * Return the folder name as it should be displayed to the user.  This
   3588          * takes care of localizing special folders.
   3589          *
   3590          * @param r Resources object for current locale; only need access to
   3591          *          system resources.
   3592          * @param folder The value found in the {@link #FOLDER} column.
   3593          *
   3594          * @return CharSequence The label for this folder that should be shown
   3595          *         to the user.
   3596          */
   3597         public static CharSequence getLabelForFolder(Resources r, String folder) {
   3598             return folder;
   3599         }
   3600 
   3601         /**
   3602          * Return the title as it should be displayed to the user. This takes
   3603          * care of localizing bookmarks that point to activities.
   3604          *
   3605          * @param context A context.
   3606          * @param cursor A cursor pointing to the row whose title should be
   3607          *        returned. The cursor must contain at least the {@link #TITLE}
   3608          *        and {@link #INTENT} columns.
   3609          * @return A title that is localized and can be displayed to the user,
   3610          *         or the empty string if one could not be found.
   3611          */
   3612         public static CharSequence getTitle(Context context, Cursor cursor) {
   3613             int titleColumn = cursor.getColumnIndex(TITLE);
   3614             int intentColumn = cursor.getColumnIndex(INTENT);
   3615             if (titleColumn == -1 || intentColumn == -1) {
   3616                 throw new IllegalArgumentException(
   3617                         "The cursor must contain the TITLE and INTENT columns.");
   3618             }
   3619 
   3620             String title = cursor.getString(titleColumn);
   3621             if (!TextUtils.isEmpty(title)) {
   3622                 return title;
   3623             }
   3624 
   3625             String intentUri = cursor.getString(intentColumn);
   3626             if (TextUtils.isEmpty(intentUri)) {
   3627                 return "";
   3628             }
   3629 
   3630             Intent intent;
   3631             try {
   3632                 intent = Intent.getIntent(intentUri);
   3633             } catch (URISyntaxException e) {
   3634                 return "";
   3635             }
   3636 
   3637             PackageManager packageManager = context.getPackageManager();
   3638             ResolveInfo info = packageManager.resolveActivity(intent, 0);
   3639             return info != null ? info.loadLabel(packageManager) : "";
   3640         }
   3641     }
   3642 
   3643     /**
   3644      * Returns the device ID that we should use when connecting to the mobile gtalk server.
   3645      * This is a string like "android-0x1242", where the hex string is the Android ID obtained
   3646      * from the GoogleLoginService.
   3647      *
   3648      * @param androidId The Android ID for this device.
   3649      * @return The device ID that should be used when connecting to the mobile gtalk server.
   3650      * @hide
   3651      */
   3652     public static String getGTalkDeviceId(long androidId) {
   3653         return "android-" + Long.toHexString(androidId);
   3654     }
   3655 }
   3656