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