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 android.annotation.NonNull;
     20 import android.annotation.SdkConstant;
     21 import android.annotation.SdkConstant.SdkConstantType;
     22 import android.annotation.SystemApi;
     23 import android.annotation.TestApi;
     24 import android.app.ActivityThread;
     25 import android.app.AppOpsManager;
     26 import android.app.Application;
     27 import android.app.SearchManager;
     28 import android.app.WallpaperManager;
     29 import android.content.ComponentName;
     30 import android.content.ContentResolver;
     31 import android.content.ContentValues;
     32 import android.content.Context;
     33 import android.content.IContentProvider;
     34 import android.content.Intent;
     35 import android.content.pm.ActivityInfo;
     36 import android.content.pm.PackageManager;
     37 import android.content.pm.ResolveInfo;
     38 import android.content.res.Configuration;
     39 import android.content.res.Resources;
     40 import android.database.Cursor;
     41 import android.database.SQLException;
     42 import android.location.LocationManager;
     43 import android.net.ConnectivityManager;
     44 import android.net.Uri;
     45 import android.net.wifi.WifiManager;
     46 import android.os.BatteryManager;
     47 import android.os.Binder;
     48 import android.os.Bundle;
     49 import android.os.DropBoxManager;
     50 import android.os.IBinder;
     51 import android.os.LocaleList;
     52 import android.os.Process;
     53 import android.os.RemoteException;
     54 import android.os.ServiceManager;
     55 import android.os.UserHandle;
     56 import android.os.Build.VERSION_CODES;
     57 import android.speech.tts.TextToSpeech;
     58 import android.text.TextUtils;
     59 import android.util.AndroidException;
     60 import android.util.ArrayMap;
     61 import android.util.ArraySet;
     62 import android.util.Log;
     63 import android.util.MemoryIntArray;
     64 
     65 import com.android.internal.annotations.GuardedBy;
     66 import com.android.internal.util.ArrayUtils;
     67 import com.android.internal.widget.ILockSettings;
     68 
     69 import java.io.IOException;
     70 import java.net.URISyntaxException;
     71 import java.text.SimpleDateFormat;
     72 import java.util.HashMap;
     73 import java.util.HashSet;
     74 import java.util.Locale;
     75 import java.util.Map;
     76 import java.util.Set;
     77 
     78 /**
     79  * The Settings provider contains global system-level device preferences.
     80  */
     81 public final class Settings {
     82 
     83     // Intent actions for Settings
     84 
     85     /**
     86      * Activity Action: Show system settings.
     87      * <p>
     88      * Input: Nothing.
     89      * <p>
     90      * Output: Nothing.
     91      */
     92     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     93     public static final String ACTION_SETTINGS = "android.settings.SETTINGS";
     94 
     95     /**
     96      * Activity Action: Show settings to allow configuration of APNs.
     97      * <p>
     98      * Input: Nothing.
     99      * <p>
    100      * Output: Nothing.
    101      */
    102     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    103     public static final String ACTION_APN_SETTINGS = "android.settings.APN_SETTINGS";
    104 
    105     /**
    106      * Activity Action: Show settings to allow configuration of current location
    107      * sources.
    108      * <p>
    109      * In some cases, a matching Activity may not exist, so ensure you
    110      * safeguard against this.
    111      * <p>
    112      * Input: Nothing.
    113      * <p>
    114      * Output: Nothing.
    115      */
    116     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    117     public static final String ACTION_LOCATION_SOURCE_SETTINGS =
    118             "android.settings.LOCATION_SOURCE_SETTINGS";
    119 
    120     /**
    121      * Activity Action: Show settings to allow configuration of users.
    122      * <p>
    123      * In some cases, a matching Activity may not exist, so ensure you
    124      * safeguard against this.
    125      * <p>
    126      * Input: Nothing.
    127      * <p>
    128      * Output: Nothing.
    129      * @hide
    130      */
    131     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    132     public static final String ACTION_USER_SETTINGS =
    133             "android.settings.USER_SETTINGS";
    134 
    135     /**
    136      * Activity Action: Show settings to allow configuration of wireless controls
    137      * such as Wi-Fi, Bluetooth and Mobile networks.
    138      * <p>
    139      * In some cases, a matching Activity may not exist, so ensure you
    140      * safeguard against this.
    141      * <p>
    142      * Input: Nothing.
    143      * <p>
    144      * Output: Nothing.
    145      */
    146     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    147     public static final String ACTION_WIRELESS_SETTINGS =
    148             "android.settings.WIRELESS_SETTINGS";
    149 
    150     /**
    151      * Activity Action: Show tether provisioning activity.
    152      *
    153      * <p>
    154      * In some cases, a matching Activity may not exist, so ensure you
    155      * safeguard against this.
    156      * <p>
    157      * Input: {@link ConnectivityManager.EXTRA_TETHER_TYPE} should be included to specify which type
    158      * of tethering should be checked. {@link ConnectivityManager.EXTRA_PROVISION_CALLBACK} should
    159      * contain a {@link ResultReceiver} which will be called back with a tether result code.
    160      * <p>
    161      * Output: The result of the provisioning check.
    162      * {@link ConnectivityManager.TETHER_ERROR_NO_ERROR} if successful,
    163      * {@link ConnectivityManager.TETHER_ERROR_PROVISION_FAILED} for failure.
    164      *
    165      * @hide
    166      */
    167     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    168     public static final String ACTION_TETHER_PROVISIONING =
    169             "android.settings.TETHER_PROVISIONING_UI";
    170 
    171     /**
    172      * Activity Action: Show settings to allow entering/exiting airplane mode.
    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     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    182     public static final String ACTION_AIRPLANE_MODE_SETTINGS =
    183             "android.settings.AIRPLANE_MODE_SETTINGS";
    184 
    185     /**
    186      * Activity Action: Modify Airplane mode settings using a voice command.
    187      * <p>
    188      * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
    189      * <p>
    190      * This intent MUST be started using
    191      * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
    192      * startVoiceActivity}.
    193      * <p>
    194      * Note: The activity implementing this intent MUST verify that
    195      * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction} returns true before
    196      * modifying the setting.
    197      * <p>
    198      * Input: To tell which state airplane mode should be set to, add the
    199      * {@link #EXTRA_AIRPLANE_MODE_ENABLED} extra to this Intent with the state specified.
    200      * If the extra is not included, no changes will be made.
    201      * <p>
    202      * Output: Nothing.
    203      */
    204     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    205     public static final String ACTION_VOICE_CONTROL_AIRPLANE_MODE =
    206             "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
    207 
    208     /**
    209      * Activity Action: Show settings for accessibility modules.
    210      * <p>
    211      * In some cases, a matching Activity may not exist, so ensure you
    212      * safeguard against this.
    213      * <p>
    214      * Input: Nothing.
    215      * <p>
    216      * Output: Nothing.
    217      */
    218     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    219     public static final String ACTION_ACCESSIBILITY_SETTINGS =
    220             "android.settings.ACCESSIBILITY_SETTINGS";
    221 
    222     /**
    223      * Activity Action: Show settings to control access to usage information.
    224      * <p>
    225      * In some cases, a matching Activity may not exist, so ensure you
    226      * safeguard against this.
    227      * <p>
    228      * Input: Nothing.
    229      * <p>
    230      * Output: Nothing.
    231      */
    232     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    233     public static final String ACTION_USAGE_ACCESS_SETTINGS =
    234             "android.settings.USAGE_ACCESS_SETTINGS";
    235 
    236     /**
    237      * Activity Category: Show application settings related to usage access.
    238      * <p>
    239      * An activity that provides a user interface for adjusting usage access related
    240      * preferences for its containing application. Optional but recommended for apps that
    241      * use {@link android.Manifest.permission#PACKAGE_USAGE_STATS}.
    242      * <p>
    243      * The activity may define meta-data to describe what usage access is
    244      * used for within their app with {@link #METADATA_USAGE_ACCESS_REASON}, which
    245      * will be displayed in Settings.
    246      * <p>
    247      * Input: Nothing.
    248      * <p>
    249      * Output: Nothing.
    250      */
    251     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
    252     public static final String INTENT_CATEGORY_USAGE_ACCESS_CONFIG =
    253             "android.intent.category.USAGE_ACCESS_CONFIG";
    254 
    255     /**
    256      * Metadata key: Reason for needing usage access.
    257      * <p>
    258      * A key for metadata attached to an activity that receives action
    259      * {@link #INTENT_CATEGORY_USAGE_ACCESS_CONFIG}, shown to the
    260      * user as description of how the app uses usage access.
    261      * <p>
    262      */
    263     public static final String METADATA_USAGE_ACCESS_REASON =
    264             "android.settings.metadata.USAGE_ACCESS_REASON";
    265 
    266     /**
    267      * Activity Action: Show settings to allow configuration of security and
    268      * location privacy.
    269      * <p>
    270      * In some cases, a matching Activity may not exist, so ensure you
    271      * safeguard against this.
    272      * <p>
    273      * Input: Nothing.
    274      * <p>
    275      * Output: Nothing.
    276      */
    277     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    278     public static final String ACTION_SECURITY_SETTINGS =
    279             "android.settings.SECURITY_SETTINGS";
    280 
    281     /**
    282      * Activity Action: Show trusted credentials settings, opening to the user tab,
    283      * to allow management of installed credentials.
    284      * <p>
    285      * In some cases, a matching Activity may not exist, so ensure you
    286      * safeguard against this.
    287      * <p>
    288      * Input: Nothing.
    289      * <p>
    290      * Output: Nothing.
    291      * @hide
    292      */
    293     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    294     public static final String ACTION_TRUSTED_CREDENTIALS_USER =
    295             "com.android.settings.TRUSTED_CREDENTIALS_USER";
    296 
    297     /**
    298      * Activity Action: Show dialog explaining that an installed CA cert may enable
    299      * monitoring of encrypted network traffic.
    300      * <p>
    301      * In some cases, a matching Activity may not exist, so ensure you
    302      * safeguard against this. Add {@link #EXTRA_NUMBER_OF_CERTIFICATES} extra to indicate the
    303      * number of certificates.
    304      * <p>
    305      * Input: Nothing.
    306      * <p>
    307      * Output: Nothing.
    308      * @hide
    309      */
    310     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    311     public static final String ACTION_MONITORING_CERT_INFO =
    312             "com.android.settings.MONITORING_CERT_INFO";
    313 
    314     /**
    315      * Activity Action: Show settings to allow configuration of privacy options.
    316      * <p>
    317      * In some cases, a matching Activity may not exist, so ensure you
    318      * safeguard against this.
    319      * <p>
    320      * Input: Nothing.
    321      * <p>
    322      * Output: Nothing.
    323      */
    324     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    325     public static final String ACTION_PRIVACY_SETTINGS =
    326             "android.settings.PRIVACY_SETTINGS";
    327 
    328     /**
    329      * Activity Action: Show settings to allow configuration of VPN.
    330      * <p>
    331      * In some cases, a matching Activity may not exist, so ensure you
    332      * safeguard against this.
    333      * <p>
    334      * Input: Nothing.
    335      * <p>
    336      * Output: Nothing.
    337      */
    338     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    339     public static final String ACTION_VPN_SETTINGS =
    340             "android.settings.VPN_SETTINGS";
    341 
    342     /**
    343      * Activity Action: Show settings to allow configuration of Wi-Fi.
    344      * <p>
    345      * In some cases, a matching Activity may not exist, so ensure you
    346      * safeguard against this.
    347      * <p>
    348      * Input: Nothing.
    349      * <p>
    350      * Output: Nothing.
    351 
    352      */
    353     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    354     public static final String ACTION_WIFI_SETTINGS =
    355             "android.settings.WIFI_SETTINGS";
    356 
    357     /**
    358      * Activity Action: Show settings to allow configuration of a static IP
    359      * address for Wi-Fi.
    360      * <p>
    361      * In some cases, a matching Activity may not exist, so ensure you safeguard
    362      * against this.
    363      * <p>
    364      * Input: Nothing.
    365      * <p>
    366      * Output: Nothing.
    367      */
    368     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    369     public static final String ACTION_WIFI_IP_SETTINGS =
    370             "android.settings.WIFI_IP_SETTINGS";
    371 
    372     /**
    373      * Activity Action: Show settings to allow configuration of Bluetooth.
    374      * <p>
    375      * In some cases, a matching Activity may not exist, so ensure you
    376      * safeguard against this.
    377      * <p>
    378      * Input: Nothing.
    379      * <p>
    380      * Output: Nothing.
    381      */
    382     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    383     public static final String ACTION_BLUETOOTH_SETTINGS =
    384             "android.settings.BLUETOOTH_SETTINGS";
    385 
    386     /**
    387      * Activity Action: Show settings to allow configuration of cast endpoints.
    388      * <p>
    389      * In some cases, a matching Activity may not exist, so ensure you
    390      * safeguard against this.
    391      * <p>
    392      * Input: Nothing.
    393      * <p>
    394      * Output: Nothing.
    395      */
    396     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    397     public static final String ACTION_CAST_SETTINGS =
    398             "android.settings.CAST_SETTINGS";
    399 
    400     /**
    401      * Activity Action: Show settings to allow configuration of date and time.
    402      * <p>
    403      * In some cases, a matching Activity may not exist, so ensure you
    404      * safeguard against this.
    405      * <p>
    406      * Input: Nothing.
    407      * <p>
    408      * Output: Nothing.
    409      */
    410     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    411     public static final String ACTION_DATE_SETTINGS =
    412             "android.settings.DATE_SETTINGS";
    413 
    414     /**
    415      * Activity Action: Show settings to allow configuration of sound and volume.
    416      * <p>
    417      * In some cases, a matching Activity may not exist, so ensure you
    418      * safeguard against this.
    419      * <p>
    420      * Input: Nothing.
    421      * <p>
    422      * Output: Nothing.
    423      */
    424     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    425     public static final String ACTION_SOUND_SETTINGS =
    426             "android.settings.SOUND_SETTINGS";
    427 
    428     /**
    429      * Activity Action: Show settings to allow configuration of display.
    430      * <p>
    431      * In some cases, a matching Activity may not exist, so ensure you
    432      * safeguard against this.
    433      * <p>
    434      * Input: Nothing.
    435      * <p>
    436      * Output: Nothing.
    437      */
    438     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    439     public static final String ACTION_DISPLAY_SETTINGS =
    440             "android.settings.DISPLAY_SETTINGS";
    441 
    442     /**
    443      * Activity Action: Show settings to allow configuration of locale.
    444      * <p>
    445      * In some cases, a matching Activity may not exist, so ensure you
    446      * safeguard against this.
    447      * <p>
    448      * Input: Nothing.
    449      * <p>
    450      * Output: Nothing.
    451      */
    452     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    453     public static final String ACTION_LOCALE_SETTINGS =
    454             "android.settings.LOCALE_SETTINGS";
    455 
    456     /**
    457      * Activity Action: Show settings to configure input methods, in particular
    458      * allowing the user to enable input methods.
    459      * <p>
    460      * In some cases, a matching Activity may not exist, so ensure you
    461      * safeguard against this.
    462      * <p>
    463      * Input: Nothing.
    464      * <p>
    465      * Output: Nothing.
    466      */
    467     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    468     public static final String ACTION_VOICE_INPUT_SETTINGS =
    469             "android.settings.VOICE_INPUT_SETTINGS";
    470 
    471     /**
    472      * Activity Action: Show settings to configure input methods, in particular
    473      * allowing the user to enable input methods.
    474      * <p>
    475      * In some cases, a matching Activity may not exist, so ensure you
    476      * safeguard against this.
    477      * <p>
    478      * Input: Nothing.
    479      * <p>
    480      * Output: Nothing.
    481      */
    482     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    483     public static final String ACTION_INPUT_METHOD_SETTINGS =
    484             "android.settings.INPUT_METHOD_SETTINGS";
    485 
    486     /**
    487      * Activity Action: Show settings to enable/disable input method subtypes.
    488      * <p>
    489      * In some cases, a matching Activity may not exist, so ensure you
    490      * safeguard against this.
    491      * <p>
    492      * To tell which input method's subtypes are displayed in the settings, add
    493      * {@link #EXTRA_INPUT_METHOD_ID} extra to this Intent with the input method id.
    494      * If there is no extra in this Intent, subtypes from all installed input methods
    495      * will be displayed in the settings.
    496      *
    497      * @see android.view.inputmethod.InputMethodInfo#getId
    498      * <p>
    499      * Input: Nothing.
    500      * <p>
    501      * Output: Nothing.
    502      */
    503     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    504     public static final String ACTION_INPUT_METHOD_SUBTYPE_SETTINGS =
    505             "android.settings.INPUT_METHOD_SUBTYPE_SETTINGS";
    506 
    507     /**
    508      * Activity Action: Show a dialog to select input method.
    509      * <p>
    510      * In some cases, a matching Activity may not exist, so ensure you
    511      * safeguard against this.
    512      * <p>
    513      * Input: Nothing.
    514      * <p>
    515      * Output: Nothing.
    516      * @hide
    517      */
    518     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    519     public static final String ACTION_SHOW_INPUT_METHOD_PICKER =
    520             "android.settings.SHOW_INPUT_METHOD_PICKER";
    521 
    522     /**
    523      * Activity Action: Show settings to manage the user input dictionary.
    524      * <p>
    525      * Starting with {@link android.os.Build.VERSION_CODES#KITKAT},
    526      * it is guaranteed there will always be an appropriate implementation for this Intent action.
    527      * In prior releases of the platform this was optional, so ensure you safeguard against it.
    528      * <p>
    529      * Input: Nothing.
    530      * <p>
    531      * Output: Nothing.
    532      */
    533     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    534     public static final String ACTION_USER_DICTIONARY_SETTINGS =
    535             "android.settings.USER_DICTIONARY_SETTINGS";
    536 
    537     /**
    538      * Activity Action: Show settings to configure the hardware keyboard.
    539      * <p>
    540      * In some cases, a matching Activity may not exist, so ensure you
    541      * safeguard against this.
    542      * <p>
    543      * Input: Nothing.
    544      * <p>
    545      * Output: Nothing.
    546      */
    547     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    548     public static final String ACTION_HARD_KEYBOARD_SETTINGS =
    549             "android.settings.HARD_KEYBOARD_SETTINGS";
    550 
    551     /**
    552      * Activity Action: Adds a word to the user dictionary.
    553      * <p>
    554      * In some cases, a matching Activity may not exist, so ensure you
    555      * safeguard against this.
    556      * <p>
    557      * Input: An extra with key <code>word</code> that contains the word
    558      * that should be added to the dictionary.
    559      * <p>
    560      * Output: Nothing.
    561      *
    562      * @hide
    563      */
    564     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    565     public static final String ACTION_USER_DICTIONARY_INSERT =
    566             "com.android.settings.USER_DICTIONARY_INSERT";
    567 
    568     /**
    569      * Activity Action: Show settings to allow configuration of application-related settings.
    570      * <p>
    571      * In some cases, a matching Activity may not exist, so ensure you
    572      * safeguard against this.
    573      * <p>
    574      * Input: Nothing.
    575      * <p>
    576      * Output: Nothing.
    577      */
    578     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    579     public static final String ACTION_APPLICATION_SETTINGS =
    580             "android.settings.APPLICATION_SETTINGS";
    581 
    582     /**
    583      * Activity Action: Show settings to allow configuration of application
    584      * development-related settings.  As of
    585      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} this action is
    586      * a required part of the platform.
    587      * <p>
    588      * Input: Nothing.
    589      * <p>
    590      * Output: Nothing.
    591      */
    592     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    593     public static final String ACTION_APPLICATION_DEVELOPMENT_SETTINGS =
    594             "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
    595 
    596     /**
    597      * Activity Action: Show settings to allow configuration of quick launch shortcuts.
    598      * <p>
    599      * In some cases, a matching Activity may not exist, so ensure you
    600      * safeguard against this.
    601      * <p>
    602      * Input: Nothing.
    603      * <p>
    604      * Output: Nothing.
    605      */
    606     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    607     public static final String ACTION_QUICK_LAUNCH_SETTINGS =
    608             "android.settings.QUICK_LAUNCH_SETTINGS";
    609 
    610     /**
    611      * Activity Action: Show settings to manage installed applications.
    612      * <p>
    613      * In some cases, a matching Activity may not exist, so ensure you
    614      * safeguard against this.
    615      * <p>
    616      * Input: Nothing.
    617      * <p>
    618      * Output: Nothing.
    619      */
    620     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    621     public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS =
    622             "android.settings.MANAGE_APPLICATIONS_SETTINGS";
    623 
    624     /**
    625      * Activity Action: Show settings to manage all applications.
    626      * <p>
    627      * In some cases, a matching Activity may not exist, so ensure you
    628      * safeguard against this.
    629      * <p>
    630      * Input: Nothing.
    631      * <p>
    632      * Output: Nothing.
    633      */
    634     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    635     public static final String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS =
    636             "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
    637 
    638     /**
    639      * Activity Action: Show screen for controlling which apps can draw on top of other apps.
    640      * <p>
    641      * In some cases, a matching Activity may not exist, so ensure you
    642      * safeguard against this.
    643      * <p>
    644      * Input: Optionally, the Intent's data URI can specify the application package name to
    645      * directly invoke the management GUI specific to the package name. For example
    646      * "package:com.my.app".
    647      * <p>
    648      * Output: Nothing.
    649      */
    650     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    651     public static final String ACTION_MANAGE_OVERLAY_PERMISSION =
    652             "android.settings.action.MANAGE_OVERLAY_PERMISSION";
    653 
    654     /**
    655      * Activity Action: Show screen for controlling which apps are allowed to write/modify
    656      * system settings.
    657      * <p>
    658      * In some cases, a matching Activity may not exist, so ensure you
    659      * safeguard against this.
    660      * <p>
    661      * Input: Optionally, the Intent's data URI can specify the application package name to
    662      * directly invoke the management GUI specific to the package name. For example
    663      * "package:com.my.app".
    664      * <p>
    665      * Output: Nothing.
    666      */
    667     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    668     public static final String ACTION_MANAGE_WRITE_SETTINGS =
    669             "android.settings.action.MANAGE_WRITE_SETTINGS";
    670 
    671     /**
    672      * Activity Action: Show screen of details about a particular application.
    673      * <p>
    674      * In some cases, a matching Activity may not exist, so ensure you
    675      * safeguard against this.
    676      * <p>
    677      * Input: The Intent's data URI specifies the application package name
    678      * to be shown, with the "package" scheme.  That is "package:com.my.app".
    679      * <p>
    680      * Output: Nothing.
    681      */
    682     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    683     public static final String ACTION_APPLICATION_DETAILS_SETTINGS =
    684             "android.settings.APPLICATION_DETAILS_SETTINGS";
    685 
    686     /**
    687      * Activity Action: Show screen for controlling which apps can ignore battery optimizations.
    688      * <p>
    689      * Input: Nothing.
    690      * <p>
    691      * Output: Nothing.
    692      * <p>
    693      * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations
    694      * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is
    695      * already ignoring optimizations.  You can use
    696      * {@link #ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS} to ask the user to put you
    697      * on this list.
    698      */
    699     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    700     public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS =
    701             "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS";
    702 
    703     /**
    704      * Activity Action: Ask the user to allow an app to ignore battery optimizations (that is,
    705      * put them on the whitelist of apps shown by
    706      * {@link #ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}).  For an app to use this, it also
    707      * must hold the {@link android.Manifest.permission#REQUEST_IGNORE_BATTERY_OPTIMIZATIONS}
    708      * permission.
    709      * <p><b>Note:</b> most applications should <em>not</em> use this; there are many facilities
    710      * provided by the platform for applications to operate correctly in the various power
    711      * saving modes.  This is only for unusual applications that need to deeply control their own
    712      * execution, at the potential expense of the user's battery life.  Note that these applications
    713      * greatly run the risk of showing to the user as high power consumers on their device.</p>
    714      * <p>
    715      * Input: The Intent's data URI must specify the application package name
    716      * to be shown, with the "package" scheme.  That is "package:com.my.app".
    717      * <p>
    718      * Output: Nothing.
    719      * <p>
    720      * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations
    721      * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is
    722      * already ignoring optimizations.
    723      */
    724     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    725     public static final String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS =
    726             "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
    727 
    728     /**
    729      * Activity Action: Show screen for controlling background data
    730      * restrictions for a particular application.
    731      * <p>
    732      * Input: Intent's data URI set with an application name, using the
    733      * "package" schema (like "package:com.my.app").
    734      *
    735      * <p>
    736      * Output: Nothing.
    737      * <p>
    738      * Applications can also use {@link android.net.ConnectivityManager#getRestrictBackgroundStatus
    739      * ConnectivityManager#getRestrictBackgroundStatus()} to determine the
    740      * status of the background data restrictions for them.
    741      */
    742     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    743     public static final String ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS =
    744             "android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS";
    745 
    746     /**
    747      * @hide
    748      * Activity Action: Show the "app ops" settings screen.
    749      * <p>
    750      * Input: Nothing.
    751      * <p>
    752      * Output: Nothing.
    753      */
    754     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    755     public static final String ACTION_APP_OPS_SETTINGS =
    756             "android.settings.APP_OPS_SETTINGS";
    757 
    758     /**
    759      * Activity Action: Show settings for system update functionality.
    760      * <p>
    761      * In some cases, a matching Activity may not exist, so ensure you
    762      * safeguard against this.
    763      * <p>
    764      * Input: Nothing.
    765      * <p>
    766      * Output: Nothing.
    767      *
    768      * @hide
    769      */
    770     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    771     public static final String ACTION_SYSTEM_UPDATE_SETTINGS =
    772             "android.settings.SYSTEM_UPDATE_SETTINGS";
    773 
    774     /**
    775      * Activity Action: Show settings to allow configuration of sync settings.
    776      * <p>
    777      * In some cases, a matching Activity may not exist, so ensure you
    778      * safeguard against this.
    779      * <p>
    780      * The account types available to add via the add account button may be restricted by adding an
    781      * {@link #EXTRA_AUTHORITIES} extra to this Intent with one or more syncable content provider's
    782      * authorities. Only account types which can sync with that content provider will be offered to
    783      * the user.
    784      * <p>
    785      * Input: Nothing.
    786      * <p>
    787      * Output: Nothing.
    788      */
    789     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    790     public static final String ACTION_SYNC_SETTINGS =
    791             "android.settings.SYNC_SETTINGS";
    792 
    793     /**
    794      * Activity Action: Show add account screen for creating a new account.
    795      * <p>
    796      * In some cases, a matching Activity may not exist, so ensure you
    797      * safeguard against this.
    798      * <p>
    799      * The account types available to add may be restricted by adding an {@link #EXTRA_AUTHORITIES}
    800      * extra to the Intent with one or more syncable content provider's authorities.  Only account
    801      * types which can sync with that content provider will be offered to the user.
    802      * <p>
    803      * Account types can also be filtered by adding an {@link #EXTRA_ACCOUNT_TYPES} extra to the
    804      * Intent with one or more account types.
    805      * <p>
    806      * Input: Nothing.
    807      * <p>
    808      * Output: Nothing.
    809      */
    810     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    811     public static final String ACTION_ADD_ACCOUNT =
    812             "android.settings.ADD_ACCOUNT_SETTINGS";
    813 
    814     /**
    815      * Activity Action: Show settings for selecting the network operator.
    816      * <p>
    817      * In some cases, a matching Activity may not exist, so ensure you
    818      * safeguard against this.
    819      * <p>
    820      * Input: Nothing.
    821      * <p>
    822      * Output: Nothing.
    823      */
    824     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    825     public static final String ACTION_NETWORK_OPERATOR_SETTINGS =
    826             "android.settings.NETWORK_OPERATOR_SETTINGS";
    827 
    828     /**
    829      * Activity Action: Show settings for selection of 2G/3G.
    830      * <p>
    831      * In some cases, a matching Activity may not exist, so ensure you
    832      * safeguard against this.
    833      * <p>
    834      * Input: Nothing.
    835      * <p>
    836      * Output: Nothing.
    837      */
    838     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    839     public static final String ACTION_DATA_ROAMING_SETTINGS =
    840             "android.settings.DATA_ROAMING_SETTINGS";
    841 
    842     /**
    843      * Activity Action: Show settings for internal storage.
    844      * <p>
    845      * In some cases, a matching Activity may not exist, so ensure you
    846      * safeguard against this.
    847      * <p>
    848      * Input: Nothing.
    849      * <p>
    850      * Output: Nothing.
    851      */
    852     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    853     public static final String ACTION_INTERNAL_STORAGE_SETTINGS =
    854             "android.settings.INTERNAL_STORAGE_SETTINGS";
    855     /**
    856      * Activity Action: Show settings for memory card storage.
    857      * <p>
    858      * In some cases, a matching Activity may not exist, so ensure you
    859      * safeguard against this.
    860      * <p>
    861      * Input: Nothing.
    862      * <p>
    863      * Output: Nothing.
    864      */
    865     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    866     public static final String ACTION_MEMORY_CARD_SETTINGS =
    867             "android.settings.MEMORY_CARD_SETTINGS";
    868 
    869     /**
    870      * Activity Action: Show settings for global search.
    871      * <p>
    872      * In some cases, a matching Activity may not exist, so ensure you
    873      * safeguard against this.
    874      * <p>
    875      * Input: Nothing.
    876      * <p>
    877      * Output: Nothing
    878      */
    879     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    880     public static final String ACTION_SEARCH_SETTINGS =
    881         "android.search.action.SEARCH_SETTINGS";
    882 
    883     /**
    884      * Activity Action: Show general device information settings (serial
    885      * number, software version, phone number, etc.).
    886      * <p>
    887      * In some cases, a matching Activity may not exist, so ensure you
    888      * safeguard against this.
    889      * <p>
    890      * Input: Nothing.
    891      * <p>
    892      * Output: Nothing
    893      */
    894     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    895     public static final String ACTION_DEVICE_INFO_SETTINGS =
    896         "android.settings.DEVICE_INFO_SETTINGS";
    897 
    898     /**
    899      * Activity Action: Show NFC settings.
    900      * <p>
    901      * This shows UI that allows NFC to be turned on or off.
    902      * <p>
    903      * In some cases, a matching Activity may not exist, so ensure you
    904      * safeguard against this.
    905      * <p>
    906      * Input: Nothing.
    907      * <p>
    908      * Output: Nothing
    909      * @see android.nfc.NfcAdapter#isEnabled()
    910      */
    911     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    912     public static final String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
    913 
    914     /**
    915      * Activity Action: Show NFC Sharing settings.
    916      * <p>
    917      * This shows UI that allows NDEF Push (Android Beam) to be turned on or
    918      * off.
    919      * <p>
    920      * In some cases, a matching Activity may not exist, so ensure you
    921      * safeguard against this.
    922      * <p>
    923      * Input: Nothing.
    924      * <p>
    925      * Output: Nothing
    926      * @see android.nfc.NfcAdapter#isNdefPushEnabled()
    927      */
    928     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    929     public static final String ACTION_NFCSHARING_SETTINGS =
    930         "android.settings.NFCSHARING_SETTINGS";
    931 
    932     /**
    933      * Activity Action: Show NFC Tap & Pay settings
    934      * <p>
    935      * This shows UI that allows the user to configure Tap&Pay
    936      * settings.
    937      * <p>
    938      * In some cases, a matching Activity may not exist, so ensure you
    939      * safeguard against this.
    940      * <p>
    941      * Input: Nothing.
    942      * <p>
    943      * Output: Nothing
    944      */
    945     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    946     public static final String ACTION_NFC_PAYMENT_SETTINGS =
    947         "android.settings.NFC_PAYMENT_SETTINGS";
    948 
    949     /**
    950      * Activity Action: Show Daydream settings.
    951      * <p>
    952      * In some cases, a matching Activity may not exist, so ensure you
    953      * safeguard against this.
    954      * <p>
    955      * Input: Nothing.
    956      * <p>
    957      * Output: Nothing.
    958      * @see android.service.dreams.DreamService
    959      */
    960     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    961     public static final String ACTION_DREAM_SETTINGS = "android.settings.DREAM_SETTINGS";
    962 
    963     /**
    964      * Activity Action: Show Notification listener settings.
    965      * <p>
    966      * In some cases, a matching Activity may not exist, so ensure you
    967      * safeguard against this.
    968      * <p>
    969      * Input: Nothing.
    970      * <p>
    971      * Output: Nothing.
    972      * @see android.service.notification.NotificationListenerService
    973      */
    974     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    975     public static final String ACTION_NOTIFICATION_LISTENER_SETTINGS
    976             = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
    977 
    978     /**
    979      * Activity Action: Show Do Not Disturb access settings.
    980      * <p>
    981      * Users can grant and deny access to Do Not Disturb configuration from here.
    982      * See {@link android.app.NotificationManager#isNotificationPolicyAccessGranted()} for more
    983      * details.
    984      * <p>
    985      * Input: Nothing.
    986      * <p>
    987      * Output: Nothing.
    988      */
    989     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    990     public static final String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
    991             = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
    992 
    993     /**
    994      * @hide
    995      */
    996     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    997     public static final String ACTION_CONDITION_PROVIDER_SETTINGS
    998             = "android.settings.ACTION_CONDITION_PROVIDER_SETTINGS";
    999 
   1000     /**
   1001      * Activity Action: Show settings for video captioning.
   1002      * <p>
   1003      * In some cases, a matching Activity may not exist, so ensure you safeguard
   1004      * against this.
   1005      * <p>
   1006      * Input: Nothing.
   1007      * <p>
   1008      * Output: Nothing.
   1009      */
   1010     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1011     public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
   1012 
   1013     /**
   1014      * Activity Action: Show the top level print settings.
   1015      * <p>
   1016      * In some cases, a matching Activity may not exist, so ensure you
   1017      * safeguard against this.
   1018      * <p>
   1019      * Input: Nothing.
   1020      * <p>
   1021      * Output: Nothing.
   1022      */
   1023     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1024     public static final String ACTION_PRINT_SETTINGS =
   1025             "android.settings.ACTION_PRINT_SETTINGS";
   1026 
   1027     /**
   1028      * Activity Action: Show Zen Mode configuration settings.
   1029      *
   1030      * @hide
   1031      */
   1032     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1033     public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
   1034 
   1035     /**
   1036      * Activity Action: Show Zen Mode priority configuration settings.
   1037      *
   1038      * @hide
   1039      */
   1040     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1041     public static final String ACTION_ZEN_MODE_PRIORITY_SETTINGS
   1042             = "android.settings.ZEN_MODE_PRIORITY_SETTINGS";
   1043 
   1044     /**
   1045      * Activity Action: Show Zen Mode automation configuration settings.
   1046      *
   1047      * @hide
   1048      */
   1049     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1050     public static final String ACTION_ZEN_MODE_AUTOMATION_SETTINGS
   1051             = "android.settings.ZEN_MODE_AUTOMATION_SETTINGS";
   1052 
   1053     /**
   1054      * Activity Action: Modify do not disturb mode settings.
   1055      * <p>
   1056      * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
   1057      * <p>
   1058      * This intent MUST be started using
   1059      * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
   1060      * startVoiceActivity}.
   1061      * <p>
   1062      * Note: The Activity implementing this intent MUST verify that
   1063      * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction}.
   1064      * returns true before modifying the setting.
   1065      * <p>
   1066      * Input: The optional {@link #EXTRA_DO_NOT_DISTURB_MODE_MINUTES} extra can be used to indicate
   1067      * how long the user wishes to avoid interruptions for. The optional
   1068      * {@link #EXTRA_DO_NOT_DISTURB_MODE_ENABLED} extra can be to indicate if the user is
   1069      * enabling or disabling do not disturb mode. If either extra is not included, the
   1070      * user maybe asked to provide the value.
   1071      * <p>
   1072      * Output: Nothing.
   1073      */
   1074     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1075     public static final String ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE =
   1076             "android.settings.VOICE_CONTROL_DO_NOT_DISTURB_MODE";
   1077 
   1078     /**
   1079      * Activity Action: Show Zen Mode schedule rule configuration settings.
   1080      *
   1081      * @hide
   1082      */
   1083     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1084     public static final String ACTION_ZEN_MODE_SCHEDULE_RULE_SETTINGS
   1085             = "android.settings.ZEN_MODE_SCHEDULE_RULE_SETTINGS";
   1086 
   1087     /**
   1088      * Activity Action: Show Zen Mode event rule configuration settings.
   1089      *
   1090      * @hide
   1091      */
   1092     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1093     public static final String ACTION_ZEN_MODE_EVENT_RULE_SETTINGS
   1094             = "android.settings.ZEN_MODE_EVENT_RULE_SETTINGS";
   1095 
   1096     /**
   1097      * Activity Action: Show Zen Mode external rule configuration settings.
   1098      *
   1099      * @hide
   1100      */
   1101     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1102     public static final String ACTION_ZEN_MODE_EXTERNAL_RULE_SETTINGS
   1103             = "android.settings.ZEN_MODE_EXTERNAL_RULE_SETTINGS";
   1104 
   1105     /**
   1106      * Activity Action: Show the regulatory information screen for the device.
   1107      * <p>
   1108      * In some cases, a matching Activity may not exist, so ensure you safeguard
   1109      * against this.
   1110      * <p>
   1111      * Input: Nothing.
   1112      * <p>
   1113      * Output: Nothing.
   1114      */
   1115     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1116     public static final String
   1117             ACTION_SHOW_REGULATORY_INFO = "android.settings.SHOW_REGULATORY_INFO";
   1118 
   1119     /**
   1120      * Activity Action: Show Device Name Settings.
   1121      * <p>
   1122      * In some cases, a matching Activity may not exist, so ensure you safeguard
   1123      * against this.
   1124      *
   1125      * @hide
   1126      */
   1127     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1128     public static final String DEVICE_NAME_SETTINGS = "android.settings.DEVICE_NAME";
   1129 
   1130     /**
   1131      * Activity Action: Show pairing settings.
   1132      * <p>
   1133      * In some cases, a matching Activity may not exist, so ensure you safeguard
   1134      * against this.
   1135      *
   1136      * @hide
   1137      */
   1138     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1139     public static final String ACTION_PAIRING_SETTINGS = "android.settings.PAIRING_SETTINGS";
   1140 
   1141     /**
   1142      * Activity Action: Show battery saver settings.
   1143      * <p>
   1144      * In some cases, a matching Activity may not exist, so ensure you safeguard
   1145      * against this.
   1146      */
   1147     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1148     public static final String ACTION_BATTERY_SAVER_SETTINGS
   1149             = "android.settings.BATTERY_SAVER_SETTINGS";
   1150 
   1151     /**
   1152      * Activity Action: Modify Battery Saver mode setting using a voice command.
   1153      * <p>
   1154      * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
   1155      * <p>
   1156      * This intent MUST be started using
   1157      * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
   1158      * startVoiceActivity}.
   1159      * <p>
   1160      * Note: The activity implementing this intent MUST verify that
   1161      * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction} returns true before
   1162      * modifying the setting.
   1163      * <p>
   1164      * Input: To tell which state batter saver mode should be set to, add the
   1165      * {@link #EXTRA_BATTERY_SAVER_MODE_ENABLED} extra to this Intent with the state specified.
   1166      * If the extra is not included, no changes will be made.
   1167      * <p>
   1168      * Output: Nothing.
   1169      */
   1170     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1171     public static final String ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE =
   1172             "android.settings.VOICE_CONTROL_BATTERY_SAVER_MODE";
   1173 
   1174     /**
   1175      * Activity Action: Show Home selection settings. If there are multiple activities
   1176      * that can satisfy the {@link Intent#CATEGORY_HOME} intent, this screen allows you
   1177      * to pick your preferred activity.
   1178      */
   1179     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1180     public static final String ACTION_HOME_SETTINGS
   1181             = "android.settings.HOME_SETTINGS";
   1182 
   1183 
   1184 
   1185     /**
   1186      * Activity Action: Show Default apps settings.
   1187      * <p>
   1188      * In some cases, a matching Activity may not exist, so ensure you
   1189      * safeguard against this.
   1190      * <p>
   1191      * Input: Nothing.
   1192      * <p>
   1193      * Output: Nothing.
   1194      */
   1195     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1196     public static final String ACTION_MANAGE_DEFAULT_APPS_SETTINGS
   1197             = "android.settings.MANAGE_DEFAULT_APPS_SETTINGS";
   1198 
   1199     /**
   1200      * Activity Action: Show notification settings.
   1201      *
   1202      * @hide
   1203      */
   1204     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1205     public static final String ACTION_NOTIFICATION_SETTINGS
   1206             = "android.settings.NOTIFICATION_SETTINGS";
   1207 
   1208     /**
   1209      * Activity Action: Show notification settings for a single app.
   1210      *
   1211      * @hide
   1212      */
   1213     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1214     public static final String ACTION_APP_NOTIFICATION_SETTINGS
   1215             = "android.settings.APP_NOTIFICATION_SETTINGS";
   1216 
   1217     /**
   1218      * Activity Action: Show notification redaction settings.
   1219      *
   1220      * @hide
   1221      */
   1222     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1223     public static final String ACTION_APP_NOTIFICATION_REDACTION
   1224             = "android.settings.ACTION_APP_NOTIFICATION_REDACTION";
   1225 
   1226     /** @hide */ public static final String EXTRA_APP_UID = "app_uid";
   1227     /** @hide */ public static final String EXTRA_APP_PACKAGE = "app_package";
   1228 
   1229     /**
   1230      * Activity Action: Show a dialog with disabled by policy message.
   1231      * <p> If an user action is disabled by policy, this dialog can be triggered to let
   1232      * the user know about this.
   1233      * <p>
   1234      * Input: Nothing.
   1235      * <p>
   1236      * Output: Nothing.
   1237      *
   1238      * @hide
   1239      */
   1240     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1241     public static final String ACTION_SHOW_ADMIN_SUPPORT_DETAILS
   1242             = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS";
   1243 
   1244     /**
   1245      * Activity Action: Show a dialog for remote bugreport flow.
   1246      * <p>
   1247      * Input: Nothing.
   1248      * <p>
   1249      * Output: Nothing.
   1250      *
   1251      * @hide
   1252      */
   1253     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1254     public static final String ACTION_SHOW_REMOTE_BUGREPORT_DIALOG
   1255             = "android.settings.SHOW_REMOTE_BUGREPORT_DIALOG";
   1256 
   1257     /**
   1258      * Activity Action: Show VR listener settings.
   1259      * <p>
   1260      * Input: Nothing.
   1261      * <p>
   1262      * Output: Nothing.
   1263      *
   1264      * @see android.service.vr.VrListenerService
   1265      */
   1266     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1267     public static final String ACTION_VR_LISTENER_SETTINGS
   1268             = "android.settings.VR_LISTENER_SETTINGS";
   1269 
   1270     /**
   1271      * Activity Action: Allows user to select current webview implementation.
   1272      * <p>
   1273      * Input: Nothing.
   1274      * <p>
   1275      * Output: Nothing.
   1276      */
   1277     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
   1278     public static final String ACTION_WEBVIEW_SETTINGS = "android.settings.WEBVIEW_SETTINGS";
   1279 
   1280     // End of Intent actions for Settings
   1281 
   1282     /**
   1283      * @hide - Private call() method on SettingsProvider to read from 'system' table.
   1284      */
   1285     public static final String CALL_METHOD_GET_SYSTEM = "GET_system";
   1286 
   1287     /**
   1288      * @hide - Private call() method on SettingsProvider to read from 'secure' table.
   1289      */
   1290     public static final String CALL_METHOD_GET_SECURE = "GET_secure";
   1291 
   1292     /**
   1293      * @hide - Private call() method on SettingsProvider to read from 'global' table.
   1294      */
   1295     public static final String CALL_METHOD_GET_GLOBAL = "GET_global";
   1296 
   1297     /**
   1298      * @hide - Specifies that the caller of the fast-path call()-based flow tracks
   1299      * the settings generation in order to cache values locally. If this key is
   1300      * mapped to a <code>null</code> string extra in the request bundle, the response
   1301      * bundle will contain the same key mapped to a parcelable extra which would be
   1302      * an {@link android.util.MemoryIntArray}. The response will also contain an
   1303      * integer mapped to the {@link #CALL_METHOD_GENERATION_INDEX_KEY} which is the
   1304      * index in the array clients should use to lookup the generation. For efficiency
   1305      * the caller should request the generation tracking memory array only if it
   1306      * doesn't already have it.
   1307      *
   1308      * @see #CALL_METHOD_GENERATION_INDEX_KEY
   1309      */
   1310     public static final String CALL_METHOD_TRACK_GENERATION_KEY = "_track_generation";
   1311 
   1312     /**
   1313      * @hide Key with the location in the {@link android.util.MemoryIntArray} where
   1314      * to look up the generation id of the backing table. The value is an integer.
   1315      *
   1316      * @see #CALL_METHOD_TRACK_GENERATION_KEY
   1317      */
   1318     public static final String CALL_METHOD_GENERATION_INDEX_KEY = "_generation_index";
   1319 
   1320     /**
   1321      * @hide Key with the settings table generation. The value is an integer.
   1322      *
   1323      * @see #CALL_METHOD_TRACK_GENERATION_KEY
   1324      */
   1325     public static final String CALL_METHOD_GENERATION_KEY = "_generation";
   1326 
   1327     /**
   1328      * @hide - User handle argument extra to the fast-path call()-based requests
   1329      */
   1330     public static final String CALL_METHOD_USER_KEY = "_user";
   1331 
   1332     /** @hide - Private call() method to write to 'system' table */
   1333     public static final String CALL_METHOD_PUT_SYSTEM = "PUT_system";
   1334 
   1335     /** @hide - Private call() method to write to 'secure' table */
   1336     public static final String CALL_METHOD_PUT_SECURE = "PUT_secure";
   1337 
   1338     /** @hide - Private call() method to write to 'global' table */
   1339     public static final String CALL_METHOD_PUT_GLOBAL= "PUT_global";
   1340 
   1341     /**
   1342      * Activity Extra: Limit available options in launched activity based on the given authority.
   1343      * <p>
   1344      * This can be passed as an extra field in an Activity Intent with one or more syncable content
   1345      * provider's authorities as a String[]. This field is used by some intents to alter the
   1346      * behavior of the called activity.
   1347      * <p>
   1348      * Example: The {@link #ACTION_ADD_ACCOUNT} intent restricts the account types available based
   1349      * on the authority given.
   1350      */
   1351     public static final String EXTRA_AUTHORITIES = "authorities";
   1352 
   1353     /**
   1354      * Activity Extra: Limit available options in launched activity based on the given account
   1355      * types.
   1356      * <p>
   1357      * This can be passed as an extra field in an Activity Intent with one or more account types
   1358      * as a String[]. This field is used by some intents to alter the behavior of the called
   1359      * activity.
   1360      * <p>
   1361      * Example: The {@link #ACTION_ADD_ACCOUNT} intent restricts the account types to the specified
   1362      * list.
   1363      */
   1364     public static final String EXTRA_ACCOUNT_TYPES = "account_types";
   1365 
   1366     public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
   1367 
   1368     /**
   1369      * Activity Extra: The device identifier to act upon.
   1370      * <p>
   1371      * This can be passed as an extra field in an Activity Intent with a single
   1372      * InputDeviceIdentifier. This field is used by some activities to jump straight into the
   1373      * settings for the given device.
   1374      * <p>
   1375      * Example: The {@link #ACTION_INPUT_METHOD_SETTINGS} intent opens the keyboard layout
   1376      * dialog for the given device.
   1377      * @hide
   1378      */
   1379     public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
   1380 
   1381     /**
   1382      * Activity Extra: Enable or disable Airplane Mode.
   1383      * <p>
   1384      * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_AIRPLANE_MODE}
   1385      * intent as a boolean to indicate if it should be enabled.
   1386      */
   1387     public static final String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
   1388 
   1389     /**
   1390      * Activity Extra: Enable or disable Battery saver mode.
   1391      * <p>
   1392      * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE}
   1393      * intent as a boolean to indicate if it should be enabled.
   1394      */
   1395     public static final String EXTRA_BATTERY_SAVER_MODE_ENABLED =
   1396             "android.settings.extra.battery_saver_mode_enabled";
   1397 
   1398     /**
   1399      * Activity Extra: Enable or disable Do Not Disturb mode.
   1400      * <p>
   1401      * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE}
   1402      * intent as a boolean to indicate if it should be enabled.
   1403      */
   1404     public static final String EXTRA_DO_NOT_DISTURB_MODE_ENABLED =
   1405             "android.settings.extra.do_not_disturb_mode_enabled";
   1406 
   1407     /**
   1408      * Activity Extra: How many minutes to enable do not disturb mode for.
   1409      * <p>
   1410      * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE}
   1411      * intent to indicate how long do not disturb mode should be enabled for.
   1412      */
   1413     public static final String EXTRA_DO_NOT_DISTURB_MODE_MINUTES =
   1414             "android.settings.extra.do_not_disturb_mode_minutes";
   1415 
   1416     /**
   1417      * Activity Extra: Number of certificates
   1418      * <p>
   1419      * This can be passed as an extra field to the {@link #ACTION_MONITORING_CERT_INFO}
   1420      * intent to indicate the number of certificates
   1421      * @hide
   1422      */
   1423     public static final String EXTRA_NUMBER_OF_CERTIFICATES =
   1424             "android.settings.extra.number_of_certificates";
   1425 
   1426     private static final String JID_RESOURCE_PREFIX = "android";
   1427 
   1428     public static final String AUTHORITY = "settings";
   1429 
   1430     private static final String TAG = "Settings";
   1431     private static final boolean LOCAL_LOGV = false;
   1432 
   1433     // Lock ensures that when enabling/disabling the master location switch, we don't end up
   1434     // with a partial enable/disable state in multi-threaded situations.
   1435     private static final Object mLocationSettingsLock = new Object();
   1436 
   1437     public static class SettingNotFoundException extends AndroidException {
   1438         public SettingNotFoundException(String msg) {
   1439             super(msg);
   1440         }
   1441     }
   1442 
   1443     /**
   1444      * Common base for tables of name/value settings.
   1445      */
   1446     public static class NameValueTable implements BaseColumns {
   1447         public static final String NAME = "name";
   1448         public static final String VALUE = "value";
   1449 
   1450         protected static boolean putString(ContentResolver resolver, Uri uri,
   1451                 String name, String value) {
   1452             // The database will take care of replacing duplicates.
   1453             try {
   1454                 ContentValues values = new ContentValues();
   1455                 values.put(NAME, name);
   1456                 values.put(VALUE, value);
   1457                 resolver.insert(uri, values);
   1458                 return true;
   1459             } catch (SQLException e) {
   1460                 Log.w(TAG, "Can't set key " + name + " in " + uri, e);
   1461                 return false;
   1462             }
   1463         }
   1464 
   1465         public static Uri getUriFor(Uri uri, String name) {
   1466             return Uri.withAppendedPath(uri, name);
   1467         }
   1468     }
   1469 
   1470     private static final class GenerationTracker {
   1471         private final MemoryIntArray mArray;
   1472         private final Runnable mErrorHandler;
   1473         private final int mIndex;
   1474         private int mCurrentGeneration;
   1475 
   1476         public GenerationTracker(@NonNull MemoryIntArray array, int index,
   1477                 int generation, Runnable errorHandler) {
   1478             mArray = array;
   1479             mIndex = index;
   1480             mErrorHandler = errorHandler;
   1481             mCurrentGeneration = generation;
   1482         }
   1483 
   1484         public boolean isGenerationChanged() {
   1485             final int currentGeneration = readCurrentGeneration();
   1486             if (currentGeneration >= 0) {
   1487                 if (currentGeneration == mCurrentGeneration) {
   1488                     return false;
   1489                 }
   1490                 mCurrentGeneration = currentGeneration;
   1491             }
   1492             return true;
   1493         }
   1494 
   1495         private int readCurrentGeneration() {
   1496             try {
   1497                 return mArray.get(mIndex);
   1498             } catch (IOException e) {
   1499                 Log.e(TAG, "Error getting current generation", e);
   1500                 if (mErrorHandler != null) {
   1501                     mErrorHandler.run();
   1502                 }
   1503             }
   1504             return -1;
   1505         }
   1506 
   1507         public void destroy() {
   1508             try {
   1509                 mArray.close();
   1510             } catch (IOException e) {
   1511                 Log.e(TAG, "Error closing backing array", e);
   1512                 if (mErrorHandler != null) {
   1513                     mErrorHandler.run();
   1514                 }
   1515             }
   1516         }
   1517     }
   1518 
   1519     // Thread-safe.
   1520     private static class NameValueCache {
   1521         private static final boolean DEBUG = false;
   1522 
   1523         private final Uri mUri;
   1524 
   1525         private static final String[] SELECT_VALUE =
   1526             new String[] { Settings.NameValueTable.VALUE };
   1527         private static final String NAME_EQ_PLACEHOLDER = "name=?";
   1528 
   1529         // Must synchronize on 'this' to access mValues and mValuesVersion.
   1530         private final HashMap<String, String> mValues = new HashMap<String, String>();
   1531 
   1532         // Initially null; set lazily and held forever.  Synchronized on 'this'.
   1533         private IContentProvider mContentProvider = null;
   1534 
   1535         // The method we'll call (or null, to not use) on the provider
   1536         // for the fast path of retrieving settings.
   1537         private final String mCallGetCommand;
   1538         private final String mCallSetCommand;
   1539 
   1540         @GuardedBy("this")
   1541         private GenerationTracker mGenerationTracker;
   1542 
   1543         public NameValueCache(Uri uri, String getCommand, String setCommand) {
   1544             mUri = uri;
   1545             mCallGetCommand = getCommand;
   1546             mCallSetCommand = setCommand;
   1547         }
   1548 
   1549         private IContentProvider lazyGetProvider(ContentResolver cr) {
   1550             IContentProvider cp = null;
   1551             synchronized (NameValueCache.this) {
   1552                 cp = mContentProvider;
   1553                 if (cp == null) {
   1554                     cp = mContentProvider = cr.acquireProvider(mUri.getAuthority());
   1555                 }
   1556             }
   1557             return cp;
   1558         }
   1559 
   1560         public boolean putStringForUser(ContentResolver cr, String name, String value,
   1561                 final int userHandle) {
   1562             try {
   1563                 Bundle arg = new Bundle();
   1564                 arg.putString(Settings.NameValueTable.VALUE, value);
   1565                 arg.putInt(CALL_METHOD_USER_KEY, userHandle);
   1566                 IContentProvider cp = lazyGetProvider(cr);
   1567                 cp.call(cr.getPackageName(), mCallSetCommand, name, arg);
   1568             } catch (RemoteException e) {
   1569                 Log.w(TAG, "Can't set key " + name + " in " + mUri, e);
   1570                 return false;
   1571             }
   1572             return true;
   1573         }
   1574 
   1575         public String getStringForUser(ContentResolver cr, String name, final int userHandle) {
   1576             final boolean isSelf = (userHandle == UserHandle.myUserId());
   1577             if (isSelf) {
   1578                 synchronized (NameValueCache.this) {
   1579                     if (mGenerationTracker != null) {
   1580                         if (mGenerationTracker.isGenerationChanged()) {
   1581                             if (DEBUG) {
   1582                                 Log.i(TAG, "Generation changed for type:"
   1583                                         + mUri.getPath() + " in package:"
   1584                                         + cr.getPackageName() +" and user:" + userHandle);
   1585                             }
   1586                             mValues.clear();
   1587                         } else if (mValues.containsKey(name)) {
   1588                             return mValues.get(name);
   1589                         }
   1590                     }
   1591                 }
   1592             } else {
   1593                 if (LOCAL_LOGV) Log.v(TAG, "get setting for user " + userHandle
   1594                         + " by user " + UserHandle.myUserId() + " so skipping cache");
   1595             }
   1596 
   1597             IContentProvider cp = lazyGetProvider(cr);
   1598 
   1599             // Try the fast path first, not using query().  If this
   1600             // fails (alternate Settings provider that doesn't support
   1601             // this interface?) then we fall back to the query/table
   1602             // interface.
   1603             if (mCallGetCommand != null) {
   1604                 try {
   1605                     Bundle args = null;
   1606                     if (!isSelf) {
   1607                         args = new Bundle();
   1608                         args.putInt(CALL_METHOD_USER_KEY, userHandle);
   1609                     }
   1610                     boolean needsGenerationTracker = false;
   1611                     synchronized (NameValueCache.this) {
   1612                         if (isSelf && mGenerationTracker == null) {
   1613                             needsGenerationTracker = true;
   1614                             if (args == null) {
   1615                                 args = new Bundle();
   1616                             }
   1617                             args.putString(CALL_METHOD_TRACK_GENERATION_KEY, null);
   1618                             if (DEBUG) {
   1619                                 Log.i(TAG, "Requested generation tracker for type: "+ mUri.getPath()
   1620                                         + " in package:" + cr.getPackageName() +" and user:"
   1621                                         + userHandle);
   1622                             }
   1623                         }
   1624                     }
   1625                     Bundle b = cp.call(cr.getPackageName(), mCallGetCommand, name, args);
   1626                     if (b != null) {
   1627                         String value = b.getString(Settings.NameValueTable.VALUE);
   1628                         // Don't update our cache for reads of other users' data
   1629                         if (isSelf) {
   1630                             synchronized (NameValueCache.this) {
   1631                                 if (needsGenerationTracker) {
   1632                                     MemoryIntArray array = b.getParcelable(
   1633                                             CALL_METHOD_TRACK_GENERATION_KEY);
   1634                                     final int index = b.getInt(
   1635                                             CALL_METHOD_GENERATION_INDEX_KEY, -1);
   1636                                     if (array != null && index >= 0) {
   1637                                         final int generation = b.getInt(
   1638                                                 CALL_METHOD_GENERATION_KEY, 0);
   1639                                         if (DEBUG) {
   1640                                             Log.i(TAG, "Received generation tracker for type:"
   1641                                                     + mUri.getPath() + " in package:"
   1642                                                     + cr.getPackageName() + " and user:"
   1643                                                     + userHandle + " with index:" + index);
   1644                                         }
   1645                                         mGenerationTracker = new GenerationTracker(array, index,
   1646                                                 generation, () -> {
   1647                                             synchronized (NameValueCache.this) {
   1648                                                 Log.e(TAG, "Error accessing generation"
   1649                                                         + " tracker - removing");
   1650                                                 if (mGenerationTracker != null) {
   1651                                                     GenerationTracker generationTracker =
   1652                                                             mGenerationTracker;
   1653                                                     mGenerationTracker = null;
   1654                                                     generationTracker.destroy();
   1655                                                     mValues.clear();
   1656                                                 }
   1657                                             }
   1658                                         });
   1659                                     }
   1660                                 }
   1661                                 mValues.put(name, value);
   1662                             }
   1663                         } else {
   1664                             if (LOCAL_LOGV) Log.i(TAG, "call-query of user " + userHandle
   1665                                     + " by " + UserHandle.myUserId()
   1666                                     + " so not updating cache");
   1667                         }
   1668                         return value;
   1669                     }
   1670                     // If the response Bundle is null, we fall through
   1671                     // to the query interface below.
   1672                 } catch (RemoteException e) {
   1673                     // Not supported by the remote side?  Fall through
   1674                     // to query().
   1675                 }
   1676             }
   1677 
   1678             Cursor c = null;
   1679             try {
   1680                 c = cp.query(cr.getPackageName(), mUri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
   1681                              new String[]{name}, null, null);
   1682                 if (c == null) {
   1683                     Log.w(TAG, "Can't get key " + name + " from " + mUri);
   1684                     return null;
   1685                 }
   1686 
   1687                 String value = c.moveToNext() ? c.getString(0) : null;
   1688                 synchronized (NameValueCache.this) {
   1689                     mValues.put(name, value);
   1690                 }
   1691                 if (LOCAL_LOGV) {
   1692                     Log.v(TAG, "cache miss [" + mUri.getLastPathSegment() + "]: " +
   1693                             name + " = " + (value == null ? "(null)" : value));
   1694                 }
   1695                 return value;
   1696             } catch (RemoteException e) {
   1697                 Log.w(TAG, "Can't get key " + name + " from " + mUri, e);
   1698                 return null;  // Return null, but don't cache it.
   1699             } finally {
   1700                 if (c != null) c.close();
   1701             }
   1702         }
   1703     }
   1704 
   1705     /**
   1706      * Checks if the specified context can draw on top of other apps. As of API
   1707      * level 23, an app cannot draw on top of other apps unless it declares the
   1708      * {@link android.Manifest.permission#SYSTEM_ALERT_WINDOW} permission in its
   1709      * manifest, <em>and</em> the user specifically grants the app this
   1710      * capability. To prompt the user to grant this approval, the app must send an
   1711      * intent with the action
   1712      * {@link android.provider.Settings#ACTION_MANAGE_OVERLAY_PERMISSION}, which
   1713      * causes the system to display a permission management screen.
   1714      *
   1715      * @param context App context.
   1716      * @return true if the specified context can draw on top of other apps, false otherwise
   1717      */
   1718     public static boolean canDrawOverlays(Context context) {
   1719         return Settings.isCallingPackageAllowedToDrawOverlays(context, Process.myUid(),
   1720                 context.getOpPackageName(), false);
   1721     }
   1722 
   1723     /**
   1724      * System settings, containing miscellaneous system preferences.  This
   1725      * table holds simple name/value pairs.  There are convenience
   1726      * functions for accessing individual settings entries.
   1727      */
   1728     public static final class System extends NameValueTable {
   1729         private static final float DEFAULT_FONT_SCALE = 1.0f;
   1730 
   1731         /** @hide */
   1732         public static interface Validator {
   1733             public boolean validate(String value);
   1734         }
   1735 
   1736         /**
   1737          * The content:// style URL for this table
   1738          */
   1739         public static final Uri CONTENT_URI =
   1740             Uri.parse("content://" + AUTHORITY + "/system");
   1741 
   1742         private static final NameValueCache sNameValueCache = new NameValueCache(
   1743                 CONTENT_URI,
   1744                 CALL_METHOD_GET_SYSTEM,
   1745                 CALL_METHOD_PUT_SYSTEM);
   1746 
   1747         private static final HashSet<String> MOVED_TO_SECURE;
   1748         static {
   1749             MOVED_TO_SECURE = new HashSet<String>(30);
   1750             MOVED_TO_SECURE.add(Secure.ANDROID_ID);
   1751             MOVED_TO_SECURE.add(Secure.HTTP_PROXY);
   1752             MOVED_TO_SECURE.add(Secure.LOCATION_PROVIDERS_ALLOWED);
   1753             MOVED_TO_SECURE.add(Secure.LOCK_BIOMETRIC_WEAK_FLAGS);
   1754             MOVED_TO_SECURE.add(Secure.LOCK_PATTERN_ENABLED);
   1755             MOVED_TO_SECURE.add(Secure.LOCK_PATTERN_VISIBLE);
   1756             MOVED_TO_SECURE.add(Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED);
   1757             MOVED_TO_SECURE.add(Secure.LOGGING_ID);
   1758             MOVED_TO_SECURE.add(Secure.PARENTAL_CONTROL_ENABLED);
   1759             MOVED_TO_SECURE.add(Secure.PARENTAL_CONTROL_LAST_UPDATE);
   1760             MOVED_TO_SECURE.add(Secure.PARENTAL_CONTROL_REDIRECT_URL);
   1761             MOVED_TO_SECURE.add(Secure.SETTINGS_CLASSNAME);
   1762             MOVED_TO_SECURE.add(Secure.USE_GOOGLE_MAIL);
   1763             MOVED_TO_SECURE.add(Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON);
   1764             MOVED_TO_SECURE.add(Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY);
   1765             MOVED_TO_SECURE.add(Secure.WIFI_NUM_OPEN_NETWORKS_KEPT);
   1766             MOVED_TO_SECURE.add(Secure.WIFI_ON);
   1767             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE);
   1768             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_AP_COUNT);
   1769             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS);
   1770             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED);
   1771             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS);
   1772             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT);
   1773             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_MAX_AP_CHECKS);
   1774             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_ON);
   1775             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_COUNT);
   1776             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_DELAY_MS);
   1777             MOVED_TO_SECURE.add(Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS);
   1778 
   1779             // At one time in System, then Global, but now back in Secure
   1780             MOVED_TO_SECURE.add(Secure.INSTALL_NON_MARKET_APPS);
   1781         }
   1782 
   1783         private static final HashSet<String> MOVED_TO_GLOBAL;
   1784         private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL;
   1785         static {
   1786             MOVED_TO_GLOBAL = new HashSet<String>();
   1787             MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<String>();
   1788 
   1789             // these were originally in system but migrated to secure in the past,
   1790             // so are duplicated in the Secure.* namespace
   1791             MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED);
   1792             MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON);
   1793             MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DATA_ROAMING);
   1794             MOVED_TO_SECURE_THEN_GLOBAL.add(Global.DEVICE_PROVISIONED);
   1795             MOVED_TO_SECURE_THEN_GLOBAL.add(Global.USB_MASS_STORAGE_ENABLED);
   1796             MOVED_TO_SECURE_THEN_GLOBAL.add(Global.HTTP_PROXY);
   1797 
   1798             // these are moving directly from system to global
   1799             MOVED_TO_GLOBAL.add(Settings.Global.AIRPLANE_MODE_ON);
   1800             MOVED_TO_GLOBAL.add(Settings.Global.AIRPLANE_MODE_RADIOS);
   1801             MOVED_TO_GLOBAL.add(Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
   1802             MOVED_TO_GLOBAL.add(Settings.Global.AUTO_TIME);
   1803             MOVED_TO_GLOBAL.add(Settings.Global.AUTO_TIME_ZONE);
   1804             MOVED_TO_GLOBAL.add(Settings.Global.CAR_DOCK_SOUND);
   1805             MOVED_TO_GLOBAL.add(Settings.Global.CAR_UNDOCK_SOUND);
   1806             MOVED_TO_GLOBAL.add(Settings.Global.DESK_DOCK_SOUND);
   1807             MOVED_TO_GLOBAL.add(Settings.Global.DESK_UNDOCK_SOUND);
   1808             MOVED_TO_GLOBAL.add(Settings.Global.DOCK_SOUNDS_ENABLED);
   1809             MOVED_TO_GLOBAL.add(Settings.Global.LOCK_SOUND);
   1810             MOVED_TO_GLOBAL.add(Settings.Global.UNLOCK_SOUND);
   1811             MOVED_TO_GLOBAL.add(Settings.Global.LOW_BATTERY_SOUND);
   1812             MOVED_TO_GLOBAL.add(Settings.Global.POWER_SOUNDS_ENABLED);
   1813             MOVED_TO_GLOBAL.add(Settings.Global.STAY_ON_WHILE_PLUGGED_IN);
   1814             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SLEEP_POLICY);
   1815             MOVED_TO_GLOBAL.add(Settings.Global.MODE_RINGER);
   1816             MOVED_TO_GLOBAL.add(Settings.Global.WINDOW_ANIMATION_SCALE);
   1817             MOVED_TO_GLOBAL.add(Settings.Global.TRANSITION_ANIMATION_SCALE);
   1818             MOVED_TO_GLOBAL.add(Settings.Global.ANIMATOR_DURATION_SCALE);
   1819             MOVED_TO_GLOBAL.add(Settings.Global.FANCY_IME_ANIMATIONS);
   1820             MOVED_TO_GLOBAL.add(Settings.Global.COMPATIBILITY_MODE);
   1821             MOVED_TO_GLOBAL.add(Settings.Global.EMERGENCY_TONE);
   1822             MOVED_TO_GLOBAL.add(Settings.Global.CALL_AUTO_RETRY);
   1823             MOVED_TO_GLOBAL.add(Settings.Global.DEBUG_APP);
   1824             MOVED_TO_GLOBAL.add(Settings.Global.WAIT_FOR_DEBUGGER);
   1825             MOVED_TO_GLOBAL.add(Settings.Global.SHOW_PROCESSES);
   1826             MOVED_TO_GLOBAL.add(Settings.Global.ALWAYS_FINISH_ACTIVITIES);
   1827             MOVED_TO_GLOBAL.add(Settings.Global.TZINFO_UPDATE_CONTENT_URL);
   1828             MOVED_TO_GLOBAL.add(Settings.Global.TZINFO_UPDATE_METADATA_URL);
   1829             MOVED_TO_GLOBAL.add(Settings.Global.SELINUX_UPDATE_CONTENT_URL);
   1830             MOVED_TO_GLOBAL.add(Settings.Global.SELINUX_UPDATE_METADATA_URL);
   1831             MOVED_TO_GLOBAL.add(Settings.Global.SMS_SHORT_CODES_UPDATE_CONTENT_URL);
   1832             MOVED_TO_GLOBAL.add(Settings.Global.SMS_SHORT_CODES_UPDATE_METADATA_URL);
   1833             MOVED_TO_GLOBAL.add(Settings.Global.CERT_PIN_UPDATE_CONTENT_URL);
   1834             MOVED_TO_GLOBAL.add(Settings.Global.CERT_PIN_UPDATE_METADATA_URL);
   1835         }
   1836 
   1837         private static final Validator sBooleanValidator =
   1838                 new DiscreteValueValidator(new String[] {"0", "1"});
   1839 
   1840         private static final Validator sNonNegativeIntegerValidator = new Validator() {
   1841             @Override
   1842             public boolean validate(String value) {
   1843                 try {
   1844                     return Integer.parseInt(value) >= 0;
   1845                 } catch (NumberFormatException e) {
   1846                     return false;
   1847                 }
   1848             }
   1849         };
   1850 
   1851         private static final Validator sUriValidator = new Validator() {
   1852             @Override
   1853             public boolean validate(String value) {
   1854                 try {
   1855                     Uri.decode(value);
   1856                     return true;
   1857                 } catch (IllegalArgumentException e) {
   1858                     return false;
   1859                 }
   1860             }
   1861         };
   1862 
   1863         private static final Validator sLenientIpAddressValidator = new Validator() {
   1864             private static final int MAX_IPV6_LENGTH = 45;
   1865 
   1866             @Override
   1867             public boolean validate(String value) {
   1868                 return value.length() <= MAX_IPV6_LENGTH;
   1869             }
   1870         };
   1871 
   1872         /** @hide */
   1873         public static void getMovedToGlobalSettings(Set<String> outKeySet) {
   1874             outKeySet.addAll(MOVED_TO_GLOBAL);
   1875             outKeySet.addAll(MOVED_TO_SECURE_THEN_GLOBAL);
   1876         }
   1877 
   1878         /** @hide */
   1879         public static void getMovedToSecureSettings(Set<String> outKeySet) {
   1880             outKeySet.addAll(MOVED_TO_SECURE);
   1881         }
   1882 
   1883         /** @hide */
   1884         public static void getNonLegacyMovedKeys(HashSet<String> outKeySet) {
   1885             outKeySet.addAll(MOVED_TO_GLOBAL);
   1886         }
   1887 
   1888         /**
   1889          * Look up a name in the database.
   1890          * @param resolver to access the database with
   1891          * @param name to look up in the table
   1892          * @return the corresponding value, or null if not present
   1893          */
   1894         public static String getString(ContentResolver resolver, String name) {
   1895             return getStringForUser(resolver, name, UserHandle.myUserId());
   1896         }
   1897 
   1898         /** @hide */
   1899         public static String getStringForUser(ContentResolver resolver, String name,
   1900                 int userHandle) {
   1901             if (MOVED_TO_SECURE.contains(name)) {
   1902                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   1903                         + " to android.provider.Settings.Secure, returning read-only value.");
   1904                 return Secure.getStringForUser(resolver, name, userHandle);
   1905             }
   1906             if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) {
   1907                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   1908                         + " to android.provider.Settings.Global, returning read-only value.");
   1909                 return Global.getStringForUser(resolver, name, userHandle);
   1910             }
   1911             return sNameValueCache.getStringForUser(resolver, name, userHandle);
   1912         }
   1913 
   1914         /**
   1915          * Store a name/value pair into the database.
   1916          * @param resolver to access the database with
   1917          * @param name to store
   1918          * @param value to associate with the name
   1919          * @return true if the value was set, false on database errors
   1920          */
   1921         public static boolean putString(ContentResolver resolver, String name, String value) {
   1922             return putStringForUser(resolver, name, value, UserHandle.myUserId());
   1923         }
   1924 
   1925         /** @hide */
   1926         public static boolean putStringForUser(ContentResolver resolver, String name, String value,
   1927                 int userHandle) {
   1928             if (MOVED_TO_SECURE.contains(name)) {
   1929                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   1930                         + " to android.provider.Settings.Secure, value is unchanged.");
   1931                 return false;
   1932             }
   1933             if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) {
   1934                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   1935                         + " to android.provider.Settings.Global, value is unchanged.");
   1936                 return false;
   1937             }
   1938             return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
   1939         }
   1940 
   1941         /**
   1942          * Construct the content URI for a particular name/value pair,
   1943          * useful for monitoring changes with a ContentObserver.
   1944          * @param name to look up in the table
   1945          * @return the corresponding content URI, or null if not present
   1946          */
   1947         public static Uri getUriFor(String name) {
   1948             if (MOVED_TO_SECURE.contains(name)) {
   1949                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   1950                     + " to android.provider.Settings.Secure, returning Secure URI.");
   1951                 return Secure.getUriFor(Secure.CONTENT_URI, name);
   1952             }
   1953             if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) {
   1954                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   1955                         + " to android.provider.Settings.Global, returning read-only global URI.");
   1956                 return Global.getUriFor(Global.CONTENT_URI, name);
   1957             }
   1958             return getUriFor(CONTENT_URI, name);
   1959         }
   1960 
   1961         /**
   1962          * Convenience function for retrieving a single system settings value
   1963          * as an integer.  Note that internally setting values are always
   1964          * stored as strings; this function converts the string to an integer
   1965          * for you.  The default value will be returned if the setting is
   1966          * not defined or not an integer.
   1967          *
   1968          * @param cr The ContentResolver to access.
   1969          * @param name The name of the setting to retrieve.
   1970          * @param def Value to return if the setting is not defined.
   1971          *
   1972          * @return The setting's current value, or 'def' if it is not defined
   1973          * or not a valid integer.
   1974          */
   1975         public static int getInt(ContentResolver cr, String name, int def) {
   1976             return getIntForUser(cr, name, def, UserHandle.myUserId());
   1977         }
   1978 
   1979         /** @hide */
   1980         public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) {
   1981             String v = getStringForUser(cr, name, userHandle);
   1982             try {
   1983                 return v != null ? Integer.parseInt(v) : def;
   1984             } catch (NumberFormatException e) {
   1985                 return def;
   1986             }
   1987         }
   1988 
   1989         /**
   1990          * Convenience function for retrieving a single system settings value
   1991          * as an integer.  Note that internally setting values are always
   1992          * stored as strings; this function converts the string to an integer
   1993          * for you.
   1994          * <p>
   1995          * This version does not take a default value.  If the setting has not
   1996          * been set, or the string value is not a number,
   1997          * it throws {@link SettingNotFoundException}.
   1998          *
   1999          * @param cr The ContentResolver to access.
   2000          * @param name The name of the setting to retrieve.
   2001          *
   2002          * @throws SettingNotFoundException Thrown if a setting by the given
   2003          * name can't be found or the setting value is not an integer.
   2004          *
   2005          * @return The setting's current value.
   2006          */
   2007         public static int getInt(ContentResolver cr, String name)
   2008                 throws SettingNotFoundException {
   2009             return getIntForUser(cr, name, UserHandle.myUserId());
   2010         }
   2011 
   2012         /** @hide */
   2013         public static int getIntForUser(ContentResolver cr, String name, int userHandle)
   2014                 throws SettingNotFoundException {
   2015             String v = getStringForUser(cr, name, userHandle);
   2016             try {
   2017                 return Integer.parseInt(v);
   2018             } catch (NumberFormatException e) {
   2019                 throw new SettingNotFoundException(name);
   2020             }
   2021         }
   2022 
   2023         /**
   2024          * Convenience function for updating a single settings value as an
   2025          * integer. This will either create a new entry in the table if the
   2026          * given name does not exist, or modify the value of the existing row
   2027          * with that name.  Note that internally setting values are always
   2028          * stored as strings, so this function converts the given value to a
   2029          * string before storing it.
   2030          *
   2031          * @param cr The ContentResolver to access.
   2032          * @param name The name of the setting to modify.
   2033          * @param value The new value for the setting.
   2034          * @return true if the value was set, false on database errors
   2035          */
   2036         public static boolean putInt(ContentResolver cr, String name, int value) {
   2037             return putIntForUser(cr, name, value, UserHandle.myUserId());
   2038         }
   2039 
   2040         /** @hide */
   2041         public static boolean putIntForUser(ContentResolver cr, String name, int value,
   2042                 int userHandle) {
   2043             return putStringForUser(cr, name, Integer.toString(value), userHandle);
   2044         }
   2045 
   2046         /**
   2047          * Convenience function for retrieving a single system settings value
   2048          * as a {@code long}.  Note that internally setting values are always
   2049          * stored as strings; this function converts the string to a {@code long}
   2050          * for you.  The default value will be returned if the setting is
   2051          * not defined or not a {@code long}.
   2052          *
   2053          * @param cr The ContentResolver to access.
   2054          * @param name The name of the setting to retrieve.
   2055          * @param def Value to return if the setting is not defined.
   2056          *
   2057          * @return The setting's current value, or 'def' if it is not defined
   2058          * or not a valid {@code long}.
   2059          */
   2060         public static long getLong(ContentResolver cr, String name, long def) {
   2061             return getLongForUser(cr, name, def, UserHandle.myUserId());
   2062         }
   2063 
   2064         /** @hide */
   2065         public static long getLongForUser(ContentResolver cr, String name, long def,
   2066                 int userHandle) {
   2067             String valString = getStringForUser(cr, name, userHandle);
   2068             long value;
   2069             try {
   2070                 value = valString != null ? Long.parseLong(valString) : def;
   2071             } catch (NumberFormatException e) {
   2072                 value = def;
   2073             }
   2074             return value;
   2075         }
   2076 
   2077         /**
   2078          * Convenience function for retrieving a single system settings value
   2079          * as a {@code long}.  Note that internally setting values are always
   2080          * stored as strings; this function converts the string to a {@code long}
   2081          * for you.
   2082          * <p>
   2083          * This version does not take a default value.  If the setting has not
   2084          * been set, or the string value is not a number,
   2085          * it throws {@link SettingNotFoundException}.
   2086          *
   2087          * @param cr The ContentResolver to access.
   2088          * @param name The name of the setting to retrieve.
   2089          *
   2090          * @return The setting's current value.
   2091          * @throws SettingNotFoundException Thrown if a setting by the given
   2092          * name can't be found or the setting value is not an integer.
   2093          */
   2094         public static long getLong(ContentResolver cr, String name)
   2095                 throws SettingNotFoundException {
   2096             return getLongForUser(cr, name, UserHandle.myUserId());
   2097         }
   2098 
   2099         /** @hide */
   2100         public static long getLongForUser(ContentResolver cr, String name, int userHandle)
   2101                 throws SettingNotFoundException {
   2102             String valString = getStringForUser(cr, name, userHandle);
   2103             try {
   2104                 return Long.parseLong(valString);
   2105             } catch (NumberFormatException e) {
   2106                 throw new SettingNotFoundException(name);
   2107             }
   2108         }
   2109 
   2110         /**
   2111          * Convenience function for updating a single settings value as a long
   2112          * integer. This will either create a new entry in the table if the
   2113          * given name does not exist, or modify the value of the existing row
   2114          * with that name.  Note that internally setting values are always
   2115          * stored as strings, so this function converts the given value to a
   2116          * string before storing it.
   2117          *
   2118          * @param cr The ContentResolver to access.
   2119          * @param name The name of the setting to modify.
   2120          * @param value The new value for the setting.
   2121          * @return true if the value was set, false on database errors
   2122          */
   2123         public static boolean putLong(ContentResolver cr, String name, long value) {
   2124             return putLongForUser(cr, name, value, UserHandle.myUserId());
   2125         }
   2126 
   2127         /** @hide */
   2128         public static boolean putLongForUser(ContentResolver cr, String name, long value,
   2129                 int userHandle) {
   2130             return putStringForUser(cr, name, Long.toString(value), userHandle);
   2131         }
   2132 
   2133         /**
   2134          * Convenience function for retrieving a single system settings value
   2135          * as a floating point number.  Note that internally setting values are
   2136          * always stored as strings; this function converts the string to an
   2137          * float for you. The default value will be returned if the setting
   2138          * is not defined or not a valid float.
   2139          *
   2140          * @param cr The ContentResolver to access.
   2141          * @param name The name of the setting to retrieve.
   2142          * @param def Value to return if the setting is not defined.
   2143          *
   2144          * @return The setting's current value, or 'def' if it is not defined
   2145          * or not a valid float.
   2146          */
   2147         public static float getFloat(ContentResolver cr, String name, float def) {
   2148             return getFloatForUser(cr, name, def, UserHandle.myUserId());
   2149         }
   2150 
   2151         /** @hide */
   2152         public static float getFloatForUser(ContentResolver cr, String name, float def,
   2153                 int userHandle) {
   2154             String v = getStringForUser(cr, name, userHandle);
   2155             try {
   2156                 return v != null ? Float.parseFloat(v) : def;
   2157             } catch (NumberFormatException e) {
   2158                 return def;
   2159             }
   2160         }
   2161 
   2162         /**
   2163          * Convenience function for retrieving a single system settings value
   2164          * as a float.  Note that internally setting values are always
   2165          * stored as strings; this function converts the string to a float
   2166          * for you.
   2167          * <p>
   2168          * This version does not take a default value.  If the setting has not
   2169          * been set, or the string value is not a number,
   2170          * it throws {@link SettingNotFoundException}.
   2171          *
   2172          * @param cr The ContentResolver to access.
   2173          * @param name The name of the setting to retrieve.
   2174          *
   2175          * @throws SettingNotFoundException Thrown if a setting by the given
   2176          * name can't be found or the setting value is not a float.
   2177          *
   2178          * @return The setting's current value.
   2179          */
   2180         public static float getFloat(ContentResolver cr, String name)
   2181                 throws SettingNotFoundException {
   2182             return getFloatForUser(cr, name, UserHandle.myUserId());
   2183         }
   2184 
   2185         /** @hide */
   2186         public static float getFloatForUser(ContentResolver cr, String name, int userHandle)
   2187                 throws SettingNotFoundException {
   2188             String v = getStringForUser(cr, name, userHandle);
   2189             if (v == null) {
   2190                 throw new SettingNotFoundException(name);
   2191             }
   2192             try {
   2193                 return Float.parseFloat(v);
   2194             } catch (NumberFormatException e) {
   2195                 throw new SettingNotFoundException(name);
   2196             }
   2197         }
   2198 
   2199         /**
   2200          * Convenience function for updating a single settings value as a
   2201          * floating point number. This will either create a new entry in the
   2202          * table if the given name does not exist, or modify the value of the
   2203          * existing row with that name.  Note that internally setting values
   2204          * are always stored as strings, so this function converts the given
   2205          * value to a string before storing it.
   2206          *
   2207          * @param cr The ContentResolver to access.
   2208          * @param name The name of the setting to modify.
   2209          * @param value The new value for the setting.
   2210          * @return true if the value was set, false on database errors
   2211          */
   2212         public static boolean putFloat(ContentResolver cr, String name, float value) {
   2213             return putFloatForUser(cr, name, value, UserHandle.myUserId());
   2214         }
   2215 
   2216         /** @hide */
   2217         public static boolean putFloatForUser(ContentResolver cr, String name, float value,
   2218                 int userHandle) {
   2219             return putStringForUser(cr, name, Float.toString(value), userHandle);
   2220         }
   2221 
   2222         /**
   2223          * Convenience function to read all of the current
   2224          * configuration-related settings into a
   2225          * {@link Configuration} object.
   2226          *
   2227          * @param cr The ContentResolver to access.
   2228          * @param outConfig Where to place the configuration settings.
   2229          */
   2230         public static void getConfiguration(ContentResolver cr, Configuration outConfig) {
   2231             adjustConfigurationForUser(cr, outConfig, UserHandle.myUserId(),
   2232                     false /* updateSettingsIfEmpty */);
   2233         }
   2234 
   2235         /** @hide */
   2236         public static void adjustConfigurationForUser(ContentResolver cr, Configuration outConfig,
   2237                 int userHandle, boolean updateSettingsIfEmpty) {
   2238             outConfig.fontScale = Settings.System.getFloatForUser(
   2239                     cr, FONT_SCALE, DEFAULT_FONT_SCALE, userHandle);
   2240             if (outConfig.fontScale < 0) {
   2241                 outConfig.fontScale = DEFAULT_FONT_SCALE;
   2242             }
   2243 
   2244             final String localeValue =
   2245                     Settings.System.getStringForUser(cr, SYSTEM_LOCALES, userHandle);
   2246             if (localeValue != null) {
   2247                 outConfig.setLocales(LocaleList.forLanguageTags(localeValue));
   2248             } else {
   2249                 // Do not update configuration with emtpy settings since we need to take over the
   2250                 // locale list of previous user if the settings value is empty. This happens when a
   2251                 // new user is created.
   2252 
   2253                 if (updateSettingsIfEmpty) {
   2254                     // Make current configuration persistent. This is necessary the first time a
   2255                     // user log in. At the first login, the configuration settings are empty, so we
   2256                     // need to store the adjusted configuration as the initial settings.
   2257                     Settings.System.putStringForUser(
   2258                             cr, SYSTEM_LOCALES, outConfig.getLocales().toLanguageTags(),
   2259                             userHandle);
   2260                 }
   2261             }
   2262         }
   2263 
   2264         /**
   2265          * @hide Erase the fields in the Configuration that should be applied
   2266          * by the settings.
   2267          */
   2268         public static void clearConfiguration(Configuration inoutConfig) {
   2269             inoutConfig.fontScale = 0;
   2270             if (!inoutConfig.userSetLocale && !inoutConfig.getLocales().isEmpty()) {
   2271                 inoutConfig.clearLocales();
   2272             }
   2273         }
   2274 
   2275         /**
   2276          * Convenience function to write a batch of configuration-related
   2277          * settings from a {@link Configuration} object.
   2278          *
   2279          * @param cr The ContentResolver to access.
   2280          * @param config The settings to write.
   2281          * @return true if the values were set, false on database errors
   2282          */
   2283         public static boolean putConfiguration(ContentResolver cr, Configuration config) {
   2284             return putConfigurationForUser(cr, config, UserHandle.myUserId());
   2285         }
   2286 
   2287         /** @hide */
   2288         public static boolean putConfigurationForUser(ContentResolver cr, Configuration config,
   2289                 int userHandle) {
   2290             return Settings.System.putFloatForUser(cr, FONT_SCALE, config.fontScale, userHandle) &&
   2291                     Settings.System.putStringForUser(
   2292                             cr, SYSTEM_LOCALES, config.getLocales().toLanguageTags(), userHandle);
   2293         }
   2294 
   2295         /** @hide */
   2296         public static boolean hasInterestingConfigurationChanges(int changes) {
   2297             return (changes & ActivityInfo.CONFIG_FONT_SCALE) != 0 ||
   2298                     (changes & ActivityInfo.CONFIG_LOCALE) != 0;
   2299         }
   2300 
   2301         /** @deprecated - Do not use */
   2302         @Deprecated
   2303         public static boolean getShowGTalkServiceStatus(ContentResolver cr) {
   2304             return getShowGTalkServiceStatusForUser(cr, UserHandle.myUserId());
   2305         }
   2306 
   2307         /**
   2308          * @hide
   2309          * @deprecated - Do not use
   2310          */
   2311         public static boolean getShowGTalkServiceStatusForUser(ContentResolver cr,
   2312                 int userHandle) {
   2313             return getIntForUser(cr, SHOW_GTALK_SERVICE_STATUS, 0, userHandle) != 0;
   2314         }
   2315 
   2316         /** @deprecated - Do not use */
   2317         @Deprecated
   2318         public static void setShowGTalkServiceStatus(ContentResolver cr, boolean flag) {
   2319             setShowGTalkServiceStatusForUser(cr, flag, UserHandle.myUserId());
   2320         }
   2321 
   2322         /**
   2323          * @hide
   2324          * @deprecated - Do not use
   2325          */
   2326         @Deprecated
   2327         public static void setShowGTalkServiceStatusForUser(ContentResolver cr, boolean flag,
   2328                 int userHandle) {
   2329             putIntForUser(cr, SHOW_GTALK_SERVICE_STATUS, flag ? 1 : 0, userHandle);
   2330         }
   2331 
   2332         private static final class DiscreteValueValidator implements Validator {
   2333             private final String[] mValues;
   2334 
   2335             public DiscreteValueValidator(String[] values) {
   2336                 mValues = values;
   2337             }
   2338 
   2339             @Override
   2340             public boolean validate(String value) {
   2341                 return ArrayUtils.contains(mValues, value);
   2342             }
   2343         }
   2344 
   2345         private static final class InclusiveIntegerRangeValidator implements Validator {
   2346             private final int mMin;
   2347             private final int mMax;
   2348 
   2349             public InclusiveIntegerRangeValidator(int min, int max) {
   2350                 mMin = min;
   2351                 mMax = max;
   2352             }
   2353 
   2354             @Override
   2355             public boolean validate(String value) {
   2356                 try {
   2357                     final int intValue = Integer.parseInt(value);
   2358                     return intValue >= mMin && intValue <= mMax;
   2359                 } catch (NumberFormatException e) {
   2360                     return false;
   2361                 }
   2362             }
   2363         }
   2364 
   2365         private static final class InclusiveFloatRangeValidator implements Validator {
   2366             private final float mMin;
   2367             private final float mMax;
   2368 
   2369             public InclusiveFloatRangeValidator(float min, float max) {
   2370                 mMin = min;
   2371                 mMax = max;
   2372             }
   2373 
   2374             @Override
   2375             public boolean validate(String value) {
   2376                 try {
   2377                     final float floatValue = Float.parseFloat(value);
   2378                     return floatValue >= mMin && floatValue <= mMax;
   2379                 } catch (NumberFormatException e) {
   2380                     return false;
   2381                 }
   2382             }
   2383         }
   2384 
   2385         /**
   2386          * @deprecated Use {@link android.provider.Settings.Global#STAY_ON_WHILE_PLUGGED_IN} instead
   2387          */
   2388         @Deprecated
   2389         public static final String STAY_ON_WHILE_PLUGGED_IN = Global.STAY_ON_WHILE_PLUGGED_IN;
   2390 
   2391         /**
   2392          * What happens when the user presses the end call button if they're not
   2393          * on a call.<br/>
   2394          * <b>Values:</b><br/>
   2395          * 0 - The end button does nothing.<br/>
   2396          * 1 - The end button goes to the home screen.<br/>
   2397          * 2 - The end button puts the device to sleep and locks the keyguard.<br/>
   2398          * 3 - The end button goes to the home screen.  If the user is already on the
   2399          * home screen, it puts the device to sleep.
   2400          */
   2401         public static final String END_BUTTON_BEHAVIOR = "end_button_behavior";
   2402 
   2403         private static final Validator END_BUTTON_BEHAVIOR_VALIDATOR =
   2404                 new InclusiveIntegerRangeValidator(0, 3);
   2405 
   2406         /**
   2407          * END_BUTTON_BEHAVIOR value for "go home".
   2408          * @hide
   2409          */
   2410         public static final int END_BUTTON_BEHAVIOR_HOME = 0x1;
   2411 
   2412         /**
   2413          * END_BUTTON_BEHAVIOR value for "go to sleep".
   2414          * @hide
   2415          */
   2416         public static final int END_BUTTON_BEHAVIOR_SLEEP = 0x2;
   2417 
   2418         /**
   2419          * END_BUTTON_BEHAVIOR default value.
   2420          * @hide
   2421          */
   2422         public static final int END_BUTTON_BEHAVIOR_DEFAULT = END_BUTTON_BEHAVIOR_SLEEP;
   2423 
   2424         /**
   2425          * Is advanced settings mode turned on. 0 == no, 1 == yes
   2426          * @hide
   2427          */
   2428         public static final String ADVANCED_SETTINGS = "advanced_settings";
   2429 
   2430         private static final Validator ADVANCED_SETTINGS_VALIDATOR = sBooleanValidator;
   2431 
   2432         /**
   2433          * ADVANCED_SETTINGS default value.
   2434          * @hide
   2435          */
   2436         public static final int ADVANCED_SETTINGS_DEFAULT = 0;
   2437 
   2438         /**
   2439          * @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_ON} instead
   2440          */
   2441         @Deprecated
   2442         public static final String AIRPLANE_MODE_ON = Global.AIRPLANE_MODE_ON;
   2443 
   2444         /**
   2445          * @deprecated Use {@link android.provider.Settings.Global#RADIO_BLUETOOTH} instead
   2446          */
   2447         @Deprecated
   2448         public static final String RADIO_BLUETOOTH = Global.RADIO_BLUETOOTH;
   2449 
   2450         /**
   2451          * @deprecated Use {@link android.provider.Settings.Global#RADIO_WIFI} instead
   2452          */
   2453         @Deprecated
   2454         public static final String RADIO_WIFI = Global.RADIO_WIFI;
   2455 
   2456         /**
   2457          * @deprecated Use {@link android.provider.Settings.Global#RADIO_WIMAX} instead
   2458          * {@hide}
   2459          */
   2460         @Deprecated
   2461         public static final String RADIO_WIMAX = Global.RADIO_WIMAX;
   2462 
   2463         /**
   2464          * @deprecated Use {@link android.provider.Settings.Global#RADIO_CELL} instead
   2465          */
   2466         @Deprecated
   2467         public static final String RADIO_CELL = Global.RADIO_CELL;
   2468 
   2469         /**
   2470          * @deprecated Use {@link android.provider.Settings.Global#RADIO_NFC} instead
   2471          */
   2472         @Deprecated
   2473         public static final String RADIO_NFC = Global.RADIO_NFC;
   2474 
   2475         /**
   2476          * @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_RADIOS} instead
   2477          */
   2478         @Deprecated
   2479         public static final String AIRPLANE_MODE_RADIOS = Global.AIRPLANE_MODE_RADIOS;
   2480 
   2481         /**
   2482          * @deprecated Use {@link android.provider.Settings.Global#AIRPLANE_MODE_TOGGLEABLE_RADIOS} instead
   2483          *
   2484          * {@hide}
   2485          */
   2486         @Deprecated
   2487         public static final String AIRPLANE_MODE_TOGGLEABLE_RADIOS =
   2488                 Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS;
   2489 
   2490         /**
   2491          * @deprecated Use {@link android.provider.Settings.Global#WIFI_SLEEP_POLICY} instead
   2492          */
   2493         @Deprecated
   2494         public static final String WIFI_SLEEP_POLICY = Global.WIFI_SLEEP_POLICY;
   2495 
   2496         /**
   2497          * @deprecated Use {@link android.provider.Settings.Global#WIFI_SLEEP_POLICY_DEFAULT} instead
   2498          */
   2499         @Deprecated
   2500         public static final int WIFI_SLEEP_POLICY_DEFAULT = Global.WIFI_SLEEP_POLICY_DEFAULT;
   2501 
   2502         /**
   2503          * @deprecated Use {@link android.provider.Settings.Global#WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED} instead
   2504          */
   2505         @Deprecated
   2506         public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED =
   2507                 Global.WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED;
   2508 
   2509         /**
   2510          * @deprecated Use {@link android.provider.Settings.Global#WIFI_SLEEP_POLICY_NEVER} instead
   2511          */
   2512         @Deprecated
   2513         public static final int WIFI_SLEEP_POLICY_NEVER = Global.WIFI_SLEEP_POLICY_NEVER;
   2514 
   2515         /**
   2516          * @deprecated Use {@link android.provider.Settings.Global#MODE_RINGER} instead
   2517          */
   2518         @Deprecated
   2519         public static final String MODE_RINGER = Global.MODE_RINGER;
   2520 
   2521         /**
   2522          * Whether to use static IP and other static network attributes.
   2523          * <p>
   2524          * Set to 1 for true and 0 for false.
   2525          *
   2526          * @deprecated Use {@link WifiManager} instead
   2527          */
   2528         @Deprecated
   2529         public static final String WIFI_USE_STATIC_IP = "wifi_use_static_ip";
   2530 
   2531         private static final Validator WIFI_USE_STATIC_IP_VALIDATOR = sBooleanValidator;
   2532 
   2533         /**
   2534          * The static IP address.
   2535          * <p>
   2536          * Example: "192.168.1.51"
   2537          *
   2538          * @deprecated Use {@link WifiManager} instead
   2539          */
   2540         @Deprecated
   2541         public static final String WIFI_STATIC_IP = "wifi_static_ip";
   2542 
   2543         private static final Validator WIFI_STATIC_IP_VALIDATOR = sLenientIpAddressValidator;
   2544 
   2545         /**
   2546          * If using static IP, the gateway's IP address.
   2547          * <p>
   2548          * Example: "192.168.1.1"
   2549          *
   2550          * @deprecated Use {@link WifiManager} instead
   2551          */
   2552         @Deprecated
   2553         public static final String WIFI_STATIC_GATEWAY = "wifi_static_gateway";
   2554 
   2555         private static final Validator WIFI_STATIC_GATEWAY_VALIDATOR = sLenientIpAddressValidator;
   2556 
   2557         /**
   2558          * If using static IP, the net mask.
   2559          * <p>
   2560          * Example: "255.255.255.0"
   2561          *
   2562          * @deprecated Use {@link WifiManager} instead
   2563          */
   2564         @Deprecated
   2565         public static final String WIFI_STATIC_NETMASK = "wifi_static_netmask";
   2566 
   2567         private static final Validator WIFI_STATIC_NETMASK_VALIDATOR = sLenientIpAddressValidator;
   2568 
   2569         /**
   2570          * If using static IP, the primary DNS's IP address.
   2571          * <p>
   2572          * Example: "192.168.1.1"
   2573          *
   2574          * @deprecated Use {@link WifiManager} instead
   2575          */
   2576         @Deprecated
   2577         public static final String WIFI_STATIC_DNS1 = "wifi_static_dns1";
   2578 
   2579         private static final Validator WIFI_STATIC_DNS1_VALIDATOR = sLenientIpAddressValidator;
   2580 
   2581         /**
   2582          * If using static IP, the secondary DNS's IP address.
   2583          * <p>
   2584          * Example: "192.168.1.2"
   2585          *
   2586          * @deprecated Use {@link WifiManager} instead
   2587          */
   2588         @Deprecated
   2589         public static final String WIFI_STATIC_DNS2 = "wifi_static_dns2";
   2590 
   2591         private static final Validator WIFI_STATIC_DNS2_VALIDATOR = sLenientIpAddressValidator;
   2592 
   2593         /**
   2594          * Determines whether remote devices may discover and/or connect to
   2595          * this device.
   2596          * <P>Type: INT</P>
   2597          * 2 -- discoverable and connectable
   2598          * 1 -- connectable but not discoverable
   2599          * 0 -- neither connectable nor discoverable
   2600          */
   2601         public static final String BLUETOOTH_DISCOVERABILITY =
   2602             "bluetooth_discoverability";
   2603 
   2604         private static final Validator BLUETOOTH_DISCOVERABILITY_VALIDATOR =
   2605                 new InclusiveIntegerRangeValidator(0, 2);
   2606 
   2607         /**
   2608          * Bluetooth discoverability timeout.  If this value is nonzero, then
   2609          * Bluetooth becomes discoverable for a certain number of seconds,
   2610          * after which is becomes simply connectable.  The value is in seconds.
   2611          */
   2612         public static final String BLUETOOTH_DISCOVERABILITY_TIMEOUT =
   2613             "bluetooth_discoverability_timeout";
   2614 
   2615         private static final Validator BLUETOOTH_DISCOVERABILITY_TIMEOUT_VALIDATOR =
   2616                 sNonNegativeIntegerValidator;
   2617 
   2618         /**
   2619          * @deprecated Use {@link android.provider.Settings.Secure#LOCK_PATTERN_ENABLED}
   2620          * instead
   2621          */
   2622         @Deprecated
   2623         public static final String LOCK_PATTERN_ENABLED = Secure.LOCK_PATTERN_ENABLED;
   2624 
   2625         /**
   2626          * @deprecated Use {@link android.provider.Settings.Secure#LOCK_PATTERN_VISIBLE}
   2627          * instead
   2628          */
   2629         @Deprecated
   2630         public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
   2631 
   2632         /**
   2633          * @deprecated Use
   2634          * {@link android.provider.Settings.Secure#LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED}
   2635          * instead
   2636          */
   2637         @Deprecated
   2638         public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED =
   2639             "lock_pattern_tactile_feedback_enabled";
   2640 
   2641         /**
   2642          * A formatted string of the next alarm that is set, or the empty string
   2643          * if there is no alarm set.
   2644          *
   2645          * @deprecated Use {@link android.app.AlarmManager#getNextAlarmClock()}.
   2646          */
   2647         @Deprecated
   2648         public static final String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
   2649 
   2650         private static final Validator NEXT_ALARM_FORMATTED_VALIDATOR = new Validator() {
   2651             private static final int MAX_LENGTH = 1000;
   2652 
   2653             @Override
   2654             public boolean validate(String value) {
   2655                 // TODO: No idea what the correct format is.
   2656                 return value == null || value.length() < MAX_LENGTH;
   2657             }
   2658         };
   2659 
   2660         /**
   2661          * Scaling factor for fonts, float.
   2662          */
   2663         public static final String FONT_SCALE = "font_scale";
   2664 
   2665         private static final Validator FONT_SCALE_VALIDATOR = new Validator() {
   2666             @Override
   2667             public boolean validate(String value) {
   2668                 try {
   2669                     return Float.parseFloat(value) >= 0;
   2670                 } catch (NumberFormatException e) {
   2671                     return false;
   2672                 }
   2673             }
   2674         };
   2675 
   2676         /**
   2677          * The serialized system locale value.
   2678          *
   2679          * Do not use this value directory.
   2680          * To get system locale, use {@link LocaleList#getDefault} instead.
   2681          * To update system locale, use {@link com.android.internal.app.LocalePicker#updateLocales}
   2682          * instead.
   2683          * @hide
   2684          */
   2685         public static final String SYSTEM_LOCALES = "system_locales";
   2686 
   2687 
   2688         /**
   2689          * Name of an application package to be debugged.
   2690          *
   2691          * @deprecated Use {@link Global#DEBUG_APP} instead
   2692          */
   2693         @Deprecated
   2694         public static final String DEBUG_APP = Global.DEBUG_APP;
   2695 
   2696         /**
   2697          * If 1, when launching DEBUG_APP it will wait for the debugger before
   2698          * starting user code.  If 0, it will run normally.
   2699          *
   2700          * @deprecated Use {@link Global#WAIT_FOR_DEBUGGER} instead
   2701          */
   2702         @Deprecated
   2703         public static final String WAIT_FOR_DEBUGGER = Global.WAIT_FOR_DEBUGGER;
   2704 
   2705         /**
   2706          * Whether or not to dim the screen. 0=no  1=yes
   2707          * @deprecated This setting is no longer used.
   2708          */
   2709         @Deprecated
   2710         public static final String DIM_SCREEN = "dim_screen";
   2711 
   2712         private static final Validator DIM_SCREEN_VALIDATOR = sBooleanValidator;
   2713 
   2714         /**
   2715          * The amount of time in milliseconds before the device goes to sleep or begins
   2716          * to dream after a period of inactivity.  This value is also known as the
   2717          * user activity timeout period since the screen isn't necessarily turned off
   2718          * when it expires.
   2719          */
   2720         public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
   2721 
   2722         private static final Validator SCREEN_OFF_TIMEOUT_VALIDATOR = sNonNegativeIntegerValidator;
   2723 
   2724         /**
   2725          * The screen backlight brightness between 0 and 255.
   2726          */
   2727         public static final String SCREEN_BRIGHTNESS = "screen_brightness";
   2728 
   2729         private static final Validator SCREEN_BRIGHTNESS_VALIDATOR =
   2730                 new InclusiveIntegerRangeValidator(0, 255);
   2731 
   2732         /**
   2733          * Control whether to enable automatic brightness mode.
   2734          */
   2735         public static final String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
   2736 
   2737         private static final Validator SCREEN_BRIGHTNESS_MODE_VALIDATOR = sBooleanValidator;
   2738 
   2739         /**
   2740          * Adjustment to auto-brightness to make it generally more (>0.0 <1.0)
   2741          * or less (<0.0 >-1.0) bright.
   2742          * @hide
   2743          */
   2744         public static final String SCREEN_AUTO_BRIGHTNESS_ADJ = "screen_auto_brightness_adj";
   2745 
   2746         private static final Validator SCREEN_AUTO_BRIGHTNESS_ADJ_VALIDATOR =
   2747                 new InclusiveFloatRangeValidator(-1, 1);
   2748 
   2749         /**
   2750          * SCREEN_BRIGHTNESS_MODE value for manual mode.
   2751          */
   2752         public static final int SCREEN_BRIGHTNESS_MODE_MANUAL = 0;
   2753 
   2754         /**
   2755          * SCREEN_BRIGHTNESS_MODE value for automatic mode.
   2756          */
   2757         public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1;
   2758 
   2759         /**
   2760          * Control whether the process CPU usage meter should be shown.
   2761          *
   2762          * @deprecated Use {@link Global#SHOW_PROCESSES} instead
   2763          */
   2764         @Deprecated
   2765         public static final String SHOW_PROCESSES = Global.SHOW_PROCESSES;
   2766 
   2767         /**
   2768          * If 1, the activity manager will aggressively finish activities and
   2769          * processes as soon as they are no longer needed.  If 0, the normal
   2770          * extended lifetime is used.
   2771          *
   2772          * @deprecated Use {@link Global#ALWAYS_FINISH_ACTIVITIES} instead
   2773          */
   2774         @Deprecated
   2775         public static final String ALWAYS_FINISH_ACTIVITIES = Global.ALWAYS_FINISH_ACTIVITIES;
   2776 
   2777         /**
   2778          * Determines which streams are affected by ringer mode changes. The
   2779          * stream type's bit should be set to 1 if it should be muted when going
   2780          * into an inaudible ringer mode.
   2781          */
   2782         public static final String MODE_RINGER_STREAMS_AFFECTED = "mode_ringer_streams_affected";
   2783 
   2784         private static final Validator MODE_RINGER_STREAMS_AFFECTED_VALIDATOR =
   2785                 sNonNegativeIntegerValidator;
   2786 
   2787         /**
   2788           * Determines which streams are affected by mute. The
   2789           * stream type's bit should be set to 1 if it should be muted when a mute request
   2790           * is received.
   2791           */
   2792         public static final String MUTE_STREAMS_AFFECTED = "mute_streams_affected";
   2793 
   2794         private static final Validator MUTE_STREAMS_AFFECTED_VALIDATOR =
   2795                 sNonNegativeIntegerValidator;
   2796 
   2797         /**
   2798          * Whether vibrate is on for different events. This is used internally,
   2799          * changing this value will not change the vibrate. See AudioManager.
   2800          */
   2801         public static final String VIBRATE_ON = "vibrate_on";
   2802 
   2803         private static final Validator VIBRATE_ON_VALIDATOR = sBooleanValidator;
   2804 
   2805         /**
   2806          * If 1, redirects the system vibrator to all currently attached input devices
   2807          * that support vibration.  If there are no such input devices, then the system
   2808          * vibrator is used instead.
   2809          * If 0, does not register the system vibrator.
   2810          *
   2811          * This setting is mainly intended to provide a compatibility mechanism for
   2812          * applications that only know about the system vibrator and do not use the
   2813          * input device vibrator API.
   2814          *
   2815          * @hide
   2816          */
   2817         public static final String VIBRATE_INPUT_DEVICES = "vibrate_input_devices";
   2818 
   2819         private static final Validator VIBRATE_INPUT_DEVICES_VALIDATOR = sBooleanValidator;
   2820 
   2821         /**
   2822          * Ringer volume. This is used internally, changing this value will not
   2823          * change the volume. See AudioManager.
   2824          *
   2825          * @removed Not used by anything since API 2.
   2826          */
   2827         public static final String VOLUME_RING = "volume_ring";
   2828 
   2829         /**
   2830          * System/notifications volume. This is used internally, changing this
   2831          * value will not change the volume. See AudioManager.
   2832          *
   2833          * @removed Not used by anything since API 2.
   2834          */
   2835         public static final String VOLUME_SYSTEM = "volume_system";
   2836 
   2837         /**
   2838          * Voice call volume. This is used internally, changing this value will
   2839          * not change the volume. See AudioManager.
   2840          *
   2841          * @removed Not used by anything since API 2.
   2842          */
   2843         public static final String VOLUME_VOICE = "volume_voice";
   2844 
   2845         /**
   2846          * Music/media/gaming volume. This is used internally, changing this
   2847          * value will not change the volume. See AudioManager.
   2848          *
   2849          * @removed Not used by anything since API 2.
   2850          */
   2851         public static final String VOLUME_MUSIC = "volume_music";
   2852 
   2853         /**
   2854          * Alarm volume. This is used internally, changing this
   2855          * value will not change the volume. See AudioManager.
   2856          *
   2857          * @removed Not used by anything since API 2.
   2858          */
   2859         public static final String VOLUME_ALARM = "volume_alarm";
   2860 
   2861         /**
   2862          * Notification volume. This is used internally, changing this
   2863          * value will not change the volume. See AudioManager.
   2864          *
   2865          * @removed Not used by anything since API 2.
   2866          */
   2867         public static final String VOLUME_NOTIFICATION = "volume_notification";
   2868 
   2869         /**
   2870          * Bluetooth Headset volume. This is used internally, changing this value will
   2871          * not change the volume. See AudioManager.
   2872          *
   2873          * @removed Not used by anything since API 2.
   2874          */
   2875         public static final String VOLUME_BLUETOOTH_SCO = "volume_bluetooth_sco";
   2876 
   2877         /**
   2878          * Master volume (float in the range 0.0f to 1.0f).
   2879          *
   2880          * @hide
   2881          */
   2882         public static final String VOLUME_MASTER = "volume_master";
   2883 
   2884         /**
   2885          * Master mono (int 1 = mono, 0 = normal).
   2886          *
   2887          * @hide
   2888          */
   2889         public static final String MASTER_MONO = "master_mono";
   2890 
   2891         private static final Validator MASTER_MONO_VALIDATOR = sBooleanValidator;
   2892 
   2893         /**
   2894          * Whether the notifications should use the ring volume (value of 1) or
   2895          * a separate notification volume (value of 0). In most cases, users
   2896          * will have this enabled so the notification and ringer volumes will be
   2897          * the same. However, power users can disable this and use the separate
   2898          * notification volume control.
   2899          * <p>
   2900          * Note: This is a one-off setting that will be removed in the future
   2901          * when there is profile support. For this reason, it is kept hidden
   2902          * from the public APIs.
   2903          *
   2904          * @hide
   2905          * @deprecated
   2906          */
   2907         @Deprecated
   2908         public static final String NOTIFICATIONS_USE_RING_VOLUME =
   2909             "notifications_use_ring_volume";
   2910 
   2911         private static final Validator NOTIFICATIONS_USE_RING_VOLUME_VALIDATOR = sBooleanValidator;
   2912 
   2913         /**
   2914          * Whether silent mode should allow vibration feedback. This is used
   2915          * internally in AudioService and the Sound settings activity to
   2916          * coordinate decoupling of vibrate and silent modes. This setting
   2917          * will likely be removed in a future release with support for
   2918          * audio/vibe feedback profiles.
   2919          *
   2920          * Not used anymore. On devices with vibrator, the user explicitly selects
   2921          * silent or vibrate mode.
   2922          * Kept for use by legacy database upgrade code in DatabaseHelper.
   2923          * @hide
   2924          */
   2925         public static final String VIBRATE_IN_SILENT = "vibrate_in_silent";
   2926 
   2927         private static final Validator VIBRATE_IN_SILENT_VALIDATOR = sBooleanValidator;
   2928 
   2929         /**
   2930          * The mapping of stream type (integer) to its setting.
   2931          *
   2932          * @removed  Not used by anything since API 2.
   2933          */
   2934         public static final String[] VOLUME_SETTINGS = {
   2935             VOLUME_VOICE, VOLUME_SYSTEM, VOLUME_RING, VOLUME_MUSIC,
   2936             VOLUME_ALARM, VOLUME_NOTIFICATION, VOLUME_BLUETOOTH_SCO
   2937         };
   2938 
   2939         /**
   2940          * Appended to various volume related settings to record the previous
   2941          * values before they the settings were affected by a silent/vibrate
   2942          * ringer mode change.
   2943          *
   2944          * @removed  Not used by anything since API 2.
   2945          */
   2946         public static final String APPEND_FOR_LAST_AUDIBLE = "_last_audible";
   2947 
   2948         /**
   2949          * Persistent store for the system-wide default ringtone URI.
   2950          * <p>
   2951          * If you need to play the default ringtone at any given time, it is recommended
   2952          * you give {@link #DEFAULT_RINGTONE_URI} to the media player.  It will resolve
   2953          * to the set default ringtone at the time of playing.
   2954          *
   2955          * @see #DEFAULT_RINGTONE_URI
   2956          */
   2957         public static final String RINGTONE = "ringtone";
   2958 
   2959         private static final Validator RINGTONE_VALIDATOR = sUriValidator;
   2960 
   2961         /**
   2962          * A {@link Uri} that will point to the current default ringtone at any
   2963          * given time.
   2964          * <p>
   2965          * If the current default ringtone is in the DRM provider and the caller
   2966          * does not have permission, the exception will be a
   2967          * FileNotFoundException.
   2968          */
   2969         public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE);
   2970 
   2971         /** {@hide} */
   2972         public static final String RINGTONE_CACHE = "ringtone_cache";
   2973         /** {@hide} */
   2974         public static final Uri RINGTONE_CACHE_URI = getUriFor(RINGTONE_CACHE);
   2975 
   2976         /**
   2977          * Persistent store for the system-wide default notification sound.
   2978          *
   2979          * @see #RINGTONE
   2980          * @see #DEFAULT_NOTIFICATION_URI
   2981          */
   2982         public static final String NOTIFICATION_SOUND = "notification_sound";
   2983 
   2984         private static final Validator NOTIFICATION_SOUND_VALIDATOR = sUriValidator;
   2985 
   2986         /**
   2987          * A {@link Uri} that will point to the current default notification
   2988          * sound at any given time.
   2989          *
   2990          * @see #DEFAULT_RINGTONE_URI
   2991          */
   2992         public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND);
   2993 
   2994         /** {@hide} */
   2995         public static final String NOTIFICATION_SOUND_CACHE = "notification_sound_cache";
   2996         /** {@hide} */
   2997         public static final Uri NOTIFICATION_SOUND_CACHE_URI = getUriFor(NOTIFICATION_SOUND_CACHE);
   2998 
   2999         /**
   3000          * Persistent store for the system-wide default alarm alert.
   3001          *
   3002          * @see #RINGTONE
   3003          * @see #DEFAULT_ALARM_ALERT_URI
   3004          */
   3005         public static final String ALARM_ALERT = "alarm_alert";
   3006 
   3007         private static final Validator ALARM_ALERT_VALIDATOR = sUriValidator;
   3008 
   3009         /**
   3010          * A {@link Uri} that will point to the current default alarm alert at
   3011          * any given time.
   3012          *
   3013          * @see #DEFAULT_ALARM_ALERT_URI
   3014          */
   3015         public static final Uri DEFAULT_ALARM_ALERT_URI = getUriFor(ALARM_ALERT);
   3016 
   3017         /** {@hide} */
   3018         public static final String ALARM_ALERT_CACHE = "alarm_alert_cache";
   3019         /** {@hide} */
   3020         public static final Uri ALARM_ALERT_CACHE_URI = getUriFor(ALARM_ALERT_CACHE);
   3021 
   3022         /**
   3023          * Persistent store for the system default media button event receiver.
   3024          *
   3025          * @hide
   3026          */
   3027         public static final String MEDIA_BUTTON_RECEIVER = "media_button_receiver";
   3028 
   3029         private static final Validator MEDIA_BUTTON_RECEIVER_VALIDATOR = new Validator() {
   3030             @Override
   3031             public boolean validate(String value) {
   3032                 try {
   3033                     ComponentName.unflattenFromString(value);
   3034                     return true;
   3035                 } catch (NullPointerException e) {
   3036                     return false;
   3037                 }
   3038             }
   3039         };
   3040 
   3041         /**
   3042          * Setting to enable Auto Replace (AutoText) in text editors. 1 = On, 0 = Off
   3043          */
   3044         public static final String TEXT_AUTO_REPLACE = "auto_replace";
   3045 
   3046         private static final Validator TEXT_AUTO_REPLACE_VALIDATOR = sBooleanValidator;
   3047 
   3048         /**
   3049          * Setting to enable Auto Caps in text editors. 1 = On, 0 = Off
   3050          */
   3051         public static final String TEXT_AUTO_CAPS = "auto_caps";
   3052 
   3053         private static final Validator TEXT_AUTO_CAPS_VALIDATOR = sBooleanValidator;
   3054 
   3055         /**
   3056          * Setting to enable Auto Punctuate in text editors. 1 = On, 0 = Off. This
   3057          * feature converts two spaces to a "." and space.
   3058          */
   3059         public static final String TEXT_AUTO_PUNCTUATE = "auto_punctuate";
   3060 
   3061         private static final Validator TEXT_AUTO_PUNCTUATE_VALIDATOR = sBooleanValidator;
   3062 
   3063         /**
   3064          * Setting to showing password characters in text editors. 1 = On, 0 = Off
   3065          */
   3066         public static final String TEXT_SHOW_PASSWORD = "show_password";
   3067 
   3068         private static final Validator TEXT_SHOW_PASSWORD_VALIDATOR = sBooleanValidator;
   3069 
   3070         public static final String SHOW_GTALK_SERVICE_STATUS =
   3071                 "SHOW_GTALK_SERVICE_STATUS";
   3072 
   3073         private static final Validator SHOW_GTALK_SERVICE_STATUS_VALIDATOR = sBooleanValidator;
   3074 
   3075         /**
   3076          * Name of activity to use for wallpaper on the home screen.
   3077          *
   3078          * @deprecated Use {@link WallpaperManager} instead.
   3079          */
   3080         @Deprecated
   3081         public static final String WALLPAPER_ACTIVITY = "wallpaper_activity";
   3082 
   3083         private static final Validator WALLPAPER_ACTIVITY_VALIDATOR = new Validator() {
   3084             private static final int MAX_LENGTH = 1000;
   3085 
   3086             @Override
   3087             public boolean validate(String value) {
   3088                 if (value != null && value.length() > MAX_LENGTH) {
   3089                     return false;
   3090                 }
   3091                 return ComponentName.unflattenFromString(value) != null;
   3092             }
   3093         };
   3094 
   3095         /**
   3096          * @deprecated Use {@link android.provider.Settings.Global#AUTO_TIME}
   3097          * instead
   3098          */
   3099         @Deprecated
   3100         public static final String AUTO_TIME = Global.AUTO_TIME;
   3101 
   3102         /**
   3103          * @deprecated Use {@link android.provider.Settings.Global#AUTO_TIME_ZONE}
   3104          * instead
   3105          */
   3106         @Deprecated
   3107         public static final String AUTO_TIME_ZONE = Global.AUTO_TIME_ZONE;
   3108 
   3109         /**
   3110          * Display times as 12 or 24 hours
   3111          *   12
   3112          *   24
   3113          */
   3114         public static final String TIME_12_24 = "time_12_24";
   3115 
   3116         /** @hide */
   3117         public static final Validator TIME_12_24_VALIDATOR =
   3118                 new DiscreteValueValidator(new String[] {"12", "24"});
   3119 
   3120         /**
   3121          * Date format string
   3122          *   mm/dd/yyyy
   3123          *   dd/mm/yyyy
   3124          *   yyyy/mm/dd
   3125          */
   3126         public static final String DATE_FORMAT = "date_format";
   3127 
   3128         /** @hide */
   3129         public static final Validator DATE_FORMAT_VALIDATOR = new Validator() {
   3130             @Override
   3131             public boolean validate(String value) {
   3132                 try {
   3133                     new SimpleDateFormat(value);
   3134                     return true;
   3135                 } catch (IllegalArgumentException e) {
   3136                     return false;
   3137                 }
   3138             }
   3139         };
   3140 
   3141         /**
   3142          * Whether the setup wizard has been run before (on first boot), or if
   3143          * it still needs to be run.
   3144          *
   3145          * nonzero = it has been run in the past
   3146          * 0 = it has not been run in the past
   3147          */
   3148         public static final String SETUP_WIZARD_HAS_RUN = "setup_wizard_has_run";
   3149 
   3150         /** @hide */
   3151         public static final Validator SETUP_WIZARD_HAS_RUN_VALIDATOR = sBooleanValidator;
   3152 
   3153         /**
   3154          * Scaling factor for normal window animations. Setting to 0 will disable window
   3155          * animations.
   3156          *
   3157          * @deprecated Use {@link Global#WINDOW_ANIMATION_SCALE} instead
   3158          */
   3159         @Deprecated
   3160         public static final String WINDOW_ANIMATION_SCALE = Global.WINDOW_ANIMATION_SCALE;
   3161 
   3162         /**
   3163          * Scaling factor for activity transition animations. Setting to 0 will disable window
   3164          * animations.
   3165          *
   3166          * @deprecated Use {@link Global#TRANSITION_ANIMATION_SCALE} instead
   3167          */
   3168         @Deprecated
   3169         public static final String TRANSITION_ANIMATION_SCALE = Global.TRANSITION_ANIMATION_SCALE;
   3170 
   3171         /**
   3172          * Scaling factor for Animator-based animations. This affects both the start delay and
   3173          * duration of all such animations. Setting to 0 will cause animations to end immediately.
   3174          * The default value is 1.
   3175          *
   3176          * @deprecated Use {@link Global#ANIMATOR_DURATION_SCALE} instead
   3177          */
   3178         @Deprecated
   3179         public static final String ANIMATOR_DURATION_SCALE = Global.ANIMATOR_DURATION_SCALE;
   3180 
   3181         /**
   3182          * Control whether the accelerometer will be used to change screen
   3183          * orientation.  If 0, it will not be used unless explicitly requested
   3184          * by the application; if 1, it will be used by default unless explicitly
   3185          * disabled by the application.
   3186          */
   3187         public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";
   3188 
   3189         /** @hide */
   3190         public static final Validator ACCELEROMETER_ROTATION_VALIDATOR = sBooleanValidator;
   3191 
   3192         /**
   3193          * Default screen rotation when no other policy applies.
   3194          * When {@link #ACCELEROMETER_ROTATION} is zero and no on-screen Activity expresses a
   3195          * preference, this rotation value will be used. Must be one of the
   3196          * {@link android.view.Surface#ROTATION_0 Surface rotation constants}.
   3197          *
   3198          * @see android.view.Display#getRotation
   3199          */
   3200         public static final String USER_ROTATION = "user_rotation";
   3201 
   3202         /** @hide */
   3203         public static final Validator USER_ROTATION_VALIDATOR =
   3204                 new InclusiveIntegerRangeValidator(0, 3);
   3205 
   3206         /**
   3207          * Control whether the rotation lock toggle in the System UI should be hidden.
   3208          * Typically this is done for accessibility purposes to make it harder for
   3209          * the user to accidentally toggle the rotation lock while the display rotation
   3210          * has been locked for accessibility.
   3211          *
   3212          * If 0, then rotation lock toggle is not hidden for accessibility (although it may be
   3213          * unavailable for other reasons).  If 1, then the rotation lock toggle is hidden.
   3214          *
   3215          * @hide
   3216          */
   3217         public static final String HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY =
   3218                 "hide_rotation_lock_toggle_for_accessibility";
   3219 
   3220         /** @hide */
   3221         public static final Validator HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY_VALIDATOR =
   3222                 sBooleanValidator;
   3223 
   3224         /**
   3225          * Whether the phone vibrates when it is ringing due to an incoming call. This will
   3226          * be used by Phone and Setting apps; it shouldn't affect other apps.
   3227          * The value is boolean (1 or 0).
   3228          *
   3229          * Note: this is not same as "vibrate on ring", which had been available until ICS.
   3230          * It was about AudioManager's setting and thus affected all the applications which
   3231          * relied on the setting, while this is purely about the vibration setting for incoming
   3232          * calls.
   3233          */
   3234         public static final String VIBRATE_WHEN_RINGING = "vibrate_when_ringing";
   3235 
   3236         /** @hide */
   3237         public static final Validator VIBRATE_WHEN_RINGING_VALIDATOR = sBooleanValidator;
   3238 
   3239         /**
   3240          * Whether the audible DTMF tones are played by the dialer when dialing. The value is
   3241          * boolean (1 or 0).
   3242          */
   3243         public static final String DTMF_TONE_WHEN_DIALING = "dtmf_tone";
   3244 
   3245         /** @hide */
   3246         public static final Validator DTMF_TONE_WHEN_DIALING_VALIDATOR = sBooleanValidator;
   3247 
   3248         /**
   3249          * CDMA only settings
   3250          * DTMF tone type played by the dialer when dialing.
   3251          *                 0 = Normal
   3252          *                 1 = Long
   3253          */
   3254         public static final String DTMF_TONE_TYPE_WHEN_DIALING = "dtmf_tone_type";
   3255 
   3256         /** @hide */
   3257         public static final Validator DTMF_TONE_TYPE_WHEN_DIALING_VALIDATOR = sBooleanValidator;
   3258 
   3259         /**
   3260          * Whether the hearing aid is enabled. The value is
   3261          * boolean (1 or 0).
   3262          * @hide
   3263          */
   3264         public static final String HEARING_AID = "hearing_aid";
   3265 
   3266         /** @hide */
   3267         public static final Validator HEARING_AID_VALIDATOR = sBooleanValidator;
   3268 
   3269         /**
   3270          * CDMA only settings
   3271          * TTY Mode
   3272          * 0 = OFF
   3273          * 1 = FULL
   3274          * 2 = VCO
   3275          * 3 = HCO
   3276          * @hide
   3277          */
   3278         public static final String TTY_MODE = "tty_mode";
   3279 
   3280         /** @hide */
   3281         public static final Validator TTY_MODE_VALIDATOR = new InclusiveIntegerRangeValidator(0, 3);
   3282 
   3283         /**
   3284          * Whether the sounds effects (key clicks, lid open ...) are enabled. The value is
   3285          * boolean (1 or 0).
   3286          */
   3287         public static final String SOUND_EFFECTS_ENABLED = "sound_effects_enabled";
   3288 
   3289         /** @hide */
   3290         public static final Validator SOUND_EFFECTS_ENABLED_VALIDATOR = sBooleanValidator;
   3291 
   3292         /**
   3293          * Whether the haptic feedback (long presses, ...) are enabled. The value is
   3294          * boolean (1 or 0).
   3295          */
   3296         public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
   3297 
   3298         /** @hide */
   3299         public static final Validator HAPTIC_FEEDBACK_ENABLED_VALIDATOR = sBooleanValidator;
   3300 
   3301         /**
   3302          * @deprecated Each application that shows web suggestions should have its own
   3303          * setting for this.
   3304          */
   3305         @Deprecated
   3306         public static final String SHOW_WEB_SUGGESTIONS = "show_web_suggestions";
   3307 
   3308         /** @hide */
   3309         public static final Validator SHOW_WEB_SUGGESTIONS_VALIDATOR = sBooleanValidator;
   3310 
   3311         /**
   3312          * Whether the notification LED should repeatedly flash when a notification is
   3313          * pending. The value is boolean (1 or 0).
   3314          * @hide
   3315          */
   3316         public static final String NOTIFICATION_LIGHT_PULSE = "notification_light_pulse";
   3317 
   3318         /** @hide */
   3319         public static final Validator NOTIFICATION_LIGHT_PULSE_VALIDATOR = sBooleanValidator;
   3320 
   3321         /**
   3322          * Show pointer location on screen?
   3323          * 0 = no
   3324          * 1 = yes
   3325          * @hide
   3326          */
   3327         public static final String POINTER_LOCATION = "pointer_location";
   3328 
   3329         /** @hide */
   3330         public static final Validator POINTER_LOCATION_VALIDATOR = sBooleanValidator;
   3331 
   3332         /**
   3333          * Show touch positions on screen?
   3334          * 0 = no
   3335          * 1 = yes
   3336          * @hide
   3337          */
   3338         public static final String SHOW_TOUCHES = "show_touches";
   3339 
   3340         /** @hide */
   3341         public static final Validator SHOW_TOUCHES_VALIDATOR = sBooleanValidator;
   3342 
   3343         /**
   3344          * Log raw orientation data from
   3345          * {@link com.android.server.policy.WindowOrientationListener} for use with the
   3346          * orientationplot.py tool.
   3347          * 0 = no
   3348          * 1 = yes
   3349          * @hide
   3350          */
   3351         public static final String WINDOW_ORIENTATION_LISTENER_LOG =
   3352                 "window_orientation_listener_log";
   3353 
   3354         /** @hide */
   3355         public static final Validator WINDOW_ORIENTATION_LISTENER_LOG_VALIDATOR = sBooleanValidator;
   3356 
   3357         /**
   3358          * @deprecated Use {@link android.provider.Settings.Global#POWER_SOUNDS_ENABLED}
   3359          * instead
   3360          * @hide
   3361          */
   3362         @Deprecated
   3363         public static final String POWER_SOUNDS_ENABLED = Global.POWER_SOUNDS_ENABLED;
   3364 
   3365         /**
   3366          * @deprecated Use {@link android.provider.Settings.Global#DOCK_SOUNDS_ENABLED}
   3367          * instead
   3368          * @hide
   3369          */
   3370         @Deprecated
   3371         public static final String DOCK_SOUNDS_ENABLED = Global.DOCK_SOUNDS_ENABLED;
   3372 
   3373         /**
   3374          * Whether to play sounds when the keyguard is shown and dismissed.
   3375          * @hide
   3376          */
   3377         public static final String LOCKSCREEN_SOUNDS_ENABLED = "lockscreen_sounds_enabled";
   3378 
   3379         /** @hide */
   3380         public static final Validator LOCKSCREEN_SOUNDS_ENABLED_VALIDATOR = sBooleanValidator;
   3381 
   3382         /**
   3383          * Whether the lockscreen should be completely disabled.
   3384          * @hide
   3385          */
   3386         public static final String LOCKSCREEN_DISABLED = "lockscreen.disabled";
   3387 
   3388         /** @hide */
   3389         public static final Validator LOCKSCREEN_DISABLED_VALIDATOR = sBooleanValidator;
   3390 
   3391         /**
   3392          * @deprecated Use {@link android.provider.Settings.Global#LOW_BATTERY_SOUND}
   3393          * instead
   3394          * @hide
   3395          */
   3396         @Deprecated
   3397         public static final String LOW_BATTERY_SOUND = Global.LOW_BATTERY_SOUND;
   3398 
   3399         /**
   3400          * @deprecated Use {@link android.provider.Settings.Global#DESK_DOCK_SOUND}
   3401          * instead
   3402          * @hide
   3403          */
   3404         @Deprecated
   3405         public static final String DESK_DOCK_SOUND = Global.DESK_DOCK_SOUND;
   3406 
   3407         /**
   3408          * @deprecated Use {@link android.provider.Settings.Global#DESK_UNDOCK_SOUND}
   3409          * instead
   3410          * @hide
   3411          */
   3412         @Deprecated
   3413         public static final String DESK_UNDOCK_SOUND = Global.DESK_UNDOCK_SOUND;
   3414 
   3415         /**
   3416          * @deprecated Use {@link android.provider.Settings.Global#CAR_DOCK_SOUND}
   3417          * instead
   3418          * @hide
   3419          */
   3420         @Deprecated
   3421         public static final String CAR_DOCK_SOUND = Global.CAR_DOCK_SOUND;
   3422 
   3423         /**
   3424          * @deprecated Use {@link android.provider.Settings.Global#CAR_UNDOCK_SOUND}
   3425          * instead
   3426          * @hide
   3427          */
   3428         @Deprecated
   3429         public static final String CAR_UNDOCK_SOUND = Global.CAR_UNDOCK_SOUND;
   3430 
   3431         /**
   3432          * @deprecated Use {@link android.provider.Settings.Global#LOCK_SOUND}
   3433          * instead
   3434          * @hide
   3435          */
   3436         @Deprecated
   3437         public static final String LOCK_SOUND = Global.LOCK_SOUND;
   3438 
   3439         /**
   3440          * @deprecated Use {@link android.provider.Settings.Global#UNLOCK_SOUND}
   3441          * instead
   3442          * @hide
   3443          */
   3444         @Deprecated
   3445         public static final String UNLOCK_SOUND = Global.UNLOCK_SOUND;
   3446 
   3447         /**
   3448          * Receive incoming SIP calls?
   3449          * 0 = no
   3450          * 1 = yes
   3451          * @hide
   3452          */
   3453         public static final String SIP_RECEIVE_CALLS = "sip_receive_calls";
   3454 
   3455         /** @hide */
   3456         public static final Validator SIP_RECEIVE_CALLS_VALIDATOR = sBooleanValidator;
   3457 
   3458         /**
   3459          * Call Preference String.
   3460          * "SIP_ALWAYS" : Always use SIP with network access
   3461          * "SIP_ADDRESS_ONLY" : Only if destination is a SIP address
   3462          * @hide
   3463          */
   3464         public static final String SIP_CALL_OPTIONS = "sip_call_options";
   3465 
   3466         /** @hide */
   3467         public static final Validator SIP_CALL_OPTIONS_VALIDATOR = new DiscreteValueValidator(
   3468                 new String[] {"SIP_ALWAYS", "SIP_ADDRESS_ONLY"});
   3469 
   3470         /**
   3471          * One of the sip call options: Always use SIP with network access.
   3472          * @hide
   3473          */
   3474         public static final String SIP_ALWAYS = "SIP_ALWAYS";
   3475 
   3476         /** @hide */
   3477         public static final Validator SIP_ALWAYS_VALIDATOR = sBooleanValidator;
   3478 
   3479         /**
   3480          * One of the sip call options: Only if destination is a SIP address.
   3481          * @hide
   3482          */
   3483         public static final String SIP_ADDRESS_ONLY = "SIP_ADDRESS_ONLY";
   3484 
   3485         /** @hide */
   3486         public static final Validator SIP_ADDRESS_ONLY_VALIDATOR = sBooleanValidator;
   3487 
   3488         /**
   3489          * @deprecated Use SIP_ALWAYS or SIP_ADDRESS_ONLY instead.  Formerly used to indicate that
   3490          * the user should be prompted each time a call is made whether it should be placed using
   3491          * SIP.  The {@link com.android.providers.settings.DatabaseHelper} replaces this with
   3492          * SIP_ADDRESS_ONLY.
   3493          * @hide
   3494          */
   3495         @Deprecated
   3496         public static final String SIP_ASK_ME_EACH_TIME = "SIP_ASK_ME_EACH_TIME";
   3497 
   3498         /** @hide */
   3499         public static final Validator SIP_ASK_ME_EACH_TIME_VALIDATOR = sBooleanValidator;
   3500 
   3501         /**
   3502          * Pointer speed setting.
   3503          * This is an integer value in a range between -7 and +7, so there are 15 possible values.
   3504          *   -7 = slowest
   3505          *    0 = default speed
   3506          *   +7 = fastest
   3507          * @hide
   3508          */
   3509         public static final String POINTER_SPEED = "pointer_speed";
   3510 
   3511         /** @hide */
   3512         public static final Validator POINTER_SPEED_VALIDATOR =
   3513                 new InclusiveFloatRangeValidator(-7, 7);
   3514 
   3515         /**
   3516          * Whether lock-to-app will be triggered by long-press on recents.
   3517          * @hide
   3518          */
   3519         public static final String LOCK_TO_APP_ENABLED = "lock_to_app_enabled";
   3520 
   3521         /** @hide */
   3522         public static final Validator LOCK_TO_APP_ENABLED_VALIDATOR = sBooleanValidator;
   3523 
   3524         /**
   3525          * I am the lolrus.
   3526          * <p>
   3527          * Nonzero values indicate that the user has a bukkit.
   3528          * Backward-compatible with <code>PrefGetPreference(prefAllowEasterEggs)</code>.
   3529          * @hide
   3530          */
   3531         public static final String EGG_MODE = "egg_mode";
   3532 
   3533         /** @hide */
   3534         public static final Validator EGG_MODE_VALIDATOR = new Validator() {
   3535             @Override
   3536             public boolean validate(String value) {
   3537                 try {
   3538                     return Long.parseLong(value) >= 0;
   3539                 } catch (NumberFormatException e) {
   3540                     return false;
   3541                 }
   3542             }
   3543         };
   3544 
   3545         /**
   3546          * IMPORTANT: If you add a new public settings you also have to add it to
   3547          * PUBLIC_SETTINGS below. If the new setting is hidden you have to add
   3548          * it to PRIVATE_SETTINGS below. Also add a validator that can validate
   3549          * the setting value. See an example above.
   3550          */
   3551 
   3552         /**
   3553          * Settings to backup. This is here so that it's in the same place as the settings
   3554          * keys and easy to update.
   3555          *
   3556          * NOTE: Settings are backed up and restored in the order they appear
   3557          *       in this array. If you have one setting depending on another,
   3558          *       make sure that they are ordered appropriately.
   3559          *
   3560          * @hide
   3561          */
   3562         public static final String[] SETTINGS_TO_BACKUP = {
   3563             STAY_ON_WHILE_PLUGGED_IN,   // moved to global
   3564             WIFI_USE_STATIC_IP,
   3565             WIFI_STATIC_IP,
   3566             WIFI_STATIC_GATEWAY,
   3567             WIFI_STATIC_NETMASK,
   3568             WIFI_STATIC_DNS1,
   3569             WIFI_STATIC_DNS2,
   3570             BLUETOOTH_DISCOVERABILITY,
   3571             BLUETOOTH_DISCOVERABILITY_TIMEOUT,
   3572             FONT_SCALE,
   3573             DIM_SCREEN,
   3574             SCREEN_OFF_TIMEOUT,
   3575             SCREEN_BRIGHTNESS,
   3576             SCREEN_BRIGHTNESS_MODE,
   3577             SCREEN_AUTO_BRIGHTNESS_ADJ,
   3578             VIBRATE_INPUT_DEVICES,
   3579             MODE_RINGER_STREAMS_AFFECTED,
   3580             TEXT_AUTO_REPLACE,
   3581             TEXT_AUTO_CAPS,
   3582             TEXT_AUTO_PUNCTUATE,
   3583             TEXT_SHOW_PASSWORD,
   3584             AUTO_TIME,                  // moved to global
   3585             AUTO_TIME_ZONE,             // moved to global
   3586             TIME_12_24,
   3587             DATE_FORMAT,
   3588             DTMF_TONE_WHEN_DIALING,
   3589             DTMF_TONE_TYPE_WHEN_DIALING,
   3590             HEARING_AID,
   3591             TTY_MODE,
   3592             MASTER_MONO,
   3593             SOUND_EFFECTS_ENABLED,
   3594             HAPTIC_FEEDBACK_ENABLED,
   3595             POWER_SOUNDS_ENABLED,       // moved to global
   3596             DOCK_SOUNDS_ENABLED,        // moved to global
   3597             LOCKSCREEN_SOUNDS_ENABLED,
   3598             SHOW_WEB_SUGGESTIONS,
   3599             SIP_CALL_OPTIONS,
   3600             SIP_RECEIVE_CALLS,
   3601             POINTER_SPEED,
   3602             VIBRATE_WHEN_RINGING,
   3603             RINGTONE,
   3604             LOCK_TO_APP_ENABLED,
   3605             NOTIFICATION_SOUND,
   3606             ACCELEROMETER_ROTATION
   3607         };
   3608 
   3609         /**
   3610          * These are all public system settings
   3611          *
   3612          * @hide
   3613          */
   3614         public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>();
   3615         static {
   3616             PUBLIC_SETTINGS.add(END_BUTTON_BEHAVIOR);
   3617             PUBLIC_SETTINGS.add(WIFI_USE_STATIC_IP);
   3618             PUBLIC_SETTINGS.add(WIFI_STATIC_IP);
   3619             PUBLIC_SETTINGS.add(WIFI_STATIC_GATEWAY);
   3620             PUBLIC_SETTINGS.add(WIFI_STATIC_NETMASK);
   3621             PUBLIC_SETTINGS.add(WIFI_STATIC_DNS1);
   3622             PUBLIC_SETTINGS.add(WIFI_STATIC_DNS2);
   3623             PUBLIC_SETTINGS.add(BLUETOOTH_DISCOVERABILITY);
   3624             PUBLIC_SETTINGS.add(BLUETOOTH_DISCOVERABILITY_TIMEOUT);
   3625             PUBLIC_SETTINGS.add(NEXT_ALARM_FORMATTED);
   3626             PUBLIC_SETTINGS.add(FONT_SCALE);
   3627             PUBLIC_SETTINGS.add(DIM_SCREEN);
   3628             PUBLIC_SETTINGS.add(SCREEN_OFF_TIMEOUT);
   3629             PUBLIC_SETTINGS.add(SCREEN_BRIGHTNESS);
   3630             PUBLIC_SETTINGS.add(SCREEN_BRIGHTNESS_MODE);
   3631             PUBLIC_SETTINGS.add(MODE_RINGER_STREAMS_AFFECTED);
   3632             PUBLIC_SETTINGS.add(MUTE_STREAMS_AFFECTED);
   3633             PUBLIC_SETTINGS.add(VIBRATE_ON);
   3634             PUBLIC_SETTINGS.add(VOLUME_RING);
   3635             PUBLIC_SETTINGS.add(VOLUME_SYSTEM);
   3636             PUBLIC_SETTINGS.add(VOLUME_VOICE);
   3637             PUBLIC_SETTINGS.add(VOLUME_MUSIC);
   3638             PUBLIC_SETTINGS.add(VOLUME_ALARM);
   3639             PUBLIC_SETTINGS.add(VOLUME_NOTIFICATION);
   3640             PUBLIC_SETTINGS.add(VOLUME_BLUETOOTH_SCO);
   3641             PUBLIC_SETTINGS.add(RINGTONE);
   3642             PUBLIC_SETTINGS.add(NOTIFICATION_SOUND);
   3643             PUBLIC_SETTINGS.add(ALARM_ALERT);
   3644             PUBLIC_SETTINGS.add(TEXT_AUTO_REPLACE);
   3645             PUBLIC_SETTINGS.add(TEXT_AUTO_CAPS);
   3646             PUBLIC_SETTINGS.add(TEXT_AUTO_PUNCTUATE);
   3647             PUBLIC_SETTINGS.add(TEXT_SHOW_PASSWORD);
   3648             PUBLIC_SETTINGS.add(SHOW_GTALK_SERVICE_STATUS);
   3649             PUBLIC_SETTINGS.add(WALLPAPER_ACTIVITY);
   3650             PUBLIC_SETTINGS.add(TIME_12_24);
   3651             PUBLIC_SETTINGS.add(DATE_FORMAT);
   3652             PUBLIC_SETTINGS.add(SETUP_WIZARD_HAS_RUN);
   3653             PUBLIC_SETTINGS.add(ACCELEROMETER_ROTATION);
   3654             PUBLIC_SETTINGS.add(USER_ROTATION);
   3655             PUBLIC_SETTINGS.add(DTMF_TONE_WHEN_DIALING);
   3656             PUBLIC_SETTINGS.add(SOUND_EFFECTS_ENABLED);
   3657             PUBLIC_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
   3658             PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);
   3659             PUBLIC_SETTINGS.add(VIBRATE_WHEN_RINGING);
   3660         }
   3661 
   3662         /**
   3663          * These are all hidden system settings.
   3664          *
   3665          * @hide
   3666          */
   3667         public static final Set<String> PRIVATE_SETTINGS = new ArraySet<>();
   3668         static {
   3669             PRIVATE_SETTINGS.add(WIFI_USE_STATIC_IP);
   3670             PRIVATE_SETTINGS.add(END_BUTTON_BEHAVIOR);
   3671             PRIVATE_SETTINGS.add(ADVANCED_SETTINGS);
   3672             PRIVATE_SETTINGS.add(SCREEN_AUTO_BRIGHTNESS_ADJ);
   3673             PRIVATE_SETTINGS.add(VIBRATE_INPUT_DEVICES);
   3674             PRIVATE_SETTINGS.add(VOLUME_MASTER);
   3675             PRIVATE_SETTINGS.add(MASTER_MONO);
   3676             PRIVATE_SETTINGS.add(NOTIFICATIONS_USE_RING_VOLUME);
   3677             PRIVATE_SETTINGS.add(VIBRATE_IN_SILENT);
   3678             PRIVATE_SETTINGS.add(MEDIA_BUTTON_RECEIVER);
   3679             PRIVATE_SETTINGS.add(HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY);
   3680             PRIVATE_SETTINGS.add(DTMF_TONE_TYPE_WHEN_DIALING);
   3681             PRIVATE_SETTINGS.add(HEARING_AID);
   3682             PRIVATE_SETTINGS.add(TTY_MODE);
   3683             PRIVATE_SETTINGS.add(NOTIFICATION_LIGHT_PULSE);
   3684             PRIVATE_SETTINGS.add(POINTER_LOCATION);
   3685             PRIVATE_SETTINGS.add(SHOW_TOUCHES);
   3686             PRIVATE_SETTINGS.add(WINDOW_ORIENTATION_LISTENER_LOG);
   3687             PRIVATE_SETTINGS.add(POWER_SOUNDS_ENABLED);
   3688             PRIVATE_SETTINGS.add(DOCK_SOUNDS_ENABLED);
   3689             PRIVATE_SETTINGS.add(LOCKSCREEN_SOUNDS_ENABLED);
   3690             PRIVATE_SETTINGS.add(LOCKSCREEN_DISABLED);
   3691             PRIVATE_SETTINGS.add(LOW_BATTERY_SOUND);
   3692             PRIVATE_SETTINGS.add(DESK_DOCK_SOUND);
   3693             PRIVATE_SETTINGS.add(DESK_UNDOCK_SOUND);
   3694             PRIVATE_SETTINGS.add(CAR_DOCK_SOUND);
   3695             PRIVATE_SETTINGS.add(CAR_UNDOCK_SOUND);
   3696             PRIVATE_SETTINGS.add(LOCK_SOUND);
   3697             PRIVATE_SETTINGS.add(UNLOCK_SOUND);
   3698             PRIVATE_SETTINGS.add(SIP_RECEIVE_CALLS);
   3699             PRIVATE_SETTINGS.add(SIP_CALL_OPTIONS);
   3700             PRIVATE_SETTINGS.add(SIP_ALWAYS);
   3701             PRIVATE_SETTINGS.add(SIP_ADDRESS_ONLY);
   3702             PRIVATE_SETTINGS.add(SIP_ASK_ME_EACH_TIME);
   3703             PRIVATE_SETTINGS.add(POINTER_SPEED);
   3704             PRIVATE_SETTINGS.add(LOCK_TO_APP_ENABLED);
   3705             PRIVATE_SETTINGS.add(EGG_MODE);
   3706         }
   3707 
   3708         /**
   3709          * These are all public system settings
   3710          *
   3711          * @hide
   3712          */
   3713         public static final Map<String, Validator> VALIDATORS = new ArrayMap<>();
   3714         static {
   3715             VALIDATORS.put(END_BUTTON_BEHAVIOR,END_BUTTON_BEHAVIOR_VALIDATOR);
   3716             VALIDATORS.put(WIFI_USE_STATIC_IP, WIFI_USE_STATIC_IP_VALIDATOR);
   3717             VALIDATORS.put(BLUETOOTH_DISCOVERABILITY, BLUETOOTH_DISCOVERABILITY_VALIDATOR);
   3718             VALIDATORS.put(BLUETOOTH_DISCOVERABILITY_TIMEOUT,
   3719                     BLUETOOTH_DISCOVERABILITY_TIMEOUT_VALIDATOR);
   3720             VALIDATORS.put(NEXT_ALARM_FORMATTED, NEXT_ALARM_FORMATTED_VALIDATOR);
   3721             VALIDATORS.put(FONT_SCALE, FONT_SCALE_VALIDATOR);
   3722             VALIDATORS.put(DIM_SCREEN, DIM_SCREEN_VALIDATOR);
   3723             VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR);
   3724             VALIDATORS.put(SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_VALIDATOR);
   3725             VALIDATORS.put(SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_VALIDATOR);
   3726             VALIDATORS.put(MODE_RINGER_STREAMS_AFFECTED, MODE_RINGER_STREAMS_AFFECTED_VALIDATOR);
   3727             VALIDATORS.put(MUTE_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED_VALIDATOR);
   3728             VALIDATORS.put(VIBRATE_ON, VIBRATE_ON_VALIDATOR);
   3729             VALIDATORS.put(RINGTONE, RINGTONE_VALIDATOR);
   3730             VALIDATORS.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_VALIDATOR);
   3731             VALIDATORS.put(ALARM_ALERT, ALARM_ALERT_VALIDATOR);
   3732             VALIDATORS.put(TEXT_AUTO_REPLACE, TEXT_AUTO_REPLACE_VALIDATOR);
   3733             VALIDATORS.put(TEXT_AUTO_CAPS, TEXT_AUTO_CAPS_VALIDATOR);
   3734             VALIDATORS.put(TEXT_AUTO_PUNCTUATE, TEXT_AUTO_PUNCTUATE_VALIDATOR);
   3735             VALIDATORS.put(TEXT_SHOW_PASSWORD, TEXT_SHOW_PASSWORD_VALIDATOR);
   3736             VALIDATORS.put(SHOW_GTALK_SERVICE_STATUS, SHOW_GTALK_SERVICE_STATUS_VALIDATOR);
   3737             VALIDATORS.put(WALLPAPER_ACTIVITY, WALLPAPER_ACTIVITY_VALIDATOR);
   3738             VALIDATORS.put(TIME_12_24, TIME_12_24_VALIDATOR);
   3739             VALIDATORS.put(DATE_FORMAT, DATE_FORMAT_VALIDATOR);
   3740             VALIDATORS.put(SETUP_WIZARD_HAS_RUN, SETUP_WIZARD_HAS_RUN_VALIDATOR);
   3741             VALIDATORS.put(ACCELEROMETER_ROTATION, ACCELEROMETER_ROTATION_VALIDATOR);
   3742             VALIDATORS.put(USER_ROTATION, USER_ROTATION_VALIDATOR);
   3743             VALIDATORS.put(DTMF_TONE_WHEN_DIALING, DTMF_TONE_WHEN_DIALING_VALIDATOR);
   3744             VALIDATORS.put(SOUND_EFFECTS_ENABLED, SOUND_EFFECTS_ENABLED_VALIDATOR);
   3745             VALIDATORS.put(HAPTIC_FEEDBACK_ENABLED, HAPTIC_FEEDBACK_ENABLED_VALIDATOR);
   3746             VALIDATORS.put(SHOW_WEB_SUGGESTIONS, SHOW_WEB_SUGGESTIONS_VALIDATOR);
   3747             VALIDATORS.put(WIFI_USE_STATIC_IP, WIFI_USE_STATIC_IP_VALIDATOR);
   3748             VALIDATORS.put(END_BUTTON_BEHAVIOR, END_BUTTON_BEHAVIOR_VALIDATOR);
   3749             VALIDATORS.put(ADVANCED_SETTINGS, ADVANCED_SETTINGS_VALIDATOR);
   3750             VALIDATORS.put(SCREEN_AUTO_BRIGHTNESS_ADJ, SCREEN_AUTO_BRIGHTNESS_ADJ_VALIDATOR);
   3751             VALIDATORS.put(VIBRATE_INPUT_DEVICES, VIBRATE_INPUT_DEVICES_VALIDATOR);
   3752             VALIDATORS.put(MASTER_MONO, MASTER_MONO_VALIDATOR);
   3753             VALIDATORS.put(NOTIFICATIONS_USE_RING_VOLUME, NOTIFICATIONS_USE_RING_VOLUME_VALIDATOR);
   3754             VALIDATORS.put(VIBRATE_IN_SILENT, VIBRATE_IN_SILENT_VALIDATOR);
   3755             VALIDATORS.put(MEDIA_BUTTON_RECEIVER, MEDIA_BUTTON_RECEIVER_VALIDATOR);
   3756             VALIDATORS.put(HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY,
   3757                     HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY_VALIDATOR);
   3758             VALIDATORS.put(VIBRATE_WHEN_RINGING, VIBRATE_WHEN_RINGING_VALIDATOR);
   3759             VALIDATORS.put(DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_WHEN_DIALING_VALIDATOR);
   3760             VALIDATORS.put(HEARING_AID, HEARING_AID_VALIDATOR);
   3761             VALIDATORS.put(TTY_MODE, TTY_MODE_VALIDATOR);
   3762             VALIDATORS.put(NOTIFICATION_LIGHT_PULSE, NOTIFICATION_LIGHT_PULSE_VALIDATOR);
   3763             VALIDATORS.put(POINTER_LOCATION, POINTER_LOCATION_VALIDATOR);
   3764             VALIDATORS.put(SHOW_TOUCHES, SHOW_TOUCHES_VALIDATOR);
   3765             VALIDATORS.put(WINDOW_ORIENTATION_LISTENER_LOG,
   3766                     WINDOW_ORIENTATION_LISTENER_LOG_VALIDATOR);
   3767             VALIDATORS.put(LOCKSCREEN_SOUNDS_ENABLED, LOCKSCREEN_SOUNDS_ENABLED_VALIDATOR);
   3768             VALIDATORS.put(LOCKSCREEN_DISABLED, LOCKSCREEN_DISABLED_VALIDATOR);
   3769             VALIDATORS.put(SIP_RECEIVE_CALLS, SIP_RECEIVE_CALLS_VALIDATOR);
   3770             VALIDATORS.put(SIP_CALL_OPTIONS, SIP_CALL_OPTIONS_VALIDATOR);
   3771             VALIDATORS.put(SIP_ALWAYS, SIP_ALWAYS_VALIDATOR);
   3772             VALIDATORS.put(SIP_ADDRESS_ONLY, SIP_ADDRESS_ONLY_VALIDATOR);
   3773             VALIDATORS.put(SIP_ASK_ME_EACH_TIME, SIP_ASK_ME_EACH_TIME_VALIDATOR);
   3774             VALIDATORS.put(POINTER_SPEED, POINTER_SPEED_VALIDATOR);
   3775             VALIDATORS.put(LOCK_TO_APP_ENABLED, LOCK_TO_APP_ENABLED_VALIDATOR);
   3776             VALIDATORS.put(EGG_MODE, EGG_MODE_VALIDATOR);
   3777             VALIDATORS.put(WIFI_STATIC_IP, WIFI_STATIC_IP_VALIDATOR);
   3778             VALIDATORS.put(WIFI_STATIC_GATEWAY, WIFI_STATIC_GATEWAY_VALIDATOR);
   3779             VALIDATORS.put(WIFI_STATIC_NETMASK, WIFI_STATIC_NETMASK_VALIDATOR);
   3780             VALIDATORS.put(WIFI_STATIC_DNS1, WIFI_STATIC_DNS1_VALIDATOR);
   3781             VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_VALIDATOR);
   3782         }
   3783 
   3784         /**
   3785          * These entries are considered common between the personal and the managed profile,
   3786          * since the managed profile doesn't get to change them.
   3787          */
   3788         private static final Set<String> CLONE_TO_MANAGED_PROFILE = new ArraySet<>();
   3789         static {
   3790             CLONE_TO_MANAGED_PROFILE.add(DATE_FORMAT);
   3791             CLONE_TO_MANAGED_PROFILE.add(HAPTIC_FEEDBACK_ENABLED);
   3792             CLONE_TO_MANAGED_PROFILE.add(SOUND_EFFECTS_ENABLED);
   3793             CLONE_TO_MANAGED_PROFILE.add(TEXT_SHOW_PASSWORD);
   3794             CLONE_TO_MANAGED_PROFILE.add(TIME_12_24);
   3795         }
   3796 
   3797         /** @hide */
   3798         public static void getCloneToManagedProfileSettings(Set<String> outKeySet) {
   3799             outKeySet.addAll(CLONE_TO_MANAGED_PROFILE);
   3800         }
   3801 
   3802         /**
   3803          * When to use Wi-Fi calling
   3804          *
   3805          * @see android.telephony.TelephonyManager.WifiCallingChoices
   3806          * @hide
   3807          */
   3808         public static final String WHEN_TO_MAKE_WIFI_CALLS = "when_to_make_wifi_calls";
   3809 
   3810         // Settings moved to Settings.Secure
   3811 
   3812         /**
   3813          * @deprecated Use {@link android.provider.Settings.Global#ADB_ENABLED}
   3814          * instead
   3815          */
   3816         @Deprecated
   3817         public static final String ADB_ENABLED = Global.ADB_ENABLED;
   3818 
   3819         /**
   3820          * @deprecated Use {@link android.provider.Settings.Secure#ANDROID_ID} instead
   3821          */
   3822         @Deprecated
   3823         public static final String ANDROID_ID = Secure.ANDROID_ID;
   3824 
   3825         /**
   3826          * @deprecated Use {@link android.provider.Settings.Global#BLUETOOTH_ON} instead
   3827          */
   3828         @Deprecated
   3829         public static final String BLUETOOTH_ON = Global.BLUETOOTH_ON;
   3830 
   3831         /**
   3832          * @deprecated Use {@link android.provider.Settings.Global#DATA_ROAMING} instead
   3833          */
   3834         @Deprecated
   3835         public static final String DATA_ROAMING = Global.DATA_ROAMING;
   3836 
   3837         /**
   3838          * @deprecated Use {@link android.provider.Settings.Global#DEVICE_PROVISIONED} instead
   3839          */
   3840         @Deprecated
   3841         public static final String DEVICE_PROVISIONED = Global.DEVICE_PROVISIONED;
   3842 
   3843         /**
   3844          * @deprecated Use {@link android.provider.Settings.Global#HTTP_PROXY} instead
   3845          */
   3846         @Deprecated
   3847         public static final String HTTP_PROXY = Global.HTTP_PROXY;
   3848 
   3849         /**
   3850          * @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
   3851          */
   3852         @Deprecated
   3853         public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
   3854 
   3855         /**
   3856          * @deprecated Use {@link android.provider.Settings.Secure#LOCATION_PROVIDERS_ALLOWED}
   3857          * instead
   3858          */
   3859         @Deprecated
   3860         public static final String LOCATION_PROVIDERS_ALLOWED = Secure.LOCATION_PROVIDERS_ALLOWED;
   3861 
   3862         /**
   3863          * @deprecated Use {@link android.provider.Settings.Secure#LOGGING_ID} instead
   3864          */
   3865         @Deprecated
   3866         public static final String LOGGING_ID = Secure.LOGGING_ID;
   3867 
   3868         /**
   3869          * @deprecated Use {@link android.provider.Settings.Global#NETWORK_PREFERENCE} instead
   3870          */
   3871         @Deprecated
   3872         public static final String NETWORK_PREFERENCE = Global.NETWORK_PREFERENCE;
   3873 
   3874         /**
   3875          * @deprecated Use {@link android.provider.Settings.Secure#PARENTAL_CONTROL_ENABLED}
   3876          * instead
   3877          */
   3878         @Deprecated
   3879         public static final String PARENTAL_CONTROL_ENABLED = Secure.PARENTAL_CONTROL_ENABLED;
   3880 
   3881         /**
   3882          * @deprecated Use {@link android.provider.Settings.Secure#PARENTAL_CONTROL_LAST_UPDATE}
   3883          * instead
   3884          */
   3885         @Deprecated
   3886         public static final String PARENTAL_CONTROL_LAST_UPDATE = Secure.PARENTAL_CONTROL_LAST_UPDATE;
   3887 
   3888         /**
   3889          * @deprecated Use {@link android.provider.Settings.Secure#PARENTAL_CONTROL_REDIRECT_URL}
   3890          * instead
   3891          */
   3892         @Deprecated
   3893         public static final String PARENTAL_CONTROL_REDIRECT_URL =
   3894             Secure.PARENTAL_CONTROL_REDIRECT_URL;
   3895 
   3896         /**
   3897          * @deprecated Use {@link android.provider.Settings.Secure#SETTINGS_CLASSNAME} instead
   3898          */
   3899         @Deprecated
   3900         public static final String SETTINGS_CLASSNAME = Secure.SETTINGS_CLASSNAME;
   3901 
   3902         /**
   3903          * @deprecated Use {@link android.provider.Settings.Global#USB_MASS_STORAGE_ENABLED} instead
   3904          */
   3905         @Deprecated
   3906         public static final String USB_MASS_STORAGE_ENABLED = Global.USB_MASS_STORAGE_ENABLED;
   3907 
   3908         /**
   3909          * @deprecated Use {@link android.provider.Settings.Global#USE_GOOGLE_MAIL} instead
   3910          */
   3911         @Deprecated
   3912         public static final String USE_GOOGLE_MAIL = Global.USE_GOOGLE_MAIL;
   3913 
   3914        /**
   3915          * @deprecated Use
   3916          * {@link android.provider.Settings.Global#WIFI_MAX_DHCP_RETRY_COUNT} instead
   3917          */
   3918         @Deprecated
   3919         public static final String WIFI_MAX_DHCP_RETRY_COUNT = Global.WIFI_MAX_DHCP_RETRY_COUNT;
   3920 
   3921         /**
   3922          * @deprecated Use
   3923          * {@link android.provider.Settings.Global#WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS} instead
   3924          */
   3925         @Deprecated
   3926         public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
   3927                 Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS;
   3928 
   3929         /**
   3930          * @deprecated Use
   3931          * {@link android.provider.Settings.Global#WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON} instead
   3932          */
   3933         @Deprecated
   3934         public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
   3935                 Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON;
   3936 
   3937         /**
   3938          * @deprecated Use
   3939          * {@link android.provider.Settings.Global#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY} instead
   3940          */
   3941         @Deprecated
   3942         public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
   3943                 Global.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY;
   3944 
   3945         /**
   3946          * @deprecated Use {@link android.provider.Settings.Global#WIFI_NUM_OPEN_NETWORKS_KEPT}
   3947          * instead
   3948          */
   3949         @Deprecated
   3950         public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = Global.WIFI_NUM_OPEN_NETWORKS_KEPT;
   3951 
   3952         /**
   3953          * @deprecated Use {@link android.provider.Settings.Global#WIFI_ON} instead
   3954          */
   3955         @Deprecated
   3956         public static final String WIFI_ON = Global.WIFI_ON;
   3957 
   3958         /**
   3959          * @deprecated Use
   3960          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE}
   3961          * instead
   3962          */
   3963         @Deprecated
   3964         public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE =
   3965                 Secure.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE;
   3966 
   3967         /**
   3968          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_AP_COUNT} instead
   3969          */
   3970         @Deprecated
   3971         public static final String WIFI_WATCHDOG_AP_COUNT = Secure.WIFI_WATCHDOG_AP_COUNT;
   3972 
   3973         /**
   3974          * @deprecated Use
   3975          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS} instead
   3976          */
   3977         @Deprecated
   3978         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
   3979                 Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS;
   3980 
   3981         /**
   3982          * @deprecated Use
   3983          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED} instead
   3984          */
   3985         @Deprecated
   3986         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED =
   3987                 Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED;
   3988 
   3989         /**
   3990          * @deprecated Use
   3991          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS}
   3992          * instead
   3993          */
   3994         @Deprecated
   3995         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS =
   3996                 Secure.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS;
   3997 
   3998         /**
   3999          * @deprecated Use
   4000          * {@link android.provider.Settings.Secure#WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT} instead
   4001          */
   4002         @Deprecated
   4003         public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT =
   4004             Secure.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT;
   4005 
   4006         /**
   4007          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_MAX_AP_CHECKS}
   4008          * instead
   4009          */
   4010         @Deprecated
   4011         public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = Secure.WIFI_WATCHDOG_MAX_AP_CHECKS;
   4012 
   4013         /**
   4014          * @deprecated Use {@link android.provider.Settings.Global#WIFI_WATCHDOG_ON} instead
   4015          */
   4016         @Deprecated
   4017         public static final String WIFI_WATCHDOG_ON = Global.WIFI_WATCHDOG_ON;
   4018 
   4019         /**
   4020          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_COUNT} instead
   4021          */
   4022         @Deprecated
   4023         public static final String WIFI_WATCHDOG_PING_COUNT = Secure.WIFI_WATCHDOG_PING_COUNT;
   4024 
   4025         /**
   4026          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_DELAY_MS}
   4027          * instead
   4028          */
   4029         @Deprecated
   4030         public static final String WIFI_WATCHDOG_PING_DELAY_MS = Secure.WIFI_WATCHDOG_PING_DELAY_MS;
   4031 
   4032         /**
   4033          * @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_TIMEOUT_MS}
   4034          * instead
   4035          */
   4036         @Deprecated
   4037         public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS =
   4038             Secure.WIFI_WATCHDOG_PING_TIMEOUT_MS;
   4039 
   4040         /**
   4041          * Checks if the specified app can modify system settings. As of API
   4042          * level 23, an app cannot modify system settings unless it declares the
   4043          * {@link android.Manifest.permission#WRITE_SETTINGS}
   4044          * permission in its manifest, <em>and</em> the user specifically grants
   4045          * the app this capability. To prompt the user to grant this approval,
   4046          * the app must send an intent with the action {@link
   4047          * android.provider.Settings#ACTION_MANAGE_WRITE_SETTINGS}, which causes
   4048          * the system to display a permission management screen.
   4049          *
   4050          * @param context App context.
   4051          * @return true if the calling app can write to system settings, false otherwise
   4052          */
   4053         public static boolean canWrite(Context context) {
   4054             return isCallingPackageAllowedToWriteSettings(context, Process.myUid(),
   4055                     context.getOpPackageName(), false);
   4056         }
   4057     }
   4058 
   4059     /**
   4060      * Secure system settings, containing system preferences that applications
   4061      * can read but are not allowed to write.  These are for preferences that
   4062      * the user must explicitly modify through the system UI or specialized
   4063      * APIs for those values, not modified directly by applications.
   4064      */
   4065     public static final class Secure extends NameValueTable {
   4066         /**
   4067          * The content:// style URL for this table
   4068          */
   4069         public static final Uri CONTENT_URI =
   4070             Uri.parse("content://" + AUTHORITY + "/secure");
   4071 
   4072         // Populated lazily, guarded by class object:
   4073         private static final NameValueCache sNameValueCache = new NameValueCache(
   4074                 CONTENT_URI,
   4075                 CALL_METHOD_GET_SECURE,
   4076                 CALL_METHOD_PUT_SECURE);
   4077 
   4078         private static ILockSettings sLockSettings = null;
   4079 
   4080         private static boolean sIsSystemProcess;
   4081         private static final HashSet<String> MOVED_TO_LOCK_SETTINGS;
   4082         private static final HashSet<String> MOVED_TO_GLOBAL;
   4083         static {
   4084             MOVED_TO_LOCK_SETTINGS = new HashSet<String>(3);
   4085             MOVED_TO_LOCK_SETTINGS.add(Secure.LOCK_PATTERN_ENABLED);
   4086             MOVED_TO_LOCK_SETTINGS.add(Secure.LOCK_PATTERN_VISIBLE);
   4087             MOVED_TO_LOCK_SETTINGS.add(Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED);
   4088 
   4089             MOVED_TO_GLOBAL = new HashSet<String>();
   4090             MOVED_TO_GLOBAL.add(Settings.Global.ADB_ENABLED);
   4091             MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_ENABLED);
   4092             MOVED_TO_GLOBAL.add(Settings.Global.BLUETOOTH_ON);
   4093             MOVED_TO_GLOBAL.add(Settings.Global.BUGREPORT_IN_POWER_MENU);
   4094             MOVED_TO_GLOBAL.add(Settings.Global.CDMA_CELL_BROADCAST_SMS);
   4095             MOVED_TO_GLOBAL.add(Settings.Global.CDMA_ROAMING_MODE);
   4096             MOVED_TO_GLOBAL.add(Settings.Global.CDMA_SUBSCRIPTION_MODE);
   4097             MOVED_TO_GLOBAL.add(Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE);
   4098             MOVED_TO_GLOBAL.add(Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI);
   4099             MOVED_TO_GLOBAL.add(Settings.Global.DATA_ROAMING);
   4100             MOVED_TO_GLOBAL.add(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED);
   4101             MOVED_TO_GLOBAL.add(Settings.Global.DEVICE_PROVISIONED);
   4102             MOVED_TO_GLOBAL.add(Settings.Global.DISPLAY_SIZE_FORCED);
   4103             MOVED_TO_GLOBAL.add(Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE);
   4104             MOVED_TO_GLOBAL.add(Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE);
   4105             MOVED_TO_GLOBAL.add(Settings.Global.MOBILE_DATA);
   4106             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_BUCKET_DURATION);
   4107             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_DELETE_AGE);
   4108             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_PERSIST_BYTES);
   4109             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_ROTATE_AGE);
   4110             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_ENABLED);
   4111             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_GLOBAL_ALERT_BYTES);
   4112             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_POLL_INTERVAL);
   4113             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_SAMPLE_ENABLED);
   4114             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_TIME_CACHE_MAX_AGE);
   4115             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_BUCKET_DURATION);
   4116             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_DELETE_AGE);
   4117             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_PERSIST_BYTES);
   4118             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_ROTATE_AGE);
   4119             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_BUCKET_DURATION);
   4120             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_DELETE_AGE);
   4121             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES);
   4122             MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE);
   4123             MOVED_TO_GLOBAL.add(Settings.Global.NETWORK_PREFERENCE);
   4124             MOVED_TO_GLOBAL.add(Settings.Global.NITZ_UPDATE_DIFF);
   4125             MOVED_TO_GLOBAL.add(Settings.Global.NITZ_UPDATE_SPACING);
   4126             MOVED_TO_GLOBAL.add(Settings.Global.NTP_SERVER);
   4127             MOVED_TO_GLOBAL.add(Settings.Global.NTP_TIMEOUT);
   4128             MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_ERROR_POLL_COUNT);
   4129             MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS);
   4130             MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT);
   4131             MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_POLL_INTERVAL_MS);
   4132             MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_TRIGGER_PACKET_COUNT);
   4133             MOVED_TO_GLOBAL.add(Settings.Global.SAMPLING_PROFILER_MS);
   4134             MOVED_TO_GLOBAL.add(Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
   4135             MOVED_TO_GLOBAL.add(Settings.Global.SETUP_PREPAID_DETECTION_REDIR_HOST);
   4136             MOVED_TO_GLOBAL.add(Settings.Global.SETUP_PREPAID_DETECTION_TARGET_URL);
   4137             MOVED_TO_GLOBAL.add(Settings.Global.TETHER_DUN_APN);
   4138             MOVED_TO_GLOBAL.add(Settings.Global.TETHER_DUN_REQUIRED);
   4139             MOVED_TO_GLOBAL.add(Settings.Global.TETHER_SUPPORTED);
   4140             MOVED_TO_GLOBAL.add(Settings.Global.USB_MASS_STORAGE_ENABLED);
   4141             MOVED_TO_GLOBAL.add(Settings.Global.USE_GOOGLE_MAIL);
   4142             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_COUNTRY_CODE);
   4143             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_FRAMEWORK_SCAN_INTERVAL_MS);
   4144             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_FREQUENCY_BAND);
   4145             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_IDLE_MS);
   4146             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT);
   4147             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS);
   4148             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON);
   4149             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY);
   4150             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NUM_OPEN_NETWORKS_KEPT);
   4151             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_ON);
   4152             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_P2P_DEVICE_NAME);
   4153             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SAVED_STATE);
   4154             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS);
   4155             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED);
   4156             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED);
   4157             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_ENHANCED_AUTO_JOIN);
   4158             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORK_SHOW_RSSI);
   4159             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_WATCHDOG_ON);
   4160             MOVED_TO_GLOBAL.add(Settings.Global.WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED);
   4161             MOVED_TO_GLOBAL.add(Settings.Global.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON);
   4162             MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_ENABLE);
   4163             MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_TIMEOUT);
   4164             MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE);
   4165             MOVED_TO_GLOBAL.add(Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS);
   4166             MOVED_TO_GLOBAL.add(Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS);
   4167             MOVED_TO_GLOBAL.add(Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS);
   4168             MOVED_TO_GLOBAL.add(Settings.Global.WTF_IS_FATAL);
   4169             MOVED_TO_GLOBAL.add(Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD);
   4170             MOVED_TO_GLOBAL.add(Settings.Global.BATTERY_DISCHARGE_THRESHOLD);
   4171             MOVED_TO_GLOBAL.add(Settings.Global.SEND_ACTION_APP_ERROR);
   4172             MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_AGE_SECONDS);
   4173             MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_MAX_FILES);
   4174             MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_QUOTA_KB);
   4175             MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_QUOTA_PERCENT);
   4176             MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_RESERVE_PERCENT);
   4177             MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_TAG_PREFIX);
   4178             MOVED_TO_GLOBAL.add(Settings.Global.ERROR_LOGCAT_PREFIX);
   4179             MOVED_TO_GLOBAL.add(Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL);
   4180             MOVED_TO_GLOBAL.add(Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD);
   4181             MOVED_TO_GLOBAL.add(Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE);
   4182             MOVED_TO_GLOBAL.add(Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES);
   4183             MOVED_TO_GLOBAL.add(Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES);
   4184             MOVED_TO_GLOBAL.add(Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS);
   4185             MOVED_TO_GLOBAL.add(Settings.Global.CONNECTIVITY_CHANGE_DELAY);
   4186             MOVED_TO_GLOBAL.add(Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED);
   4187             MOVED_TO_GLOBAL.add(Settings.Global.CAPTIVE_PORTAL_SERVER);
   4188             MOVED_TO_GLOBAL.add(Settings.Global.NSD_ON);
   4189             MOVED_TO_GLOBAL.add(Settings.Global.SET_INSTALL_LOCATION);
   4190             MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_INSTALL_LOCATION);
   4191             MOVED_TO_GLOBAL.add(Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY);
   4192             MOVED_TO_GLOBAL.add(Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY);
   4193             MOVED_TO_GLOBAL.add(Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT);
   4194             MOVED_TO_GLOBAL.add(Settings.Global.HTTP_PROXY);
   4195             MOVED_TO_GLOBAL.add(Settings.Global.GLOBAL_HTTP_PROXY_HOST);
   4196             MOVED_TO_GLOBAL.add(Settings.Global.GLOBAL_HTTP_PROXY_PORT);
   4197             MOVED_TO_GLOBAL.add(Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST);
   4198             MOVED_TO_GLOBAL.add(Settings.Global.SET_GLOBAL_HTTP_PROXY);
   4199             MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_DNS_SERVER);
   4200             MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_NETWORK_MODE);
   4201             MOVED_TO_GLOBAL.add(Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY);
   4202         }
   4203 
   4204         /** @hide */
   4205         public static void getMovedToGlobalSettings(Set<String> outKeySet) {
   4206             outKeySet.addAll(MOVED_TO_GLOBAL);
   4207         }
   4208 
   4209         /**
   4210          * Look up a name in the database.
   4211          * @param resolver to access the database with
   4212          * @param name to look up in the table
   4213          * @return the corresponding value, or null if not present
   4214          */
   4215         public static String getString(ContentResolver resolver, String name) {
   4216             return getStringForUser(resolver, name, UserHandle.myUserId());
   4217         }
   4218 
   4219         /** @hide */
   4220         public static String getStringForUser(ContentResolver resolver, String name,
   4221                 int userHandle) {
   4222             if (MOVED_TO_GLOBAL.contains(name)) {
   4223                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
   4224                         + " to android.provider.Settings.Global.");
   4225                 return Global.getStringForUser(resolver, name, userHandle);
   4226             }
   4227 
   4228             if (MOVED_TO_LOCK_SETTINGS.contains(name)) {
   4229                 synchronized (Secure.class) {
   4230                     if (sLockSettings == null) {
   4231                         sLockSettings = ILockSettings.Stub.asInterface(
   4232                                 (IBinder) ServiceManager.getService("lock_settings"));
   4233                         sIsSystemProcess = Process.myUid() == Process.SYSTEM_UID;
   4234                     }
   4235                 }
   4236                 if (sLockSettings != null && !sIsSystemProcess) {
   4237                     // No context; use the ActivityThread's context as an approximation for
   4238                     // determining the target API level.
   4239                     Application application = ActivityThread.currentApplication();
   4240 
   4241                     boolean isPreMnc = application != null
   4242                             && application.getApplicationInfo() != null
   4243                             && application.getApplicationInfo().targetSdkVersion
   4244                             <= VERSION_CODES.LOLLIPOP_MR1;
   4245                     if (isPreMnc) {
   4246                         try {
   4247                             return sLockSettings.getString(name, "0", userHandle);
   4248                         } catch (RemoteException re) {
   4249                             // Fall through
   4250                         }
   4251                     } else {
   4252                         throw new SecurityException("Settings.Secure." + name
   4253                                 + " is deprecated and no longer accessible."
   4254                                 + " See API documentation for potential replacements.");
   4255                     }
   4256                 }
   4257             }
   4258 
   4259             return sNameValueCache.getStringForUser(resolver, name, userHandle);
   4260         }
   4261 
   4262         /**
   4263          * Store a name/value pair into the database.
   4264          * @param resolver to access the database with
   4265          * @param name to store
   4266          * @param value to associate with the name
   4267          * @return true if the value was set, false on database errors
   4268          */
   4269         public static boolean putString(ContentResolver resolver, String name, String value) {
   4270             return putStringForUser(resolver, name, value, UserHandle.myUserId());
   4271         }
   4272 
   4273         /** @hide */
   4274         public static boolean putStringForUser(ContentResolver resolver, String name, String value,
   4275                 int userHandle) {
   4276             if (LOCATION_MODE.equals(name)) {
   4277                 // HACK ALERT: temporary hack to work around b/10491283.
   4278                 // TODO: once b/10491283 fixed, remove this hack
   4279                 return setLocationModeForUser(resolver, Integer.parseInt(value), userHandle);
   4280             }
   4281             if (MOVED_TO_GLOBAL.contains(name)) {
   4282                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
   4283                         + " to android.provider.Settings.Global");
   4284                 return Global.putStringForUser(resolver, name, value, userHandle);
   4285             }
   4286             return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
   4287         }
   4288 
   4289         /**
   4290          * Construct the content URI for a particular name/value pair,
   4291          * useful for monitoring changes with a ContentObserver.
   4292          * @param name to look up in the table
   4293          * @return the corresponding content URI, or null if not present
   4294          */
   4295         public static Uri getUriFor(String name) {
   4296             if (MOVED_TO_GLOBAL.contains(name)) {
   4297                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
   4298                         + " to android.provider.Settings.Global, returning global URI.");
   4299                 return Global.getUriFor(Global.CONTENT_URI, name);
   4300             }
   4301             return getUriFor(CONTENT_URI, name);
   4302         }
   4303 
   4304         /**
   4305          * Convenience function for retrieving a single secure settings value
   4306          * as an integer.  Note that internally setting values are always
   4307          * stored as strings; this function converts the string to an integer
   4308          * for you.  The default value will be returned if the setting is
   4309          * not defined or not an integer.
   4310          *
   4311          * @param cr The ContentResolver to access.
   4312          * @param name The name of the setting to retrieve.
   4313          * @param def Value to return if the setting is not defined.
   4314          *
   4315          * @return The setting's current value, or 'def' if it is not defined
   4316          * or not a valid integer.
   4317          */
   4318         public static int getInt(ContentResolver cr, String name, int def) {
   4319             return getIntForUser(cr, name, def, UserHandle.myUserId());
   4320         }
   4321 
   4322         /** @hide */
   4323         public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) {
   4324             if (LOCATION_MODE.equals(name)) {
   4325                 // HACK ALERT: temporary hack to work around b/10491283.
   4326                 // TODO: once b/10491283 fixed, remove this hack
   4327                 return getLocationModeForUser(cr, userHandle);
   4328             }
   4329             String v = getStringForUser(cr, name, userHandle);
   4330             try {
   4331                 return v != null ? Integer.parseInt(v) : def;
   4332             } catch (NumberFormatException e) {
   4333                 return def;
   4334             }
   4335         }
   4336 
   4337         /**
   4338          * Convenience function for retrieving a single secure settings value
   4339          * as an integer.  Note that internally setting values are always
   4340          * stored as strings; this function converts the string to an integer
   4341          * for you.
   4342          * <p>
   4343          * This version does not take a default value.  If the setting has not
   4344          * been set, or the string value is not a number,
   4345          * it throws {@link SettingNotFoundException}.
   4346          *
   4347          * @param cr The ContentResolver to access.
   4348          * @param name The name of the setting to retrieve.
   4349          *
   4350          * @throws SettingNotFoundException Thrown if a setting by the given
   4351          * name can't be found or the setting value is not an integer.
   4352          *
   4353          * @return The setting's current value.
   4354          */
   4355         public static int getInt(ContentResolver cr, String name)
   4356                 throws SettingNotFoundException {
   4357             return getIntForUser(cr, name, UserHandle.myUserId());
   4358         }
   4359 
   4360         /** @hide */
   4361         public static int getIntForUser(ContentResolver cr, String name, int userHandle)
   4362                 throws SettingNotFoundException {
   4363             if (LOCATION_MODE.equals(name)) {
   4364                 // HACK ALERT: temporary hack to work around b/10491283.
   4365                 // TODO: once b/10491283 fixed, remove this hack
   4366                 return getLocationModeForUser(cr, userHandle);
   4367             }
   4368             String v = getStringForUser(cr, name, userHandle);
   4369             try {
   4370                 return Integer.parseInt(v);
   4371             } catch (NumberFormatException e) {
   4372                 throw new SettingNotFoundException(name);
   4373             }
   4374         }
   4375 
   4376         /**
   4377          * Convenience function for updating a single settings value as an
   4378          * integer. This will either create a new entry in the table if the
   4379          * given name does not exist, or modify the value of the existing row
   4380          * with that name.  Note that internally setting values are always
   4381          * stored as strings, so this function converts the given value to a
   4382          * string before storing it.
   4383          *
   4384          * @param cr The ContentResolver to access.
   4385          * @param name The name of the setting to modify.
   4386          * @param value The new value for the setting.
   4387          * @return true if the value was set, false on database errors
   4388          */
   4389         public static boolean putInt(ContentResolver cr, String name, int value) {
   4390             return putIntForUser(cr, name, value, UserHandle.myUserId());
   4391         }
   4392 
   4393         /** @hide */
   4394         public static boolean putIntForUser(ContentResolver cr, String name, int value,
   4395                 int userHandle) {
   4396             return putStringForUser(cr, name, Integer.toString(value), userHandle);
   4397         }
   4398 
   4399         /**
   4400          * Convenience function for retrieving a single secure settings value
   4401          * as a {@code long}.  Note that internally setting values are always
   4402          * stored as strings; this function converts the string to a {@code long}
   4403          * for you.  The default value will be returned if the setting is
   4404          * not defined or not a {@code long}.
   4405          *
   4406          * @param cr The ContentResolver to access.
   4407          * @param name The name of the setting to retrieve.
   4408          * @param def Value to return if the setting is not defined.
   4409          *
   4410          * @return The setting's current value, or 'def' if it is not defined
   4411          * or not a valid {@code long}.
   4412          */
   4413         public static long getLong(ContentResolver cr, String name, long def) {
   4414             return getLongForUser(cr, name, def, UserHandle.myUserId());
   4415         }
   4416 
   4417         /** @hide */
   4418         public static long getLongForUser(ContentResolver cr, String name, long def,
   4419                 int userHandle) {
   4420             String valString = getStringForUser(cr, name, userHandle);
   4421             long value;
   4422             try {
   4423                 value = valString != null ? Long.parseLong(valString) : def;
   4424             } catch (NumberFormatException e) {
   4425                 value = def;
   4426             }
   4427             return value;
   4428         }
   4429 
   4430         /**
   4431          * Convenience function for retrieving a single secure settings value
   4432          * as a {@code long}.  Note that internally setting values are always
   4433          * stored as strings; this function converts the string to a {@code long}
   4434          * for you.
   4435          * <p>
   4436          * This version does not take a default value.  If the setting has not
   4437          * been set, or the string value is not a number,
   4438          * it throws {@link SettingNotFoundException}.
   4439          *
   4440          * @param cr The ContentResolver to access.
   4441          * @param name The name of the setting to retrieve.
   4442          *
   4443          * @return The setting's current value.
   4444          * @throws SettingNotFoundException Thrown if a setting by the given
   4445          * name can't be found or the setting value is not an integer.
   4446          */
   4447         public static long getLong(ContentResolver cr, String name)
   4448                 throws SettingNotFoundException {
   4449             return getLongForUser(cr, name, UserHandle.myUserId());
   4450         }
   4451 
   4452         /** @hide */
   4453         public static long getLongForUser(ContentResolver cr, String name, int userHandle)
   4454                 throws SettingNotFoundException {
   4455             String valString = getStringForUser(cr, name, userHandle);
   4456             try {
   4457                 return Long.parseLong(valString);
   4458             } catch (NumberFormatException e) {
   4459                 throw new SettingNotFoundException(name);
   4460             }
   4461         }
   4462 
   4463         /**
   4464          * Convenience function for updating a secure settings value as a long
   4465          * integer. This will either create a new entry in the table if the
   4466          * given name does not exist, or modify the value of the existing row
   4467          * with that name.  Note that internally setting values are always
   4468          * stored as strings, so this function converts the given value to a
   4469          * string before storing it.
   4470          *
   4471          * @param cr The ContentResolver to access.
   4472          * @param name The name of the setting to modify.
   4473          * @param value The new value for the setting.
   4474          * @return true if the value was set, false on database errors
   4475          */
   4476         public static boolean putLong(ContentResolver cr, String name, long value) {
   4477             return putLongForUser(cr, name, value, UserHandle.myUserId());
   4478         }
   4479 
   4480         /** @hide */
   4481         public static boolean putLongForUser(ContentResolver cr, String name, long value,
   4482                 int userHandle) {
   4483             return putStringForUser(cr, name, Long.toString(value), userHandle);
   4484         }
   4485 
   4486         /**
   4487          * Convenience function for retrieving a single secure settings value
   4488          * as a floating point number.  Note that internally setting values are
   4489          * always stored as strings; this function converts the string to an
   4490          * float for you. The default value will be returned if the setting
   4491          * is not defined or not a valid float.
   4492          *
   4493          * @param cr The ContentResolver to access.
   4494          * @param name The name of the setting to retrieve.
   4495          * @param def Value to return if the setting is not defined.
   4496          *
   4497          * @return The setting's current value, or 'def' if it is not defined
   4498          * or not a valid float.
   4499          */
   4500         public static float getFloat(ContentResolver cr, String name, float def) {
   4501             return getFloatForUser(cr, name, def, UserHandle.myUserId());
   4502         }
   4503 
   4504         /** @hide */
   4505         public static float getFloatForUser(ContentResolver cr, String name, float def,
   4506                 int userHandle) {
   4507             String v = getStringForUser(cr, name, userHandle);
   4508             try {
   4509                 return v != null ? Float.parseFloat(v) : def;
   4510             } catch (NumberFormatException e) {
   4511                 return def;
   4512             }
   4513         }
   4514 
   4515         /**
   4516          * Convenience function for retrieving a single secure settings value
   4517          * as a float.  Note that internally setting values are always
   4518          * stored as strings; this function converts the string to a float
   4519          * for you.
   4520          * <p>
   4521          * This version does not take a default value.  If the setting has not
   4522          * been set, or the string value is not a number,
   4523          * it throws {@link SettingNotFoundException}.
   4524          *
   4525          * @param cr The ContentResolver to access.
   4526          * @param name The name of the setting to retrieve.
   4527          *
   4528          * @throws SettingNotFoundException Thrown if a setting by the given
   4529          * name can't be found or the setting value is not a float.
   4530          *
   4531          * @return The setting's current value.
   4532          */
   4533         public static float getFloat(ContentResolver cr, String name)
   4534                 throws SettingNotFoundException {
   4535             return getFloatForUser(cr, name, UserHandle.myUserId());
   4536         }
   4537 
   4538         /** @hide */
   4539         public static float getFloatForUser(ContentResolver cr, String name, int userHandle)
   4540                 throws SettingNotFoundException {
   4541             String v = getStringForUser(cr, name, userHandle);
   4542             if (v == null) {
   4543                 throw new SettingNotFoundException(name);
   4544             }
   4545             try {
   4546                 return Float.parseFloat(v);
   4547             } catch (NumberFormatException e) {
   4548                 throw new SettingNotFoundException(name);
   4549             }
   4550         }
   4551 
   4552         /**
   4553          * Convenience function for updating a single settings value as a
   4554          * floating point number. This will either create a new entry in the
   4555          * table if the given name does not exist, or modify the value of the
   4556          * existing row with that name.  Note that internally setting values
   4557          * are always stored as strings, so this function converts the given
   4558          * value to a string before storing it.
   4559          *
   4560          * @param cr The ContentResolver to access.
   4561          * @param name The name of the setting to modify.
   4562          * @param value The new value for the setting.
   4563          * @return true if the value was set, false on database errors
   4564          */
   4565         public static boolean putFloat(ContentResolver cr, String name, float value) {
   4566             return putFloatForUser(cr, name, value, UserHandle.myUserId());
   4567         }
   4568 
   4569         /** @hide */
   4570         public static boolean putFloatForUser(ContentResolver cr, String name, float value,
   4571                 int userHandle) {
   4572             return putStringForUser(cr, name, Float.toString(value), userHandle);
   4573         }
   4574 
   4575         /**
   4576          * @deprecated Use {@link android.provider.Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}
   4577          * instead
   4578          */
   4579         @Deprecated
   4580         public static final String DEVELOPMENT_SETTINGS_ENABLED =
   4581                 Global.DEVELOPMENT_SETTINGS_ENABLED;
   4582 
   4583         /**
   4584          * When the user has enable the option to have a "bug report" command
   4585          * in the power menu.
   4586          * @deprecated Use {@link android.provider.Settings.Global#BUGREPORT_IN_POWER_MENU} instead
   4587          * @hide
   4588          */
   4589         @Deprecated
   4590         public static final String BUGREPORT_IN_POWER_MENU = "bugreport_in_power_menu";
   4591 
   4592         /**
   4593          * @deprecated Use {@link android.provider.Settings.Global#ADB_ENABLED} instead
   4594          */
   4595         @Deprecated
   4596         public static final String ADB_ENABLED = Global.ADB_ENABLED;
   4597 
   4598         /**
   4599          * Setting to allow mock locations and location provider status to be injected into the
   4600          * LocationManager service for testing purposes during application development.  These
   4601          * locations and status values  override actual location and status information generated
   4602          * by network, gps, or other location providers.
   4603          *
   4604          * @deprecated This settings is not used anymore.
   4605          */
   4606         @Deprecated
   4607         public static final String ALLOW_MOCK_LOCATION = "mock_location";
   4608 
   4609         /**
   4610          * A 64-bit number (as a hex string) that is randomly
   4611          * generated when the user first sets up the device and should remain
   4612          * constant for the lifetime of the user's device. The value may
   4613          * change if a factory reset is performed on the device.
   4614          * <p class="note"><strong>Note:</strong> When a device has <a
   4615          * href="{@docRoot}about/versions/android-4.2.html#MultipleUsers">multiple users</a>
   4616          * (available on certain devices running Android 4.2 or higher), each user appears as a
   4617          * completely separate device, so the {@code ANDROID_ID} value is unique to each
   4618          * user.</p>
   4619          */
   4620         public static final String ANDROID_ID = "android_id";
   4621 
   4622         /**
   4623          * @deprecated Use {@link android.provider.Settings.Global#BLUETOOTH_ON} instead
   4624          */
   4625         @Deprecated
   4626         public static final String BLUETOOTH_ON = Global.BLUETOOTH_ON;
   4627 
   4628         /**
   4629          * @deprecated Use {@link android.provider.Settings.Global#DATA_ROAMING} instead
   4630          */
   4631         @Deprecated
   4632         public static final String DATA_ROAMING = Global.DATA_ROAMING;
   4633 
   4634         /**
   4635          * Setting to record the input method used by default, holding the ID
   4636          * of the desired method.
   4637          */
   4638         public static final String DEFAULT_INPUT_METHOD = "default_input_method";
   4639 
   4640         /**
   4641          * Setting to record the input method subtype used by default, holding the ID
   4642          * of the desired method.
   4643          */
   4644         public static final String SELECTED_INPUT_METHOD_SUBTYPE =
   4645                 "selected_input_method_subtype";
   4646 
   4647         /**
   4648          * Setting to record the history of input method subtype, holding the pair of ID of IME
   4649          * and its last used subtype.
   4650          * @hide
   4651          */
   4652         public static final String INPUT_METHODS_SUBTYPE_HISTORY =
   4653                 "input_methods_subtype_history";
   4654 
   4655         /**
   4656          * Setting to record the visibility of input method selector
   4657          */
   4658         public static final String INPUT_METHOD_SELECTOR_VISIBILITY =
   4659                 "input_method_selector_visibility";
   4660 
   4661         /**
   4662          * The currently selected voice interaction service flattened ComponentName.
   4663          * @hide
   4664          */
   4665         @TestApi
   4666         public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
   4667 
   4668         /**
   4669          * bluetooth HCI snoop log configuration
   4670          * @hide
   4671          */
   4672         public static final String BLUETOOTH_HCI_LOG =
   4673                 "bluetooth_hci_log";
   4674 
   4675         /**
   4676          * @deprecated Use {@link android.provider.Settings.Global#DEVICE_PROVISIONED} instead
   4677          */
   4678         @Deprecated
   4679         public static final String DEVICE_PROVISIONED = Global.DEVICE_PROVISIONED;
   4680 
   4681         /**
   4682          * Whether the current user has been set up via setup wizard (0 = false, 1 = true)
   4683          * @hide
   4684          */
   4685         public static final String USER_SETUP_COMPLETE = "user_setup_complete";
   4686 
   4687         /**
   4688          * Prefix for category name that marks whether a suggested action from that category was
   4689          * completed.
   4690          * @hide
   4691          */
   4692         public static final String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
   4693 
   4694         /**
   4695          * List of input methods that are currently enabled.  This is a string
   4696          * containing the IDs of all enabled input methods, each ID separated
   4697          * by ':'.
   4698          */
   4699         public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
   4700 
   4701         /**
   4702          * List of system input methods that are currently disabled.  This is a string
   4703          * containing the IDs of all disabled input methods, each ID separated
   4704          * by ':'.
   4705          * @hide
   4706          */
   4707         public static final String DISABLED_SYSTEM_INPUT_METHODS = "disabled_system_input_methods";
   4708 
   4709         /**
   4710          * Whether to show the IME when a hard keyboard is connected. This is a boolean that
   4711          * determines if the IME should be shown when a hard keyboard is attached.
   4712          * @hide
   4713          */
   4714         public static final String SHOW_IME_WITH_HARD_KEYBOARD = "show_ime_with_hard_keyboard";
   4715 
   4716         /**
   4717          * Host name and port for global http proxy. Uses ':' seperator for
   4718          * between host and port.
   4719          *
   4720          * @deprecated Use {@link Global#HTTP_PROXY}
   4721          */
   4722         @Deprecated
   4723         public static final String HTTP_PROXY = Global.HTTP_PROXY;
   4724 
   4725         /**
   4726          * Package designated as always-on VPN provider.
   4727          *
   4728          * @hide
   4729          */
   4730         public static final String ALWAYS_ON_VPN_APP = "always_on_vpn_app";
   4731 
   4732         /**
   4733          * Whether to block networking outside of VPN connections while always-on is set.
   4734          * @see #ALWAYS_ON_VPN_APP
   4735          *
   4736          * @hide
   4737          */
   4738         public static final String ALWAYS_ON_VPN_LOCKDOWN = "always_on_vpn_lockdown";
   4739 
   4740         /**
   4741          * Whether applications can be installed for this user via the system's
   4742          * {@link Intent#ACTION_INSTALL_PACKAGE} mechanism.
   4743          *
   4744          * <p>1 = permit app installation via the system package installer intent
   4745          * <p>0 = do not allow use of the package installer
   4746          */
   4747         public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
   4748 
   4749         /**
   4750          * Comma-separated list of location providers that activities may access. Do not rely on
   4751          * this value being present in settings.db or on ContentObserver notifications on the
   4752          * corresponding Uri.
   4753          *
   4754          * @deprecated use {@link #LOCATION_MODE} and
   4755          * {@link LocationManager#MODE_CHANGED_ACTION} (or
   4756          * {@link LocationManager#PROVIDERS_CHANGED_ACTION})
   4757          */
   4758         @Deprecated
   4759         public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
   4760 
   4761         /**
   4762          * The degree of location access enabled by the user.
   4763          * <p>
   4764          * When used with {@link #putInt(ContentResolver, String, int)}, must be one of {@link
   4765          * #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, {@link
   4766          * #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. When used with {@link
   4767          * #getInt(ContentResolver, String)}, the caller must gracefully handle additional location
   4768          * modes that might be added in the future.
   4769          * <p>
   4770          * Note: do not rely on this value being present in settings.db or on ContentObserver
   4771          * notifications for the corresponding Uri. Use {@link LocationManager#MODE_CHANGED_ACTION}
   4772          * to receive changes in this value.
   4773          */
   4774         public static final String LOCATION_MODE = "location_mode";
   4775         /**
   4776          * Stores the previous location mode when {@link #LOCATION_MODE} is set to
   4777          * {@link #LOCATION_MODE_OFF}
   4778          * @hide
   4779          */
   4780         public static final String LOCATION_PREVIOUS_MODE = "location_previous_mode";
   4781 
   4782         /**
   4783          * Sets all location providers to the previous states before location was turned off.
   4784          * @hide
   4785          */
   4786         public static final int LOCATION_MODE_PREVIOUS = -1;
   4787         /**
   4788          * Location access disabled.
   4789          */
   4790         public static final int LOCATION_MODE_OFF = 0;
   4791         /**
   4792          * Network Location Provider disabled, but GPS and other sensors enabled.
   4793          */
   4794         public static final int LOCATION_MODE_SENSORS_ONLY = 1;
   4795         /**
   4796          * Reduced power usage, such as limiting the number of GPS updates per hour. Requests
   4797          * with {@link android.location.Criteria#POWER_HIGH} may be downgraded to
   4798          * {@link android.location.Criteria#POWER_MEDIUM}.
   4799          */
   4800         public static final int LOCATION_MODE_BATTERY_SAVING = 2;
   4801         /**
   4802          * Best-effort location computation allowed.
   4803          */
   4804         public static final int LOCATION_MODE_HIGH_ACCURACY = 3;
   4805 
   4806         /**
   4807          * A flag containing settings used for biometric weak
   4808          * @hide
   4809          */
   4810         @Deprecated
   4811         public static final String LOCK_BIOMETRIC_WEAK_FLAGS =
   4812                 "lock_biometric_weak_flags";
   4813 
   4814         /**
   4815          * Whether lock-to-app will lock the keyguard when exiting.
   4816          * @hide
   4817          */
   4818         public static final String LOCK_TO_APP_EXIT_LOCKED = "lock_to_app_exit_locked";
   4819 
   4820         /**
   4821          * Whether autolock is enabled (0 = false, 1 = true)
   4822          *
   4823          * @deprecated Use {@link android.app.KeyguardManager} to determine the state and security
   4824          *             level of the keyguard. Accessing this setting from an app that is targeting
   4825          *             {@link VERSION_CODES#M} or later throws a {@code SecurityException}.
   4826          */
   4827         @Deprecated
   4828         public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
   4829 
   4830         /**
   4831          * Whether lock pattern is visible as user enters (0 = false, 1 = true)
   4832          *
   4833          * @deprecated Accessing this setting from an app that is targeting
   4834          *             {@link VERSION_CODES#M} or later throws a {@code SecurityException}.
   4835          */
   4836         @Deprecated
   4837         public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
   4838 
   4839         /**
   4840          * Whether lock pattern will vibrate as user enters (0 = false, 1 =
   4841          * true)
   4842          *
   4843          * @deprecated Starting in {@link VERSION_CODES#JELLY_BEAN_MR1} the
   4844          *             lockscreen uses
   4845          *             {@link Settings.System#HAPTIC_FEEDBACK_ENABLED}.
   4846          *             Accessing this setting from an app that is targeting
   4847          *             {@link VERSION_CODES#M} or later throws a {@code SecurityException}.
   4848          */
   4849         @Deprecated
   4850         public static final String
   4851                 LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
   4852 
   4853         /**
   4854          * This preference allows the device to be locked given time after screen goes off,
   4855          * subject to current DeviceAdmin policy limits.
   4856          * @hide
   4857          */
   4858         public static final String LOCK_SCREEN_LOCK_AFTER_TIMEOUT = "lock_screen_lock_after_timeout";
   4859 
   4860 
   4861         /**
   4862          * This preference contains the string that shows for owner info on LockScreen.
   4863          * @hide
   4864          * @deprecated
   4865          */
   4866         public static final String LOCK_SCREEN_OWNER_INFO = "lock_screen_owner_info";
   4867 
   4868         /**
   4869          * Ids of the user-selected appwidgets on the lockscreen (comma-delimited).
   4870          * @hide
   4871          */
   4872         @Deprecated
   4873         public static final String LOCK_SCREEN_APPWIDGET_IDS =
   4874             "lock_screen_appwidget_ids";
   4875 
   4876         /**
   4877          * Id of the appwidget shown on the lock screen when appwidgets are disabled.
   4878          * @hide
   4879          */
   4880         @Deprecated
   4881         public static final String LOCK_SCREEN_FALLBACK_APPWIDGET_ID =
   4882             "lock_screen_fallback_appwidget_id";
   4883 
   4884         /**
   4885          * Index of the lockscreen appwidget to restore, -1 if none.
   4886          * @hide
   4887          */
   4888         @Deprecated
   4889         public static final String LOCK_SCREEN_STICKY_APPWIDGET =
   4890             "lock_screen_sticky_appwidget";
   4891 
   4892         /**
   4893          * This preference enables showing the owner info on LockScreen.
   4894          * @hide
   4895          * @deprecated
   4896          */
   4897         public static final String LOCK_SCREEN_OWNER_INFO_ENABLED =
   4898             "lock_screen_owner_info_enabled";
   4899 
   4900         /**
   4901          * When set by a user, allows notifications to be shown atop a securely locked screen
   4902          * in their full "private" form (same as when the device is unlocked).
   4903          * @hide
   4904          */
   4905         public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS =
   4906                 "lock_screen_allow_private_notifications";
   4907 
   4908         /**
   4909          * When set by a user, allows notification remote input atop a securely locked screen
   4910          * without having to unlock
   4911          * @hide
   4912          */
   4913         public static final String LOCK_SCREEN_ALLOW_REMOTE_INPUT =
   4914                 "lock_screen_allow_remote_input";
   4915 
   4916         /**
   4917          * Set by the system to track if the user needs to see the call to action for
   4918          * the lockscreen notification policy.
   4919          * @hide
   4920          */
   4921         public static final String SHOW_NOTE_ABOUT_NOTIFICATION_HIDING =
   4922                 "show_note_about_notification_hiding";
   4923 
   4924         /**
   4925          * Set to 1 by the system after trust agents have been initialized.
   4926          * @hide
   4927          */
   4928         public static final String TRUST_AGENTS_INITIALIZED =
   4929                 "trust_agents_initialized";
   4930 
   4931         /**
   4932          * The Logging ID (a unique 64-bit value) as a hex string.
   4933          * Used as a pseudonymous identifier for logging.
   4934          * @deprecated This identifier is poorly initialized and has
   4935          * many collisions.  It should not be used.
   4936          */
   4937         @Deprecated
   4938         public static final String LOGGING_ID = "logging_id";
   4939 
   4940         /**
   4941          * @deprecated Use {@link android.provider.Settings.Global#NETWORK_PREFERENCE} instead
   4942          */
   4943         @Deprecated
   4944         public static final String NETWORK_PREFERENCE = Global.NETWORK_PREFERENCE;
   4945 
   4946         /**
   4947          * No longer supported.
   4948          */
   4949         public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
   4950 
   4951         /**
   4952          * No longer supported.
   4953          */
   4954         public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
   4955 
   4956         /**
   4957          * No longer supported.
   4958          */
   4959         public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
   4960 
   4961         /**
   4962          * Settings classname to launch when Settings is clicked from All
   4963          * Applications.  Needed because of user testing between the old
   4964          * and new Settings apps.
   4965          */
   4966         // TODO: 881807
   4967         public static final String SETTINGS_CLASSNAME = "settings_classname";
   4968 
   4969         /**
   4970          * @deprecated Use {@link android.provider.Settings.Global#USB_MASS_STORAGE_ENABLED} instead
   4971          */
   4972         @Deprecated
   4973         public static final String USB_MASS_STORAGE_ENABLED = Global.USB_MASS_STORAGE_ENABLED;
   4974 
   4975         /**
   4976          * @deprecated Use {@link android.provider.Settings.Global#USE_GOOGLE_MAIL} instead
   4977          */
   4978         @Deprecated
   4979         public static final String USE_GOOGLE_MAIL = Global.USE_GOOGLE_MAIL;
   4980 
   4981         /**
   4982          * If accessibility is enabled.
   4983          */
   4984         public static final String ACCESSIBILITY_ENABLED = "accessibility_enabled";
   4985 
   4986         /**
   4987          * If touch exploration is enabled.
   4988          */
   4989         public static final String TOUCH_EXPLORATION_ENABLED = "touch_exploration_enabled";
   4990 
   4991         /**
   4992          * List of the enabled accessibility providers.
   4993          */
   4994         public static final String ENABLED_ACCESSIBILITY_SERVICES =
   4995             "enabled_accessibility_services";
   4996 
   4997         /**
   4998          * List of the accessibility services to which the user has granted
   4999          * permission to put the device into touch exploration mode.
   5000          *
   5001          * @hide
   5002          */
   5003         public static final String TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES =
   5004             "touch_exploration_granted_accessibility_services";
   5005 
   5006         /**
   5007          * Whether to speak passwords while in accessibility mode.
   5008          */
   5009         public static final String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
   5010 
   5011         /**
   5012          * Whether to draw text with high contrast while in accessibility mode.
   5013          *
   5014          * @hide
   5015          */
   5016         public static final String ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED =
   5017                 "high_text_contrast_enabled";
   5018 
   5019         /**
   5020          * If injection of accessibility enhancing JavaScript screen-reader
   5021          * is enabled.
   5022          * <p>
   5023          *   Note: The JavaScript based screen-reader is served by the
   5024          *   Google infrastructure and enable users with disabilities to
   5025          *   efficiently navigate in and explore web content.
   5026          * </p>
   5027          * <p>
   5028          *   This property represents a boolean value.
   5029          * </p>
   5030          * @hide
   5031          */
   5032         public static final String ACCESSIBILITY_SCRIPT_INJECTION =
   5033             "accessibility_script_injection";
   5034 
   5035         /**
   5036          * The URL for the injected JavaScript based screen-reader used
   5037          * for providing accessibility of content in WebView.
   5038          * <p>
   5039          *   Note: The JavaScript based screen-reader is served by the
   5040          *   Google infrastructure and enable users with disabilities to
   5041          *   efficiently navigate in and explore web content.
   5042          * </p>
   5043          * <p>
   5044          *   This property represents a string value.
   5045          * </p>
   5046          * @hide
   5047          */
   5048         public static final String ACCESSIBILITY_SCREEN_READER_URL =
   5049             "accessibility_script_injection_url";
   5050 
   5051         /**
   5052          * Key bindings for navigation in built-in accessibility support for web content.
   5053          * <p>
   5054          *   Note: These key bindings are for the built-in accessibility navigation for
   5055          *   web content which is used as a fall back solution if JavaScript in a WebView
   5056          *   is not enabled or the user has not opted-in script injection from Google.
   5057          * </p>
   5058          * <p>
   5059          *   The bindings are separated by semi-colon. A binding is a mapping from
   5060          *   a key to a sequence of actions (for more details look at
   5061          *   android.webkit.AccessibilityInjector). A key is represented as the hexademical
   5062          *   string representation of an integer obtained from a meta state (optional) shifted
   5063          *   sixteen times left and bitwise ored with a key code. An action is represented
   5064          *   as a hexademical string representation of an integer where the first two digits
   5065          *   are navigation action index, the second, the third, and the fourth digit pairs
   5066          *   represent the action arguments. The separate actions in a binding are colon
   5067          *   separated. The key and the action sequence it maps to are separated by equals.
   5068          * </p>
   5069          * <p>
   5070          *   For example, the binding below maps the DPAD right button to traverse the
   5071          *   current navigation axis once without firing an accessibility event and to
   5072          *   perform the same traversal again but to fire an event:
   5073          *   <code>
   5074          *     0x16=0x01000100:0x01000101;
   5075          *   </code>
   5076          * </p>
   5077          * <p>
   5078          *   The goal of this binding is to enable dynamic rebinding of keys to
   5079          *   navigation actions for web content without requiring a framework change.
   5080          * </p>
   5081          * <p>
   5082          *   This property represents a string value.
   5083          * </p>
   5084          * @hide
   5085          */
   5086         public static final String ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS =
   5087             "accessibility_web_content_key_bindings";
   5088 
   5089         /**
   5090          * Setting that specifies whether the display magnification is enabled.
   5091          * Display magnifications allows the user to zoom in the display content
   5092          * and is targeted to low vision users. The current magnification scale
   5093          * is controlled by {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}.
   5094          *
   5095          * @hide
   5096          */
   5097         public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED =
   5098                 "accessibility_display_magnification_enabled";
   5099 
   5100         /**
   5101          * Setting that specifies what the display magnification scale is.
   5102          * Display magnifications allows the user to zoom in the display
   5103          * content and is targeted to low vision users. Whether a display
   5104          * magnification is performed is controlled by
   5105          * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED}
   5106          *
   5107          * @hide
   5108          */
   5109         public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE =
   5110                 "accessibility_display_magnification_scale";
   5111 
   5112         /**
   5113          * Setting that specifies whether the display magnification should be
   5114          * automatically updated. If this fearture is enabled the system will
   5115          * exit magnification mode or pan the viewport when a context change
   5116          * occurs. For example, on staring a new activity or rotating the screen,
   5117          * the system may zoom out so the user can see the new context he is in.
   5118          * Another example is on showing a window that is not visible in the
   5119          * magnified viewport the system may pan the viewport to make the window
   5120          * the has popped up so the user knows that the context has changed.
   5121          * Whether a screen magnification is performed is controlled by
   5122          * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED}
   5123          *
   5124          * @hide
   5125          */
   5126         public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE =
   5127                 "accessibility_display_magnification_auto_update";
   5128 
   5129         /**
   5130          * Setting that specifies what mode the soft keyboard is in (default or hidden). Can be
   5131          * modified from an AccessibilityService using the SoftKeyboardController.
   5132          *
   5133          * @hide
   5134          */
   5135         public static final String ACCESSIBILITY_SOFT_KEYBOARD_MODE =
   5136                 "accessibility_soft_keyboard_mode";
   5137 
   5138         /**
   5139          * Default soft keyboard behavior.
   5140          *
   5141          * @hide
   5142          */
   5143         public static final int SHOW_MODE_AUTO = 0;
   5144 
   5145         /**
   5146          * Soft keyboard is never shown.
   5147          *
   5148          * @hide
   5149          */
   5150         public static final int SHOW_MODE_HIDDEN = 1;
   5151 
   5152         /**
   5153          * Setting that specifies whether timed text (captions) should be
   5154          * displayed in video content. Text display properties are controlled by
   5155          * the following settings:
   5156          * <ul>
   5157          * <li>{@link #ACCESSIBILITY_CAPTIONING_LOCALE}
   5158          * <li>{@link #ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR}
   5159          * <li>{@link #ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR}
   5160          * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_COLOR}
   5161          * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_TYPE}
   5162          * <li>{@link #ACCESSIBILITY_CAPTIONING_TYPEFACE}
   5163          * <li>{@link #ACCESSIBILITY_CAPTIONING_FONT_SCALE}
   5164          * </ul>
   5165          *
   5166          * @hide
   5167          */
   5168         public static final String ACCESSIBILITY_CAPTIONING_ENABLED =
   5169                 "accessibility_captioning_enabled";
   5170 
   5171         /**
   5172          * Setting that specifies the language for captions as a locale string,
   5173          * e.g. en_US.
   5174          *
   5175          * @see java.util.Locale#toString
   5176          * @hide
   5177          */
   5178         public static final String ACCESSIBILITY_CAPTIONING_LOCALE =
   5179                 "accessibility_captioning_locale";
   5180 
   5181         /**
   5182          * Integer property that specifies the preset style for captions, one
   5183          * of:
   5184          * <ul>
   5185          * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESET_CUSTOM}
   5186          * <li>a valid index of {@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESETS}
   5187          * </ul>
   5188          *
   5189          * @see java.util.Locale#toString
   5190          * @hide
   5191          */
   5192         public static final String ACCESSIBILITY_CAPTIONING_PRESET =
   5193                 "accessibility_captioning_preset";
   5194 
   5195         /**
   5196          * Integer property that specifes the background color for captions as a
   5197          * packed 32-bit color.
   5198          *
   5199          * @see android.graphics.Color#argb
   5200          * @hide
   5201          */
   5202         public static final String ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR =
   5203                 "accessibility_captioning_background_color";
   5204 
   5205         /**
   5206          * Integer property that specifes the foreground color for captions as a
   5207          * packed 32-bit color.
   5208          *
   5209          * @see android.graphics.Color#argb
   5210          * @hide
   5211          */
   5212         public static final String ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR =
   5213                 "accessibility_captioning_foreground_color";
   5214 
   5215         /**
   5216          * Integer property that specifes the edge type for captions, one of:
   5217          * <ul>
   5218          * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_NONE}
   5219          * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_OUTLINE}
   5220          * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_DROP_SHADOW}
   5221          * </ul>
   5222          *
   5223          * @see #ACCESSIBILITY_CAPTIONING_EDGE_COLOR
   5224          * @hide
   5225          */
   5226         public static final String ACCESSIBILITY_CAPTIONING_EDGE_TYPE =
   5227                 "accessibility_captioning_edge_type";
   5228 
   5229         /**
   5230          * Integer property that specifes the edge color for captions as a
   5231          * packed 32-bit color.
   5232          *
   5233          * @see #ACCESSIBILITY_CAPTIONING_EDGE_TYPE
   5234          * @see android.graphics.Color#argb
   5235          * @hide
   5236          */
   5237         public static final String ACCESSIBILITY_CAPTIONING_EDGE_COLOR =
   5238                 "accessibility_captioning_edge_color";
   5239 
   5240         /**
   5241          * Integer property that specifes the window color for captions as a
   5242          * packed 32-bit color.
   5243          *
   5244          * @see android.graphics.Color#argb
   5245          * @hide
   5246          */
   5247         public static final String ACCESSIBILITY_CAPTIONING_WINDOW_COLOR =
   5248                 "accessibility_captioning_window_color";
   5249 
   5250         /**
   5251          * String property that specifies the typeface for captions, one of:
   5252          * <ul>
   5253          * <li>DEFAULT
   5254          * <li>MONOSPACE
   5255          * <li>SANS_SERIF
   5256          * <li>SERIF
   5257          * </ul>
   5258          *
   5259          * @see android.graphics.Typeface
   5260          * @hide
   5261          */
   5262         public static final String ACCESSIBILITY_CAPTIONING_TYPEFACE =
   5263                 "accessibility_captioning_typeface";
   5264 
   5265         /**
   5266          * Floating point property that specifies font scaling for captions.
   5267          *
   5268          * @hide
   5269          */
   5270         public static final String ACCESSIBILITY_CAPTIONING_FONT_SCALE =
   5271                 "accessibility_captioning_font_scale";
   5272 
   5273         /**
   5274          * Setting that specifies whether display color inversion is enabled.
   5275          */
   5276         public static final String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED =
   5277                 "accessibility_display_inversion_enabled";
   5278 
   5279         /**
   5280          * Setting that specifies whether display color space adjustment is
   5281          * enabled.
   5282          *
   5283          * @hide
   5284          */
   5285         public static final String ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED =
   5286                 "accessibility_display_daltonizer_enabled";
   5287 
   5288         /**
   5289          * Integer property that specifies the type of color space adjustment to
   5290          * perform. Valid values are defined in AccessibilityManager.
   5291          *
   5292          * @hide
   5293          */
   5294         public static final String ACCESSIBILITY_DISPLAY_DALTONIZER =
   5295                 "accessibility_display_daltonizer";
   5296 
   5297         /**
   5298          * Float list that specifies the color matrix to apply to
   5299          * the display. Valid values are defined in AccessibilityManager.
   5300          *
   5301          * @hide
   5302          */
   5303         public static final String ACCESSIBILITY_DISPLAY_COLOR_MATRIX =
   5304                 "accessibility_display_color_matrix";
   5305 
   5306         /**
   5307          * Setting that specifies whether automatic click when the mouse pointer stops moving is
   5308          * enabled.
   5309          *
   5310          * @hide
   5311          */
   5312         public static final String ACCESSIBILITY_AUTOCLICK_ENABLED =
   5313                 "accessibility_autoclick_enabled";
   5314 
   5315         /**
   5316          * Integer setting specifying amount of time in ms the mouse pointer has to stay still
   5317          * before performing click when {@link #ACCESSIBILITY_AUTOCLICK_ENABLED} is set.
   5318          *
   5319          * @see #ACCESSIBILITY_AUTOCLICK_ENABLED
   5320          * @hide
   5321          */
   5322         public static final String ACCESSIBILITY_AUTOCLICK_DELAY =
   5323                 "accessibility_autoclick_delay";
   5324 
   5325         /**
   5326          * Whether or not larger size icons are used for the pointer of mouse/trackpad for
   5327          * accessibility.
   5328          * (0 = false, 1 = true)
   5329          * @hide
   5330          */
   5331         public static final String ACCESSIBILITY_LARGE_POINTER_ICON =
   5332                 "accessibility_large_pointer_icon";
   5333 
   5334         /**
   5335          * The timeout for considering a press to be a long press in milliseconds.
   5336          * @hide
   5337          */
   5338         public static final String LONG_PRESS_TIMEOUT = "long_press_timeout";
   5339 
   5340         /**
   5341          * List of the enabled print services.
   5342          *
   5343          * N and beyond uses {@link #DISABLED_PRINT_SERVICES}. But this might be used in an upgrade
   5344          * from pre-N.
   5345          *
   5346          * @hide
   5347          */
   5348         public static final String ENABLED_PRINT_SERVICES =
   5349             "enabled_print_services";
   5350 
   5351         /**
   5352          * List of the disabled print services.
   5353          *
   5354          * @hide
   5355          */
   5356         public static final String DISABLED_PRINT_SERVICES =
   5357             "disabled_print_services";
   5358 
   5359         /**
   5360          * The saved value for WindowManagerService.setForcedDisplayDensity()
   5361          * formatted as a single integer representing DPI. If unset, then use
   5362          * the real display density.
   5363          *
   5364          * @hide
   5365          */
   5366         public static final String DISPLAY_DENSITY_FORCED = "display_density_forced";
   5367 
   5368         /**
   5369          * Setting to always use the default text-to-speech settings regardless
   5370          * of the application settings.
   5371          * 1 = override application settings,
   5372          * 0 = use application settings (if specified).
   5373          *
   5374          * @deprecated  The value of this setting is no longer respected by
   5375          * the framework text to speech APIs as of the Ice Cream Sandwich release.
   5376          */
   5377         @Deprecated
   5378         public static final String TTS_USE_DEFAULTS = "tts_use_defaults";
   5379 
   5380         /**
   5381          * Default text-to-speech engine speech rate. 100 = 1x
   5382          */
   5383         public static final String TTS_DEFAULT_RATE = "tts_default_rate";
   5384 
   5385         /**
   5386          * Default text-to-speech engine pitch. 100 = 1x
   5387          */
   5388         public static final String TTS_DEFAULT_PITCH = "tts_default_pitch";
   5389 
   5390         /**
   5391          * Default text-to-speech engine.
   5392          */
   5393         public static final String TTS_DEFAULT_SYNTH = "tts_default_synth";
   5394 
   5395         /**
   5396          * Default text-to-speech language.
   5397          *
   5398          * @deprecated this setting is no longer in use, as of the Ice Cream
   5399          * Sandwich release. Apps should never need to read this setting directly,
   5400          * instead can query the TextToSpeech framework classes for the default
   5401          * locale. {@link TextToSpeech#getLanguage()}.
   5402          */
   5403         @Deprecated
   5404         public static final String TTS_DEFAULT_LANG = "tts_default_lang";
   5405 
   5406         /**
   5407          * Default text-to-speech country.
   5408          *
   5409          * @deprecated this setting is no longer in use, as of the Ice Cream
   5410          * Sandwich release. Apps should never need to read this setting directly,
   5411          * instead can query the TextToSpeech framework classes for the default
   5412          * locale. {@link TextToSpeech#getLanguage()}.
   5413          */
   5414         @Deprecated
   5415         public static final String TTS_DEFAULT_COUNTRY = "tts_default_country";
   5416 
   5417         /**
   5418          * Default text-to-speech locale variant.
   5419          *
   5420          * @deprecated this setting is no longer in use, as of the Ice Cream
   5421          * Sandwich release. Apps should never need to read this setting directly,
   5422          * instead can query the TextToSpeech framework classes for the
   5423          * locale that is in use {@link TextToSpeech#getLanguage()}.
   5424          */
   5425         @Deprecated
   5426         public static final String TTS_DEFAULT_VARIANT = "tts_default_variant";
   5427 
   5428         /**
   5429          * Stores the default tts locales on a per engine basis. Stored as
   5430          * a comma seperated list of values, each value being of the form
   5431          * {@code engine_name:locale} for example,
   5432          * {@code com.foo.ttsengine:eng-USA,com.bar.ttsengine:esp-ESP}. This
   5433          * supersedes {@link #TTS_DEFAULT_LANG}, {@link #TTS_DEFAULT_COUNTRY} and
   5434          * {@link #TTS_DEFAULT_VARIANT}. Apps should never need to read this
   5435          * setting directly, and can query the TextToSpeech framework classes
   5436          * for the locale that is in use.
   5437          *
   5438          * @hide
   5439          */
   5440         public static final String TTS_DEFAULT_LOCALE = "tts_default_locale";
   5441 
   5442         /**
   5443          * Space delimited list of plugin packages that are enabled.
   5444          */
   5445         public static final String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
   5446 
   5447         /**
   5448          * @deprecated Use {@link android.provider.Settings.Global#WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON}
   5449          * instead.
   5450          */
   5451         @Deprecated
   5452         public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
   5453                 Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON;
   5454 
   5455         /**
   5456          * @deprecated Use {@link android.provider.Settings.Global#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY}
   5457          * instead.
   5458          */
   5459         @Deprecated
   5460         public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
   5461                 Global.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY;
   5462 
   5463         /**
   5464          * @deprecated Use {@link android.provider.Settings.Global#WIFI_NUM_OPEN_NETWORKS_KEPT}
   5465          * instead.
   5466          */
   5467         @Deprecated
   5468         public static final String WIFI_NUM_OPEN_NETWORKS_KEPT =
   5469                 Global.WIFI_NUM_OPEN_NETWORKS_KEPT;
   5470 
   5471         /**
   5472          * @deprecated Use {@link android.provider.Settings.Global#WIFI_ON}
   5473          * instead.
   5474          */
   5475         @Deprecated
   5476         public static final String WIFI_ON = Global.WIFI_ON;
   5477 
   5478         /**
   5479          * The acceptable packet loss percentage (range 0 - 100) before trying
   5480          * another AP on the same network.
   5481          * @deprecated This setting is not used.
   5482          */
   5483         @Deprecated
   5484         public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE =
   5485                 "wifi_watchdog_acceptable_packet_loss_percentage";
   5486 
   5487         /**
   5488          * The number of access points required for a network in order for the
   5489          * watchdog to monitor it.
   5490          * @deprecated This setting is not used.
   5491          */
   5492         @Deprecated
   5493         public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
   5494 
   5495         /**
   5496          * The delay between background checks.
   5497          * @deprecated This setting is not used.
   5498          */
   5499         @Deprecated
   5500         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
   5501                 "wifi_watchdog_background_check_delay_ms";
   5502 
   5503         /**
   5504          * Whether the Wi-Fi watchdog is enabled for background checking even
   5505          * after it thinks the user has connected to a good access point.
   5506          * @deprecated This setting is not used.
   5507          */
   5508         @Deprecated
   5509         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED =
   5510                 "wifi_watchdog_background_check_enabled";
   5511 
   5512         /**
   5513          * The timeout for a background ping
   5514          * @deprecated This setting is not used.
   5515          */
   5516         @Deprecated
   5517         public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS =
   5518                 "wifi_watchdog_background_check_timeout_ms";
   5519 
   5520         /**
   5521          * The number of initial pings to perform that *may* be ignored if they
   5522          * fail. Again, if these fail, they will *not* be used in packet loss
   5523          * calculation. For example, one network always seemed to time out for
   5524          * the first couple pings, so this is set to 3 by default.
   5525          * @deprecated This setting is not used.
   5526          */
   5527         @Deprecated
   5528         public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT =
   5529             "wifi_watchdog_initial_ignored_ping_count";
   5530 
   5531         /**
   5532          * The maximum number of access points (per network) to attempt to test.
   5533          * If this number is reached, the watchdog will no longer monitor the
   5534          * initial connection state for the network. This is a safeguard for
   5535          * networks containing multiple APs whose DNS does not respond to pings.
   5536          * @deprecated This setting is not used.
   5537          */
   5538         @Deprecated
   5539         public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
   5540 
   5541         /**
   5542          * @deprecated Use {@link android.provider.Settings.Global#WIFI_WATCHDOG_ON} instead
   5543          */
   5544         @Deprecated
   5545         public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
   5546 
   5547         /**
   5548          * A comma-separated list of SSIDs for which the Wi-Fi watchdog should be enabled.
   5549          * @deprecated This setting is not used.
   5550          */
   5551         @Deprecated
   5552         public static final String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
   5553 
   5554         /**
   5555          * The number of pings to test if an access point is a good connection.
   5556          * @deprecated This setting is not used.
   5557          */
   5558         @Deprecated
   5559         public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
   5560 
   5561         /**
   5562          * The delay between pings.
   5563          * @deprecated This setting is not used.
   5564          */
   5565         @Deprecated
   5566         public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
   5567 
   5568         /**
   5569          * The timeout per ping.
   5570          * @deprecated This setting is not used.
   5571          */
   5572         @Deprecated
   5573         public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
   5574 
   5575         /**
   5576          * @deprecated Use
   5577          * {@link android.provider.Settings.Global#WIFI_MAX_DHCP_RETRY_COUNT} instead
   5578          */
   5579         @Deprecated
   5580         public static final String WIFI_MAX_DHCP_RETRY_COUNT = Global.WIFI_MAX_DHCP_RETRY_COUNT;
   5581 
   5582         /**
   5583          * @deprecated Use
   5584          * {@link android.provider.Settings.Global#WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS} instead
   5585          */
   5586         @Deprecated
   5587         public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
   5588                 Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS;
   5589 
   5590         /**
   5591          * The number of milliseconds to hold on to a PendingIntent based request. This delay gives
   5592          * the receivers of the PendingIntent an opportunity to make a new network request before
   5593          * the Network satisfying the request is potentially removed.
   5594          *
   5595          * @hide
   5596          */
   5597         public static final String CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS =
   5598                 "connectivity_release_pending_intent_delay_ms";
   5599 
   5600         /**
   5601          * Whether background data usage is allowed.
   5602          *
   5603          * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH},
   5604          *             availability of background data depends on several
   5605          *             combined factors. When background data is unavailable,
   5606          *             {@link ConnectivityManager#getActiveNetworkInfo()} will
   5607          *             now appear disconnected.
   5608          */
   5609         @Deprecated
   5610         public static final String BACKGROUND_DATA = "background_data";
   5611 
   5612         /**
   5613          * Origins for which browsers should allow geolocation by default.
   5614          * The value is a space-separated list of origins.
   5615          */
   5616         public static final String ALLOWED_GEOLOCATION_ORIGINS
   5617                 = "allowed_geolocation_origins";
   5618 
   5619         /**
   5620          * The preferred TTY mode     0 = TTy Off, CDMA default
   5621          *                            1 = TTY Full
   5622          *                            2 = TTY HCO
   5623          *                            3 = TTY VCO
   5624          * @hide
   5625          */
   5626         public static final String PREFERRED_TTY_MODE =
   5627                 "preferred_tty_mode";
   5628 
   5629         /**
   5630          * Whether the enhanced voice privacy mode is enabled.
   5631          * 0 = normal voice privacy
   5632          * 1 = enhanced voice privacy
   5633          * @hide
   5634          */
   5635         public static final String ENHANCED_VOICE_PRIVACY_ENABLED = "enhanced_voice_privacy_enabled";
   5636 
   5637         /**
   5638          * Whether the TTY mode mode is enabled.
   5639          * 0 = disabled
   5640          * 1 = enabled
   5641          * @hide
   5642          */
   5643         public static final String TTY_MODE_ENABLED = "tty_mode_enabled";
   5644 
   5645         /**
   5646          * Controls whether settings backup is enabled.
   5647          * Type: int ( 0 = disabled, 1 = enabled )
   5648          * @hide
   5649          */
   5650         public static final String BACKUP_ENABLED = "backup_enabled";
   5651 
   5652         /**
   5653          * Controls whether application data is automatically restored from backup
   5654          * at install time.
   5655          * Type: int ( 0 = disabled, 1 = enabled )
   5656          * @hide
   5657          */
   5658         public static final String BACKUP_AUTO_RESTORE = "backup_auto_restore";
   5659 
   5660         /**
   5661          * Indicates whether settings backup has been fully provisioned.
   5662          * Type: int ( 0 = unprovisioned, 1 = fully provisioned )
   5663          * @hide
   5664          */
   5665         public static final String BACKUP_PROVISIONED = "backup_provisioned";
   5666 
   5667         /**
   5668          * Component of the transport to use for backup/restore.
   5669          * @hide
   5670          */
   5671         public static final String BACKUP_TRANSPORT = "backup_transport";
   5672 
   5673         /**
   5674          * Version for which the setup wizard was last shown.  Bumped for
   5675          * each release when there is new setup information to show.
   5676          * @hide
   5677          */
   5678         public static final String LAST_SETUP_SHOWN = "last_setup_shown";
   5679 
   5680         /**
   5681          * The interval in milliseconds after which Wi-Fi is considered idle.
   5682          * When idle, it is possible for the device to be switched from Wi-Fi to
   5683          * the mobile data network.
   5684          * @hide
   5685          * @deprecated Use {@link android.provider.Settings.Global#WIFI_IDLE_MS}
   5686          * instead.
   5687          */
   5688         @Deprecated
   5689         public static final String WIFI_IDLE_MS = Global.WIFI_IDLE_MS;
   5690 
   5691         /**
   5692          * The global search provider chosen by the user (if multiple global
   5693          * search providers are installed). This will be the provider returned
   5694          * by {@link SearchManager#getGlobalSearchActivity()} if it's still
   5695          * installed. This setting is stored as a flattened component name as
   5696          * per {@link ComponentName#flattenToString()}.
   5697          *
   5698          * @hide
   5699          */
   5700         public static final String SEARCH_GLOBAL_SEARCH_ACTIVITY =
   5701                 "search_global_search_activity";
   5702 
   5703         /**
   5704          * The number of promoted sources in GlobalSearch.
   5705          * @hide
   5706          */
   5707         public static final String SEARCH_NUM_PROMOTED_SOURCES = "search_num_promoted_sources";
   5708         /**
   5709          * The maximum number of suggestions returned by GlobalSearch.
   5710          * @hide
   5711          */
   5712         public static final String SEARCH_MAX_RESULTS_TO_DISPLAY = "search_max_results_to_display";
   5713         /**
   5714          * The number of suggestions GlobalSearch will ask each non-web search source for.
   5715          * @hide
   5716          */
   5717         public static final String SEARCH_MAX_RESULTS_PER_SOURCE = "search_max_results_per_source";
   5718         /**
   5719          * The number of suggestions the GlobalSearch will ask the web search source for.
   5720          * @hide
   5721          */
   5722         public static final String SEARCH_WEB_RESULTS_OVERRIDE_LIMIT =
   5723                 "search_web_results_override_limit";
   5724         /**
   5725          * The number of milliseconds that GlobalSearch will wait for suggestions from
   5726          * promoted sources before continuing with all other sources.
   5727          * @hide
   5728          */
   5729         public static final String SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS =
   5730                 "search_promoted_source_deadline_millis";
   5731         /**
   5732          * The number of milliseconds before GlobalSearch aborts search suggesiton queries.
   5733          * @hide
   5734          */
   5735         public static final String SEARCH_SOURCE_TIMEOUT_MILLIS = "search_source_timeout_millis";
   5736         /**
   5737          * The maximum number of milliseconds that GlobalSearch shows the previous results
   5738          * after receiving a new query.
   5739          * @hide
   5740          */
   5741         public static final String SEARCH_PREFILL_MILLIS = "search_prefill_millis";
   5742         /**
   5743          * The maximum age of log data used for shortcuts in GlobalSearch.
   5744          * @hide
   5745          */
   5746         public static final String SEARCH_MAX_STAT_AGE_MILLIS = "search_max_stat_age_millis";
   5747         /**
   5748          * The maximum age of log data used for source ranking in GlobalSearch.
   5749          * @hide
   5750          */
   5751         public static final String SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS =
   5752                 "search_max_source_event_age_millis";
   5753         /**
   5754          * The minimum number of impressions needed to rank a source in GlobalSearch.
   5755          * @hide
   5756          */
   5757         public static final String SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING =
   5758                 "search_min_impressions_for_source_ranking";
   5759         /**
   5760          * The minimum number of clicks needed to rank a source in GlobalSearch.
   5761          * @hide
   5762          */
   5763         public static final String SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING =
   5764                 "search_min_clicks_for_source_ranking";
   5765         /**
   5766          * The maximum number of shortcuts shown by GlobalSearch.
   5767          * @hide
   5768          */
   5769         public static final String SEARCH_MAX_SHORTCUTS_RETURNED = "search_max_shortcuts_returned";
   5770         /**
   5771          * The size of the core thread pool for suggestion queries in GlobalSearch.
   5772          * @hide
   5773          */
   5774         public static final String SEARCH_QUERY_THREAD_CORE_POOL_SIZE =
   5775                 "search_query_thread_core_pool_size";
   5776         /**
   5777          * The maximum size of the thread pool for suggestion queries in GlobalSearch.
   5778          * @hide
   5779          */
   5780         public static final String SEARCH_QUERY_THREAD_MAX_POOL_SIZE =
   5781                 "search_query_thread_max_pool_size";
   5782         /**
   5783          * The size of the core thread pool for shortcut refreshing in GlobalSearch.
   5784          * @hide
   5785          */
   5786         public static final String SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE =
   5787                 "search_shortcut_refresh_core_pool_size";
   5788         /**
   5789          * The maximum size of the thread pool for shortcut refreshing in GlobalSearch.
   5790          * @hide
   5791          */
   5792         public static final String SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE =
   5793                 "search_shortcut_refresh_max_pool_size";
   5794         /**
   5795          * The maximun time that excess threads in the GlobalSeach thread pools will
   5796          * wait before terminating.
   5797          * @hide
   5798          */
   5799         public static final String SEARCH_THREAD_KEEPALIVE_SECONDS =
   5800                 "search_thread_keepalive_seconds";
   5801         /**
   5802          * The maximum number of concurrent suggestion queries to each source.
   5803          * @hide
   5804          */
   5805         public static final String SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT =
   5806                 "search_per_source_concurrent_query_limit";
   5807 
   5808         /**
   5809          * Whether or not alert sounds are played on MountService events. (0 = false, 1 = true)
   5810          * @hide
   5811          */
   5812         public static final String MOUNT_PLAY_NOTIFICATION_SND = "mount_play_not_snd";
   5813 
   5814         /**
   5815          * Whether or not UMS auto-starts on UMS host detection. (0 = false, 1 = true)
   5816          * @hide
   5817          */
   5818         public static final String MOUNT_UMS_AUTOSTART = "mount_ums_autostart";
   5819 
   5820         /**
   5821          * Whether or not a notification is displayed on UMS host detection. (0 = false, 1 = true)
   5822          * @hide
   5823          */
   5824         public static final String MOUNT_UMS_PROMPT = "mount_ums_prompt";
   5825 
   5826         /**
   5827          * Whether or not a notification is displayed while UMS is enabled. (0 = false, 1 = true)
   5828          * @hide
   5829          */
   5830         public static final String MOUNT_UMS_NOTIFY_ENABLED = "mount_ums_notify_enabled";
   5831 
   5832         /**
   5833          * If nonzero, ANRs in invisible background processes bring up a dialog.
   5834          * Otherwise, the process will be silently killed.
   5835          * @hide
   5836          */
   5837         public static final String ANR_SHOW_BACKGROUND = "anr_show_background";
   5838 
   5839         /**
   5840          * The {@link ComponentName} string of the service to be used as the voice recognition
   5841          * service.
   5842          *
   5843          * @hide
   5844          */
   5845         public static final String VOICE_RECOGNITION_SERVICE = "voice_recognition_service";
   5846 
   5847         /**
   5848          * Stores whether an user has consented to have apps verified through PAM.
   5849          * The value is boolean (1 or 0).
   5850          *
   5851          * @hide
   5852          */
   5853         public static final String PACKAGE_VERIFIER_USER_CONSENT =
   5854             "package_verifier_user_consent";
   5855 
   5856         /**
   5857          * The {@link ComponentName} string of the selected spell checker service which is
   5858          * one of the services managed by the text service manager.
   5859          *
   5860          * @hide
   5861          */
   5862         public static final String SELECTED_SPELL_CHECKER = "selected_spell_checker";
   5863 
   5864         /**
   5865          * The {@link ComponentName} string of the selected subtype of the selected spell checker
   5866          * service which is one of the services managed by the text service manager.
   5867          *
   5868          * @hide
   5869          */
   5870         public static final String SELECTED_SPELL_CHECKER_SUBTYPE =
   5871                 "selected_spell_checker_subtype";
   5872 
   5873         /**
   5874          * The {@link ComponentName} string whether spell checker is enabled or not.
   5875          *
   5876          * @hide
   5877          */
   5878         public static final String SPELL_CHECKER_ENABLED = "spell_checker_enabled";
   5879 
   5880         /**
   5881          * What happens when the user presses the Power button while in-call
   5882          * and the screen is on.<br/>
   5883          * <b>Values:</b><br/>
   5884          * 1 - The Power button turns off the screen and locks the device. (Default behavior)<br/>
   5885          * 2 - The Power button hangs up the current call.<br/>
   5886          *
   5887          * @hide
   5888          */
   5889         public static final String INCALL_POWER_BUTTON_BEHAVIOR = "incall_power_button_behavior";
   5890 
   5891         /**
   5892          * INCALL_POWER_BUTTON_BEHAVIOR value for "turn off screen".
   5893          * @hide
   5894          */
   5895         public static final int INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF = 0x1;
   5896 
   5897         /**
   5898          * INCALL_POWER_BUTTON_BEHAVIOR value for "hang up".
   5899          * @hide
   5900          */
   5901         public static final int INCALL_POWER_BUTTON_BEHAVIOR_HANGUP = 0x2;
   5902 
   5903         /**
   5904          * INCALL_POWER_BUTTON_BEHAVIOR default value.
   5905          * @hide
   5906          */
   5907         public static final int INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT =
   5908                 INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF;
   5909 
   5910         /**
   5911          * Whether the device should wake when the wake gesture sensor detects motion.
   5912          * @hide
   5913          */
   5914         public static final String WAKE_GESTURE_ENABLED = "wake_gesture_enabled";
   5915 
   5916         /**
   5917          * Whether the device should doze if configured.
   5918          * @hide
   5919          */
   5920         public static final String DOZE_ENABLED = "doze_enabled";
   5921 
   5922         /**
   5923          * The current night mode that has been selected by the user.  Owned
   5924          * and controlled by UiModeManagerService.  Constants are as per
   5925          * UiModeManager.
   5926          * @hide
   5927          */
   5928         public static final String UI_NIGHT_MODE = "ui_night_mode";
   5929 
   5930         /**
   5931          * Whether screensavers are enabled.
   5932          * @hide
   5933          */
   5934         public static final String SCREENSAVER_ENABLED = "screensaver_enabled";
   5935 
   5936         /**
   5937          * The user's chosen screensaver components.
   5938          *
   5939          * These will be launched by the PhoneWindowManager after a timeout when not on
   5940          * battery, or upon dock insertion (if SCREENSAVER_ACTIVATE_ON_DOCK is set to 1).
   5941          * @hide
   5942          */
   5943         public static final String SCREENSAVER_COMPONENTS = "screensaver_components";
   5944 
   5945         /**
   5946          * If screensavers are enabled, whether the screensaver should be automatically launched
   5947          * when the device is inserted into a (desk) dock.
   5948          * @hide
   5949          */
   5950         public static final String SCREENSAVER_ACTIVATE_ON_DOCK = "screensaver_activate_on_dock";
   5951 
   5952         /**
   5953          * If screensavers are enabled, whether the screensaver should be automatically launched
   5954          * when the screen times out when not on battery.
   5955          * @hide
   5956          */
   5957         public static final String SCREENSAVER_ACTIVATE_ON_SLEEP = "screensaver_activate_on_sleep";
   5958 
   5959         /**
   5960          * If screensavers are enabled, the default screensaver component.
   5961          * @hide
   5962          */
   5963         public static final String SCREENSAVER_DEFAULT_COMPONENT = "screensaver_default_component";
   5964 
   5965         /**
   5966          * The default NFC payment component
   5967          * @hide
   5968          */
   5969         public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component";
   5970 
   5971         /**
   5972          * Whether NFC payment is handled by the foreground application or a default.
   5973          * @hide
   5974          */
   5975         public static final String NFC_PAYMENT_FOREGROUND = "nfc_payment_foreground";
   5976 
   5977         /**
   5978          * Specifies the package name currently configured to be the primary sms application
   5979          * @hide
   5980          */
   5981         public static final String SMS_DEFAULT_APPLICATION = "sms_default_application";
   5982 
   5983         /**
   5984          * Specifies the package name currently configured to be the default dialer application
   5985          * @hide
   5986          */
   5987         public static final String DIALER_DEFAULT_APPLICATION = "dialer_default_application";
   5988 
   5989         /**
   5990          * Specifies the package name currently configured to be the emergency assistance application
   5991          *
   5992          * @see android.telephony.TelephonyManager#ACTION_EMERGENCY_ASSISTANCE
   5993          *
   5994          * @hide
   5995          */
   5996         public static final String EMERGENCY_ASSISTANCE_APPLICATION = "emergency_assistance_application";
   5997 
   5998         /**
   5999          * Specifies whether the current app context on scren (assist data) will be sent to the
   6000          * assist application (active voice interaction service).
   6001          *
   6002          * @hide
   6003          */
   6004         public static final String ASSIST_STRUCTURE_ENABLED = "assist_structure_enabled";
   6005 
   6006         /**
   6007          * Specifies whether a screenshot of the screen contents will be sent to the assist
   6008          * application (active voice interaction service).
   6009          *
   6010          * @hide
   6011          */
   6012         public static final String ASSIST_SCREENSHOT_ENABLED = "assist_screenshot_enabled";
   6013 
   6014         /**
   6015          * Names of the service components that the current user has explicitly allowed to
   6016          * see all of the user's notifications, separated by ':'.
   6017          *
   6018          * @hide
   6019          */
   6020         public static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners";
   6021 
   6022         /**
   6023          * Names of the packages that the current user has explicitly allowed to
   6024          * manage notification policy configuration, separated by ':'.
   6025          *
   6026          * @hide
   6027          */
   6028         @TestApi
   6029         public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES =
   6030                 "enabled_notification_policy_access_packages";
   6031 
   6032         /** @hide */
   6033         public static final String BAR_SERVICE_COMPONENT = "bar_service_component";
   6034 
   6035         /** @hide */
   6036         public static final String VOLUME_CONTROLLER_SERVICE_COMPONENT
   6037                 = "volume_controller_service_component";
   6038 
   6039         /** @hide */
   6040         public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations";
   6041 
   6042         /**
   6043          * This is the query URI for finding a print service to install.
   6044          *
   6045          * @hide
   6046          */
   6047         public static final String PRINT_SERVICE_SEARCH_URI = "print_service_search_uri";
   6048 
   6049         /**
   6050          * This is the query URI for finding a NFC payment service to install.
   6051          *
   6052          * @hide
   6053          */
   6054         public static final String PAYMENT_SERVICE_SEARCH_URI = "payment_service_search_uri";
   6055 
   6056         /**
   6057          * If enabled, apps should try to skip any introductory hints on first launch. This might
   6058          * apply to users that are already familiar with the environment or temporary users.
   6059          * <p>
   6060          * Type : int (0 to show hints, 1 to skip showing hints)
   6061          */
   6062         public static final String SKIP_FIRST_USE_HINTS = "skip_first_use_hints";
   6063 
   6064         /**
   6065          * Persisted playback time after a user confirmation of an unsafe volume level.
   6066          *
   6067          * @hide
   6068          */
   6069         public static final String UNSAFE_VOLUME_MUSIC_ACTIVE_MS = "unsafe_volume_music_active_ms";
   6070 
   6071         /**
   6072          * This preference enables notification display on the lockscreen.
   6073          * @hide
   6074          */
   6075         public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS =
   6076                 "lock_screen_show_notifications";
   6077 
   6078         /**
   6079          * List of TV inputs that are currently hidden. This is a string
   6080          * containing the IDs of all hidden TV inputs. Each ID is encoded by
   6081          * {@link android.net.Uri#encode(String)} and separated by ':'.
   6082          * @hide
   6083          */
   6084         public static final String TV_INPUT_HIDDEN_INPUTS = "tv_input_hidden_inputs";
   6085 
   6086         /**
   6087          * List of custom TV input labels. This is a string containing <TV input id, custom name>
   6088          * pairs. TV input id and custom name are encoded by {@link android.net.Uri#encode(String)}
   6089          * and separated by ','. Each pair is separated by ':'.
   6090          * @hide
   6091          */
   6092         public static final String TV_INPUT_CUSTOM_LABELS = "tv_input_custom_labels";
   6093 
   6094         /**
   6095          * Whether automatic routing of system audio to USB audio peripheral is disabled.
   6096          * The value is boolean (1 or 0), where 1 means automatic routing is disabled,
   6097          * and 0 means automatic routing is enabled.
   6098          *
   6099          * @hide
   6100          */
   6101         public static final String USB_AUDIO_AUTOMATIC_ROUTING_DISABLED =
   6102                 "usb_audio_automatic_routing_disabled";
   6103 
   6104         /**
   6105          * The timeout in milliseconds before the device fully goes to sleep after
   6106          * a period of inactivity.  This value sets an upper bound on how long the device
   6107          * will stay awake or dreaming without user activity.  It should generally
   6108          * be longer than {@link Settings.System#SCREEN_OFF_TIMEOUT} as otherwise the device
   6109          * will sleep before it ever has a chance to dream.
   6110          * <p>
   6111          * Use -1 to disable this timeout.
   6112          * </p>
   6113          *
   6114          * @hide
   6115          */
   6116         public static final String SLEEP_TIMEOUT = "sleep_timeout";
   6117 
   6118         /**
   6119          * Controls whether double tap to wake is enabled.
   6120          * @hide
   6121          */
   6122         public static final String DOUBLE_TAP_TO_WAKE = "double_tap_to_wake";
   6123 
   6124         /**
   6125          * The current assistant component. It could be a voice interaction service,
   6126          * or an activity that handles ACTION_ASSIST, or empty which means using the default
   6127          * handling.
   6128          *
   6129          * @hide
   6130          */
   6131         public static final String ASSISTANT = "assistant";
   6132 
   6133         /**
   6134          * Whether the camera launch gesture should be disabled.
   6135          *
   6136          * @hide
   6137          */
   6138         public static final String CAMERA_GESTURE_DISABLED = "camera_gesture_disabled";
   6139 
   6140         /**
   6141          * Whether the camera launch gesture to double tap the power button when the screen is off
   6142          * should be disabled.
   6143          *
   6144          * @hide
   6145          */
   6146         public static final String CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED =
   6147                 "camera_double_tap_power_gesture_disabled";
   6148 
   6149         /**
   6150 
   6151         /**
   6152          * Behavior of twilight on the device.
   6153          * One of {@link #TWILIGHT_MODE_LOCKED_OFF}, {@link #TWILIGHT_MODE_LOCKED_ON}
   6154          * or {@link #TWILIGHT_MODE_AUTO}.
   6155          * @hide
   6156          */
   6157         public static final String TWILIGHT_MODE = "twilight_mode";
   6158 
   6159         /**
   6160          * Twilight mode always off.
   6161          * @hide
   6162          */
   6163         public static final int TWILIGHT_MODE_LOCKED_OFF = 0;
   6164 
   6165         /**
   6166          * Twilight mode always on.
   6167          * @hide
   6168          */
   6169         public static final int TWILIGHT_MODE_LOCKED_ON = 1;
   6170 
   6171         /**
   6172          * Twilight mode auto.
   6173          * @hide
   6174          */
   6175         public static final int TWILIGHT_MODE_AUTO = 2;
   6176 
   6177         /**
   6178          * Twilight mode auto, temporarily overriden to on.
   6179          * @hide
   6180          */
   6181         public static final int TWILIGHT_MODE_AUTO_OVERRIDE_OFF = 3;
   6182 
   6183         /**
   6184          * Twilight mode auto, temporarily overriden to off.
   6185          * @hide
   6186          */
   6187         public static final int TWILIGHT_MODE_AUTO_OVERRIDE_ON = 4;
   6188 
   6189         /**
   6190          * Whether brightness should automatically adjust based on twilight state.
   6191          * @hide
   6192          */
   6193         public static final String BRIGHTNESS_USE_TWILIGHT = "brightness_use_twilight";
   6194 
   6195         /**
   6196          * Names of the service components that the current user has explicitly allowed to
   6197          * be a VR mode listener, separated by ':'.
   6198          *
   6199          * @hide
   6200          */
   6201         public static final String ENABLED_VR_LISTENERS = "enabled_vr_listeners";
   6202 
   6203         /**
   6204          * Behavior of the display while in VR mode.
   6205          *
   6206          * One of {@link #VR_DISPLAY_MODE_LOW_PERSISTENCE} or {@link #VR_DISPLAY_MODE_OFF}.
   6207          *
   6208          * @hide
   6209          */
   6210         public static final String VR_DISPLAY_MODE = "vr_display_mode";
   6211 
   6212         /**
   6213          * Lower the display persistence while the system is in VR mode.
   6214          *
   6215          * @see PackageManager#FEATURE_VR_MODE_HIGH_PERFORMANCE
   6216          *
   6217          * @hide.
   6218          */
   6219         public static final int VR_DISPLAY_MODE_LOW_PERSISTENCE = 0;
   6220 
   6221         /**
   6222          * Do not alter the display persistence while the system is in VR mode.
   6223          *
   6224          * @see PackageManager#FEATURE_VR_MODE_HIGH_PERFORMANCE
   6225          *
   6226          * @hide.
   6227          */
   6228         public static final int VR_DISPLAY_MODE_OFF = 1;
   6229 
   6230         /**
   6231          * Whether parent user can access remote contact in managed profile.
   6232          *
   6233          * @hide
   6234          */
   6235         public static final String MANAGED_PROFILE_CONTACT_REMOTE_SEARCH =
   6236                 "managed_profile_contact_remote_search";
   6237 
   6238         /**
   6239          * This are the settings to be backed up.
   6240          *
   6241          * NOTE: Settings are backed up and restored in the order they appear
   6242          *       in this array. If you have one setting depending on another,
   6243          *       make sure that they are ordered appropriately.
   6244          *
   6245          * @hide
   6246          */
   6247         public static final String[] SETTINGS_TO_BACKUP = {
   6248             BUGREPORT_IN_POWER_MENU,                            // moved to global
   6249             ALLOW_MOCK_LOCATION,
   6250             PARENTAL_CONTROL_ENABLED,
   6251             PARENTAL_CONTROL_REDIRECT_URL,
   6252             USB_MASS_STORAGE_ENABLED,                           // moved to global
   6253             ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
   6254             ACCESSIBILITY_DISPLAY_DALTONIZER,
   6255             ACCESSIBILITY_DISPLAY_COLOR_MATRIX,
   6256             ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
   6257             ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
   6258             ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
   6259             ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE,
   6260             ACCESSIBILITY_SCRIPT_INJECTION,
   6261             ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
   6262             ENABLED_ACCESSIBILITY_SERVICES,
   6263             ENABLED_NOTIFICATION_LISTENERS,
   6264             ENABLED_VR_LISTENERS,
   6265             ENABLED_INPUT_METHODS,
   6266             TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
   6267             TOUCH_EXPLORATION_ENABLED,
   6268             ACCESSIBILITY_ENABLED,
   6269             ACCESSIBILITY_SPEAK_PASSWORD,
   6270             ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
   6271             ACCESSIBILITY_CAPTIONING_PRESET,
   6272             ACCESSIBILITY_CAPTIONING_ENABLED,
   6273             ACCESSIBILITY_CAPTIONING_LOCALE,
   6274             ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
   6275             ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
   6276             ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
   6277             ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
   6278             ACCESSIBILITY_CAPTIONING_TYPEFACE,
   6279             ACCESSIBILITY_CAPTIONING_FONT_SCALE,
   6280             ACCESSIBILITY_CAPTIONING_WINDOW_COLOR,
   6281             TTS_USE_DEFAULTS,
   6282             TTS_DEFAULT_RATE,
   6283             TTS_DEFAULT_PITCH,
   6284             TTS_DEFAULT_SYNTH,
   6285             TTS_DEFAULT_LANG,
   6286             TTS_DEFAULT_COUNTRY,
   6287             TTS_ENABLED_PLUGINS,
   6288             TTS_DEFAULT_LOCALE,
   6289             SHOW_IME_WITH_HARD_KEYBOARD,
   6290             WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,            // moved to global
   6291             WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,               // moved to global
   6292             WIFI_NUM_OPEN_NETWORKS_KEPT,                        // moved to global
   6293             SELECTED_SPELL_CHECKER,
   6294             SELECTED_SPELL_CHECKER_SUBTYPE,
   6295             SPELL_CHECKER_ENABLED,
   6296             MOUNT_PLAY_NOTIFICATION_SND,
   6297             MOUNT_UMS_AUTOSTART,
   6298             MOUNT_UMS_PROMPT,
   6299             MOUNT_UMS_NOTIFY_ENABLED,
   6300             SLEEP_TIMEOUT,
   6301             DOUBLE_TAP_TO_WAKE,
   6302             WAKE_GESTURE_ENABLED,
   6303             LONG_PRESS_TIMEOUT,
   6304             CAMERA_GESTURE_DISABLED,
   6305             ACCESSIBILITY_AUTOCLICK_ENABLED,
   6306             ACCESSIBILITY_AUTOCLICK_DELAY,
   6307             ACCESSIBILITY_LARGE_POINTER_ICON,
   6308             PREFERRED_TTY_MODE,
   6309             ENHANCED_VOICE_PRIVACY_ENABLED,
   6310             TTY_MODE_ENABLED,
   6311             INCALL_POWER_BUTTON_BEHAVIOR
   6312         };
   6313 
   6314         /**
   6315          * These entries are considered common between the personal and the managed profile,
   6316          * since the managed profile doesn't get to change them.
   6317          */
   6318         private static final Set<String> CLONE_TO_MANAGED_PROFILE = new ArraySet<>();
   6319 
   6320         static {
   6321             CLONE_TO_MANAGED_PROFILE.add(ACCESSIBILITY_ENABLED);
   6322             CLONE_TO_MANAGED_PROFILE.add(ALLOW_MOCK_LOCATION);
   6323             CLONE_TO_MANAGED_PROFILE.add(ALLOWED_GEOLOCATION_ORIGINS);
   6324             CLONE_TO_MANAGED_PROFILE.add(DEFAULT_INPUT_METHOD);
   6325             CLONE_TO_MANAGED_PROFILE.add(ENABLED_ACCESSIBILITY_SERVICES);
   6326             CLONE_TO_MANAGED_PROFILE.add(ENABLED_INPUT_METHODS);
   6327             CLONE_TO_MANAGED_PROFILE.add(LOCATION_MODE);
   6328             CLONE_TO_MANAGED_PROFILE.add(LOCATION_PREVIOUS_MODE);
   6329             CLONE_TO_MANAGED_PROFILE.add(LOCATION_PROVIDERS_ALLOWED);
   6330             CLONE_TO_MANAGED_PROFILE.add(SELECTED_INPUT_METHOD_SUBTYPE);
   6331             CLONE_TO_MANAGED_PROFILE.add(SELECTED_SPELL_CHECKER);
   6332             CLONE_TO_MANAGED_PROFILE.add(SELECTED_SPELL_CHECKER_SUBTYPE);
   6333         }
   6334 
   6335         /** @hide */
   6336         public static void getCloneToManagedProfileSettings(Set<String> outKeySet) {
   6337             outKeySet.addAll(CLONE_TO_MANAGED_PROFILE);
   6338         }
   6339 
   6340         /**
   6341          * Helper method for determining if a location provider is enabled.
   6342          *
   6343          * @param cr the content resolver to use
   6344          * @param provider the location provider to query
   6345          * @return true if the provider is enabled
   6346          *
   6347          * @deprecated use {@link #LOCATION_MODE} or
   6348          *             {@link LocationManager#isProviderEnabled(String)}
   6349          */
   6350         @Deprecated
   6351         public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) {
   6352             return isLocationProviderEnabledForUser(cr, provider, UserHandle.myUserId());
   6353         }
   6354 
   6355         /**
   6356          * Helper method for determining if a location provider is enabled.
   6357          * @param cr the content resolver to use
   6358          * @param provider the location provider to query
   6359          * @param userId the userId to query
   6360          * @return true if the provider is enabled
   6361          * @deprecated use {@link #LOCATION_MODE} or
   6362          *             {@link LocationManager#isProviderEnabled(String)}
   6363          * @hide
   6364          */
   6365         @Deprecated
   6366         public static final boolean isLocationProviderEnabledForUser(ContentResolver cr, String provider, int userId) {
   6367             String allowedProviders = Settings.Secure.getStringForUser(cr,
   6368                     LOCATION_PROVIDERS_ALLOWED, userId);
   6369             return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
   6370         }
   6371 
   6372         /**
   6373          * Thread-safe method for enabling or disabling a single location provider.
   6374          * @param cr the content resolver to use
   6375          * @param provider the location provider to enable or disable
   6376          * @param enabled true if the provider should be enabled
   6377          * @deprecated use {@link #putInt(ContentResolver, String, int)} and {@link #LOCATION_MODE}
   6378          */
   6379         @Deprecated
   6380         public static final void setLocationProviderEnabled(ContentResolver cr,
   6381                 String provider, boolean enabled) {
   6382             setLocationProviderEnabledForUser(cr, provider, enabled, UserHandle.myUserId());
   6383         }
   6384 
   6385         /**
   6386          * Thread-safe method for enabling or disabling a single location provider.
   6387          *
   6388          * @param cr the content resolver to use
   6389          * @param provider the location provider to enable or disable
   6390          * @param enabled true if the provider should be enabled
   6391          * @param userId the userId for which to enable/disable providers
   6392          * @return true if the value was set, false on database errors
   6393          * @deprecated use {@link #putIntForUser(ContentResolver, String, int, int)} and
   6394          *             {@link #LOCATION_MODE}
   6395          * @hide
   6396          */
   6397         @Deprecated
   6398         public static final boolean setLocationProviderEnabledForUser(ContentResolver cr,
   6399                 String provider, boolean enabled, int userId) {
   6400             synchronized (mLocationSettingsLock) {
   6401                 // to ensure thread safety, we write the provider name with a '+' or '-'
   6402                 // and let the SettingsProvider handle it rather than reading and modifying
   6403                 // the list of enabled providers.
   6404                 if (enabled) {
   6405                     provider = "+" + provider;
   6406                 } else {
   6407                     provider = "-" + provider;
   6408                 }
   6409                 return putStringForUser(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider,
   6410                         userId);
   6411             }
   6412         }
   6413 
   6414         /**
   6415          * Saves the current location mode into {@link #LOCATION_PREVIOUS_MODE}.
   6416          */
   6417         private static final boolean saveLocationModeForUser(ContentResolver cr, int userId) {
   6418             final int mode = getLocationModeForUser(cr, userId);
   6419             return putIntForUser(cr, Settings.Secure.LOCATION_PREVIOUS_MODE, mode, userId);
   6420         }
   6421 
   6422         /**
   6423          * Restores the current location mode from {@link #LOCATION_PREVIOUS_MODE}.
   6424          */
   6425         private static final boolean restoreLocationModeForUser(ContentResolver cr, int userId) {
   6426             int mode = getIntForUser(cr, Settings.Secure.LOCATION_PREVIOUS_MODE,
   6427                     LOCATION_MODE_HIGH_ACCURACY, userId);
   6428             // Make sure that the previous mode is never "off". Otherwise the user won't be able to
   6429             // turn on location any longer.
   6430             if (mode == LOCATION_MODE_OFF) {
   6431                 mode = LOCATION_MODE_HIGH_ACCURACY;
   6432             }
   6433             return setLocationModeForUser(cr, mode, userId);
   6434         }
   6435 
   6436         /**
   6437          * Thread-safe method for setting the location mode to one of
   6438          * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY},
   6439          * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}.
   6440          *
   6441          * @param cr the content resolver to use
   6442          * @param mode such as {@link #LOCATION_MODE_HIGH_ACCURACY}
   6443          * @param userId the userId for which to change mode
   6444          * @return true if the value was set, false on database errors
   6445          *
   6446          * @throws IllegalArgumentException if mode is not one of the supported values
   6447          */
   6448         private static final boolean setLocationModeForUser(ContentResolver cr, int mode,
   6449                 int userId) {
   6450             synchronized (mLocationSettingsLock) {
   6451                 boolean gps = false;
   6452                 boolean network = false;
   6453                 switch (mode) {
   6454                     case LOCATION_MODE_PREVIOUS:
   6455                         // Retrieve the actual mode and set to that mode.
   6456                         return restoreLocationModeForUser(cr, userId);
   6457                     case LOCATION_MODE_OFF:
   6458                         saveLocationModeForUser(cr, userId);
   6459                         break;
   6460                     case LOCATION_MODE_SENSORS_ONLY:
   6461                         gps = true;
   6462                         break;
   6463                     case LOCATION_MODE_BATTERY_SAVING:
   6464                         network = true;
   6465                         break;
   6466                     case LOCATION_MODE_HIGH_ACCURACY:
   6467                         gps = true;
   6468                         network = true;
   6469                         break;
   6470                     default:
   6471                         throw new IllegalArgumentException("Invalid location mode: " + mode);
   6472                 }
   6473                 // Note it's important that we set the NLP mode first. The Google implementation
   6474                 // of NLP clears its NLP consent setting any time it receives a
   6475                 // LocationManager.PROVIDERS_CHANGED_ACTION broadcast and NLP is disabled. Also,
   6476                 // it shows an NLP consent dialog any time it receives the broadcast, NLP is
   6477                 // enabled, and the NLP consent is not set. If 1) we were to enable GPS first,
   6478                 // 2) a setup wizard has its own NLP consent UI that sets the NLP consent setting,
   6479                 // and 3) the receiver happened to complete before we enabled NLP, then the Google
   6480                 // NLP would detect the attempt to enable NLP and show a redundant NLP consent
   6481                 // dialog. Then the people who wrote the setup wizard would be sad.
   6482                 boolean nlpSuccess = Settings.Secure.setLocationProviderEnabledForUser(
   6483                         cr, LocationManager.NETWORK_PROVIDER, network, userId);
   6484                 boolean gpsSuccess = Settings.Secure.setLocationProviderEnabledForUser(
   6485                         cr, LocationManager.GPS_PROVIDER, gps, userId);
   6486                 return gpsSuccess && nlpSuccess;
   6487             }
   6488         }
   6489 
   6490         /**
   6491          * Thread-safe method for reading the location mode, returns one of
   6492          * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY},
   6493          * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}.
   6494          *
   6495          * @param cr the content resolver to use
   6496          * @param userId the userId for which to read the mode
   6497          * @return the location mode
   6498          */
   6499         private static final int getLocationModeForUser(ContentResolver cr, int userId) {
   6500             synchronized (mLocationSettingsLock) {
   6501                 boolean gpsEnabled = Settings.Secure.isLocationProviderEnabledForUser(
   6502                         cr, LocationManager.GPS_PROVIDER, userId);
   6503                 boolean networkEnabled = Settings.Secure.isLocationProviderEnabledForUser(
   6504                         cr, LocationManager.NETWORK_PROVIDER, userId);
   6505                 if (gpsEnabled && networkEnabled) {
   6506                     return LOCATION_MODE_HIGH_ACCURACY;
   6507                 } else if (gpsEnabled) {
   6508                     return LOCATION_MODE_SENSORS_ONLY;
   6509                 } else if (networkEnabled) {
   6510                     return LOCATION_MODE_BATTERY_SAVING;
   6511                 } else {
   6512                     return LOCATION_MODE_OFF;
   6513                 }
   6514             }
   6515         }
   6516     }
   6517 
   6518     /**
   6519      * Global system settings, containing preferences that always apply identically
   6520      * to all defined users.  Applications can read these but are not allowed to write;
   6521      * like the "Secure" settings, these are for preferences that the user must
   6522      * explicitly modify through the system UI or specialized APIs for those values.
   6523      */
   6524     public static final class Global extends NameValueTable {
   6525         /**
   6526          * The content:// style URL for global secure settings items.  Not public.
   6527          */
   6528         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/global");
   6529 
   6530         /**
   6531          * Whether users are allowed to add more users or guest from lockscreen.
   6532          * <p>
   6533          * Type: int
   6534          * @hide
   6535          */
   6536         public static final String ADD_USERS_WHEN_LOCKED = "add_users_when_locked";
   6537 
   6538         /**
   6539          * Setting whether the global gesture for enabling accessibility is enabled.
   6540          * If this gesture is enabled the user will be able to perfrom it to enable
   6541          * the accessibility state without visiting the settings app.
   6542          * @hide
   6543          */
   6544         public static final String ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED =
   6545                 "enable_accessibility_global_gesture_enabled";
   6546 
   6547         /**
   6548          * Whether Airplane Mode is on.
   6549          */
   6550         public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
   6551 
   6552         /**
   6553          * Whether Theater Mode is on.
   6554          * {@hide}
   6555          */
   6556         @SystemApi
   6557         public static final String THEATER_MODE_ON = "theater_mode_on";
   6558 
   6559         /**
   6560          * Constant for use in AIRPLANE_MODE_RADIOS to specify Bluetooth radio.
   6561          */
   6562         public static final String RADIO_BLUETOOTH = "bluetooth";
   6563 
   6564         /**
   6565          * Constant for use in AIRPLANE_MODE_RADIOS to specify Wi-Fi radio.
   6566          */
   6567         public static final String RADIO_WIFI = "wifi";
   6568 
   6569         /**
   6570          * {@hide}
   6571          */
   6572         public static final String RADIO_WIMAX = "wimax";
   6573         /**
   6574          * Constant for use in AIRPLANE_MODE_RADIOS to specify Cellular radio.
   6575          */
   6576         public static final String RADIO_CELL = "cell";
   6577 
   6578         /**
   6579          * Constant for use in AIRPLANE_MODE_RADIOS to specify NFC radio.
   6580          */
   6581         public static final String RADIO_NFC = "nfc";
   6582 
   6583         /**
   6584          * A comma separated list of radios that need to be disabled when airplane mode
   6585          * is on. This overrides WIFI_ON and BLUETOOTH_ON, if Wi-Fi and bluetooth are
   6586          * included in the comma separated list.
   6587          */
   6588         public static final String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
   6589 
   6590         /**
   6591          * A comma separated list of radios that should to be disabled when airplane mode
   6592          * is on, but can be manually reenabled by the user.  For example, if RADIO_WIFI is
   6593          * added to both AIRPLANE_MODE_RADIOS and AIRPLANE_MODE_TOGGLEABLE_RADIOS, then Wifi
   6594          * will be turned off when entering airplane mode, but the user will be able to reenable
   6595          * Wifi in the Settings app.
   6596          *
   6597          * {@hide}
   6598          */
   6599         public static final String AIRPLANE_MODE_TOGGLEABLE_RADIOS = "airplane_mode_toggleable_radios";
   6600 
   6601         /**
   6602          * A Long representing a bitmap of profiles that should be disabled when bluetooth starts.
   6603          * See {@link android.bluetooth.BluetoothProfile}.
   6604          * {@hide}
   6605          */
   6606         public static final String BLUETOOTH_DISABLED_PROFILES = "bluetooth_disabled_profiles";
   6607 
   6608         /**
   6609          * A semi-colon separated list of Bluetooth interoperability workarounds.
   6610          * Each entry is a partial Bluetooth device address string and an integer representing
   6611          * the feature to be disabled, separated by a comma. The integer must correspond
   6612          * to a interoperability feature as defined in "interop.h" in /system/bt.
   6613          * <p>
   6614          * Example: <br/>
   6615          *   "00:11:22,0;01:02:03:04,2"
   6616          * @hide
   6617          */
   6618        public static final String BLUETOOTH_INTEROPERABILITY_LIST = "bluetooth_interoperability_list";
   6619 
   6620         /**
   6621          * The policy for deciding when Wi-Fi should go to sleep (which will in
   6622          * turn switch to using the mobile data as an Internet connection).
   6623          * <p>
   6624          * Set to one of {@link #WIFI_SLEEP_POLICY_DEFAULT},
   6625          * {@link #WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED}, or
   6626          * {@link #WIFI_SLEEP_POLICY_NEVER}.
   6627          */
   6628         public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
   6629 
   6630         /**
   6631          * Value for {@link #WIFI_SLEEP_POLICY} to use the default Wi-Fi sleep
   6632          * policy, which is to sleep shortly after the turning off
   6633          * according to the {@link #STAY_ON_WHILE_PLUGGED_IN} setting.
   6634          */
   6635         public static final int WIFI_SLEEP_POLICY_DEFAULT = 0;
   6636 
   6637         /**
   6638          * Value for {@link #WIFI_SLEEP_POLICY} to use the default policy when
   6639          * the device is on battery, and never go to sleep when the device is
   6640          * plugged in.
   6641          */
   6642         public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1;
   6643 
   6644         /**
   6645          * Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep.
   6646          */
   6647         public static final int WIFI_SLEEP_POLICY_NEVER = 2;
   6648 
   6649         /**
   6650          * Value to specify if the user prefers the date, time and time zone
   6651          * to be automatically fetched from the network (NITZ). 1=yes, 0=no
   6652          */
   6653         public static final String AUTO_TIME = "auto_time";
   6654 
   6655         /**
   6656          * Value to specify if the user prefers the time zone
   6657          * to be automatically fetched from the network (NITZ). 1=yes, 0=no
   6658          */
   6659         public static final String AUTO_TIME_ZONE = "auto_time_zone";
   6660 
   6661         /**
   6662          * URI for the car dock "in" event sound.
   6663          * @hide
   6664          */
   6665         public static final String CAR_DOCK_SOUND = "car_dock_sound";
   6666 
   6667         /**
   6668          * URI for the car dock "out" event sound.
   6669          * @hide
   6670          */
   6671         public static final String CAR_UNDOCK_SOUND = "car_undock_sound";
   6672 
   6673         /**
   6674          * URI for the desk dock "in" event sound.
   6675          * @hide
   6676          */
   6677         public static final String DESK_DOCK_SOUND = "desk_dock_sound";
   6678 
   6679         /**
   6680          * URI for the desk dock "out" event sound.
   6681          * @hide
   6682          */
   6683         public static final String DESK_UNDOCK_SOUND = "desk_undock_sound";
   6684 
   6685         /**
   6686          * Whether to play a sound for dock events.
   6687          * @hide
   6688          */
   6689         public static final String DOCK_SOUNDS_ENABLED = "dock_sounds_enabled";
   6690 
   6691         /**
   6692          * URI for the "device locked" (keyguard shown) sound.
   6693          * @hide
   6694          */
   6695         public static final String LOCK_SOUND = "lock_sound";
   6696 
   6697         /**
   6698          * URI for the "device unlocked" sound.
   6699          * @hide
   6700          */
   6701         public static final String UNLOCK_SOUND = "unlock_sound";
   6702 
   6703         /**
   6704          * URI for the "device is trusted" sound, which is played when the device enters the trusted
   6705          * state without unlocking.
   6706          * @hide
   6707          */
   6708         public static final String TRUSTED_SOUND = "trusted_sound";
   6709 
   6710         /**
   6711          * URI for the low battery sound file.
   6712          * @hide
   6713          */
   6714         public static final String LOW_BATTERY_SOUND = "low_battery_sound";
   6715 
   6716         /**
   6717          * Whether to play a sound for low-battery alerts.
   6718          * @hide
   6719          */
   6720         public static final String POWER_SOUNDS_ENABLED = "power_sounds_enabled";
   6721 
   6722         /**
   6723          * URI for the "wireless charging started" sound.
   6724          * @hide
   6725          */
   6726         public static final String WIRELESS_CHARGING_STARTED_SOUND =
   6727                 "wireless_charging_started_sound";
   6728 
   6729         /**
   6730          * Whether to play a sound for charging events.
   6731          * @hide
   6732          */
   6733         public static final String CHARGING_SOUNDS_ENABLED = "charging_sounds_enabled";
   6734 
   6735         /**
   6736          * Whether we keep the device on while the device is plugged in.
   6737          * Supported values are:
   6738          * <ul>
   6739          * <li>{@code 0} to never stay on while plugged in</li>
   6740          * <li>{@link BatteryManager#BATTERY_PLUGGED_AC} to stay on for AC charger</li>
   6741          * <li>{@link BatteryManager#BATTERY_PLUGGED_USB} to stay on for USB charger</li>
   6742          * <li>{@link BatteryManager#BATTERY_PLUGGED_WIRELESS} to stay on for wireless charger</li>
   6743          * </ul>
   6744          * These values can be OR-ed together.
   6745          */
   6746         public static final String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
   6747 
   6748         /**
   6749          * When the user has enable the option to have a "bug report" command
   6750          * in the power menu.
   6751          * @hide
   6752          */
   6753         public static final String BUGREPORT_IN_POWER_MENU = "bugreport_in_power_menu";
   6754 
   6755         /**
   6756          * Whether ADB is enabled.
   6757          */
   6758         public static final String ADB_ENABLED = "adb_enabled";
   6759 
   6760         /**
   6761          * Whether Views are allowed to save their attribute data.
   6762          * @hide
   6763          */
   6764         public static final String DEBUG_VIEW_ATTRIBUTES = "debug_view_attributes";
   6765 
   6766         /**
   6767          * Whether assisted GPS should be enabled or not.
   6768          * @hide
   6769          */
   6770         public static final String ASSISTED_GPS_ENABLED = "assisted_gps_enabled";
   6771 
   6772         /**
   6773          * Whether bluetooth is enabled/disabled
   6774          * 0=disabled. 1=enabled.
   6775          */
   6776         public static final String BLUETOOTH_ON = "bluetooth_on";
   6777 
   6778         /**
   6779          * CDMA Cell Broadcast SMS
   6780          *                            0 = CDMA Cell Broadcast SMS disabled
   6781          *                            1 = CDMA Cell Broadcast SMS enabled
   6782          * @hide
   6783          */
   6784         public static final String CDMA_CELL_BROADCAST_SMS =
   6785                 "cdma_cell_broadcast_sms";
   6786 
   6787         /**
   6788          * The CDMA roaming mode 0 = Home Networks, CDMA default
   6789          *                       1 = Roaming on Affiliated networks
   6790          *                       2 = Roaming on any networks
   6791          * @hide
   6792          */
   6793         public static final String CDMA_ROAMING_MODE = "roaming_settings";
   6794 
   6795         /**
   6796          * The CDMA subscription mode 0 = RUIM/SIM (default)
   6797          *                                1 = NV
   6798          * @hide
   6799          */
   6800         public static final String CDMA_SUBSCRIPTION_MODE = "subscription_mode";
   6801 
   6802         /** Inactivity timeout to track mobile data activity.
   6803         *
   6804         * If set to a positive integer, it indicates the inactivity timeout value in seconds to
   6805         * infer the data activity of mobile network. After a period of no activity on mobile
   6806         * networks with length specified by the timeout, an {@code ACTION_DATA_ACTIVITY_CHANGE}
   6807         * intent is fired to indicate a transition of network status from "active" to "idle". Any
   6808         * subsequent activity on mobile networks triggers the firing of {@code
   6809         * ACTION_DATA_ACTIVITY_CHANGE} intent indicating transition from "idle" to "active".
   6810         *
   6811         * Network activity refers to transmitting or receiving data on the network interfaces.
   6812         *
   6813         * Tracking is disabled if set to zero or negative value.
   6814         *
   6815         * @hide
   6816         */
   6817        public static final String DATA_ACTIVITY_TIMEOUT_MOBILE = "data_activity_timeout_mobile";
   6818 
   6819        /** Timeout to tracking Wifi data activity. Same as {@code DATA_ACTIVITY_TIMEOUT_MOBILE}
   6820         * but for Wifi network.
   6821         * @hide
   6822         */
   6823        public static final String DATA_ACTIVITY_TIMEOUT_WIFI = "data_activity_timeout_wifi";
   6824 
   6825        /**
   6826         * Whether or not data roaming is enabled. (0 = false, 1 = true)
   6827         */
   6828        public static final String DATA_ROAMING = "data_roaming";
   6829 
   6830        /**
   6831         * The value passed to a Mobile DataConnection via bringUp which defines the
   6832         * number of retries to preform when setting up the initial connection. The default
   6833         * value defined in DataConnectionTrackerBase#DEFAULT_MDC_INITIAL_RETRY is currently 1.
   6834         * @hide
   6835         */
   6836        public static final String MDC_INITIAL_MAX_RETRY = "mdc_initial_max_retry";
   6837 
   6838        /**
   6839         * Whether any package can be on external storage. When this is true, any
   6840         * package, regardless of manifest values, is a candidate for installing
   6841         * or moving onto external storage. (0 = false, 1 = true)
   6842         * @hide
   6843         */
   6844        public static final String FORCE_ALLOW_ON_EXTERNAL = "force_allow_on_external";
   6845 
   6846         /**
   6847          * Whether any activity can be resized. When this is true, any
   6848          * activity, regardless of manifest values, can be resized for multi-window.
   6849          * (0 = false, 1 = true)
   6850          * @hide
   6851          */
   6852         public static final String DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES
   6853                 = "force_resizable_activities";
   6854 
   6855         /**
   6856          * Whether to enable experimental freeform support for windows.
   6857          * @hide
   6858          */
   6859         public static final String DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT
   6860                 = "enable_freeform_support";
   6861 
   6862        /**
   6863         * Whether user has enabled development settings.
   6864         */
   6865        public static final String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
   6866 
   6867        /**
   6868         * Whether the device has been provisioned (0 = false, 1 = true).
   6869         * <p>On a multiuser device with a separate system user, the screen may be locked
   6870         * as soon as this is set to true and further activities cannot be launched on the
   6871         * system user unless they are marked to show over keyguard.
   6872         */
   6873        public static final String DEVICE_PROVISIONED = "device_provisioned";
   6874 
   6875        /**
   6876         * Whether mobile data should be allowed while the device is being provisioned.
   6877         * This allows the provisioning process to turn off mobile data before the user
   6878         * has an opportunity to set things up, preventing other processes from burning
   6879         * precious bytes before wifi is setup.
   6880         * (0 = false, 1 = true)
   6881         * @hide
   6882         */
   6883        public static final String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED =
   6884                "device_provisioning_mobile_data";
   6885 
   6886        /**
   6887         * The saved value for WindowManagerService.setForcedDisplaySize().
   6888         * Two integers separated by a comma.  If unset, then use the real display size.
   6889         * @hide
   6890         */
   6891        public static final String DISPLAY_SIZE_FORCED = "display_size_forced";
   6892 
   6893        /**
   6894         * The saved value for WindowManagerService.setForcedDisplayScalingMode().
   6895         * 0 or unset if scaling is automatic, 1 if scaling is disabled.
   6896         * @hide
   6897         */
   6898        public static final String DISPLAY_SCALING_FORCE = "display_scaling_force";
   6899 
   6900        /**
   6901         * The maximum size, in bytes, of a download that the download manager will transfer over
   6902         * a non-wifi connection.
   6903         * @hide
   6904         */
   6905        public static final String DOWNLOAD_MAX_BYTES_OVER_MOBILE =
   6906                "download_manager_max_bytes_over_mobile";
   6907 
   6908        /**
   6909         * The recommended maximum size, in bytes, of a download that the download manager should
   6910         * transfer over a non-wifi connection. Over this size, the use will be warned, but will
   6911         * have the option to start the download over the mobile connection anyway.
   6912         * @hide
   6913         */
   6914        public static final String DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE =
   6915                "download_manager_recommended_max_bytes_over_mobile";
   6916 
   6917        /**
   6918         * @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
   6919         */
   6920        @Deprecated
   6921        public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
   6922 
   6923        /**
   6924         * Whether HDMI control shall be enabled. If disabled, no CEC/MHL command will be
   6925         * sent or processed. (0 = false, 1 = true)
   6926         * @hide
   6927         */
   6928        public static final String HDMI_CONTROL_ENABLED = "hdmi_control_enabled";
   6929 
   6930        /**
   6931         * Whether HDMI system audio is enabled. If enabled, TV internal speaker is muted,
   6932         * and the output is redirected to AV Receiver connected via
   6933         * {@Global#HDMI_SYSTEM_AUDIO_OUTPUT}.
   6934         * @hide
   6935         */
   6936        public static final String HDMI_SYSTEM_AUDIO_ENABLED = "hdmi_system_audio_enabled";
   6937 
   6938        /**
   6939         * Whether TV will automatically turn on upon reception of the CEC command
   6940         * &lt;Text View On&gt; or &lt;Image View On&gt;. (0 = false, 1 = true)
   6941         * @hide
   6942         */
   6943        public static final String HDMI_CONTROL_AUTO_WAKEUP_ENABLED =
   6944                "hdmi_control_auto_wakeup_enabled";
   6945 
   6946        /**
   6947         * Whether TV will also turn off other CEC devices when it goes to standby mode.
   6948         * (0 = false, 1 = true)
   6949         * @hide
   6950         */
   6951        public static final String HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED =
   6952                "hdmi_control_auto_device_off_enabled";
   6953 
   6954        /**
   6955         * Whether TV will switch to MHL port when a mobile device is plugged in.
   6956         * (0 = false, 1 = true)
   6957         * @hide
   6958         */
   6959        public static final String MHL_INPUT_SWITCHING_ENABLED = "mhl_input_switching_enabled";
   6960 
   6961        /**
   6962         * Whether TV will charge the mobile device connected at MHL port. (0 = false, 1 = true)
   6963         * @hide
   6964         */
   6965        public static final String MHL_POWER_CHARGE_ENABLED = "mhl_power_charge_enabled";
   6966 
   6967        /**
   6968         * Whether mobile data connections are allowed by the user.  See
   6969         * ConnectivityManager for more info.
   6970         * @hide
   6971         */
   6972        public static final String MOBILE_DATA = "mobile_data";
   6973 
   6974        /**
   6975         * Whether the mobile data connection should remain active even when higher
   6976         * priority networks like WiFi are active, to help make network switching faster.
   6977         *
   6978         * See ConnectivityService for more info.
   6979         *
   6980         * (0 = disabled, 1 = enabled)
   6981         * @hide
   6982         */
   6983        public static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on";
   6984 
   6985        /** {@hide} */
   6986        public static final String NETSTATS_ENABLED = "netstats_enabled";
   6987        /** {@hide} */
   6988        public static final String NETSTATS_POLL_INTERVAL = "netstats_poll_interval";
   6989        /** {@hide} */
   6990        public static final String NETSTATS_TIME_CACHE_MAX_AGE = "netstats_time_cache_max_age";
   6991        /** {@hide} */
   6992        public static final String NETSTATS_GLOBAL_ALERT_BYTES = "netstats_global_alert_bytes";
   6993        /** {@hide} */
   6994        public static final String NETSTATS_SAMPLE_ENABLED = "netstats_sample_enabled";
   6995 
   6996        /** {@hide} */
   6997        public static final String NETSTATS_DEV_BUCKET_DURATION = "netstats_dev_bucket_duration";
   6998        /** {@hide} */
   6999        public static final String NETSTATS_DEV_PERSIST_BYTES = "netstats_dev_persist_bytes";
   7000        /** {@hide} */
   7001        public static final String NETSTATS_DEV_ROTATE_AGE = "netstats_dev_rotate_age";
   7002        /** {@hide} */
   7003        public static final String NETSTATS_DEV_DELETE_AGE = "netstats_dev_delete_age";
   7004 
   7005        /** {@hide} */
   7006        public static final String NETSTATS_UID_BUCKET_DURATION = "netstats_uid_bucket_duration";
   7007        /** {@hide} */
   7008        public static final String NETSTATS_UID_PERSIST_BYTES = "netstats_uid_persist_bytes";
   7009        /** {@hide} */
   7010        public static final String NETSTATS_UID_ROTATE_AGE = "netstats_uid_rotate_age";
   7011        /** {@hide} */
   7012        public static final String NETSTATS_UID_DELETE_AGE = "netstats_uid_delete_age";
   7013 
   7014        /** {@hide} */
   7015        public static final String NETSTATS_UID_TAG_BUCKET_DURATION = "netstats_uid_tag_bucket_duration";
   7016        /** {@hide} */
   7017        public static final String NETSTATS_UID_TAG_PERSIST_BYTES = "netstats_uid_tag_persist_bytes";
   7018        /** {@hide} */
   7019        public static final String NETSTATS_UID_TAG_ROTATE_AGE = "netstats_uid_tag_rotate_age";
   7020        /** {@hide} */
   7021        public static final String NETSTATS_UID_TAG_DELETE_AGE = "netstats_uid_tag_delete_age";
   7022 
   7023        /**
   7024         * User preference for which network(s) should be used. Only the
   7025         * connectivity service should touch this.
   7026         */
   7027        public static final String NETWORK_PREFERENCE = "network_preference";
   7028 
   7029        /**
   7030         * Which package name to use for network scoring. If null, or if the package is not a valid
   7031         * scorer app, external network scores will neither be requested nor accepted.
   7032         * @hide
   7033         */
   7034        public static final String NETWORK_SCORER_APP = "network_scorer_app";
   7035 
   7036        /**
   7037         * If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment
   7038         * to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been
   7039         * exceeded.
   7040         * @hide
   7041         */
   7042        public static final String NITZ_UPDATE_DIFF = "nitz_update_diff";
   7043 
   7044        /**
   7045         * The length of time in milli-seconds that automatic small adjustments to
   7046         * SystemClock are ignored if NITZ_UPDATE_DIFF is not exceeded.
   7047         * @hide
   7048         */
   7049        public static final String NITZ_UPDATE_SPACING = "nitz_update_spacing";
   7050 
   7051        /** Preferred NTP server. {@hide} */
   7052        public static final String NTP_SERVER = "ntp_server";
   7053        /** Timeout in milliseconds to wait for NTP server. {@hide} */
   7054        public static final String NTP_TIMEOUT = "ntp_timeout";
   7055 
   7056        /** {@hide} */
   7057        public static final String STORAGE_BENCHMARK_INTERVAL = "storage_benchmark_interval";
   7058 
   7059        /**
   7060         * Sample validity in seconds to configure for the system DNS resolver.
   7061         * {@hide}
   7062         */
   7063        public static final String DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS =
   7064                "dns_resolver_sample_validity_seconds";
   7065 
   7066        /**
   7067         * Success threshold in percent for use with the system DNS resolver.
   7068         * {@hide}
   7069         */
   7070        public static final String DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT =
   7071                 "dns_resolver_success_threshold_percent";
   7072 
   7073        /**
   7074         * Minimum number of samples needed for statistics to be considered meaningful in the
   7075         * system DNS resolver.
   7076         * {@hide}
   7077         */
   7078        public static final String DNS_RESOLVER_MIN_SAMPLES = "dns_resolver_min_samples";
   7079 
   7080        /**
   7081         * Maximum number taken into account for statistics purposes in the system DNS resolver.
   7082         * {@hide}
   7083         */
   7084        public static final String DNS_RESOLVER_MAX_SAMPLES = "dns_resolver_max_samples";
   7085 
   7086        /**
   7087         * Whether to disable the automatic scheduling of system updates.
   7088         * 1 = system updates won't be automatically scheduled (will always
   7089         * present notification instead).
   7090         * 0 = system updates will be automatically scheduled. (default)
   7091         * @hide
   7092         */
   7093        @SystemApi
   7094        public static final String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update";
   7095 
   7096        /**
   7097         * Whether the package manager should send package verification broadcasts for verifiers to
   7098         * review apps prior to installation.
   7099         * 1 = request apps to be verified prior to installation, if a verifier exists.
   7100         * 0 = do not verify apps before installation
   7101         * @hide
   7102         */
   7103        public static final String PACKAGE_VERIFIER_ENABLE = "package_verifier_enable";
   7104 
   7105        /** Timeout for package verification.
   7106         * @hide */
   7107        public static final String PACKAGE_VERIFIER_TIMEOUT = "verifier_timeout";
   7108 
   7109        /** Default response code for package verification.
   7110         * @hide */
   7111        public static final String PACKAGE_VERIFIER_DEFAULT_RESPONSE = "verifier_default_response";
   7112 
   7113        /**
   7114         * Show package verification setting in the Settings app.
   7115         * 1 = show (default)
   7116         * 0 = hide
   7117         * @hide
   7118         */
   7119        public static final String PACKAGE_VERIFIER_SETTING_VISIBLE = "verifier_setting_visible";
   7120 
   7121        /**
   7122         * Run package verification on apps installed through ADB/ADT/USB
   7123         * 1 = perform package verification on ADB installs (default)
   7124         * 0 = bypass package verification on ADB installs
   7125         * @hide
   7126         */
   7127        public static final String PACKAGE_VERIFIER_INCLUDE_ADB = "verifier_verify_adb_installs";
   7128 
   7129        /**
   7130         * Time since last fstrim (milliseconds) after which we force one to happen
   7131         * during device startup.  If unset, the default is 3 days.
   7132         * @hide
   7133         */
   7134        public static final String FSTRIM_MANDATORY_INTERVAL = "fstrim_mandatory_interval";
   7135 
   7136        /**
   7137         * The interval in milliseconds at which to check packet counts on the
   7138         * mobile data interface when screen is on, to detect possible data
   7139         * connection problems.
   7140         * @hide
   7141         */
   7142        public static final String PDP_WATCHDOG_POLL_INTERVAL_MS =
   7143                "pdp_watchdog_poll_interval_ms";
   7144 
   7145        /**
   7146         * The interval in milliseconds at which to check packet counts on the
   7147         * mobile data interface when screen is off, to detect possible data
   7148         * connection problems.
   7149         * @hide
   7150         */
   7151        public static final String PDP_WATCHDOG_LONG_POLL_INTERVAL_MS =
   7152                "pdp_watchdog_long_poll_interval_ms";
   7153 
   7154        /**
   7155         * The interval in milliseconds at which to check packet counts on the
   7156         * mobile data interface after {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT}
   7157         * outgoing packets has been reached without incoming packets.
   7158         * @hide
   7159         */
   7160        public static final String PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS =
   7161                "pdp_watchdog_error_poll_interval_ms";
   7162 
   7163        /**
   7164         * The number of outgoing packets sent without seeing an incoming packet
   7165         * that triggers a countdown (of {@link #PDP_WATCHDOG_ERROR_POLL_COUNT}
   7166         * device is logged to the event log
   7167         * @hide
   7168         */
   7169        public static final String PDP_WATCHDOG_TRIGGER_PACKET_COUNT =
   7170                "pdp_watchdog_trigger_packet_count";
   7171 
   7172        /**
   7173         * The number of polls to perform (at {@link #PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS})
   7174         * after hitting {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT} before
   7175         * attempting data connection recovery.
   7176         * @hide
   7177         */
   7178        public static final String PDP_WATCHDOG_ERROR_POLL_COUNT =
   7179                "pdp_watchdog_error_poll_count";
   7180 
   7181        /**
   7182         * The number of failed PDP reset attempts before moving to something more
   7183         * drastic: re-registering to the network.
   7184         * @hide
   7185         */
   7186        public static final String PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT =
   7187                "pdp_watchdog_max_pdp_reset_fail_count";
   7188 
   7189        /**
   7190         * A positive value indicates how often the SamplingProfiler
   7191         * should take snapshots. Zero value means SamplingProfiler
   7192         * is disabled.
   7193         *
   7194         * @hide
   7195         */
   7196        public static final String SAMPLING_PROFILER_MS = "sampling_profiler_ms";
   7197 
   7198        /**
   7199         * URL to open browser on to allow user to manage a prepay account
   7200         * @hide
   7201         */
   7202        public static final String SETUP_PREPAID_DATA_SERVICE_URL =
   7203                "setup_prepaid_data_service_url";
   7204 
   7205        /**
   7206         * URL to attempt a GET on to see if this is a prepay device
   7207         * @hide
   7208         */
   7209        public static final String SETUP_PREPAID_DETECTION_TARGET_URL =
   7210                "setup_prepaid_detection_target_url";
   7211 
   7212        /**
   7213         * Host to check for a redirect to after an attempt to GET
   7214         * SETUP_PREPAID_DETECTION_TARGET_URL. (If we redirected there,
   7215         * this is a prepaid device with zero balance.)
   7216         * @hide
   7217         */
   7218        public static final String SETUP_PREPAID_DETECTION_REDIR_HOST =
   7219                "setup_prepaid_detection_redir_host";
   7220 
   7221        /**
   7222         * The interval in milliseconds at which to check the number of SMS sent out without asking
   7223         * for use permit, to limit the un-authorized SMS usage.
   7224         *
   7225         * @hide
   7226         */
   7227        public static final String SMS_OUTGOING_CHECK_INTERVAL_MS =
   7228                "sms_outgoing_check_interval_ms";
   7229 
   7230        /**
   7231         * The number of outgoing SMS sent without asking for user permit (of {@link
   7232         * #SMS_OUTGOING_CHECK_INTERVAL_MS}
   7233         *
   7234         * @hide
   7235         */
   7236        public static final String SMS_OUTGOING_CHECK_MAX_COUNT =
   7237                "sms_outgoing_check_max_count";
   7238 
   7239        /**
   7240         * Used to disable SMS short code confirmation - defaults to true.
   7241         * True indcates we will do the check, etc.  Set to false to disable.
   7242         * @see com.android.internal.telephony.SmsUsageMonitor
   7243         * @hide
   7244         */
   7245        public static final String SMS_SHORT_CODE_CONFIRMATION = "sms_short_code_confirmation";
   7246 
   7247         /**
   7248          * Used to select which country we use to determine premium sms codes.
   7249          * One of com.android.internal.telephony.SMSDispatcher.PREMIUM_RULE_USE_SIM,
   7250          * com.android.internal.telephony.SMSDispatcher.PREMIUM_RULE_USE_NETWORK,
   7251          * or com.android.internal.telephony.SMSDispatcher.PREMIUM_RULE_USE_BOTH.
   7252          * @hide
   7253          */
   7254         public static final String SMS_SHORT_CODE_RULE = "sms_short_code_rule";
   7255 
   7256        /**
   7257         * Used to select TCP's default initial receiver window size in segments - defaults to a build config value
   7258         * @hide
   7259         */
   7260        public static final String TCP_DEFAULT_INIT_RWND = "tcp_default_init_rwnd";
   7261 
   7262        /**
   7263         * Used to disable Tethering on a device - defaults to true
   7264         * @hide
   7265         */
   7266        public static final String TETHER_SUPPORTED = "tether_supported";
   7267 
   7268        /**
   7269         * Used to require DUN APN on the device or not - defaults to a build config value
   7270         * which defaults to false
   7271         * @hide
   7272         */
   7273        public static final String TETHER_DUN_REQUIRED = "tether_dun_required";
   7274 
   7275        /**
   7276         * Used to hold a gservices-provisioned apn value for DUN.  If set, or the
   7277         * corresponding build config values are set it will override the APN DB
   7278         * values.
   7279         * Consists of a comma seperated list of strings:
   7280         * "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
   7281         * note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN"
   7282         * @hide
   7283         */
   7284        public static final String TETHER_DUN_APN = "tether_dun_apn";
   7285 
   7286        /**
   7287         * List of carrier apps which are whitelisted to prompt the user for install when
   7288         * a sim card with matching uicc carrier privilege rules is inserted.
   7289         *
   7290         * The value is "package1;package2;..."
   7291         * @hide
   7292         */
   7293        public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
   7294 
   7295        /**
   7296         * USB Mass Storage Enabled
   7297         */
   7298        public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
   7299 
   7300        /**
   7301         * If this setting is set (to anything), then all references
   7302         * to Gmail on the device must change to Google Mail.
   7303         */
   7304        public static final String USE_GOOGLE_MAIL = "use_google_mail";
   7305 
   7306         /**
   7307          * Webview Data reduction proxy key.
   7308          * @hide
   7309          */
   7310         public static final String WEBVIEW_DATA_REDUCTION_PROXY_KEY =
   7311                 "webview_data_reduction_proxy_key";
   7312 
   7313         /**
   7314          * Whether or not the WebView fallback mechanism should be enabled.
   7315          * 0=disabled, 1=enabled.
   7316          * @hide
   7317          */
   7318         public static final String WEBVIEW_FALLBACK_LOGIC_ENABLED =
   7319                 "webview_fallback_logic_enabled";
   7320 
   7321         /**
   7322          * Name of the package used as WebView provider (if unset the provider is instead determined
   7323          * by the system).
   7324          * @hide
   7325          */
   7326         public static final String WEBVIEW_PROVIDER = "webview_provider";
   7327 
   7328         /**
   7329          * Developer setting to enable WebView multiprocess rendering.
   7330          * @hide
   7331          */
   7332         @SystemApi
   7333         public static final String WEBVIEW_MULTIPROCESS = "webview_multiprocess";
   7334 
   7335        /**
   7336         * Whether Wifi display is enabled/disabled
   7337         * 0=disabled. 1=enabled.
   7338         * @hide
   7339         */
   7340        public static final String WIFI_DISPLAY_ON = "wifi_display_on";
   7341 
   7342        /**
   7343         * Whether Wifi display certification mode is enabled/disabled
   7344         * 0=disabled. 1=enabled.
   7345         * @hide
   7346         */
   7347        public static final String WIFI_DISPLAY_CERTIFICATION_ON =
   7348                "wifi_display_certification_on";
   7349 
   7350        /**
   7351         * WPS Configuration method used by Wifi display, this setting only
   7352         * takes effect when WIFI_DISPLAY_CERTIFICATION_ON is 1 (enabled).
   7353         *
   7354         * Possible values are:
   7355         *
   7356         * WpsInfo.INVALID: use default WPS method chosen by framework
   7357         * WpsInfo.PBC    : use Push button
   7358         * WpsInfo.KEYPAD : use Keypad
   7359         * WpsInfo.DISPLAY: use Display
   7360         * @hide
   7361         */
   7362        public static final String WIFI_DISPLAY_WPS_CONFIG =
   7363            "wifi_display_wps_config";
   7364 
   7365        /**
   7366         * Whether to notify the user of open networks.
   7367         * <p>
   7368         * If not connected and the scan results have an open network, we will
   7369         * put this notification up. If we attempt to connect to a network or
   7370         * the open network(s) disappear, we remove the notification. When we
   7371         * show the notification, we will not show it again for
   7372         * {@link android.provider.Settings.Secure#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY} time.
   7373         */
   7374        public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
   7375                "wifi_networks_available_notification_on";
   7376        /**
   7377         * {@hide}
   7378         */
   7379        public static final String WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON =
   7380                "wimax_networks_available_notification_on";
   7381 
   7382        /**
   7383         * Delay (in seconds) before repeating the Wi-Fi networks available notification.
   7384         * Connecting to a network will reset the timer.
   7385         */
   7386        public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
   7387                "wifi_networks_available_repeat_delay";
   7388 
   7389        /**
   7390         * 802.11 country code in ISO 3166 format
   7391         * @hide
   7392         */
   7393        public static final String WIFI_COUNTRY_CODE = "wifi_country_code";
   7394 
   7395        /**
   7396         * The interval in milliseconds to issue wake up scans when wifi needs
   7397         * to connect. This is necessary to connect to an access point when
   7398         * device is on the move and the screen is off.
   7399         * @hide
   7400         */
   7401        public static final String WIFI_FRAMEWORK_SCAN_INTERVAL_MS =
   7402                "wifi_framework_scan_interval_ms";
   7403 
   7404        /**
   7405         * The interval in milliseconds after which Wi-Fi is considered idle.
   7406         * When idle, it is possible for the device to be switched from Wi-Fi to
   7407         * the mobile data network.
   7408         * @hide
   7409         */
   7410        public static final String WIFI_IDLE_MS = "wifi_idle_ms";
   7411 
   7412        /**
   7413         * When the number of open networks exceeds this number, the
   7414         * least-recently-used excess networks will be removed.
   7415         */
   7416        public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
   7417 
   7418        /**
   7419         * Whether the Wi-Fi should be on.  Only the Wi-Fi service should touch this.
   7420         */
   7421        public static final String WIFI_ON = "wifi_on";
   7422 
   7423        /**
   7424         * Setting to allow scans to be enabled even wifi is turned off for connectivity.
   7425         * @hide
   7426         */
   7427        public static final String WIFI_SCAN_ALWAYS_AVAILABLE =
   7428                 "wifi_scan_always_enabled";
   7429 
   7430        /**
   7431         * Settings to allow BLE scans to be enabled even when Bluetooth is turned off for
   7432         * connectivity.
   7433         * @hide
   7434         */
   7435        public static final String BLE_SCAN_ALWAYS_AVAILABLE =
   7436                "ble_scan_always_enabled";
   7437 
   7438        /**
   7439         * Used to save the Wifi_ON state prior to tethering.
   7440         * This state will be checked to restore Wifi after
   7441         * the user turns off tethering.
   7442         *
   7443         * @hide
   7444         */
   7445        public static final String WIFI_SAVED_STATE = "wifi_saved_state";
   7446 
   7447        /**
   7448         * The interval in milliseconds to scan as used by the wifi supplicant
   7449         * @hide
   7450         */
   7451        public static final String WIFI_SUPPLICANT_SCAN_INTERVAL_MS =
   7452                "wifi_supplicant_scan_interval_ms";
   7453 
   7454         /**
   7455          * whether frameworks handles wifi auto-join
   7456          * @hide
   7457          */
   7458        public static final String WIFI_ENHANCED_AUTO_JOIN =
   7459                 "wifi_enhanced_auto_join";
   7460 
   7461         /**
   7462          * whether settings show RSSI
   7463          * @hide
   7464          */
   7465         public static final String WIFI_NETWORK_SHOW_RSSI =
   7466                 "wifi_network_show_rssi";
   7467 
   7468         /**
   7469         * The interval in milliseconds to scan at supplicant when p2p is connected
   7470         * @hide
   7471         */
   7472        public static final String WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS =
   7473                "wifi_scan_interval_p2p_connected_ms";
   7474 
   7475        /**
   7476         * Whether the Wi-Fi watchdog is enabled.
   7477         */
   7478        public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
   7479 
   7480        /**
   7481         * Setting to turn off poor network avoidance on Wi-Fi. Feature is enabled by default and
   7482         * the setting needs to be set to 0 to disable it.
   7483         * @hide
   7484         */
   7485        public static final String WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED =
   7486                "wifi_watchdog_poor_network_test_enabled";
   7487 
   7488        /**
   7489         * Setting to turn on suspend optimizations at screen off on Wi-Fi. Enabled by default and
   7490         * needs to be set to 0 to disable it.
   7491         * @hide
   7492         */
   7493        public static final String WIFI_SUSPEND_OPTIMIZATIONS_ENABLED =
   7494                "wifi_suspend_optimizations_enabled";
   7495 
   7496        /**
   7497         * Setting to enable verbose logging in Wi-Fi; disabled by default, and setting to 1
   7498         * will enable it. In the future, additional values may be supported.
   7499         * @hide
   7500         */
   7501        public static final String WIFI_VERBOSE_LOGGING_ENABLED =
   7502                "wifi_verbose_logging_enabled";
   7503 
   7504        /**
   7505         * The maximum number of times we will retry a connection to an access
   7506         * point for which we have failed in acquiring an IP address from DHCP.
   7507         * A value of N means that we will make N+1 connection attempts in all.
   7508         */
   7509        public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
   7510 
   7511        /**
   7512         * Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile
   7513         * data connectivity to be established after a disconnect from Wi-Fi.
   7514         */
   7515        public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
   7516            "wifi_mobile_data_transition_wakelock_timeout_ms";
   7517 
   7518        /**
   7519         * This setting controls whether WiFi configurations created by a Device Owner app
   7520         * should be locked down (that is, be editable or removable only by the Device Owner App,
   7521         * not even by Settings app).
   7522         * This setting takes integer values. Non-zero values mean DO created configurations
   7523         * are locked down. Value of zero means they are not. Default value in the absence of
   7524         * actual value to this setting is 0.
   7525         */
   7526        public static final String WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN =
   7527                "wifi_device_owner_configs_lockdown";
   7528 
   7529        /**
   7530         * The operational wifi frequency band
   7531         * Set to one of {@link WifiManager#WIFI_FREQUENCY_BAND_AUTO},
   7532         * {@link WifiManager#WIFI_FREQUENCY_BAND_5GHZ} or
   7533         * {@link WifiManager#WIFI_FREQUENCY_BAND_2GHZ}
   7534         *
   7535         * @hide
   7536         */
   7537        public static final String WIFI_FREQUENCY_BAND = "wifi_frequency_band";
   7538 
   7539        /**
   7540         * The Wi-Fi peer-to-peer device name
   7541         * @hide
   7542         */
   7543        public static final String WIFI_P2P_DEVICE_NAME = "wifi_p2p_device_name";
   7544 
   7545        /**
   7546         * The min time between wifi disable and wifi enable
   7547         * @hide
   7548         */
   7549        public static final String WIFI_REENABLE_DELAY_MS = "wifi_reenable_delay";
   7550 
   7551        /**
   7552         * Timeout for ephemeral networks when all known BSSIDs go out of range. We will disconnect
   7553         * from an ephemeral network if there is no BSSID for that network with a non-null score that
   7554         * has been seen in this time period.
   7555         *
   7556         * If this is less than or equal to zero, we use a more conservative behavior and only check
   7557         * for a non-null score from the currently connected or target BSSID.
   7558         * @hide
   7559         */
   7560        public static final String WIFI_EPHEMERAL_OUT_OF_RANGE_TIMEOUT_MS =
   7561                "wifi_ephemeral_out_of_range_timeout_ms";
   7562 
   7563        /**
   7564         * The number of milliseconds to delay when checking for data stalls during
   7565         * non-aggressive detection. (screen is turned off.)
   7566         * @hide
   7567         */
   7568        public static final String DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS =
   7569                "data_stall_alarm_non_aggressive_delay_in_ms";
   7570 
   7571        /**
   7572         * The number of milliseconds to delay when checking for data stalls during
   7573         * aggressive detection. (screen on or suspected data stall)
   7574         * @hide
   7575         */
   7576        public static final String DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS =
   7577                "data_stall_alarm_aggressive_delay_in_ms";
   7578 
   7579        /**
   7580         * The number of milliseconds to allow the provisioning apn to remain active
   7581         * @hide
   7582         */
   7583        public static final String PROVISIONING_APN_ALARM_DELAY_IN_MS =
   7584                "provisioning_apn_alarm_delay_in_ms";
   7585 
   7586        /**
   7587         * The interval in milliseconds at which to check gprs registration
   7588         * after the first registration mismatch of gprs and voice service,
   7589         * to detect possible data network registration problems.
   7590         *
   7591         * @hide
   7592         */
   7593        public static final String GPRS_REGISTER_CHECK_PERIOD_MS =
   7594                "gprs_register_check_period_ms";
   7595 
   7596        /**
   7597         * Nonzero causes Log.wtf() to crash.
   7598         * @hide
   7599         */
   7600        public static final String WTF_IS_FATAL = "wtf_is_fatal";
   7601 
   7602        /**
   7603         * Ringer mode. This is used internally, changing this value will not
   7604         * change the ringer mode. See AudioManager.
   7605         */
   7606        public static final String MODE_RINGER = "mode_ringer";
   7607 
   7608        /**
   7609         * Overlay display devices setting.
   7610         * The associated value is a specially formatted string that describes the
   7611         * size and density of simulated secondary display devices.
   7612         * <p>
   7613         * Format: {width}x{height}/{dpi};...
   7614         * </p><p>
   7615         * Example:
   7616         * <ul>
   7617         * <li><code>1280x720/213</code>: make one overlay that is 1280x720 at 213dpi.</li>
   7618         * <li><code>1920x1080/320;1280x720/213</code>: make two overlays, the first
   7619         * at 1080p and the second at 720p.</li>
   7620         * <li>If the value is empty, then no overlay display devices are created.</li>
   7621         * </ul></p>
   7622         *
   7623         * @hide
   7624         */
   7625        public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices";
   7626 
   7627         /**
   7628          * Threshold values for the duration and level of a discharge cycle,
   7629          * under which we log discharge cycle info.
   7630          *
   7631          * @hide
   7632          */
   7633         public static final String
   7634                 BATTERY_DISCHARGE_DURATION_THRESHOLD = "battery_discharge_duration_threshold";
   7635 
   7636         /** @hide */
   7637         public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
   7638 
   7639         /**
   7640          * Flag for allowing ActivityManagerService to send ACTION_APP_ERROR
   7641          * intents on application crashes and ANRs. If this is disabled, the
   7642          * crash/ANR dialog will never display the "Report" button.
   7643          * <p>
   7644          * Type: int (0 = disallow, 1 = allow)
   7645          *
   7646          * @hide
   7647          */
   7648         public static final String SEND_ACTION_APP_ERROR = "send_action_app_error";
   7649 
   7650         /**
   7651          * Maximum age of entries kept by {@link DropBoxManager}.
   7652          *
   7653          * @hide
   7654          */
   7655         public static final String DROPBOX_AGE_SECONDS = "dropbox_age_seconds";
   7656 
   7657         /**
   7658          * Maximum number of entry files which {@link DropBoxManager} will keep
   7659          * around.
   7660          *
   7661          * @hide
   7662          */
   7663         public static final String DROPBOX_MAX_FILES = "dropbox_max_files";
   7664 
   7665         /**
   7666          * Maximum amount of disk space used by {@link DropBoxManager} no matter
   7667          * what.
   7668          *
   7669          * @hide
   7670          */
   7671         public static final String DROPBOX_QUOTA_KB = "dropbox_quota_kb";
   7672 
   7673         /**
   7674          * Percent of free disk (excluding reserve) which {@link DropBoxManager}
   7675          * will use.
   7676          *
   7677          * @hide
   7678          */
   7679         public static final String DROPBOX_QUOTA_PERCENT = "dropbox_quota_percent";
   7680 
   7681         /**
   7682          * Percent of total disk which {@link DropBoxManager} will never dip
   7683          * into.
   7684          *
   7685          * @hide
   7686          */
   7687         public static final String DROPBOX_RESERVE_PERCENT = "dropbox_reserve_percent";
   7688 
   7689         /**
   7690          * Prefix for per-tag dropbox disable/enable settings.
   7691          *
   7692          * @hide
   7693          */
   7694         public static final String DROPBOX_TAG_PREFIX = "dropbox:";
   7695 
   7696         /**
   7697          * Lines of logcat to include with system crash/ANR/etc. reports, as a
   7698          * prefix of the dropbox tag of the report type. For example,
   7699          * "logcat_for_system_server_anr" controls the lines of logcat captured
   7700          * with system server ANR reports. 0 to disable.
   7701          *
   7702          * @hide
   7703          */
   7704         public static final String ERROR_LOGCAT_PREFIX = "logcat_for_";
   7705 
   7706         /**
   7707          * The interval in minutes after which the amount of free storage left
   7708          * on the device is logged to the event log
   7709          *
   7710          * @hide
   7711          */
   7712         public static final String SYS_FREE_STORAGE_LOG_INTERVAL = "sys_free_storage_log_interval";
   7713 
   7714         /**
   7715          * Threshold for the amount of change in disk free space required to
   7716          * report the amount of free space. Used to prevent spamming the logs
   7717          * when the disk free space isn't changing frequently.
   7718          *
   7719          * @hide
   7720          */
   7721         public static final String
   7722                 DISK_FREE_CHANGE_REPORTING_THRESHOLD = "disk_free_change_reporting_threshold";
   7723 
   7724         /**
   7725          * Minimum percentage of free storage on the device that is used to
   7726          * determine if the device is running low on storage. The default is 10.
   7727          * <p>
   7728          * Say this value is set to 10, the device is considered running low on
   7729          * storage if 90% or more of the device storage is filled up.
   7730          *
   7731          * @hide
   7732          */
   7733         public static final String
   7734                 SYS_STORAGE_THRESHOLD_PERCENTAGE = "sys_storage_threshold_percentage";
   7735 
   7736         /**
   7737          * Maximum byte size of the low storage threshold. This is to ensure
   7738          * that {@link #SYS_STORAGE_THRESHOLD_PERCENTAGE} does not result in an
   7739          * overly large threshold for large storage devices. Currently this must
   7740          * be less than 2GB. This default is 500MB.
   7741          *
   7742          * @hide
   7743          */
   7744         public static final String
   7745                 SYS_STORAGE_THRESHOLD_MAX_BYTES = "sys_storage_threshold_max_bytes";
   7746 
   7747         /**
   7748          * Minimum bytes of free storage on the device before the data partition
   7749          * is considered full. By default, 1 MB is reserved to avoid system-wide
   7750          * SQLite disk full exceptions.
   7751          *
   7752          * @hide
   7753          */
   7754         public static final String
   7755                 SYS_STORAGE_FULL_THRESHOLD_BYTES = "sys_storage_full_threshold_bytes";
   7756 
   7757         /**
   7758          * The maximum reconnect delay for short network outages or when the
   7759          * network is suspended due to phone use.
   7760          *
   7761          * @hide
   7762          */
   7763         public static final String
   7764                 SYNC_MAX_RETRY_DELAY_IN_SECONDS = "sync_max_retry_delay_in_seconds";
   7765 
   7766         /**
   7767          * The number of milliseconds to delay before sending out
   7768          * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcasts. Ignored.
   7769          *
   7770          * @hide
   7771          */
   7772         public static final String CONNECTIVITY_CHANGE_DELAY = "connectivity_change_delay";
   7773 
   7774 
   7775         /**
   7776          * Network sampling interval, in seconds. We'll generate link information
   7777          * about bytes/packets sent and error rates based on data sampled in this interval
   7778          *
   7779          * @hide
   7780          */
   7781 
   7782         public static final String CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS =
   7783                 "connectivity_sampling_interval_in_seconds";
   7784 
   7785         /**
   7786          * The series of successively longer delays used in retrying to download PAC file.
   7787          * Last delay is used between successful PAC downloads.
   7788          *
   7789          * @hide
   7790          */
   7791         public static final String PAC_CHANGE_DELAY = "pac_change_delay";
   7792 
   7793         /**
   7794          * Setting to turn off captive portal detection. Feature is enabled by
   7795          * default and the setting needs to be set to 0 to disable it.
   7796          *
   7797          * @hide
   7798          */
   7799         public static final String
   7800                 CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled";
   7801 
   7802         /**
   7803          * The server used for captive portal detection upon a new conection. A
   7804          * 204 response code from the server is used for validation.
   7805          *
   7806          * @hide
   7807          */
   7808         public static final String CAPTIVE_PORTAL_SERVER = "captive_portal_server";
   7809 
   7810         /**
   7811          * Whether to use HTTPS for network validation. This is enabled by default and the setting
   7812          * needs to be set to 0 to disable it. This setting is a misnomer because captive portals
   7813          * don't actually use HTTPS, but it's consistent with the other settings.
   7814          *
   7815          * @hide
   7816          */
   7817         public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https";
   7818 
   7819         /**
   7820          * Whether network service discovery is enabled.
   7821          *
   7822          * @hide
   7823          */
   7824         public static final String NSD_ON = "nsd_on";
   7825 
   7826         /**
   7827          * Let user pick default install location.
   7828          *
   7829          * @hide
   7830          */
   7831         public static final String SET_INSTALL_LOCATION = "set_install_location";
   7832 
   7833         /**
   7834          * Default install location value.
   7835          * 0 = auto, let system decide
   7836          * 1 = internal
   7837          * 2 = sdcard
   7838          * @hide
   7839          */
   7840         public static final String DEFAULT_INSTALL_LOCATION = "default_install_location";
   7841 
   7842         /**
   7843          * ms during which to consume extra events related to Inet connection
   7844          * condition after a transtion to fully-connected
   7845          *
   7846          * @hide
   7847          */
   7848         public static final String
   7849                 INET_CONDITION_DEBOUNCE_UP_DELAY = "inet_condition_debounce_up_delay";
   7850 
   7851         /**
   7852          * ms during which to consume extra events related to Inet connection
   7853          * condtion after a transtion to partly-connected
   7854          *
   7855          * @hide
   7856          */
   7857         public static final String
   7858                 INET_CONDITION_DEBOUNCE_DOWN_DELAY = "inet_condition_debounce_down_delay";
   7859 
   7860         /** {@hide} */
   7861         public static final String
   7862                 READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT = "read_external_storage_enforced_default";
   7863 
   7864         /**
   7865          * Host name and port for global http proxy. Uses ':' seperator for
   7866          * between host and port.
   7867          */
   7868         public static final String HTTP_PROXY = "http_proxy";
   7869 
   7870         /**
   7871          * Host name for global http proxy. Set via ConnectivityManager.
   7872          *
   7873          * @hide
   7874          */
   7875         public static final String GLOBAL_HTTP_PROXY_HOST = "global_http_proxy_host";
   7876 
   7877         /**
   7878          * Integer host port for global http proxy. Set via ConnectivityManager.
   7879          *
   7880          * @hide
   7881          */
   7882         public static final String GLOBAL_HTTP_PROXY_PORT = "global_http_proxy_port";
   7883 
   7884         /**
   7885          * Exclusion list for global proxy. This string contains a list of
   7886          * comma-separated domains where the global proxy does not apply.
   7887          * Domains should be listed in a comma- separated list. Example of
   7888          * acceptable formats: ".domain1.com,my.domain2.com" Use
   7889          * ConnectivityManager to set/get.
   7890          *
   7891          * @hide
   7892          */
   7893         public static final String
   7894                 GLOBAL_HTTP_PROXY_EXCLUSION_LIST = "global_http_proxy_exclusion_list";
   7895 
   7896         /**
   7897          * The location PAC File for the proxy.
   7898          * @hide
   7899          */
   7900         public static final String
   7901                 GLOBAL_HTTP_PROXY_PAC = "global_proxy_pac_url";
   7902 
   7903         /**
   7904          * Enables the UI setting to allow the user to specify the global HTTP
   7905          * proxy and associated exclusion list.
   7906          *
   7907          * @hide
   7908          */
   7909         public static final String SET_GLOBAL_HTTP_PROXY = "set_global_http_proxy";
   7910 
   7911         /**
   7912          * Setting for default DNS in case nobody suggests one
   7913          *
   7914          * @hide
   7915          */
   7916         public static final String DEFAULT_DNS_SERVER = "default_dns_server";
   7917 
   7918         /** {@hide} */
   7919         public static final String
   7920                 BLUETOOTH_HEADSET_PRIORITY_PREFIX = "bluetooth_headset_priority_";
   7921         /** {@hide} */
   7922         public static final String
   7923                 BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX = "bluetooth_a2dp_sink_priority_";
   7924         /** {@hide} */
   7925         public static final String
   7926                 BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX = "bluetooth_a2dp_src_priority_";
   7927         /** {@hide} */
   7928         public static final String
   7929                 BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX = "bluetooth_input_device_priority_";
   7930         /** {@hide} */
   7931         public static final String
   7932                 BLUETOOTH_MAP_PRIORITY_PREFIX = "bluetooth_map_priority_";
   7933         /** {@hide} */
   7934         public static final String
   7935                 BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX = "bluetooth_pbap_client_priority_";
   7936         /** {@hide} */
   7937         public static final String
   7938                 BLUETOOTH_SAP_PRIORITY_PREFIX = "bluetooth_sap_priority_";
   7939 
   7940         /**
   7941          * Device Idle (Doze) specific settings.
   7942          * This is encoded as a key=value list, separated by commas. Ex:
   7943          *
   7944          * "inactive_timeout=60000,sensing_timeout=400000"
   7945          *
   7946          * The following keys are supported:
   7947          *
   7948          * <pre>
   7949          * inactive_to                      (long)
   7950          * sensing_to                       (long)
   7951          * motion_inactive_to               (long)
   7952          * idle_after_inactive_to           (long)
   7953          * idle_pending_to                  (long)
   7954          * max_idle_pending_to              (long)
   7955          * idle_pending_factor              (float)
   7956          * idle_to                          (long)
   7957          * max_idle_to                      (long)
   7958          * idle_factor                      (float)
   7959          * min_time_to_alarm                (long)
   7960          * max_temp_app_whitelist_duration  (long)
   7961          * notification_whitelist_duration  (long)
   7962          * </pre>
   7963          *
   7964          * <p>
   7965          * Type: string
   7966          * @hide
   7967          * @see com.android.server.DeviceIdleController.Constants
   7968          */
   7969         public static final String DEVICE_IDLE_CONSTANTS = "device_idle_constants";
   7970 
   7971         /**
   7972          * Device Idle (Doze) specific settings for watches. See {@code #DEVICE_IDLE_CONSTANTS}
   7973          *
   7974          * <p>
   7975          * Type: string
   7976          * @hide
   7977          * @see com.android.server.DeviceIdleController.Constants
   7978          */
   7979         public static final String DEVICE_IDLE_CONSTANTS_WATCH = "device_idle_constants_watch";
   7980 
   7981         /**
   7982          * App standby (app idle) specific settings.
   7983          * This is encoded as a key=value list, separated by commas. Ex:
   7984          *
   7985          * "idle_duration=5000,parole_interval=4500"
   7986          *
   7987          * The following keys are supported:
   7988          *
   7989          * <pre>
   7990          * idle_duration2       (long)
   7991          * wallclock_threshold  (long)
   7992          * parole_interval      (long)
   7993          * parole_duration      (long)
   7994          *
   7995          * idle_duration        (long) // This is deprecated and used to circumvent b/26355386.
   7996          * </pre>
   7997          *
   7998          * <p>
   7999          * Type: string
   8000          * @hide
   8001          * @see com.android.server.usage.UsageStatsService.SettingsObserver
   8002          */
   8003         public static final String APP_IDLE_CONSTANTS = "app_idle_constants";
   8004 
   8005         /**
   8006          * Alarm manager specific settings.
   8007          * This is encoded as a key=value list, separated by commas. Ex:
   8008          *
   8009          * "min_futurity=5000,allow_while_idle_short_time=4500"
   8010          *
   8011          * The following keys are supported:
   8012          *
   8013          * <pre>
   8014          * min_futurity                         (long)
   8015          * min_interval                         (long)
   8016          * allow_while_idle_short_time          (long)
   8017          * allow_while_idle_long_time           (long)
   8018          * allow_while_idle_whitelist_duration  (long)
   8019          * </pre>
   8020          *
   8021          * <p>
   8022          * Type: string
   8023          * @hide
   8024          * @see com.android.server.AlarmManagerService.Constants
   8025          */
   8026         public static final String ALARM_MANAGER_CONSTANTS = "alarm_manager_constants";
   8027 
   8028         /**
   8029          * Job scheduler specific settings.
   8030          * This is encoded as a key=value list, separated by commas. Ex:
   8031          *
   8032          * "min_ready_jobs_count=2,moderate_use_factor=.5"
   8033          *
   8034          * The following keys are supported:
   8035          *
   8036          * <pre>
   8037          * min_idle_count                       (int)
   8038          * min_charging_count                   (int)
   8039          * min_connectivity_count               (int)
   8040          * min_content_count                    (int)
   8041          * min_ready_jobs_count                 (int)
   8042          * heavy_use_factor                     (float)
   8043          * moderate_use_factor                  (float)
   8044          * fg_job_count                         (int)
   8045          * bg_normal_job_count                  (int)
   8046          * bg_moderate_job_count                (int)
   8047          * bg_low_job_count                     (int)
   8048          * bg_critical_job_count                (int)
   8049          * </pre>
   8050          *
   8051          * <p>
   8052          * Type: string
   8053          * @hide
   8054          * @see com.android.server.job.JobSchedulerService.Constants
   8055          */
   8056         public static final String JOB_SCHEDULER_CONSTANTS = "job_scheduler_constants";
   8057 
   8058         /**
   8059          * ShortcutManager specific settings.
   8060          * This is encoded as a key=value list, separated by commas. Ex:
   8061          *
   8062          * "reset_interval_sec=86400,max_updates_per_interval=1"
   8063          *
   8064          * The following keys are supported:
   8065          *
   8066          * <pre>
   8067          * reset_interval_sec              (long)
   8068          * max_updates_per_interval        (int)
   8069          * max_icon_dimension_dp           (int, DP)
   8070          * max_icon_dimension_dp_lowram    (int, DP)
   8071          * max_shortcuts                   (int)
   8072          * icon_quality                    (int, 0-100)
   8073          * icon_format                     (String)
   8074          * </pre>
   8075          *
   8076          * <p>
   8077          * Type: string
   8078          * @hide
   8079          * @see com.android.server.pm.ShortcutService.ConfigConstants
   8080          */
   8081         public static final String SHORTCUT_MANAGER_CONSTANTS = "shortcut_manager_constants";
   8082 
   8083         /**
   8084          * Get the key that retrieves a bluetooth headset's priority.
   8085          * @hide
   8086          */
   8087         public static final String getBluetoothHeadsetPriorityKey(String address) {
   8088             return BLUETOOTH_HEADSET_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8089         }
   8090 
   8091         /**
   8092          * Get the key that retrieves a bluetooth a2dp sink's priority.
   8093          * @hide
   8094          */
   8095         public static final String getBluetoothA2dpSinkPriorityKey(String address) {
   8096             return BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8097         }
   8098 
   8099         /**
   8100          * Get the key that retrieves a bluetooth a2dp src's priority.
   8101          * @hide
   8102          */
   8103         public static final String getBluetoothA2dpSrcPriorityKey(String address) {
   8104             return BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8105         }
   8106 
   8107         /**
   8108          * Get the key that retrieves a bluetooth Input Device's priority.
   8109          * @hide
   8110          */
   8111         public static final String getBluetoothInputDevicePriorityKey(String address) {
   8112             return BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8113         }
   8114 
   8115         /**
   8116          * Get the key that retrieves a bluetooth map priority.
   8117          * @hide
   8118          */
   8119         public static final String getBluetoothMapPriorityKey(String address) {
   8120             return BLUETOOTH_MAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8121         }
   8122 
   8123         /**
   8124          * Get the key that retrieves a bluetooth pbap client priority.
   8125          * @hide
   8126          */
   8127         public static final String getBluetoothPbapClientPriorityKey(String address) {
   8128             return BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8129         }
   8130 
   8131         /**
   8132          * Get the key that retrieves a bluetooth map priority.
   8133          * @hide
   8134          */
   8135         public static final String getBluetoothSapPriorityKey(String address) {
   8136             return BLUETOOTH_SAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
   8137         }
   8138 
   8139         /**
   8140          * Scaling factor for normal window animations. Setting to 0 will
   8141          * disable window animations.
   8142          */
   8143         public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
   8144 
   8145         /**
   8146          * Scaling factor for activity transition animations. Setting to 0 will
   8147          * disable window animations.
   8148          */
   8149         public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
   8150 
   8151         /**
   8152          * Scaling factor for Animator-based animations. This affects both the
   8153          * start delay and duration of all such animations. Setting to 0 will
   8154          * cause animations to end immediately. The default value is 1.
   8155          */
   8156         public static final String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
   8157 
   8158         /**
   8159          * Scaling factor for normal window animations. Setting to 0 will
   8160          * disable window animations.
   8161          *
   8162          * @hide
   8163          */
   8164         public static final String FANCY_IME_ANIMATIONS = "fancy_ime_animations";
   8165 
   8166         /**
   8167          * If 0, the compatibility mode is off for all applications.
   8168          * If 1, older applications run under compatibility mode.
   8169          * TODO: remove this settings before code freeze (bug/1907571)
   8170          * @hide
   8171          */
   8172         public static final String COMPATIBILITY_MODE = "compatibility_mode";
   8173 
   8174         /**
   8175          * CDMA only settings
   8176          * Emergency Tone  0 = Off
   8177          *                 1 = Alert
   8178          *                 2 = Vibrate
   8179          * @hide
   8180          */
   8181         public static final String EMERGENCY_TONE = "emergency_tone";
   8182 
   8183         /**
   8184          * CDMA only settings
   8185          * Whether the auto retry is enabled. The value is
   8186          * boolean (1 or 0).
   8187          * @hide
   8188          */
   8189         public static final String CALL_AUTO_RETRY = "call_auto_retry";
   8190 
   8191         /**
   8192          * See RIL_PreferredNetworkType in ril.h
   8193          * @hide
   8194          */
   8195         public static final String PREFERRED_NETWORK_MODE =
   8196                 "preferred_network_mode";
   8197 
   8198         /**
   8199          * Name of an application package to be debugged.
   8200          */
   8201         public static final String DEBUG_APP = "debug_app";
   8202 
   8203         /**
   8204          * If 1, when launching DEBUG_APP it will wait for the debugger before
   8205          * starting user code.  If 0, it will run normally.
   8206          */
   8207         public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
   8208 
   8209         /**
   8210          * Control whether the process CPU usage meter should be shown.
   8211          */
   8212         public static final String SHOW_PROCESSES = "show_processes";
   8213 
   8214         /**
   8215          * If 1 low power mode is enabled.
   8216          * @hide
   8217          */
   8218         public static final String LOW_POWER_MODE = "low_power";
   8219 
   8220         /**
   8221          * Battery level [1-99] at which low power mode automatically turns on.
   8222          * If 0, it will not automatically turn on.
   8223          * @hide
   8224          */
   8225         public static final String LOW_POWER_MODE_TRIGGER_LEVEL = "low_power_trigger_level";
   8226 
   8227          /**
   8228          * If not 0, the activity manager will aggressively finish activities and
   8229          * processes as soon as they are no longer needed.  If 0, the normal
   8230          * extended lifetime is used.
   8231          */
   8232         public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
   8233 
   8234         /**
   8235          * @hide
   8236          * If not 0, the activity manager will implement a looser version of background
   8237          * check that is more compatible with existing apps.
   8238          */
   8239         public static final String LENIENT_BACKGROUND_CHECK = "lenient_background_check";
   8240 
   8241         /**
   8242          * Use Dock audio output for media:
   8243          *      0 = disabled
   8244          *      1 = enabled
   8245          * @hide
   8246          */
   8247         public static final String DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled";
   8248 
   8249         /**
   8250          * The surround sound formats AC3, DTS or IEC61937 are
   8251          * available for use if they are detected.
   8252          * This is the default mode.
   8253          *
   8254          * Note that AUTO is equivalent to ALWAYS for Android TVs and other
   8255          * devices that have an S/PDIF output. This is because S/PDIF
   8256          * is unidirectional and the TV cannot know if a decoder is
   8257          * connected. So it assumes they are always available.
   8258          * @hide
   8259          */
   8260          public static final int ENCODED_SURROUND_OUTPUT_AUTO = 0;
   8261 
   8262         /**
   8263          * AC3, DTS or IEC61937 are NEVER available, even if they
   8264          * are detected by the hardware. Those formats will not be
   8265          * reported.
   8266          *
   8267          * An example use case would be an AVR reports that it is capable of
   8268          * surround sound decoding but is broken. If NEVER is chosen
   8269          * then apps must use PCM output instead of encoded output.
   8270          * @hide
   8271          */
   8272          public static final int ENCODED_SURROUND_OUTPUT_NEVER = 1;
   8273 
   8274         /**
   8275          * AC3, DTS or IEC61937 are ALWAYS available, even if they
   8276          * are not detected by the hardware. Those formats will be
   8277          * reported as part of the HDMI output capability. Applications
   8278          * are then free to use either PCM or encoded output.
   8279          *
   8280          * An example use case would be a when TV was connected over
   8281          * TOS-link to an AVR. But the TV could not see it because TOS-link
   8282          * is unidirectional.
   8283          * @hide
   8284          */
   8285          public static final int ENCODED_SURROUND_OUTPUT_ALWAYS = 2;
   8286 
   8287         /**
   8288          * Set to ENCODED_SURROUND_OUTPUT_AUTO,
   8289          * ENCODED_SURROUND_OUTPUT_NEVER or
   8290          * ENCODED_SURROUND_OUTPUT_ALWAYS
   8291          * @hide
   8292          */
   8293         public static final String ENCODED_SURROUND_OUTPUT = "encoded_surround_output";
   8294 
   8295         /**
   8296          * Persisted safe headphone volume management state by AudioService
   8297          * @hide
   8298          */
   8299         public static final String AUDIO_SAFE_VOLUME_STATE = "audio_safe_volume_state";
   8300 
   8301         /**
   8302          * URL for tzinfo (time zone) updates
   8303          * @hide
   8304          */
   8305         public static final String TZINFO_UPDATE_CONTENT_URL = "tzinfo_content_url";
   8306 
   8307         /**
   8308          * URL for tzinfo (time zone) update metadata
   8309          * @hide
   8310          */
   8311         public static final String TZINFO_UPDATE_METADATA_URL = "tzinfo_metadata_url";
   8312 
   8313         /**
   8314          * URL for selinux (mandatory access control) updates
   8315          * @hide
   8316          */
   8317         public static final String SELINUX_UPDATE_CONTENT_URL = "selinux_content_url";
   8318 
   8319         /**
   8320          * URL for selinux (mandatory access control) update metadata
   8321          * @hide
   8322          */
   8323         public static final String SELINUX_UPDATE_METADATA_URL = "selinux_metadata_url";
   8324 
   8325         /**
   8326          * URL for sms short code updates
   8327          * @hide
   8328          */
   8329         public static final String SMS_SHORT_CODES_UPDATE_CONTENT_URL =
   8330                 "sms_short_codes_content_url";
   8331 
   8332         /**
   8333          * URL for sms short code update metadata
   8334          * @hide
   8335          */
   8336         public static final String SMS_SHORT_CODES_UPDATE_METADATA_URL =
   8337                 "sms_short_codes_metadata_url";
   8338 
   8339         /**
   8340          * URL for apn_db updates
   8341          * @hide
   8342          */
   8343         public static final String APN_DB_UPDATE_CONTENT_URL = "apn_db_content_url";
   8344 
   8345         /**
   8346          * URL for apn_db update metadata
   8347          * @hide
   8348          */
   8349         public static final String APN_DB_UPDATE_METADATA_URL = "apn_db_metadata_url";
   8350 
   8351         /**
   8352          * URL for cert pinlist updates
   8353          * @hide
   8354          */
   8355         public static final String CERT_PIN_UPDATE_CONTENT_URL = "cert_pin_content_url";
   8356 
   8357         /**
   8358          * URL for cert pinlist updates
   8359          * @hide
   8360          */
   8361         public static final String CERT_PIN_UPDATE_METADATA_URL = "cert_pin_metadata_url";
   8362 
   8363         /**
   8364          * URL for intent firewall updates
   8365          * @hide
   8366          */
   8367         public static final String INTENT_FIREWALL_UPDATE_CONTENT_URL =
   8368                 "intent_firewall_content_url";
   8369 
   8370         /**
   8371          * URL for intent firewall update metadata
   8372          * @hide
   8373          */
   8374         public static final String INTENT_FIREWALL_UPDATE_METADATA_URL =
   8375                 "intent_firewall_metadata_url";
   8376 
   8377         /**
   8378          * SELinux enforcement status. If 0, permissive; if 1, enforcing.
   8379          * @hide
   8380          */
   8381         public static final String SELINUX_STATUS = "selinux_status";
   8382 
   8383         /**
   8384          * Developer setting to force RTL layout.
   8385          * @hide
   8386          */
   8387         public static final String DEVELOPMENT_FORCE_RTL = "debug.force_rtl";
   8388 
   8389         /**
   8390          * Milliseconds after screen-off after which low battery sounds will be silenced.
   8391          *
   8392          * If zero, battery sounds will always play.
   8393          * Defaults to @integer/def_low_battery_sound_timeout in SettingsProvider.
   8394          *
   8395          * @hide
   8396          */
   8397         public static final String LOW_BATTERY_SOUND_TIMEOUT = "low_battery_sound_timeout";
   8398 
   8399         /**
   8400          * Milliseconds to wait before bouncing Wi-Fi after settings is restored. Note that after
   8401          * the caller is done with this, they should call {@link ContentResolver#delete} to
   8402          * clean up any value that they may have written.
   8403          *
   8404          * @hide
   8405          */
   8406         public static final String WIFI_BOUNCE_DELAY_OVERRIDE_MS = "wifi_bounce_delay_override_ms";
   8407 
   8408         /**
   8409          * Defines global runtime overrides to window policy.
   8410          *
   8411          * See {@link com.android.server.policy.PolicyControl} for value format.
   8412          *
   8413          * @hide
   8414          */
   8415         public static final String POLICY_CONTROL = "policy_control";
   8416 
   8417         /**
   8418          * Defines global zen mode.  ZEN_MODE_OFF, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
   8419          * or ZEN_MODE_NO_INTERRUPTIONS.
   8420          *
   8421          * @hide
   8422          */
   8423         public static final String ZEN_MODE = "zen_mode";
   8424 
   8425         /** @hide */ public static final int ZEN_MODE_OFF = 0;
   8426         /** @hide */ public static final int ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
   8427         /** @hide */ public static final int ZEN_MODE_NO_INTERRUPTIONS = 2;
   8428         /** @hide */ public static final int ZEN_MODE_ALARMS = 3;
   8429 
   8430         /** @hide */ public static String zenModeToString(int mode) {
   8431             if (mode == ZEN_MODE_IMPORTANT_INTERRUPTIONS) return "ZEN_MODE_IMPORTANT_INTERRUPTIONS";
   8432             if (mode == ZEN_MODE_ALARMS) return "ZEN_MODE_ALARMS";
   8433             if (mode == ZEN_MODE_NO_INTERRUPTIONS) return "ZEN_MODE_NO_INTERRUPTIONS";
   8434             return "ZEN_MODE_OFF";
   8435         }
   8436 
   8437         /** @hide */ public static boolean isValidZenMode(int value) {
   8438             switch (value) {
   8439                 case Global.ZEN_MODE_OFF:
   8440                 case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
   8441                 case Global.ZEN_MODE_ALARMS:
   8442                 case Global.ZEN_MODE_NO_INTERRUPTIONS:
   8443                     return true;
   8444                 default:
   8445                     return false;
   8446             }
   8447         }
   8448 
   8449         /**
   8450          * Value of the ringer before entering zen mode.
   8451          *
   8452          * @hide
   8453          */
   8454         public static final String ZEN_MODE_RINGER_LEVEL = "zen_mode_ringer_level";
   8455 
   8456         /**
   8457          * Opaque value, changes when persisted zen mode configuration changes.
   8458          *
   8459          * @hide
   8460          */
   8461         public static final String ZEN_MODE_CONFIG_ETAG = "zen_mode_config_etag";
   8462 
   8463         /**
   8464          * Defines global heads up toggle.  One of HEADS_UP_OFF, HEADS_UP_ON.
   8465          *
   8466          * @hide
   8467          */
   8468         public static final String HEADS_UP_NOTIFICATIONS_ENABLED =
   8469                 "heads_up_notifications_enabled";
   8470 
   8471         /** @hide */ public static final int HEADS_UP_OFF = 0;
   8472         /** @hide */ public static final int HEADS_UP_ON = 1;
   8473 
   8474         /**
   8475          * The name of the device
   8476          *
   8477          * @hide
   8478          */
   8479         public static final String DEVICE_NAME = "device_name";
   8480 
   8481         /**
   8482          * Whether the NetworkScoringService has been first initialized.
   8483          * <p>
   8484          * Type: int (0 for false, 1 for true)
   8485          * @hide
   8486          */
   8487         public static final String NETWORK_SCORING_PROVISIONED = "network_scoring_provisioned";
   8488 
   8489         /**
   8490          * Whether the user wants to be prompted for password to decrypt the device on boot.
   8491          * This only matters if the storage is encrypted.
   8492          * <p>
   8493          * Type: int (0 for false, 1 for true)
   8494          * @hide
   8495          */
   8496         public static final String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
   8497 
   8498         /**
   8499          * Whether the Volte is enabled
   8500          * <p>
   8501          * Type: int (0 for false, 1 for true)
   8502          * @hide
   8503          */
   8504         public static final String ENHANCED_4G_MODE_ENABLED = "volte_vt_enabled";
   8505 
   8506         /**
   8507          * Whether VT (Video Telephony over IMS) is enabled
   8508          * <p>
   8509          * Type: int (0 for false, 1 for true)
   8510          *
   8511          * @hide
   8512          */
   8513         public static final String VT_IMS_ENABLED = "vt_ims_enabled";
   8514 
   8515         /**
   8516          * Whether WFC is enabled
   8517          * <p>
   8518          * Type: int (0 for false, 1 for true)
   8519          *
   8520          * @hide
   8521          */
   8522         public static final String WFC_IMS_ENABLED = "wfc_ims_enabled";
   8523 
   8524         /**
   8525          * WFC Mode.
   8526          * <p>
   8527          * Type: int - 2=Wi-Fi preferred, 1=Cellular preferred, 0=Wi-Fi only
   8528          *
   8529          * @hide
   8530          */
   8531         public static final String WFC_IMS_MODE = "wfc_ims_mode";
   8532 
   8533         /**
   8534          * Whether WFC roaming is enabled
   8535          * <p>
   8536          * Type: int (0 for false, 1 for true)
   8537          *
   8538          * @hide
   8539          */
   8540         public static final String WFC_IMS_ROAMING_ENABLED = "wfc_ims_roaming_enabled";
   8541 
   8542         /**
   8543          * Whether user can enable/disable LTE as a preferred network. A carrier might control
   8544          * this via gservices, OMA-DM, carrier app, etc.
   8545          * <p>
   8546          * Type: int (0 for false, 1 for true)
   8547          * @hide
   8548          */
   8549         public static final String LTE_SERVICE_FORCED = "lte_service_forced";
   8550 
   8551         /**
   8552          * Ephemeral app cookie max size in bytes.
   8553          * <p>
   8554          * Type: int
   8555          * @hide
   8556          */
   8557         public static final String EPHEMERAL_COOKIE_MAX_SIZE_BYTES =
   8558                 "ephemeral_cookie_max_size_bytes";
   8559 
   8560         /**
   8561          * The duration for caching uninstalled ephemeral apps.
   8562          * <p>
   8563          * Type: long
   8564          * @hide
   8565          */
   8566         public static final String UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS =
   8567                 "uninstalled_ephemeral_app_cache_duration_millis";
   8568 
   8569         /**
   8570          * Allows switching users when system user is locked.
   8571          * <p>
   8572          * Type: int
   8573          * @hide
   8574          */
   8575         public static final String ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED =
   8576                 "allow_user_switching_when_system_user_locked";
   8577 
   8578         /**
   8579          * Boot count since the device starts running APK level 24.
   8580          * <p>
   8581          * Type: int
   8582          */
   8583         public static final String BOOT_COUNT = "boot_count";
   8584 
   8585         /**
   8586          * Whether the safe boot is disallowed.
   8587          *
   8588          * <p>This setting should have the identical value as the corresponding user restriction.
   8589          * The purpose of the setting is to make the restriction available in early boot stages
   8590          * before the user restrictions are loaded.
   8591          * @hide
   8592          */
   8593         public static final String SAFE_BOOT_DISALLOWED = "safe_boot_disallowed";
   8594 
   8595         /**
   8596          * Settings to backup. This is here so that it's in the same place as the settings
   8597          * keys and easy to update.
   8598          *
   8599          * These keys may be mentioned in the SETTINGS_TO_BACKUP arrays in System
   8600          * and Secure as well.  This is because those tables drive both backup and
   8601          * restore, and restore needs to properly whitelist keys that used to live
   8602          * in those namespaces.  The keys will only actually be backed up / restored
   8603          * if they are also mentioned in this table (Global.SETTINGS_TO_BACKUP).
   8604          *
   8605          * NOTE: Settings are backed up and restored in the order they appear
   8606          *       in this array. If you have one setting depending on another,
   8607          *       make sure that they are ordered appropriately.
   8608          *
   8609          * @hide
   8610          */
   8611         public static final String[] SETTINGS_TO_BACKUP = {
   8612             BUGREPORT_IN_POWER_MENU,
   8613             STAY_ON_WHILE_PLUGGED_IN,
   8614             AUTO_TIME,
   8615             AUTO_TIME_ZONE,
   8616             POWER_SOUNDS_ENABLED,
   8617             DOCK_SOUNDS_ENABLED,
   8618             CHARGING_SOUNDS_ENABLED,
   8619             USB_MASS_STORAGE_ENABLED,
   8620             ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
   8621             WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
   8622             WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
   8623             WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED,
   8624             WIFI_NUM_OPEN_NETWORKS_KEPT,
   8625             EMERGENCY_TONE,
   8626             CALL_AUTO_RETRY,
   8627             DOCK_AUDIO_MEDIA_ENABLED,
   8628             ENCODED_SURROUND_OUTPUT,
   8629             LOW_POWER_MODE_TRIGGER_LEVEL
   8630         };
   8631 
   8632         // Populated lazily, guarded by class object:
   8633         private static NameValueCache sNameValueCache = new NameValueCache(
   8634                     CONTENT_URI,
   8635                     CALL_METHOD_GET_GLOBAL,
   8636                     CALL_METHOD_PUT_GLOBAL);
   8637 
   8638         // Certain settings have been moved from global to the per-user secure namespace
   8639         private static final HashSet<String> MOVED_TO_SECURE;
   8640         static {
   8641             MOVED_TO_SECURE = new HashSet<String>(1);
   8642             MOVED_TO_SECURE.add(Settings.Global.INSTALL_NON_MARKET_APPS);
   8643         }
   8644 
   8645         /** @hide */
   8646         public static void getMovedToSecureSettings(Set<String> outKeySet) {
   8647             outKeySet.addAll(MOVED_TO_SECURE);
   8648         }
   8649 
   8650         /**
   8651          * Look up a name in the database.
   8652          * @param resolver to access the database with
   8653          * @param name to look up in the table
   8654          * @return the corresponding value, or null if not present
   8655          */
   8656         public static String getString(ContentResolver resolver, String name) {
   8657             return getStringForUser(resolver, name, UserHandle.myUserId());
   8658         }
   8659 
   8660         /** @hide */
   8661         public static String getStringForUser(ContentResolver resolver, String name,
   8662                 int userHandle) {
   8663             if (MOVED_TO_SECURE.contains(name)) {
   8664                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
   8665                         + " to android.provider.Settings.Secure, returning read-only value.");
   8666                 return Secure.getStringForUser(resolver, name, userHandle);
   8667             }
   8668             return sNameValueCache.getStringForUser(resolver, name, userHandle);
   8669         }
   8670 
   8671         /**
   8672          * Store a name/value pair into the database.
   8673          * @param resolver to access the database with
   8674          * @param name to store
   8675          * @param value to associate with the name
   8676          * @return true if the value was set, false on database errors
   8677          */
   8678         public static boolean putString(ContentResolver resolver,
   8679                 String name, String value) {
   8680             return putStringForUser(resolver, name, value, UserHandle.myUserId());
   8681         }
   8682 
   8683         /** @hide */
   8684         public static boolean putStringForUser(ContentResolver resolver,
   8685                 String name, String value, int userHandle) {
   8686             if (LOCAL_LOGV) {
   8687                 Log.v(TAG, "Global.putString(name=" + name + ", value=" + value
   8688                         + " for " + userHandle);
   8689             }
   8690             // Global and Secure have the same access policy so we can forward writes
   8691             if (MOVED_TO_SECURE.contains(name)) {
   8692                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
   8693                         + " to android.provider.Settings.Secure, value is unchanged.");
   8694                 return Secure.putStringForUser(resolver, name, value, userHandle);
   8695             }
   8696             return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
   8697         }
   8698 
   8699         /**
   8700          * Construct the content URI for a particular name/value pair,
   8701          * useful for monitoring changes with a ContentObserver.
   8702          * @param name to look up in the table
   8703          * @return the corresponding content URI, or null if not present
   8704          */
   8705         public static Uri getUriFor(String name) {
   8706             return getUriFor(CONTENT_URI, name);
   8707         }
   8708 
   8709         /**
   8710          * Convenience function for retrieving a single secure settings value
   8711          * as an integer.  Note that internally setting values are always
   8712          * stored as strings; this function converts the string to an integer
   8713          * for you.  The default value will be returned if the setting is
   8714          * not defined or not an integer.
   8715          *
   8716          * @param cr The ContentResolver to access.
   8717          * @param name The name of the setting to retrieve.
   8718          * @param def Value to return if the setting is not defined.
   8719          *
   8720          * @return The setting's current value, or 'def' if it is not defined
   8721          * or not a valid integer.
   8722          */
   8723         public static int getInt(ContentResolver cr, String name, int def) {
   8724             String v = getString(cr, name);
   8725             try {
   8726                 return v != null ? Integer.parseInt(v) : def;
   8727             } catch (NumberFormatException e) {
   8728                 return def;
   8729             }
   8730         }
   8731 
   8732         /**
   8733          * Convenience function for retrieving a single secure settings value
   8734          * as an integer.  Note that internally setting values are always
   8735          * stored as strings; this function converts the string to an integer
   8736          * for you.
   8737          * <p>
   8738          * This version does not take a default value.  If the setting has not
   8739          * been set, or the string value is not a number,
   8740          * it throws {@link SettingNotFoundException}.
   8741          *
   8742          * @param cr The ContentResolver to access.
   8743          * @param name The name of the setting to retrieve.
   8744          *
   8745          * @throws SettingNotFoundException Thrown if a setting by the given
   8746          * name can't be found or the setting value is not an integer.
   8747          *
   8748          * @return The setting's current value.
   8749          */
   8750         public static int getInt(ContentResolver cr, String name)
   8751                 throws SettingNotFoundException {
   8752             String v = getString(cr, name);
   8753             try {
   8754                 return Integer.parseInt(v);
   8755             } catch (NumberFormatException e) {
   8756                 throw new SettingNotFoundException(name);
   8757             }
   8758         }
   8759 
   8760         /**
   8761          * Convenience function for updating a single settings value as an
   8762          * integer. This will either create a new entry in the table if the
   8763          * given name does not exist, or modify the value of the existing row
   8764          * with that name.  Note that internally setting values are always
   8765          * stored as strings, so this function converts the given value to a
   8766          * string before storing it.
   8767          *
   8768          * @param cr The ContentResolver to access.
   8769          * @param name The name of the setting to modify.
   8770          * @param value The new value for the setting.
   8771          * @return true if the value was set, false on database errors
   8772          */
   8773         public static boolean putInt(ContentResolver cr, String name, int value) {
   8774             return putString(cr, name, Integer.toString(value));
   8775         }
   8776 
   8777         /**
   8778          * Convenience function for retrieving a single secure settings value
   8779          * as a {@code long}.  Note that internally setting values are always
   8780          * stored as strings; this function converts the string to a {@code long}
   8781          * for you.  The default value will be returned if the setting is
   8782          * not defined or not a {@code long}.
   8783          *
   8784          * @param cr The ContentResolver to access.
   8785          * @param name The name of the setting to retrieve.
   8786          * @param def Value to return if the setting is not defined.
   8787          *
   8788          * @return The setting's current value, or 'def' if it is not defined
   8789          * or not a valid {@code long}.
   8790          */
   8791         public static long getLong(ContentResolver cr, String name, long def) {
   8792             String valString = getString(cr, name);
   8793             long value;
   8794             try {
   8795                 value = valString != null ? Long.parseLong(valString) : def;
   8796             } catch (NumberFormatException e) {
   8797                 value = def;
   8798             }
   8799             return value;
   8800         }
   8801 
   8802         /**
   8803          * Convenience function for retrieving a single secure settings value
   8804          * as a {@code long}.  Note that internally setting values are always
   8805          * stored as strings; this function converts the string to a {@code long}
   8806          * for you.
   8807          * <p>
   8808          * This version does not take a default value.  If the setting has not
   8809          * been set, or the string value is not a number,
   8810          * it throws {@link SettingNotFoundException}.
   8811          *
   8812          * @param cr The ContentResolver to access.
   8813          * @param name The name of the setting to retrieve.
   8814          *
   8815          * @return The setting's current value.
   8816          * @throws SettingNotFoundException Thrown if a setting by the given
   8817          * name can't be found or the setting value is not an integer.
   8818          */
   8819         public static long getLong(ContentResolver cr, String name)
   8820                 throws SettingNotFoundException {
   8821             String valString = getString(cr, name);
   8822             try {
   8823                 return Long.parseLong(valString);
   8824             } catch (NumberFormatException e) {
   8825                 throw new SettingNotFoundException(name);
   8826             }
   8827         }
   8828 
   8829         /**
   8830          * Convenience function for updating a secure settings value as a long
   8831          * integer. This will either create a new entry in the table if the
   8832          * given name does not exist, or modify the value of the existing row
   8833          * with that name.  Note that internally setting values are always
   8834          * stored as strings, so this function converts the given value to a
   8835          * string before storing it.
   8836          *
   8837          * @param cr The ContentResolver to access.
   8838          * @param name The name of the setting to modify.
   8839          * @param value The new value for the setting.
   8840          * @return true if the value was set, false on database errors
   8841          */
   8842         public static boolean putLong(ContentResolver cr, String name, long value) {
   8843             return putString(cr, name, Long.toString(value));
   8844         }
   8845 
   8846         /**
   8847          * Convenience function for retrieving a single secure settings value
   8848          * as a floating point number.  Note that internally setting values are
   8849          * always stored as strings; this function converts the string to an
   8850          * float for you. The default value will be returned if the setting
   8851          * is not defined or not a valid float.
   8852          *
   8853          * @param cr The ContentResolver to access.
   8854          * @param name The name of the setting to retrieve.
   8855          * @param def Value to return if the setting is not defined.
   8856          *
   8857          * @return The setting's current value, or 'def' if it is not defined
   8858          * or not a valid float.
   8859          */
   8860         public static float getFloat(ContentResolver cr, String name, float def) {
   8861             String v = getString(cr, name);
   8862             try {
   8863                 return v != null ? Float.parseFloat(v) : def;
   8864             } catch (NumberFormatException e) {
   8865                 return def;
   8866             }
   8867         }
   8868 
   8869         /**
   8870          * Convenience function for retrieving a single secure settings value
   8871          * as a float.  Note that internally setting values are always
   8872          * stored as strings; this function converts the string to a float
   8873          * for you.
   8874          * <p>
   8875          * This version does not take a default value.  If the setting has not
   8876          * been set, or the string value is not a number,
   8877          * it throws {@link SettingNotFoundException}.
   8878          *
   8879          * @param cr The ContentResolver to access.
   8880          * @param name The name of the setting to retrieve.
   8881          *
   8882          * @throws SettingNotFoundException Thrown if a setting by the given
   8883          * name can't be found or the setting value is not a float.
   8884          *
   8885          * @return The setting's current value.
   8886          */
   8887         public static float getFloat(ContentResolver cr, String name)
   8888                 throws SettingNotFoundException {
   8889             String v = getString(cr, name);
   8890             if (v == null) {
   8891                 throw new SettingNotFoundException(name);
   8892             }
   8893             try {
   8894                 return Float.parseFloat(v);
   8895             } catch (NumberFormatException e) {
   8896                 throw new SettingNotFoundException(name);
   8897             }
   8898         }
   8899 
   8900         /**
   8901          * Convenience function for updating a single settings value as a
   8902          * floating point number. This will either create a new entry in the
   8903          * table if the given name does not exist, or modify the value of the
   8904          * existing row with that name.  Note that internally setting values
   8905          * are always stored as strings, so this function converts the given
   8906          * value to a string before storing it.
   8907          *
   8908          * @param cr The ContentResolver to access.
   8909          * @param name The name of the setting to modify.
   8910          * @param value The new value for the setting.
   8911          * @return true if the value was set, false on database errors
   8912          */
   8913         public static boolean putFloat(ContentResolver cr, String name, float value) {
   8914             return putString(cr, name, Float.toString(value));
   8915         }
   8916 
   8917 
   8918         /**
   8919           * Subscription to be used for voice call on a multi sim device. The supported values
   8920           * are 0 = SUB1, 1 = SUB2 and etc.
   8921           * @hide
   8922           */
   8923         public static final String MULTI_SIM_VOICE_CALL_SUBSCRIPTION = "multi_sim_voice_call";
   8924 
   8925         /**
   8926           * Used to provide option to user to select subscription during dial.
   8927           * The supported values are 0 = disable or 1 = enable prompt.
   8928           * @hide
   8929           */
   8930         public static final String MULTI_SIM_VOICE_PROMPT = "multi_sim_voice_prompt";
   8931 
   8932         /**
   8933           * Subscription to be used for data call on a multi sim device. The supported values
   8934           * are 0 = SUB1, 1 = SUB2 and etc.
   8935           * @hide
   8936           */
   8937         public static final String MULTI_SIM_DATA_CALL_SUBSCRIPTION = "multi_sim_data_call";
   8938 
   8939         /**
   8940           * Subscription to be used for SMS on a multi sim device. The supported values
   8941           * are 0 = SUB1, 1 = SUB2 and etc.
   8942           * @hide
   8943           */
   8944         public static final String MULTI_SIM_SMS_SUBSCRIPTION = "multi_sim_sms";
   8945 
   8946        /**
   8947           * Used to provide option to user to select subscription during send SMS.
   8948           * The value 1 - enable, 0 - disable
   8949           * @hide
   8950           */
   8951         public static final String MULTI_SIM_SMS_PROMPT = "multi_sim_sms_prompt";
   8952 
   8953 
   8954 
   8955         /** User preferred subscriptions setting.
   8956           * This holds the details of the user selected subscription from the card and
   8957           * the activation status. Each settings string have the coma separated values
   8958           * iccId,appType,appId,activationStatus,3gppIndex,3gpp2Index
   8959           * @hide
   8960          */
   8961         public static final String[] MULTI_SIM_USER_PREFERRED_SUBS = {"user_preferred_sub1",
   8962                 "user_preferred_sub2","user_preferred_sub3"};
   8963 
   8964         /**
   8965          * Whether to enable new contacts aggregator or not.
   8966          * The value 1 - enable, 0 - disable
   8967          * @hide
   8968          */
   8969         public static final String NEW_CONTACT_AGGREGATOR = "new_contact_aggregator";
   8970 
   8971         /**
   8972          * Whether to enable contacts metadata syncing or not
   8973          * The value 1 - enable, 0 - disable
   8974          *
   8975          * @removed
   8976          */
   8977         @Deprecated
   8978         public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
   8979 
   8980         /**
   8981          * Whether to enable contacts metadata syncing or not
   8982          * The value 1 - enable, 0 - disable
   8983          */
   8984         public static final String CONTACT_METADATA_SYNC_ENABLED = "contact_metadata_sync_enabled";
   8985 
   8986         /**
   8987          * Whether to enable cellular on boot.
   8988          * The value 1 - enable, 0 - disable
   8989          * @hide
   8990          */
   8991         public static final String ENABLE_CELLULAR_ON_BOOT = "enable_cellular_on_boot";
   8992 
   8993         /**
   8994          * The maximum allowed notification enqueue rate in Hertz.
   8995          *
   8996          * Should be a float, and includes both posts and updates.
   8997          * @hide
   8998          */
   8999         public static final String MAX_NOTIFICATION_ENQUEUE_RATE = "max_notification_enqueue_rate";
   9000     }
   9001 
   9002     /**
   9003      * User-defined bookmarks and shortcuts.  The target of each bookmark is an
   9004      * Intent URL, allowing it to be either a web page or a particular
   9005      * application activity.
   9006      *
   9007      * @hide
   9008      */
   9009     public static final class Bookmarks implements BaseColumns
   9010     {
   9011         private static final String TAG = "Bookmarks";
   9012 
   9013         /**
   9014          * The content:// style URL for this table
   9015          */
   9016         public static final Uri CONTENT_URI =
   9017             Uri.parse("content://" + AUTHORITY + "/bookmarks");
   9018 
   9019         /**
   9020          * The row ID.
   9021          * <p>Type: INTEGER</p>
   9022          */
   9023         public static final String ID = "_id";
   9024 
   9025         /**
   9026          * Descriptive name of the bookmark that can be displayed to the user.
   9027          * If this is empty, the title should be resolved at display time (use
   9028          * {@link #getTitle(Context, Cursor)} any time you want to display the
   9029          * title of a bookmark.)
   9030          * <P>
   9031          * Type: TEXT
   9032          * </P>
   9033          */
   9034         public static final String TITLE = "title";
   9035 
   9036         /**
   9037          * Arbitrary string (displayed to the user) that allows bookmarks to be
   9038          * organized into categories.  There are some special names for
   9039          * standard folders, which all start with '@'.  The label displayed for
   9040          * the folder changes with the locale (via {@link #getLabelForFolder}) but
   9041          * the folder name does not change so you can consistently query for
   9042          * the folder regardless of the current locale.
   9043          *
   9044          * <P>Type: TEXT</P>
   9045          *
   9046          */
   9047         public static final String FOLDER = "folder";
   9048 
   9049         /**
   9050          * The Intent URL of the bookmark, describing what it points to.  This
   9051          * value is given to {@link android.content.Intent#getIntent} to create
   9052          * an Intent that can be launched.
   9053          * <P>Type: TEXT</P>
   9054          */
   9055         public static final String INTENT = "intent";
   9056 
   9057         /**
   9058          * Optional shortcut character associated with this bookmark.
   9059          * <P>Type: INTEGER</P>
   9060          */
   9061         public static final String SHORTCUT = "shortcut";
   9062 
   9063         /**
   9064          * The order in which the bookmark should be displayed
   9065          * <P>Type: INTEGER</P>
   9066          */
   9067         public static final String ORDERING = "ordering";
   9068 
   9069         private static final String[] sIntentProjection = { INTENT };
   9070         private static final String[] sShortcutProjection = { ID, SHORTCUT };
   9071         private static final String sShortcutSelection = SHORTCUT + "=?";
   9072 
   9073         /**
   9074          * Convenience function to retrieve the bookmarked Intent for a
   9075          * particular shortcut key.
   9076          *
   9077          * @param cr The ContentResolver to query.
   9078          * @param shortcut The shortcut key.
   9079          *
   9080          * @return Intent The bookmarked URL, or null if there is no bookmark
   9081          *         matching the given shortcut.
   9082          */
   9083         public static Intent getIntentForShortcut(ContentResolver cr, char shortcut)
   9084         {
   9085             Intent intent = null;
   9086 
   9087             Cursor c = cr.query(CONTENT_URI,
   9088                     sIntentProjection, sShortcutSelection,
   9089                     new String[] { String.valueOf((int) shortcut) }, ORDERING);
   9090             // Keep trying until we find a valid shortcut
   9091             try {
   9092                 while (intent == null && c.moveToNext()) {
   9093                     try {
   9094                         String intentURI = c.getString(c.getColumnIndexOrThrow(INTENT));
   9095                         intent = Intent.parseUri(intentURI, 0);
   9096                     } catch (java.net.URISyntaxException e) {
   9097                         // The stored URL is bad...  ignore it.
   9098                     } catch (IllegalArgumentException e) {
   9099                         // Column not found
   9100                         Log.w(TAG, "Intent column not found", e);
   9101                     }
   9102                 }
   9103             } finally {
   9104                 if (c != null) c.close();
   9105             }
   9106 
   9107             return intent;
   9108         }
   9109 
   9110         /**
   9111          * Add a new bookmark to the system.
   9112          *
   9113          * @param cr The ContentResolver to query.
   9114          * @param intent The desired target of the bookmark.
   9115          * @param title Bookmark title that is shown to the user; null if none
   9116          *            or it should be resolved to the intent's title.
   9117          * @param folder Folder in which to place the bookmark; null if none.
   9118          * @param shortcut Shortcut that will invoke the bookmark; 0 if none. If
   9119          *            this is non-zero and there is an existing bookmark entry
   9120          *            with this same shortcut, then that existing shortcut is
   9121          *            cleared (the bookmark is not removed).
   9122          * @return The unique content URL for the new bookmark entry.
   9123          */
   9124         public static Uri add(ContentResolver cr,
   9125                                            Intent intent,
   9126                                            String title,
   9127                                            String folder,
   9128                                            char shortcut,
   9129                                            int ordering)
   9130         {
   9131             // If a shortcut is supplied, and it is already defined for
   9132             // another bookmark, then remove the old definition.
   9133             if (shortcut != 0) {
   9134                 cr.delete(CONTENT_URI, sShortcutSelection,
   9135                         new String[] { String.valueOf((int) shortcut) });
   9136             }
   9137 
   9138             ContentValues values = new ContentValues();
   9139             if (title != null) values.put(TITLE, title);
   9140             if (folder != null) values.put(FOLDER, folder);
   9141             values.put(INTENT, intent.toUri(0));
   9142             if (shortcut != 0) values.put(SHORTCUT, (int) shortcut);
   9143             values.put(ORDERING, ordering);
   9144             return cr.insert(CONTENT_URI, values);
   9145         }
   9146 
   9147         /**
   9148          * Return the folder name as it should be displayed to the user.  This
   9149          * takes care of localizing special folders.
   9150          *
   9151          * @param r Resources object for current locale; only need access to
   9152          *          system resources.
   9153          * @param folder The value found in the {@link #FOLDER} column.
   9154          *
   9155          * @return CharSequence The label for this folder that should be shown
   9156          *         to the user.
   9157          */
   9158         public static CharSequence getLabelForFolder(Resources r, String folder) {
   9159             return folder;
   9160         }
   9161 
   9162         /**
   9163          * Return the title as it should be displayed to the user. This takes
   9164          * care of localizing bookmarks that point to activities.
   9165          *
   9166          * @param context A context.
   9167          * @param cursor A cursor pointing to the row whose title should be
   9168          *        returned. The cursor must contain at least the {@link #TITLE}
   9169          *        and {@link #INTENT} columns.
   9170          * @return A title that is localized and can be displayed to the user,
   9171          *         or the empty string if one could not be found.
   9172          */
   9173         public static CharSequence getTitle(Context context, Cursor cursor) {
   9174             int titleColumn = cursor.getColumnIndex(TITLE);
   9175             int intentColumn = cursor.getColumnIndex(INTENT);
   9176             if (titleColumn == -1 || intentColumn == -1) {
   9177                 throw new IllegalArgumentException(
   9178                         "The cursor must contain the TITLE and INTENT columns.");
   9179             }
   9180 
   9181             String title = cursor.getString(titleColumn);
   9182             if (!TextUtils.isEmpty(title)) {
   9183                 return title;
   9184             }
   9185 
   9186             String intentUri = cursor.getString(intentColumn);
   9187             if (TextUtils.isEmpty(intentUri)) {
   9188                 return "";
   9189             }
   9190 
   9191             Intent intent;
   9192             try {
   9193                 intent = Intent.parseUri(intentUri, 0);
   9194             } catch (URISyntaxException e) {
   9195                 return "";
   9196             }
   9197 
   9198             PackageManager packageManager = context.getPackageManager();
   9199             ResolveInfo info = packageManager.resolveActivity(intent, 0);
   9200             return info != null ? info.loadLabel(packageManager) : "";
   9201         }
   9202     }
   9203 
   9204     /**
   9205      * Returns the device ID that we should use when connecting to the mobile gtalk server.
   9206      * This is a string like "android-0x1242", where the hex string is the Android ID obtained
   9207      * from the GoogleLoginService.
   9208      *
   9209      * @param androidId The Android ID for this device.
   9210      * @return The device ID that should be used when connecting to the mobile gtalk server.
   9211      * @hide
   9212      */
   9213     public static String getGTalkDeviceId(long androidId) {
   9214         return "android-" + Long.toHexString(androidId);
   9215     }
   9216 
   9217     private static final String[] PM_WRITE_SETTINGS = {
   9218         android.Manifest.permission.WRITE_SETTINGS
   9219     };
   9220     private static final String[] PM_CHANGE_NETWORK_STATE = {
   9221         android.Manifest.permission.CHANGE_NETWORK_STATE,
   9222         android.Manifest.permission.WRITE_SETTINGS
   9223     };
   9224     private static final String[] PM_SYSTEM_ALERT_WINDOW = {
   9225         android.Manifest.permission.SYSTEM_ALERT_WINDOW
   9226     };
   9227 
   9228     /**
   9229      * Performs a strict and comprehensive check of whether a calling package is allowed to
   9230      * write/modify system settings, as the condition differs for pre-M, M+, and
   9231      * privileged/preinstalled apps. If the provided uid does not match the
   9232      * callingPackage, a negative result will be returned.
   9233      * @hide
   9234      */
   9235     public static boolean isCallingPackageAllowedToWriteSettings(Context context, int uid,
   9236             String callingPackage, boolean throwException) {
   9237         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
   9238                 callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
   9239                 PM_WRITE_SETTINGS, false);
   9240     }
   9241 
   9242     /**
   9243      * Performs a strict and comprehensive check of whether a calling package is allowed to
   9244      * write/modify system settings, as the condition differs for pre-M, M+, and
   9245      * privileged/preinstalled apps. If the provided uid does not match the
   9246      * callingPackage, a negative result will be returned. The caller is expected to have
   9247      * the WRITE_SETTINGS permission declared.
   9248      *
   9249      * Note: if the check is successful, the operation of this app will be updated to the
   9250      * current time.
   9251      * @hide
   9252      */
   9253     public static boolean checkAndNoteWriteSettingsOperation(Context context, int uid,
   9254             String callingPackage, boolean throwException) {
   9255         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
   9256                 callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
   9257                 PM_WRITE_SETTINGS, true);
   9258     }
   9259 
   9260     /**
   9261      * Performs a strict and comprehensive check of whether a calling package is allowed to
   9262      * change the state of network, as the condition differs for pre-M, M+, and
   9263      * privileged/preinstalled apps. The caller is expected to have either the
   9264      * CHANGE_NETWORK_STATE or the WRITE_SETTINGS permission declared. Either of these
   9265      * permissions allow changing network state; WRITE_SETTINGS is a runtime permission and
   9266      * can be revoked, but (except in M, excluding M MRs), CHANGE_NETWORK_STATE is a normal
   9267      * permission and cannot be revoked. See http://b/23597341
   9268      *
   9269      * Note: if the check succeeds because the application holds WRITE_SETTINGS, the operation
   9270      * of this app will be updated to the current time.
   9271      * @hide
   9272      */
   9273     public static boolean checkAndNoteChangeNetworkStateOperation(Context context, int uid,
   9274             String callingPackage, boolean throwException) {
   9275         if (context.checkCallingOrSelfPermission(android.Manifest.permission.CHANGE_NETWORK_STATE)
   9276                 == PackageManager.PERMISSION_GRANTED) {
   9277             return true;
   9278         }
   9279         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
   9280                 callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
   9281                 PM_CHANGE_NETWORK_STATE, true);
   9282     }
   9283 
   9284     /**
   9285      * Performs a strict and comprehensive check of whether a calling package is allowed to
   9286      * draw on top of other apps, as the conditions differs for pre-M, M+, and
   9287      * privileged/preinstalled apps. If the provided uid does not match the callingPackage,
   9288      * a negative result will be returned.
   9289      * @hide
   9290      */
   9291     public static boolean isCallingPackageAllowedToDrawOverlays(Context context, int uid,
   9292             String callingPackage, boolean throwException) {
   9293         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
   9294                 callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
   9295                 PM_SYSTEM_ALERT_WINDOW, false);
   9296     }
   9297 
   9298     /**
   9299      * Performs a strict and comprehensive check of whether a calling package is allowed to
   9300      * draw on top of other apps, as the conditions differs for pre-M, M+, and
   9301      * privileged/preinstalled apps. If the provided uid does not match the callingPackage,
   9302      * a negative result will be returned.
   9303      *
   9304      * Note: if the check is successful, the operation of this app will be updated to the
   9305      * current time.
   9306      * @hide
   9307      */
   9308     public static boolean checkAndNoteDrawOverlaysOperation(Context context, int uid, String
   9309             callingPackage, boolean throwException) {
   9310         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
   9311                 callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
   9312                 PM_SYSTEM_ALERT_WINDOW, true);
   9313     }
   9314 
   9315     /**
   9316      * Helper method to perform a general and comprehensive check of whether an operation that is
   9317      * protected by appops can be performed by a caller or not. e.g. OP_SYSTEM_ALERT_WINDOW and
   9318      * OP_WRITE_SETTINGS
   9319      * @hide
   9320      */
   9321     public static boolean isCallingPackageAllowedToPerformAppOpsProtectedOperation(Context context,
   9322             int uid, String callingPackage, boolean throwException, int appOpsOpCode, String[]
   9323             permissions, boolean makeNote) {
   9324         if (callingPackage == null) {
   9325             return false;
   9326         }
   9327 
   9328         AppOpsManager appOpsMgr = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
   9329         int mode = AppOpsManager.MODE_DEFAULT;
   9330         if (makeNote) {
   9331             mode = appOpsMgr.noteOpNoThrow(appOpsOpCode, uid, callingPackage);
   9332         } else {
   9333             mode = appOpsMgr.checkOpNoThrow(appOpsOpCode, uid, callingPackage);
   9334         }
   9335 
   9336         switch (mode) {
   9337             case AppOpsManager.MODE_ALLOWED:
   9338                 return true;
   9339 
   9340             case AppOpsManager.MODE_DEFAULT:
   9341                 // this is the default operating mode after an app's installation
   9342                 // In this case we will check all associated static permission to see
   9343                 // if it is granted during install time.
   9344                 for (String permission : permissions) {
   9345                     if (context.checkCallingOrSelfPermission(permission) == PackageManager
   9346                             .PERMISSION_GRANTED) {
   9347                         // if either of the permissions are granted, we will allow it
   9348                         return true;
   9349                     }
   9350                 }
   9351 
   9352             default:
   9353                 // this is for all other cases trickled down here...
   9354                 if (!throwException) {
   9355                     return false;
   9356                 }
   9357         }
   9358 
   9359         // prepare string to throw SecurityException
   9360         StringBuilder exceptionMessage = new StringBuilder();
   9361         exceptionMessage.append(callingPackage);
   9362         exceptionMessage.append(" was not granted ");
   9363         if (permissions.length > 1) {
   9364             exceptionMessage.append(" either of these permissions: ");
   9365         } else {
   9366             exceptionMessage.append(" this permission: ");
   9367         }
   9368         for (int i = 0; i < permissions.length; i++) {
   9369             exceptionMessage.append(permissions[i]);
   9370             exceptionMessage.append((i == permissions.length - 1) ? "." : ", ");
   9371         }
   9372 
   9373         throw new SecurityException(exceptionMessage.toString());
   9374     }
   9375 
   9376     /**
   9377      * Retrieves a correponding package name for a given uid. It will query all
   9378      * packages that are associated with the given uid, but it will return only
   9379      * the zeroth result.
   9380      * Note: If package could not be found, a null is returned.
   9381      * @hide
   9382      */
   9383     public static String getPackageNameForUid(Context context, int uid) {
   9384         String[] packages = context.getPackageManager().getPackagesForUid(uid);
   9385         if (packages == null) {
   9386             return null;
   9387         }
   9388         return packages[0];
   9389     }
   9390 }
   9391