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