• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
SettingNotFoundException(String msg)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 
putString(ContentResolver resolver, Uri uri, String name, String value)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 
getUriFor(Uri uri, String name)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 
GenerationTracker(@onNull MemoryIntArray array, int index, int generation, Runnable errorHandler)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 
isGenerationChanged()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 
readCurrentGeneration()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 
destroy()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 
NameValueCache(Uri uri, String getCommand, String setCommand)1559         public NameValueCache(Uri uri, String getCommand, String setCommand) {
1560             mUri = uri;
1561             mCallGetCommand = getCommand;
1562             mCallSetCommand = setCommand;
1563         }
1564 
lazyGetProvider(ContentResolver cr)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 
putStringForUser(ContentResolver cr, String name, String value, final int userHandle)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 
getStringForUser(ContentResolver cr, String name, final int userHandle)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      */
canDrawOverlays(Context context)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 {
validate(String value)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 */
getMovedToGlobalSettings(Set<String> outKeySet)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 */
getMovedToSecureSettings(Set<String> outKeySet)1895         public static void getMovedToSecureSettings(Set<String> outKeySet) {
1896             outKeySet.addAll(MOVED_TO_SECURE);
1897         }
1898 
1899         /** @hide */
getNonLegacyMovedKeys(HashSet<String> outKeySet)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          */
getString(ContentResolver resolver, String name)1910         public static String getString(ContentResolver resolver, String name) {
1911             return getStringForUser(resolver, name, UserHandle.myUserId());
1912         }
1913 
1914         /** @hide */
getStringForUser(ContentResolver resolver, String name, int userHandle)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          */
putString(ContentResolver resolver, String name, String value)1937         public static boolean putString(ContentResolver resolver, String name, String value) {
1938             return putStringForUser(resolver, name, value, UserHandle.myUserId());
1939         }
1940 
1941         /** @hide */
putStringForUser(ContentResolver resolver, String name, String value, int userHandle)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          */
getUriFor(String name)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          */
getInt(ContentResolver cr, String name, int def)1991         public static int getInt(ContentResolver cr, String name, int def) {
1992             return getIntForUser(cr, name, def, UserHandle.myUserId());
1993         }
1994 
1995         /** @hide */
getIntForUser(ContentResolver cr, String name, int def, int userHandle)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          */
getInt(ContentResolver cr, String name)2023         public static int getInt(ContentResolver cr, String name)
2024                 throws SettingNotFoundException {
2025             return getIntForUser(cr, name, UserHandle.myUserId());
2026         }
2027 
2028         /** @hide */
getIntForUser(ContentResolver cr, String name, int userHandle)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          */
putInt(ContentResolver cr, String name, int value)2052         public static boolean putInt(ContentResolver cr, String name, int value) {
2053             return putIntForUser(cr, name, value, UserHandle.myUserId());
2054         }
2055 
2056         /** @hide */
putIntForUser(ContentResolver cr, String name, int value, int userHandle)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          */
getLong(ContentResolver cr, String name, long def)2076         public static long getLong(ContentResolver cr, String name, long def) {
2077             return getLongForUser(cr, name, def, UserHandle.myUserId());
2078         }
2079 
2080         /** @hide */
getLongForUser(ContentResolver cr, String name, long def, int userHandle)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          */
getLong(ContentResolver cr, String name)2110         public static long getLong(ContentResolver cr, String name)
2111                 throws SettingNotFoundException {
2112             return getLongForUser(cr, name, UserHandle.myUserId());
2113         }
2114 
2115         /** @hide */
getLongForUser(ContentResolver cr, String name, int userHandle)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          */
putLong(ContentResolver cr, String name, long value)2139         public static boolean putLong(ContentResolver cr, String name, long value) {
2140             return putLongForUser(cr, name, value, UserHandle.myUserId());
2141         }
2142 
2143         /** @hide */
putLongForUser(ContentResolver cr, String name, long value, int userHandle)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          */
getFloat(ContentResolver cr, String name, float def)2163         public static float getFloat(ContentResolver cr, String name, float def) {
2164             return getFloatForUser(cr, name, def, UserHandle.myUserId());
2165         }
2166 
2167         /** @hide */
getFloatForUser(ContentResolver cr, String name, float def, int userHandle)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          */
getFloat(ContentResolver cr, String name)2196         public static float getFloat(ContentResolver cr, String name)
2197                 throws SettingNotFoundException {
2198             return getFloatForUser(cr, name, UserHandle.myUserId());
2199         }
2200 
2201         /** @hide */
getFloatForUser(ContentResolver cr, String name, int userHandle)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          */
putFloat(ContentResolver cr, String name, float value)2228         public static boolean putFloat(ContentResolver cr, String name, float value) {
2229             return putFloatForUser(cr, name, value, UserHandle.myUserId());
2230         }
2231 
2232         /** @hide */
putFloatForUser(ContentResolver cr, String name, float value, int userHandle)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          */
getConfiguration(ContentResolver cr, Configuration outConfig)2246         public static void getConfiguration(ContentResolver cr, Configuration outConfig) {
2247             adjustConfigurationForUser(cr, outConfig, UserHandle.myUserId(),
2248                     false /* updateSettingsIfEmpty */);
2249         }
2250 
2251         /** @hide */
adjustConfigurationForUser(ContentResolver cr, Configuration outConfig, int userHandle, boolean updateSettingsIfEmpty)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          */
clearConfiguration(Configuration inoutConfig)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          */
putConfiguration(ContentResolver cr, Configuration config)2299         public static boolean putConfiguration(ContentResolver cr, Configuration config) {
2300             return putConfigurationForUser(cr, config, UserHandle.myUserId());
2301         }
2302 
2303         /** @hide */
putConfigurationForUser(ContentResolver cr, Configuration config, int userHandle)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 */
hasInterestingConfigurationChanges(int changes)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
getShowGTalkServiceStatus(ContentResolver cr)2319         public static boolean getShowGTalkServiceStatus(ContentResolver cr) {
2320             return getShowGTalkServiceStatusForUser(cr, UserHandle.myUserId());
2321         }
2322 
2323         /**
2324          * @hide
2325          * @deprecated - Do not use
2326          */
getShowGTalkServiceStatusForUser(ContentResolver cr, int userHandle)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
setShowGTalkServiceStatus(ContentResolver cr, boolean flag)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
setShowGTalkServiceStatusForUser(ContentResolver cr, boolean flag, int userHandle)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 
DiscreteValueValidator(String[] values)2351             public DiscreteValueValidator(String[] values) {
2352                 mValues = values;
2353             }
2354 
2355             @Override
validate(String value)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 
InclusiveIntegerRangeValidator(int min, int max)2365             public InclusiveIntegerRangeValidator(int min, int max) {
2366                 mMin = min;
2367                 mMax = max;
2368             }
2369 
2370             @Override
validate(String value)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 
InclusiveFloatRangeValidator(float min, float max)2385             public InclusiveFloatRangeValidator(float min, float max) {
2386                 mMin = min;
2387                 mMax = max;
2388             }
2389 
2390             @Override
validate(String value)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 {
VALIDATORS.put(END_BUTTON_BEHAVIOR,END_BUTTON_BEHAVIOR_VALIDATOR)3731             VALIDATORS.put(END_BUTTON_BEHAVIOR,END_BUTTON_BEHAVIOR_VALIDATOR);
VALIDATORS.put(WIFI_USE_STATIC_IP, WIFI_USE_STATIC_IP_VALIDATOR)3732             VALIDATORS.put(WIFI_USE_STATIC_IP, WIFI_USE_STATIC_IP_VALIDATOR);
VALIDATORS.put(BLUETOOTH_DISCOVERABILITY, BLUETOOTH_DISCOVERABILITY_VALIDATOR)3733             VALIDATORS.put(BLUETOOTH_DISCOVERABILITY, BLUETOOTH_DISCOVERABILITY_VALIDATOR);
VALIDATORS.put(BLUETOOTH_DISCOVERABILITY_TIMEOUT, BLUETOOTH_DISCOVERABILITY_TIMEOUT_VALIDATOR)3734             VALIDATORS.put(BLUETOOTH_DISCOVERABILITY_TIMEOUT,
3735                     BLUETOOTH_DISCOVERABILITY_TIMEOUT_VALIDATOR);
VALIDATORS.put(NEXT_ALARM_FORMATTED, NEXT_ALARM_FORMATTED_VALIDATOR)3736             VALIDATORS.put(NEXT_ALARM_FORMATTED, NEXT_ALARM_FORMATTED_VALIDATOR);
VALIDATORS.put(FONT_SCALE, FONT_SCALE_VALIDATOR)3737             VALIDATORS.put(FONT_SCALE, FONT_SCALE_VALIDATOR);
VALIDATORS.put(DIM_SCREEN, DIM_SCREEN_VALIDATOR)3738             VALIDATORS.put(DIM_SCREEN, DIM_SCREEN_VALIDATOR);
VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR)3739             VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR);
VALIDATORS.put(SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_VALIDATOR)3740             VALIDATORS.put(SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_VALIDATOR);
VALIDATORS.put(SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_VALIDATOR)3741             VALIDATORS.put(SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_VALIDATOR);
VALIDATORS.put(MODE_RINGER_STREAMS_AFFECTED, MODE_RINGER_STREAMS_AFFECTED_VALIDATOR)3742             VALIDATORS.put(MODE_RINGER_STREAMS_AFFECTED, MODE_RINGER_STREAMS_AFFECTED_VALIDATOR);
VALIDATORS.put(MUTE_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED_VALIDATOR)3743             VALIDATORS.put(MUTE_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED_VALIDATOR);
VALIDATORS.put(VIBRATE_ON, VIBRATE_ON_VALIDATOR)3744             VALIDATORS.put(VIBRATE_ON, VIBRATE_ON_VALIDATOR);
VALIDATORS.put(RINGTONE, RINGTONE_VALIDATOR)3745             VALIDATORS.put(RINGTONE, RINGTONE_VALIDATOR);
VALIDATORS.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_VALIDATOR)3746             VALIDATORS.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_VALIDATOR);
VALIDATORS.put(ALARM_ALERT, ALARM_ALERT_VALIDATOR)3747             VALIDATORS.put(ALARM_ALERT, ALARM_ALERT_VALIDATOR);
VALIDATORS.put(TEXT_AUTO_REPLACE, TEXT_AUTO_REPLACE_VALIDATOR)3748             VALIDATORS.put(TEXT_AUTO_REPLACE, TEXT_AUTO_REPLACE_VALIDATOR);
VALIDATORS.put(TEXT_AUTO_CAPS, TEXT_AUTO_CAPS_VALIDATOR)3749             VALIDATORS.put(TEXT_AUTO_CAPS, TEXT_AUTO_CAPS_VALIDATOR);
VALIDATORS.put(TEXT_AUTO_PUNCTUATE, TEXT_AUTO_PUNCTUATE_VALIDATOR)3750             VALIDATORS.put(TEXT_AUTO_PUNCTUATE, TEXT_AUTO_PUNCTUATE_VALIDATOR);
VALIDATORS.put(TEXT_SHOW_PASSWORD, TEXT_SHOW_PASSWORD_VALIDATOR)3751             VALIDATORS.put(TEXT_SHOW_PASSWORD, TEXT_SHOW_PASSWORD_VALIDATOR);
VALIDATORS.put(SHOW_GTALK_SERVICE_STATUS, SHOW_GTALK_SERVICE_STATUS_VALIDATOR)3752             VALIDATORS.put(SHOW_GTALK_SERVICE_STATUS, SHOW_GTALK_SERVICE_STATUS_VALIDATOR);
VALIDATORS.put(WALLPAPER_ACTIVITY, WALLPAPER_ACTIVITY_VALIDATOR)3753             VALIDATORS.put(WALLPAPER_ACTIVITY, WALLPAPER_ACTIVITY_VALIDATOR);
VALIDATORS.put(TIME_12_24, TIME_12_24_VALIDATOR)3754             VALIDATORS.put(TIME_12_24, TIME_12_24_VALIDATOR);
VALIDATORS.put(DATE_FORMAT, DATE_FORMAT_VALIDATOR)3755             VALIDATORS.put(DATE_FORMAT, DATE_FORMAT_VALIDATOR);
VALIDATORS.put(SETUP_WIZARD_HAS_RUN, SETUP_WIZARD_HAS_RUN_VALIDATOR)3756             VALIDATORS.put(SETUP_WIZARD_HAS_RUN, SETUP_WIZARD_HAS_RUN_VALIDATOR);
VALIDATORS.put(ACCELEROMETER_ROTATION, ACCELEROMETER_ROTATION_VALIDATOR)3757             VALIDATORS.put(ACCELEROMETER_ROTATION, ACCELEROMETER_ROTATION_VALIDATOR);
VALIDATORS.put(USER_ROTATION, USER_ROTATION_VALIDATOR)3758             VALIDATORS.put(USER_ROTATION, USER_ROTATION_VALIDATOR);
VALIDATORS.put(DTMF_TONE_WHEN_DIALING, DTMF_TONE_WHEN_DIALING_VALIDATOR)3759             VALIDATORS.put(DTMF_TONE_WHEN_DIALING, DTMF_TONE_WHEN_DIALING_VALIDATOR);
VALIDATORS.put(SOUND_EFFECTS_ENABLED, SOUND_EFFECTS_ENABLED_VALIDATOR)3760             VALIDATORS.put(SOUND_EFFECTS_ENABLED, SOUND_EFFECTS_ENABLED_VALIDATOR);
VALIDATORS.put(HAPTIC_FEEDBACK_ENABLED, HAPTIC_FEEDBACK_ENABLED_VALIDATOR)3761             VALIDATORS.put(HAPTIC_FEEDBACK_ENABLED, HAPTIC_FEEDBACK_ENABLED_VALIDATOR);
VALIDATORS.put(SHOW_WEB_SUGGESTIONS, SHOW_WEB_SUGGESTIONS_VALIDATOR)3762             VALIDATORS.put(SHOW_WEB_SUGGESTIONS, SHOW_WEB_SUGGESTIONS_VALIDATOR);
VALIDATORS.put(WIFI_USE_STATIC_IP, WIFI_USE_STATIC_IP_VALIDATOR)3763             VALIDATORS.put(WIFI_USE_STATIC_IP, WIFI_USE_STATIC_IP_VALIDATOR);
VALIDATORS.put(END_BUTTON_BEHAVIOR, END_BUTTON_BEHAVIOR_VALIDATOR)3764             VALIDATORS.put(END_BUTTON_BEHAVIOR, END_BUTTON_BEHAVIOR_VALIDATOR);
VALIDATORS.put(ADVANCED_SETTINGS, ADVANCED_SETTINGS_VALIDATOR)3765             VALIDATORS.put(ADVANCED_SETTINGS, ADVANCED_SETTINGS_VALIDATOR);
VALIDATORS.put(SCREEN_AUTO_BRIGHTNESS_ADJ, SCREEN_AUTO_BRIGHTNESS_ADJ_VALIDATOR)3766             VALIDATORS.put(SCREEN_AUTO_BRIGHTNESS_ADJ, SCREEN_AUTO_BRIGHTNESS_ADJ_VALIDATOR);
VALIDATORS.put(VIBRATE_INPUT_DEVICES, VIBRATE_INPUT_DEVICES_VALIDATOR)3767             VALIDATORS.put(VIBRATE_INPUT_DEVICES, VIBRATE_INPUT_DEVICES_VALIDATOR);
VALIDATORS.put(MASTER_MONO, MASTER_MONO_VALIDATOR)3768             VALIDATORS.put(MASTER_MONO, MASTER_MONO_VALIDATOR);
VALIDATORS.put(NOTIFICATIONS_USE_RING_VOLUME, NOTIFICATIONS_USE_RING_VOLUME_VALIDATOR)3769             VALIDATORS.put(NOTIFICATIONS_USE_RING_VOLUME, NOTIFICATIONS_USE_RING_VOLUME_VALIDATOR);
VALIDATORS.put(VIBRATE_IN_SILENT, VIBRATE_IN_SILENT_VALIDATOR)3770             VALIDATORS.put(VIBRATE_IN_SILENT, VIBRATE_IN_SILENT_VALIDATOR);
VALIDATORS.put(MEDIA_BUTTON_RECEIVER, MEDIA_BUTTON_RECEIVER_VALIDATOR)3771             VALIDATORS.put(MEDIA_BUTTON_RECEIVER, MEDIA_BUTTON_RECEIVER_VALIDATOR);
VALIDATORS.put(HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY_VALIDATOR)3772             VALIDATORS.put(HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY,
3773                     HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY_VALIDATOR);
VALIDATORS.put(VIBRATE_WHEN_RINGING, VIBRATE_WHEN_RINGING_VALIDATOR)3774             VALIDATORS.put(VIBRATE_WHEN_RINGING, VIBRATE_WHEN_RINGING_VALIDATOR);
VALIDATORS.put(DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_WHEN_DIALING_VALIDATOR)3775             VALIDATORS.put(DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_WHEN_DIALING_VALIDATOR);
VALIDATORS.put(HEARING_AID, HEARING_AID_VALIDATOR)3776             VALIDATORS.put(HEARING_AID, HEARING_AID_VALIDATOR);
VALIDATORS.put(TTY_MODE, TTY_MODE_VALIDATOR)3777             VALIDATORS.put(TTY_MODE, TTY_MODE_VALIDATOR);
VALIDATORS.put(NOTIFICATION_LIGHT_PULSE, NOTIFICATION_LIGHT_PULSE_VALIDATOR)3778             VALIDATORS.put(NOTIFICATION_LIGHT_PULSE, NOTIFICATION_LIGHT_PULSE_VALIDATOR);
VALIDATORS.put(POINTER_LOCATION, POINTER_LOCATION_VALIDATOR)3779             VALIDATORS.put(POINTER_LOCATION, POINTER_LOCATION_VALIDATOR);
VALIDATORS.put(SHOW_TOUCHES, SHOW_TOUCHES_VALIDATOR)3780             VALIDATORS.put(SHOW_TOUCHES, SHOW_TOUCHES_VALIDATOR);
VALIDATORS.put(WINDOW_ORIENTATION_LISTENER_LOG, WINDOW_ORIENTATION_LISTENER_LOG_VALIDATOR)3781             VALIDATORS.put(WINDOW_ORIENTATION_LISTENER_LOG,
3782                     WINDOW_ORIENTATION_LISTENER_LOG_VALIDATOR);
VALIDATORS.put(LOCKSCREEN_SOUNDS_ENABLED, LOCKSCREEN_SOUNDS_ENABLED_VALIDATOR)3783             VALIDATORS.put(LOCKSCREEN_SOUNDS_ENABLED, LOCKSCREEN_SOUNDS_ENABLED_VALIDATOR);
VALIDATORS.put(LOCKSCREEN_DISABLED, LOCKSCREEN_DISABLED_VALIDATOR)3784             VALIDATORS.put(LOCKSCREEN_DISABLED, LOCKSCREEN_DISABLED_VALIDATOR);
VALIDATORS.put(SIP_RECEIVE_CALLS, SIP_RECEIVE_CALLS_VALIDATOR)3785             VALIDATORS.put(SIP_RECEIVE_CALLS, SIP_RECEIVE_CALLS_VALIDATOR);
VALIDATORS.put(SIP_CALL_OPTIONS, SIP_CALL_OPTIONS_VALIDATOR)3786             VALIDATORS.put(SIP_CALL_OPTIONS, SIP_CALL_OPTIONS_VALIDATOR);
VALIDATORS.put(SIP_ALWAYS, SIP_ALWAYS_VALIDATOR)3787             VALIDATORS.put(SIP_ALWAYS, SIP_ALWAYS_VALIDATOR);
VALIDATORS.put(SIP_ADDRESS_ONLY, SIP_ADDRESS_ONLY_VALIDATOR)3788             VALIDATORS.put(SIP_ADDRESS_ONLY, SIP_ADDRESS_ONLY_VALIDATOR);
VALIDATORS.put(SIP_ASK_ME_EACH_TIME, SIP_ASK_ME_EACH_TIME_VALIDATOR)3789             VALIDATORS.put(SIP_ASK_ME_EACH_TIME, SIP_ASK_ME_EACH_TIME_VALIDATOR);
VALIDATORS.put(POINTER_SPEED, POINTER_SPEED_VALIDATOR)3790             VALIDATORS.put(POINTER_SPEED, POINTER_SPEED_VALIDATOR);
VALIDATORS.put(LOCK_TO_APP_ENABLED, LOCK_TO_APP_ENABLED_VALIDATOR)3791             VALIDATORS.put(LOCK_TO_APP_ENABLED, LOCK_TO_APP_ENABLED_VALIDATOR);
VALIDATORS.put(EGG_MODE, EGG_MODE_VALIDATOR)3792             VALIDATORS.put(EGG_MODE, EGG_MODE_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_IP, WIFI_STATIC_IP_VALIDATOR)3793             VALIDATORS.put(WIFI_STATIC_IP, WIFI_STATIC_IP_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_GATEWAY, WIFI_STATIC_GATEWAY_VALIDATOR)3794             VALIDATORS.put(WIFI_STATIC_GATEWAY, WIFI_STATIC_GATEWAY_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_NETMASK, WIFI_STATIC_NETMASK_VALIDATOR)3795             VALIDATORS.put(WIFI_STATIC_NETMASK, WIFI_STATIC_NETMASK_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_DNS1, WIFI_STATIC_DNS1_VALIDATOR)3796             VALIDATORS.put(WIFI_STATIC_DNS1, WIFI_STATIC_DNS1_VALIDATOR);
VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_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 */
getCloneToManagedProfileSettings(Set<String> outKeySet)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          */
canWrite(Context context)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 */
getMovedToGlobalSettings(Set<String> outKeySet)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          */
getString(ContentResolver resolver, String name)4231         public static String getString(ContentResolver resolver, String name) {
4232             return getStringForUser(resolver, name, UserHandle.myUserId());
4233         }
4234 
4235         /** @hide */
getStringForUser(ContentResolver resolver, String name, int userHandle)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          */
putString(ContentResolver resolver, String name, String value)4285         public static boolean putString(ContentResolver resolver, String name, String value) {
4286             return putStringForUser(resolver, name, value, UserHandle.myUserId());
4287         }
4288 
4289         /** @hide */
putStringForUser(ContentResolver resolver, String name, String value, int userHandle)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          */
getUriFor(String name)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          */
getInt(ContentResolver cr, String name, int def)4334         public static int getInt(ContentResolver cr, String name, int def) {
4335             return getIntForUser(cr, name, def, UserHandle.myUserId());
4336         }
4337 
4338         /** @hide */
getIntForUser(ContentResolver cr, String name, int def, int userHandle)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          */
getInt(ContentResolver cr, String name)4371         public static int getInt(ContentResolver cr, String name)
4372                 throws SettingNotFoundException {
4373             return getIntForUser(cr, name, UserHandle.myUserId());
4374         }
4375 
4376         /** @hide */
getIntForUser(ContentResolver cr, String name, int userHandle)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          */
putInt(ContentResolver cr, String name, int value)4405         public static boolean putInt(ContentResolver cr, String name, int value) {
4406             return putIntForUser(cr, name, value, UserHandle.myUserId());
4407         }
4408 
4409         /** @hide */
putIntForUser(ContentResolver cr, String name, int value, int userHandle)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          */
getLong(ContentResolver cr, String name, long def)4429         public static long getLong(ContentResolver cr, String name, long def) {
4430             return getLongForUser(cr, name, def, UserHandle.myUserId());
4431         }
4432 
4433         /** @hide */
getLongForUser(ContentResolver cr, String name, long def, int userHandle)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          */
getLong(ContentResolver cr, String name)4463         public static long getLong(ContentResolver cr, String name)
4464                 throws SettingNotFoundException {
4465             return getLongForUser(cr, name, UserHandle.myUserId());
4466         }
4467 
4468         /** @hide */
getLongForUser(ContentResolver cr, String name, int userHandle)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          */
putLong(ContentResolver cr, String name, long value)4492         public static boolean putLong(ContentResolver cr, String name, long value) {
4493             return putLongForUser(cr, name, value, UserHandle.myUserId());
4494         }
4495 
4496         /** @hide */
putLongForUser(ContentResolver cr, String name, long value, int userHandle)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          */
getFloat(ContentResolver cr, String name, float def)4516         public static float getFloat(ContentResolver cr, String name, float def) {
4517             return getFloatForUser(cr, name, def, UserHandle.myUserId());
4518         }
4519 
4520         /** @hide */
getFloatForUser(ContentResolver cr, String name, float def, int userHandle)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          */
getFloat(ContentResolver cr, String name)4549         public static float getFloat(ContentResolver cr, String name)
4550                 throws SettingNotFoundException {
4551             return getFloatForUser(cr, name, UserHandle.myUserId());
4552         }
4553 
4554         /** @hide */
getFloatForUser(ContentResolver cr, String name, int userHandle)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          */
putFloat(ContentResolver cr, String name, float value)4581         public static boolean putFloat(ContentResolver cr, String name, float value) {
4582             return putFloatForUser(cr, name, value, UserHandle.myUserId());
4583         }
4584 
4585         /** @hide */
putFloatForUser(ContentResolver cr, String name, float value, int userHandle)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 */
getCloneToManagedProfileSettings(Set<String> outKeySet)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
isLocationProviderEnabled(ContentResolver cr, String provider)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
isLocationProviderEnabledForUser(ContentResolver cr, String provider, int userId)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
setLocationProviderEnabled(ContentResolver cr, String provider, boolean enabled)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
setLocationProviderEnabledForUser(ContentResolver cr, String provider, boolean enabled, int userId)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          */
saveLocationModeForUser(ContentResolver cr, int userId)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          */
restoreLocationModeForUser(ContentResolver cr, int userId)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          */
setLocationModeForUser(ContentResolver cr, int mode, int userId)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          */
getLocationModeForUser(ContentResolver cr, int userId)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 to automatically switch away from wifi networks that lose Internet access.
7446         * Only meaningful if config_networkAvoidBadWifi is set to 0, otherwise the system always
7447         * avoids such networks. Valid values are:
7448         *
7449         * 0: Don't avoid bad wifi, don't prompt the user. Get stuck on bad wifi like it's 2013.
7450         * null: Ask the user whether to switch away from bad wifi.
7451         * 1: Avoid bad wifi.
7452         *
7453         * @hide
7454         */
7455        public static final String NETWORK_AVOID_BAD_WIFI = "network_avoid_bad_wifi";
7456 
7457        /**
7458         * Whether Wifi display is enabled/disabled
7459         * 0=disabled. 1=enabled.
7460         * @hide
7461         */
7462        public static final String WIFI_DISPLAY_ON = "wifi_display_on";
7463 
7464        /**
7465         * Whether Wifi display certification mode is enabled/disabled
7466         * 0=disabled. 1=enabled.
7467         * @hide
7468         */
7469        public static final String WIFI_DISPLAY_CERTIFICATION_ON =
7470                "wifi_display_certification_on";
7471 
7472        /**
7473         * WPS Configuration method used by Wifi display, this setting only
7474         * takes effect when WIFI_DISPLAY_CERTIFICATION_ON is 1 (enabled).
7475         *
7476         * Possible values are:
7477         *
7478         * WpsInfo.INVALID: use default WPS method chosen by framework
7479         * WpsInfo.PBC    : use Push button
7480         * WpsInfo.KEYPAD : use Keypad
7481         * WpsInfo.DISPLAY: use Display
7482         * @hide
7483         */
7484        public static final String WIFI_DISPLAY_WPS_CONFIG =
7485            "wifi_display_wps_config";
7486 
7487        /**
7488         * Whether to notify the user of open networks.
7489         * <p>
7490         * If not connected and the scan results have an open network, we will
7491         * put this notification up. If we attempt to connect to a network or
7492         * the open network(s) disappear, we remove the notification. When we
7493         * show the notification, we will not show it again for
7494         * {@link android.provider.Settings.Secure#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY} time.
7495         */
7496        public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
7497                "wifi_networks_available_notification_on";
7498        /**
7499         * {@hide}
7500         */
7501        public static final String WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON =
7502                "wimax_networks_available_notification_on";
7503 
7504        /**
7505         * Delay (in seconds) before repeating the Wi-Fi networks available notification.
7506         * Connecting to a network will reset the timer.
7507         */
7508        public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
7509                "wifi_networks_available_repeat_delay";
7510 
7511        /**
7512         * 802.11 country code in ISO 3166 format
7513         * @hide
7514         */
7515        public static final String WIFI_COUNTRY_CODE = "wifi_country_code";
7516 
7517        /**
7518         * The interval in milliseconds to issue wake up scans when wifi needs
7519         * to connect. This is necessary to connect to an access point when
7520         * device is on the move and the screen is off.
7521         * @hide
7522         */
7523        public static final String WIFI_FRAMEWORK_SCAN_INTERVAL_MS =
7524                "wifi_framework_scan_interval_ms";
7525 
7526        /**
7527         * The interval in milliseconds after which Wi-Fi is considered idle.
7528         * When idle, it is possible for the device to be switched from Wi-Fi to
7529         * the mobile data network.
7530         * @hide
7531         */
7532        public static final String WIFI_IDLE_MS = "wifi_idle_ms";
7533 
7534        /**
7535         * When the number of open networks exceeds this number, the
7536         * least-recently-used excess networks will be removed.
7537         */
7538        public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
7539 
7540        /**
7541         * Whether the Wi-Fi should be on.  Only the Wi-Fi service should touch this.
7542         */
7543        public static final String WIFI_ON = "wifi_on";
7544 
7545        /**
7546         * Setting to allow scans to be enabled even wifi is turned off for connectivity.
7547         * @hide
7548         */
7549        public static final String WIFI_SCAN_ALWAYS_AVAILABLE =
7550                 "wifi_scan_always_enabled";
7551 
7552        /**
7553         * Settings to allow BLE scans to be enabled even when Bluetooth is turned off for
7554         * connectivity.
7555         * @hide
7556         */
7557        public static final String BLE_SCAN_ALWAYS_AVAILABLE =
7558                "ble_scan_always_enabled";
7559 
7560        /**
7561         * Used to save the Wifi_ON state prior to tethering.
7562         * This state will be checked to restore Wifi after
7563         * the user turns off tethering.
7564         *
7565         * @hide
7566         */
7567        public static final String WIFI_SAVED_STATE = "wifi_saved_state";
7568 
7569        /**
7570         * The interval in milliseconds to scan as used by the wifi supplicant
7571         * @hide
7572         */
7573        public static final String WIFI_SUPPLICANT_SCAN_INTERVAL_MS =
7574                "wifi_supplicant_scan_interval_ms";
7575 
7576         /**
7577          * whether frameworks handles wifi auto-join
7578          * @hide
7579          */
7580        public static final String WIFI_ENHANCED_AUTO_JOIN =
7581                 "wifi_enhanced_auto_join";
7582 
7583         /**
7584          * whether settings show RSSI
7585          * @hide
7586          */
7587         public static final String WIFI_NETWORK_SHOW_RSSI =
7588                 "wifi_network_show_rssi";
7589 
7590         /**
7591         * The interval in milliseconds to scan at supplicant when p2p is connected
7592         * @hide
7593         */
7594        public static final String WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS =
7595                "wifi_scan_interval_p2p_connected_ms";
7596 
7597        /**
7598         * Whether the Wi-Fi watchdog is enabled.
7599         */
7600        public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
7601 
7602        /**
7603         * Setting to turn off poor network avoidance on Wi-Fi. Feature is enabled by default and
7604         * the setting needs to be set to 0 to disable it.
7605         * @hide
7606         */
7607        public static final String WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED =
7608                "wifi_watchdog_poor_network_test_enabled";
7609 
7610        /**
7611         * Setting to turn on suspend optimizations at screen off on Wi-Fi. Enabled by default and
7612         * needs to be set to 0 to disable it.
7613         * @hide
7614         */
7615        public static final String WIFI_SUSPEND_OPTIMIZATIONS_ENABLED =
7616                "wifi_suspend_optimizations_enabled";
7617 
7618        /**
7619         * Setting to enable verbose logging in Wi-Fi; disabled by default, and setting to 1
7620         * will enable it. In the future, additional values may be supported.
7621         * @hide
7622         */
7623        public static final String WIFI_VERBOSE_LOGGING_ENABLED =
7624                "wifi_verbose_logging_enabled";
7625 
7626        /**
7627         * The maximum number of times we will retry a connection to an access
7628         * point for which we have failed in acquiring an IP address from DHCP.
7629         * A value of N means that we will make N+1 connection attempts in all.
7630         */
7631        public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
7632 
7633        /**
7634         * Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile
7635         * data connectivity to be established after a disconnect from Wi-Fi.
7636         */
7637        public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
7638            "wifi_mobile_data_transition_wakelock_timeout_ms";
7639 
7640        /**
7641         * This setting controls whether WiFi configurations created by a Device Owner app
7642         * should be locked down (that is, be editable or removable only by the Device Owner App,
7643         * not even by Settings app).
7644         * This setting takes integer values. Non-zero values mean DO created configurations
7645         * are locked down. Value of zero means they are not. Default value in the absence of
7646         * actual value to this setting is 0.
7647         */
7648        public static final String WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN =
7649                "wifi_device_owner_configs_lockdown";
7650 
7651        /**
7652         * The operational wifi frequency band
7653         * Set to one of {@link WifiManager#WIFI_FREQUENCY_BAND_AUTO},
7654         * {@link WifiManager#WIFI_FREQUENCY_BAND_5GHZ} or
7655         * {@link WifiManager#WIFI_FREQUENCY_BAND_2GHZ}
7656         *
7657         * @hide
7658         */
7659        public static final String WIFI_FREQUENCY_BAND = "wifi_frequency_band";
7660 
7661        /**
7662         * The Wi-Fi peer-to-peer device name
7663         * @hide
7664         */
7665        public static final String WIFI_P2P_DEVICE_NAME = "wifi_p2p_device_name";
7666 
7667        /**
7668         * The min time between wifi disable and wifi enable
7669         * @hide
7670         */
7671        public static final String WIFI_REENABLE_DELAY_MS = "wifi_reenable_delay";
7672 
7673        /**
7674         * Timeout for ephemeral networks when all known BSSIDs go out of range. We will disconnect
7675         * from an ephemeral network if there is no BSSID for that network with a non-null score that
7676         * has been seen in this time period.
7677         *
7678         * If this is less than or equal to zero, we use a more conservative behavior and only check
7679         * for a non-null score from the currently connected or target BSSID.
7680         * @hide
7681         */
7682        public static final String WIFI_EPHEMERAL_OUT_OF_RANGE_TIMEOUT_MS =
7683                "wifi_ephemeral_out_of_range_timeout_ms";
7684 
7685        /**
7686         * The number of milliseconds to delay when checking for data stalls during
7687         * non-aggressive detection. (screen is turned off.)
7688         * @hide
7689         */
7690        public static final String DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS =
7691                "data_stall_alarm_non_aggressive_delay_in_ms";
7692 
7693        /**
7694         * The number of milliseconds to delay when checking for data stalls during
7695         * aggressive detection. (screen on or suspected data stall)
7696         * @hide
7697         */
7698        public static final String DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS =
7699                "data_stall_alarm_aggressive_delay_in_ms";
7700 
7701        /**
7702         * The number of milliseconds to allow the provisioning apn to remain active
7703         * @hide
7704         */
7705        public static final String PROVISIONING_APN_ALARM_DELAY_IN_MS =
7706                "provisioning_apn_alarm_delay_in_ms";
7707 
7708        /**
7709         * The interval in milliseconds at which to check gprs registration
7710         * after the first registration mismatch of gprs and voice service,
7711         * to detect possible data network registration problems.
7712         *
7713         * @hide
7714         */
7715        public static final String GPRS_REGISTER_CHECK_PERIOD_MS =
7716                "gprs_register_check_period_ms";
7717 
7718        /**
7719         * Nonzero causes Log.wtf() to crash.
7720         * @hide
7721         */
7722        public static final String WTF_IS_FATAL = "wtf_is_fatal";
7723 
7724        /**
7725         * Ringer mode. This is used internally, changing this value will not
7726         * change the ringer mode. See AudioManager.
7727         */
7728        public static final String MODE_RINGER = "mode_ringer";
7729 
7730        /**
7731         * Overlay display devices setting.
7732         * The associated value is a specially formatted string that describes the
7733         * size and density of simulated secondary display devices.
7734         * <p>
7735         * Format: {width}x{height}/{dpi};...
7736         * </p><p>
7737         * Example:
7738         * <ul>
7739         * <li><code>1280x720/213</code>: make one overlay that is 1280x720 at 213dpi.</li>
7740         * <li><code>1920x1080/320;1280x720/213</code>: make two overlays, the first
7741         * at 1080p and the second at 720p.</li>
7742         * <li>If the value is empty, then no overlay display devices are created.</li>
7743         * </ul></p>
7744         *
7745         * @hide
7746         */
7747        public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices";
7748 
7749         /**
7750          * Threshold values for the duration and level of a discharge cycle,
7751          * under which we log discharge cycle info.
7752          *
7753          * @hide
7754          */
7755         public static final String
7756                 BATTERY_DISCHARGE_DURATION_THRESHOLD = "battery_discharge_duration_threshold";
7757 
7758         /** @hide */
7759         public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
7760 
7761         /**
7762          * Flag for allowing ActivityManagerService to send ACTION_APP_ERROR
7763          * intents on application crashes and ANRs. If this is disabled, the
7764          * crash/ANR dialog will never display the "Report" button.
7765          * <p>
7766          * Type: int (0 = disallow, 1 = allow)
7767          *
7768          * @hide
7769          */
7770         public static final String SEND_ACTION_APP_ERROR = "send_action_app_error";
7771 
7772         /**
7773          * Maximum age of entries kept by {@link DropBoxManager}.
7774          *
7775          * @hide
7776          */
7777         public static final String DROPBOX_AGE_SECONDS = "dropbox_age_seconds";
7778 
7779         /**
7780          * Maximum number of entry files which {@link DropBoxManager} will keep
7781          * around.
7782          *
7783          * @hide
7784          */
7785         public static final String DROPBOX_MAX_FILES = "dropbox_max_files";
7786 
7787         /**
7788          * Maximum amount of disk space used by {@link DropBoxManager} no matter
7789          * what.
7790          *
7791          * @hide
7792          */
7793         public static final String DROPBOX_QUOTA_KB = "dropbox_quota_kb";
7794 
7795         /**
7796          * Percent of free disk (excluding reserve) which {@link DropBoxManager}
7797          * will use.
7798          *
7799          * @hide
7800          */
7801         public static final String DROPBOX_QUOTA_PERCENT = "dropbox_quota_percent";
7802 
7803         /**
7804          * Percent of total disk which {@link DropBoxManager} will never dip
7805          * into.
7806          *
7807          * @hide
7808          */
7809         public static final String DROPBOX_RESERVE_PERCENT = "dropbox_reserve_percent";
7810 
7811         /**
7812          * Prefix for per-tag dropbox disable/enable settings.
7813          *
7814          * @hide
7815          */
7816         public static final String DROPBOX_TAG_PREFIX = "dropbox:";
7817 
7818         /**
7819          * Lines of logcat to include with system crash/ANR/etc. reports, as a
7820          * prefix of the dropbox tag of the report type. For example,
7821          * "logcat_for_system_server_anr" controls the lines of logcat captured
7822          * with system server ANR reports. 0 to disable.
7823          *
7824          * @hide
7825          */
7826         public static final String ERROR_LOGCAT_PREFIX = "logcat_for_";
7827 
7828         /**
7829          * The interval in minutes after which the amount of free storage left
7830          * on the device is logged to the event log
7831          *
7832          * @hide
7833          */
7834         public static final String SYS_FREE_STORAGE_LOG_INTERVAL = "sys_free_storage_log_interval";
7835 
7836         /**
7837          * Threshold for the amount of change in disk free space required to
7838          * report the amount of free space. Used to prevent spamming the logs
7839          * when the disk free space isn't changing frequently.
7840          *
7841          * @hide
7842          */
7843         public static final String
7844                 DISK_FREE_CHANGE_REPORTING_THRESHOLD = "disk_free_change_reporting_threshold";
7845 
7846         /**
7847          * Minimum percentage of free storage on the device that is used to
7848          * determine if the device is running low on storage. The default is 10.
7849          * <p>
7850          * Say this value is set to 10, the device is considered running low on
7851          * storage if 90% or more of the device storage is filled up.
7852          *
7853          * @hide
7854          */
7855         public static final String
7856                 SYS_STORAGE_THRESHOLD_PERCENTAGE = "sys_storage_threshold_percentage";
7857 
7858         /**
7859          * Maximum byte size of the low storage threshold. This is to ensure
7860          * that {@link #SYS_STORAGE_THRESHOLD_PERCENTAGE} does not result in an
7861          * overly large threshold for large storage devices. Currently this must
7862          * be less than 2GB. This default is 500MB.
7863          *
7864          * @hide
7865          */
7866         public static final String
7867                 SYS_STORAGE_THRESHOLD_MAX_BYTES = "sys_storage_threshold_max_bytes";
7868 
7869         /**
7870          * Minimum bytes of free storage on the device before the data partition
7871          * is considered full. By default, 1 MB is reserved to avoid system-wide
7872          * SQLite disk full exceptions.
7873          *
7874          * @hide
7875          */
7876         public static final String
7877                 SYS_STORAGE_FULL_THRESHOLD_BYTES = "sys_storage_full_threshold_bytes";
7878 
7879         /**
7880          * The maximum reconnect delay for short network outages or when the
7881          * network is suspended due to phone use.
7882          *
7883          * @hide
7884          */
7885         public static final String
7886                 SYNC_MAX_RETRY_DELAY_IN_SECONDS = "sync_max_retry_delay_in_seconds";
7887 
7888         /**
7889          * The number of milliseconds to delay before sending out
7890          * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcasts. Ignored.
7891          *
7892          * @hide
7893          */
7894         public static final String CONNECTIVITY_CHANGE_DELAY = "connectivity_change_delay";
7895 
7896 
7897         /**
7898          * Network sampling interval, in seconds. We'll generate link information
7899          * about bytes/packets sent and error rates based on data sampled in this interval
7900          *
7901          * @hide
7902          */
7903 
7904         public static final String CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS =
7905                 "connectivity_sampling_interval_in_seconds";
7906 
7907         /**
7908          * The series of successively longer delays used in retrying to download PAC file.
7909          * Last delay is used between successful PAC downloads.
7910          *
7911          * @hide
7912          */
7913         public static final String PAC_CHANGE_DELAY = "pac_change_delay";
7914 
7915         /**
7916          * Setting to turn off captive portal detection. Feature is enabled by
7917          * default and the setting needs to be set to 0 to disable it.
7918          *
7919          * @hide
7920          */
7921         public static final String
7922                 CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled";
7923 
7924         /**
7925          * The server used for captive portal detection upon a new conection. A
7926          * 204 response code from the server is used for validation.
7927          *
7928          * @hide
7929          */
7930         public static final String CAPTIVE_PORTAL_SERVER = "captive_portal_server";
7931 
7932         /**
7933          * Whether to use HTTPS for network validation. This is enabled by default and the setting
7934          * needs to be set to 0 to disable it. This setting is a misnomer because captive portals
7935          * don't actually use HTTPS, but it's consistent with the other settings.
7936          *
7937          * @hide
7938          */
7939         public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https";
7940 
7941         /**
7942          * Whether network service discovery is enabled.
7943          *
7944          * @hide
7945          */
7946         public static final String NSD_ON = "nsd_on";
7947 
7948         /**
7949          * Let user pick default install location.
7950          *
7951          * @hide
7952          */
7953         public static final String SET_INSTALL_LOCATION = "set_install_location";
7954 
7955         /**
7956          * Default install location value.
7957          * 0 = auto, let system decide
7958          * 1 = internal
7959          * 2 = sdcard
7960          * @hide
7961          */
7962         public static final String DEFAULT_INSTALL_LOCATION = "default_install_location";
7963 
7964         /**
7965          * ms during which to consume extra events related to Inet connection
7966          * condition after a transtion to fully-connected
7967          *
7968          * @hide
7969          */
7970         public static final String
7971                 INET_CONDITION_DEBOUNCE_UP_DELAY = "inet_condition_debounce_up_delay";
7972 
7973         /**
7974          * ms during which to consume extra events related to Inet connection
7975          * condtion after a transtion to partly-connected
7976          *
7977          * @hide
7978          */
7979         public static final String
7980                 INET_CONDITION_DEBOUNCE_DOWN_DELAY = "inet_condition_debounce_down_delay";
7981 
7982         /** {@hide} */
7983         public static final String
7984                 READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT = "read_external_storage_enforced_default";
7985 
7986         /**
7987          * Host name and port for global http proxy. Uses ':' seperator for
7988          * between host and port.
7989          */
7990         public static final String HTTP_PROXY = "http_proxy";
7991 
7992         /**
7993          * Host name for global http proxy. Set via ConnectivityManager.
7994          *
7995          * @hide
7996          */
7997         public static final String GLOBAL_HTTP_PROXY_HOST = "global_http_proxy_host";
7998 
7999         /**
8000          * Integer host port for global http proxy. Set via ConnectivityManager.
8001          *
8002          * @hide
8003          */
8004         public static final String GLOBAL_HTTP_PROXY_PORT = "global_http_proxy_port";
8005 
8006         /**
8007          * Exclusion list for global proxy. This string contains a list of
8008          * comma-separated domains where the global proxy does not apply.
8009          * Domains should be listed in a comma- separated list. Example of
8010          * acceptable formats: ".domain1.com,my.domain2.com" Use
8011          * ConnectivityManager to set/get.
8012          *
8013          * @hide
8014          */
8015         public static final String
8016                 GLOBAL_HTTP_PROXY_EXCLUSION_LIST = "global_http_proxy_exclusion_list";
8017 
8018         /**
8019          * The location PAC File for the proxy.
8020          * @hide
8021          */
8022         public static final String
8023                 GLOBAL_HTTP_PROXY_PAC = "global_proxy_pac_url";
8024 
8025         /**
8026          * Enables the UI setting to allow the user to specify the global HTTP
8027          * proxy and associated exclusion list.
8028          *
8029          * @hide
8030          */
8031         public static final String SET_GLOBAL_HTTP_PROXY = "set_global_http_proxy";
8032 
8033         /**
8034          * Setting for default DNS in case nobody suggests one
8035          *
8036          * @hide
8037          */
8038         public static final String DEFAULT_DNS_SERVER = "default_dns_server";
8039 
8040         /** {@hide} */
8041         public static final String
8042                 BLUETOOTH_HEADSET_PRIORITY_PREFIX = "bluetooth_headset_priority_";
8043         /** {@hide} */
8044         public static final String
8045                 BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX = "bluetooth_a2dp_sink_priority_";
8046         /** {@hide} */
8047         public static final String
8048                 BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX = "bluetooth_a2dp_src_priority_";
8049         /** {@hide} */
8050         public static final String
8051                 BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX = "bluetooth_input_device_priority_";
8052         /** {@hide} */
8053         public static final String
8054                 BLUETOOTH_MAP_PRIORITY_PREFIX = "bluetooth_map_priority_";
8055         /** {@hide} */
8056         public static final String
8057                 BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX = "bluetooth_pbap_client_priority_";
8058         /** {@hide} */
8059         public static final String
8060                 BLUETOOTH_SAP_PRIORITY_PREFIX = "bluetooth_sap_priority_";
8061 
8062         /**
8063          * Device Idle (Doze) specific settings.
8064          * This is encoded as a key=value list, separated by commas. Ex:
8065          *
8066          * "inactive_timeout=60000,sensing_timeout=400000"
8067          *
8068          * The following keys are supported:
8069          *
8070          * <pre>
8071          * inactive_to                      (long)
8072          * sensing_to                       (long)
8073          * motion_inactive_to               (long)
8074          * idle_after_inactive_to           (long)
8075          * idle_pending_to                  (long)
8076          * max_idle_pending_to              (long)
8077          * idle_pending_factor              (float)
8078          * idle_to                          (long)
8079          * max_idle_to                      (long)
8080          * idle_factor                      (float)
8081          * min_time_to_alarm                (long)
8082          * max_temp_app_whitelist_duration  (long)
8083          * notification_whitelist_duration  (long)
8084          * </pre>
8085          *
8086          * <p>
8087          * Type: string
8088          * @hide
8089          * @see com.android.server.DeviceIdleController.Constants
8090          */
8091         public static final String DEVICE_IDLE_CONSTANTS = "device_idle_constants";
8092 
8093         /**
8094          * Device Idle (Doze) specific settings for watches. See {@code #DEVICE_IDLE_CONSTANTS}
8095          *
8096          * <p>
8097          * Type: string
8098          * @hide
8099          * @see com.android.server.DeviceIdleController.Constants
8100          */
8101         public static final String DEVICE_IDLE_CONSTANTS_WATCH = "device_idle_constants_watch";
8102 
8103         /**
8104          * App standby (app idle) specific settings.
8105          * This is encoded as a key=value list, separated by commas. Ex:
8106          *
8107          * "idle_duration=5000,parole_interval=4500"
8108          *
8109          * The following keys are supported:
8110          *
8111          * <pre>
8112          * idle_duration2       (long)
8113          * wallclock_threshold  (long)
8114          * parole_interval      (long)
8115          * parole_duration      (long)
8116          *
8117          * idle_duration        (long) // This is deprecated and used to circumvent b/26355386.
8118          * </pre>
8119          *
8120          * <p>
8121          * Type: string
8122          * @hide
8123          * @see com.android.server.usage.UsageStatsService.SettingsObserver
8124          */
8125         public static final String APP_IDLE_CONSTANTS = "app_idle_constants";
8126 
8127         /**
8128          * Alarm manager specific settings.
8129          * This is encoded as a key=value list, separated by commas. Ex:
8130          *
8131          * "min_futurity=5000,allow_while_idle_short_time=4500"
8132          *
8133          * The following keys are supported:
8134          *
8135          * <pre>
8136          * min_futurity                         (long)
8137          * min_interval                         (long)
8138          * allow_while_idle_short_time          (long)
8139          * allow_while_idle_long_time           (long)
8140          * allow_while_idle_whitelist_duration  (long)
8141          * </pre>
8142          *
8143          * <p>
8144          * Type: string
8145          * @hide
8146          * @see com.android.server.AlarmManagerService.Constants
8147          */
8148         public static final String ALARM_MANAGER_CONSTANTS = "alarm_manager_constants";
8149 
8150         /**
8151          * Job scheduler specific settings.
8152          * This is encoded as a key=value list, separated by commas. Ex:
8153          *
8154          * "min_ready_jobs_count=2,moderate_use_factor=.5"
8155          *
8156          * The following keys are supported:
8157          *
8158          * <pre>
8159          * min_idle_count                       (int)
8160          * min_charging_count                   (int)
8161          * min_connectivity_count               (int)
8162          * min_content_count                    (int)
8163          * min_ready_jobs_count                 (int)
8164          * heavy_use_factor                     (float)
8165          * moderate_use_factor                  (float)
8166          * fg_job_count                         (int)
8167          * bg_normal_job_count                  (int)
8168          * bg_moderate_job_count                (int)
8169          * bg_low_job_count                     (int)
8170          * bg_critical_job_count                (int)
8171          * </pre>
8172          *
8173          * <p>
8174          * Type: string
8175          * @hide
8176          * @see com.android.server.job.JobSchedulerService.Constants
8177          */
8178         public static final String JOB_SCHEDULER_CONSTANTS = "job_scheduler_constants";
8179 
8180         /**
8181          * ShortcutManager specific settings.
8182          * This is encoded as a key=value list, separated by commas. Ex:
8183          *
8184          * "reset_interval_sec=86400,max_updates_per_interval=1"
8185          *
8186          * The following keys are supported:
8187          *
8188          * <pre>
8189          * reset_interval_sec              (long)
8190          * max_updates_per_interval        (int)
8191          * max_icon_dimension_dp           (int, DP)
8192          * max_icon_dimension_dp_lowram    (int, DP)
8193          * max_shortcuts                   (int)
8194          * icon_quality                    (int, 0-100)
8195          * icon_format                     (String)
8196          * </pre>
8197          *
8198          * <p>
8199          * Type: string
8200          * @hide
8201          * @see com.android.server.pm.ShortcutService.ConfigConstants
8202          */
8203         public static final String SHORTCUT_MANAGER_CONSTANTS = "shortcut_manager_constants";
8204 
8205         /**
8206          * Get the key that retrieves a bluetooth headset's priority.
8207          * @hide
8208          */
getBluetoothHeadsetPriorityKey(String address)8209         public static final String getBluetoothHeadsetPriorityKey(String address) {
8210             return BLUETOOTH_HEADSET_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8211         }
8212 
8213         /**
8214          * Get the key that retrieves a bluetooth a2dp sink's priority.
8215          * @hide
8216          */
getBluetoothA2dpSinkPriorityKey(String address)8217         public static final String getBluetoothA2dpSinkPriorityKey(String address) {
8218             return BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8219         }
8220 
8221         /**
8222          * Get the key that retrieves a bluetooth a2dp src's priority.
8223          * @hide
8224          */
getBluetoothA2dpSrcPriorityKey(String address)8225         public static final String getBluetoothA2dpSrcPriorityKey(String address) {
8226             return BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8227         }
8228 
8229         /**
8230          * Get the key that retrieves a bluetooth Input Device's priority.
8231          * @hide
8232          */
getBluetoothInputDevicePriorityKey(String address)8233         public static final String getBluetoothInputDevicePriorityKey(String address) {
8234             return BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8235         }
8236 
8237         /**
8238          * Get the key that retrieves a bluetooth map priority.
8239          * @hide
8240          */
getBluetoothMapPriorityKey(String address)8241         public static final String getBluetoothMapPriorityKey(String address) {
8242             return BLUETOOTH_MAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8243         }
8244 
8245         /**
8246          * Get the key that retrieves a bluetooth pbap client priority.
8247          * @hide
8248          */
getBluetoothPbapClientPriorityKey(String address)8249         public static final String getBluetoothPbapClientPriorityKey(String address) {
8250             return BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8251         }
8252 
8253         /**
8254          * Get the key that retrieves a bluetooth map priority.
8255          * @hide
8256          */
getBluetoothSapPriorityKey(String address)8257         public static final String getBluetoothSapPriorityKey(String address) {
8258             return BLUETOOTH_SAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
8259         }
8260 
8261         /**
8262          * Scaling factor for normal window animations. Setting to 0 will
8263          * disable window animations.
8264          */
8265         public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
8266 
8267         /**
8268          * Scaling factor for activity transition animations. Setting to 0 will
8269          * disable window animations.
8270          */
8271         public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
8272 
8273         /**
8274          * Scaling factor for Animator-based animations. This affects both the
8275          * start delay and duration of all such animations. Setting to 0 will
8276          * cause animations to end immediately. The default value is 1.
8277          */
8278         public static final String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
8279 
8280         /**
8281          * Scaling factor for normal window animations. Setting to 0 will
8282          * disable window animations.
8283          *
8284          * @hide
8285          */
8286         public static final String FANCY_IME_ANIMATIONS = "fancy_ime_animations";
8287 
8288         /**
8289          * If 0, the compatibility mode is off for all applications.
8290          * If 1, older applications run under compatibility mode.
8291          * TODO: remove this settings before code freeze (bug/1907571)
8292          * @hide
8293          */
8294         public static final String COMPATIBILITY_MODE = "compatibility_mode";
8295 
8296         /**
8297          * CDMA only settings
8298          * Emergency Tone  0 = Off
8299          *                 1 = Alert
8300          *                 2 = Vibrate
8301          * @hide
8302          */
8303         public static final String EMERGENCY_TONE = "emergency_tone";
8304 
8305         /**
8306          * CDMA only settings
8307          * Whether the auto retry is enabled. The value is
8308          * boolean (1 or 0).
8309          * @hide
8310          */
8311         public static final String CALL_AUTO_RETRY = "call_auto_retry";
8312 
8313         /**
8314          * See RIL_PreferredNetworkType in ril.h
8315          * @hide
8316          */
8317         public static final String PREFERRED_NETWORK_MODE =
8318                 "preferred_network_mode";
8319 
8320         /**
8321          * Name of an application package to be debugged.
8322          */
8323         public static final String DEBUG_APP = "debug_app";
8324 
8325         /**
8326          * If 1, when launching DEBUG_APP it will wait for the debugger before
8327          * starting user code.  If 0, it will run normally.
8328          */
8329         public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
8330 
8331         /**
8332          * Control whether the process CPU usage meter should be shown.
8333          */
8334         public static final String SHOW_PROCESSES = "show_processes";
8335 
8336         /**
8337          * If 1 low power mode is enabled.
8338          * @hide
8339          */
8340         public static final String LOW_POWER_MODE = "low_power";
8341 
8342         /**
8343          * Battery level [1-99] at which low power mode automatically turns on.
8344          * If 0, it will not automatically turn on.
8345          * @hide
8346          */
8347         public static final String LOW_POWER_MODE_TRIGGER_LEVEL = "low_power_trigger_level";
8348 
8349          /**
8350          * If not 0, the activity manager will aggressively finish activities and
8351          * processes as soon as they are no longer needed.  If 0, the normal
8352          * extended lifetime is used.
8353          */
8354         public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
8355 
8356         /**
8357          * @hide
8358          * If not 0, the activity manager will implement a looser version of background
8359          * check that is more compatible with existing apps.
8360          */
8361         public static final String LENIENT_BACKGROUND_CHECK = "lenient_background_check";
8362 
8363         /**
8364          * Use Dock audio output for media:
8365          *      0 = disabled
8366          *      1 = enabled
8367          * @hide
8368          */
8369         public static final String DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled";
8370 
8371         /**
8372          * The surround sound formats AC3, DTS or IEC61937 are
8373          * available for use if they are detected.
8374          * This is the default mode.
8375          *
8376          * Note that AUTO is equivalent to ALWAYS for Android TVs and other
8377          * devices that have an S/PDIF output. This is because S/PDIF
8378          * is unidirectional and the TV cannot know if a decoder is
8379          * connected. So it assumes they are always available.
8380          * @hide
8381          */
8382          public static final int ENCODED_SURROUND_OUTPUT_AUTO = 0;
8383 
8384         /**
8385          * AC3, DTS or IEC61937 are NEVER available, even if they
8386          * are detected by the hardware. Those formats will not be
8387          * reported.
8388          *
8389          * An example use case would be an AVR reports that it is capable of
8390          * surround sound decoding but is broken. If NEVER is chosen
8391          * then apps must use PCM output instead of encoded output.
8392          * @hide
8393          */
8394          public static final int ENCODED_SURROUND_OUTPUT_NEVER = 1;
8395 
8396         /**
8397          * AC3, DTS or IEC61937 are ALWAYS available, even if they
8398          * are not detected by the hardware. Those formats will be
8399          * reported as part of the HDMI output capability. Applications
8400          * are then free to use either PCM or encoded output.
8401          *
8402          * An example use case would be a when TV was connected over
8403          * TOS-link to an AVR. But the TV could not see it because TOS-link
8404          * is unidirectional.
8405          * @hide
8406          */
8407          public static final int ENCODED_SURROUND_OUTPUT_ALWAYS = 2;
8408 
8409         /**
8410          * Set to ENCODED_SURROUND_OUTPUT_AUTO,
8411          * ENCODED_SURROUND_OUTPUT_NEVER or
8412          * ENCODED_SURROUND_OUTPUT_ALWAYS
8413          * @hide
8414          */
8415         public static final String ENCODED_SURROUND_OUTPUT = "encoded_surround_output";
8416 
8417         /**
8418          * Persisted safe headphone volume management state by AudioService
8419          * @hide
8420          */
8421         public static final String AUDIO_SAFE_VOLUME_STATE = "audio_safe_volume_state";
8422 
8423         /**
8424          * URL for tzinfo (time zone) updates
8425          * @hide
8426          */
8427         public static final String TZINFO_UPDATE_CONTENT_URL = "tzinfo_content_url";
8428 
8429         /**
8430          * URL for tzinfo (time zone) update metadata
8431          * @hide
8432          */
8433         public static final String TZINFO_UPDATE_METADATA_URL = "tzinfo_metadata_url";
8434 
8435         /**
8436          * URL for selinux (mandatory access control) updates
8437          * @hide
8438          */
8439         public static final String SELINUX_UPDATE_CONTENT_URL = "selinux_content_url";
8440 
8441         /**
8442          * URL for selinux (mandatory access control) update metadata
8443          * @hide
8444          */
8445         public static final String SELINUX_UPDATE_METADATA_URL = "selinux_metadata_url";
8446 
8447         /**
8448          * URL for sms short code updates
8449          * @hide
8450          */
8451         public static final String SMS_SHORT_CODES_UPDATE_CONTENT_URL =
8452                 "sms_short_codes_content_url";
8453 
8454         /**
8455          * URL for sms short code update metadata
8456          * @hide
8457          */
8458         public static final String SMS_SHORT_CODES_UPDATE_METADATA_URL =
8459                 "sms_short_codes_metadata_url";
8460 
8461         /**
8462          * URL for apn_db updates
8463          * @hide
8464          */
8465         public static final String APN_DB_UPDATE_CONTENT_URL = "apn_db_content_url";
8466 
8467         /**
8468          * URL for apn_db update metadata
8469          * @hide
8470          */
8471         public static final String APN_DB_UPDATE_METADATA_URL = "apn_db_metadata_url";
8472 
8473         /**
8474          * URL for cert pinlist updates
8475          * @hide
8476          */
8477         public static final String CERT_PIN_UPDATE_CONTENT_URL = "cert_pin_content_url";
8478 
8479         /**
8480          * URL for cert pinlist updates
8481          * @hide
8482          */
8483         public static final String CERT_PIN_UPDATE_METADATA_URL = "cert_pin_metadata_url";
8484 
8485         /**
8486          * URL for intent firewall updates
8487          * @hide
8488          */
8489         public static final String INTENT_FIREWALL_UPDATE_CONTENT_URL =
8490                 "intent_firewall_content_url";
8491 
8492         /**
8493          * URL for intent firewall update metadata
8494          * @hide
8495          */
8496         public static final String INTENT_FIREWALL_UPDATE_METADATA_URL =
8497                 "intent_firewall_metadata_url";
8498 
8499         /**
8500          * SELinux enforcement status. If 0, permissive; if 1, enforcing.
8501          * @hide
8502          */
8503         public static final String SELINUX_STATUS = "selinux_status";
8504 
8505         /**
8506          * Developer setting to force RTL layout.
8507          * @hide
8508          */
8509         public static final String DEVELOPMENT_FORCE_RTL = "debug.force_rtl";
8510 
8511         /**
8512          * Milliseconds after screen-off after which low battery sounds will be silenced.
8513          *
8514          * If zero, battery sounds will always play.
8515          * Defaults to @integer/def_low_battery_sound_timeout in SettingsProvider.
8516          *
8517          * @hide
8518          */
8519         public static final String LOW_BATTERY_SOUND_TIMEOUT = "low_battery_sound_timeout";
8520 
8521         /**
8522          * Milliseconds to wait before bouncing Wi-Fi after settings is restored. Note that after
8523          * the caller is done with this, they should call {@link ContentResolver#delete} to
8524          * clean up any value that they may have written.
8525          *
8526          * @hide
8527          */
8528         public static final String WIFI_BOUNCE_DELAY_OVERRIDE_MS = "wifi_bounce_delay_override_ms";
8529 
8530         /**
8531          * Defines global runtime overrides to window policy.
8532          *
8533          * See {@link com.android.server.policy.PolicyControl} for value format.
8534          *
8535          * @hide
8536          */
8537         public static final String POLICY_CONTROL = "policy_control";
8538 
8539         /**
8540          * Defines global zen mode.  ZEN_MODE_OFF, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
8541          * or ZEN_MODE_NO_INTERRUPTIONS.
8542          *
8543          * @hide
8544          */
8545         public static final String ZEN_MODE = "zen_mode";
8546 
8547         /** @hide */ public static final int ZEN_MODE_OFF = 0;
8548         /** @hide */ public static final int ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
8549         /** @hide */ public static final int ZEN_MODE_NO_INTERRUPTIONS = 2;
8550         /** @hide */ public static final int ZEN_MODE_ALARMS = 3;
8551 
zenModeToString(int mode)8552         /** @hide */ public static String zenModeToString(int mode) {
8553             if (mode == ZEN_MODE_IMPORTANT_INTERRUPTIONS) return "ZEN_MODE_IMPORTANT_INTERRUPTIONS";
8554             if (mode == ZEN_MODE_ALARMS) return "ZEN_MODE_ALARMS";
8555             if (mode == ZEN_MODE_NO_INTERRUPTIONS) return "ZEN_MODE_NO_INTERRUPTIONS";
8556             return "ZEN_MODE_OFF";
8557         }
8558 
isValidZenMode(int value)8559         /** @hide */ public static boolean isValidZenMode(int value) {
8560             switch (value) {
8561                 case Global.ZEN_MODE_OFF:
8562                 case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
8563                 case Global.ZEN_MODE_ALARMS:
8564                 case Global.ZEN_MODE_NO_INTERRUPTIONS:
8565                     return true;
8566                 default:
8567                     return false;
8568             }
8569         }
8570 
8571         /**
8572          * Value of the ringer before entering zen mode.
8573          *
8574          * @hide
8575          */
8576         public static final String ZEN_MODE_RINGER_LEVEL = "zen_mode_ringer_level";
8577 
8578         /**
8579          * Opaque value, changes when persisted zen mode configuration changes.
8580          *
8581          * @hide
8582          */
8583         public static final String ZEN_MODE_CONFIG_ETAG = "zen_mode_config_etag";
8584 
8585         /**
8586          * Defines global heads up toggle.  One of HEADS_UP_OFF, HEADS_UP_ON.
8587          *
8588          * @hide
8589          */
8590         public static final String HEADS_UP_NOTIFICATIONS_ENABLED =
8591                 "heads_up_notifications_enabled";
8592 
8593         /** @hide */ public static final int HEADS_UP_OFF = 0;
8594         /** @hide */ public static final int HEADS_UP_ON = 1;
8595 
8596         /**
8597          * The name of the device
8598          */
8599         public static final String DEVICE_NAME = "device_name";
8600 
8601         /**
8602          * Whether the NetworkScoringService has been first initialized.
8603          * <p>
8604          * Type: int (0 for false, 1 for true)
8605          * @hide
8606          */
8607         public static final String NETWORK_SCORING_PROVISIONED = "network_scoring_provisioned";
8608 
8609         /**
8610          * Whether the user wants to be prompted for password to decrypt the device on boot.
8611          * This only matters if the storage is encrypted.
8612          * <p>
8613          * Type: int (0 for false, 1 for true)
8614          * @hide
8615          */
8616         public static final String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
8617 
8618         /**
8619          * Whether the Volte is enabled
8620          * <p>
8621          * Type: int (0 for false, 1 for true)
8622          * @hide
8623          */
8624         public static final String ENHANCED_4G_MODE_ENABLED = "volte_vt_enabled";
8625 
8626         /**
8627          * Whether VT (Video Telephony over IMS) is enabled
8628          * <p>
8629          * Type: int (0 for false, 1 for true)
8630          *
8631          * @hide
8632          */
8633         public static final String VT_IMS_ENABLED = "vt_ims_enabled";
8634 
8635         /**
8636          * Whether WFC is enabled
8637          * <p>
8638          * Type: int (0 for false, 1 for true)
8639          *
8640          * @hide
8641          */
8642         public static final String WFC_IMS_ENABLED = "wfc_ims_enabled";
8643 
8644         /**
8645          * WFC Mode.
8646          * <p>
8647          * Type: int - 2=Wi-Fi preferred, 1=Cellular preferred, 0=Wi-Fi only
8648          *
8649          * @hide
8650          */
8651         public static final String WFC_IMS_MODE = "wfc_ims_mode";
8652 
8653         /**
8654          * Whether WFC roaming is enabled
8655          * <p>
8656          * Type: int (0 for false, 1 for true)
8657          *
8658          * @hide
8659          */
8660         public static final String WFC_IMS_ROAMING_ENABLED = "wfc_ims_roaming_enabled";
8661 
8662         /**
8663          * Whether user can enable/disable LTE as a preferred network. A carrier might control
8664          * this via gservices, OMA-DM, carrier app, etc.
8665          * <p>
8666          * Type: int (0 for false, 1 for true)
8667          * @hide
8668          */
8669         public static final String LTE_SERVICE_FORCED = "lte_service_forced";
8670 
8671         /**
8672          * Ephemeral app cookie max size in bytes.
8673          * <p>
8674          * Type: int
8675          * @hide
8676          */
8677         public static final String EPHEMERAL_COOKIE_MAX_SIZE_BYTES =
8678                 "ephemeral_cookie_max_size_bytes";
8679 
8680         /**
8681          * A mask applied to the ephemeral hash to generate the hash prefix.
8682          * <p>
8683          * Type: int
8684          *
8685          * @hide
8686          */
8687         public static final String EPHEMERAL_HASH_PREFIX_MASK = "ephemeral_hash_prefix_mask";
8688 
8689         /**
8690          * Number of hash prefixes to send during ephemeral resolution.
8691          * <p>
8692          * Type: int
8693          *
8694          * @hide
8695          */
8696         public static final String EPHEMERAL_HASH_PREFIX_COUNT = "ephemeral_hash_prefix_count";
8697 
8698         /**
8699          * The duration for caching uninstalled ephemeral apps.
8700          * <p>
8701          * Type: long
8702          * @hide
8703          */
8704         public static final String UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS =
8705                 "uninstalled_ephemeral_app_cache_duration_millis";
8706 
8707         /**
8708          * Allows switching users when system user is locked.
8709          * <p>
8710          * Type: int
8711          * @hide
8712          */
8713         public static final String ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED =
8714                 "allow_user_switching_when_system_user_locked";
8715 
8716         /**
8717          * Boot count since the device starts running APK level 24.
8718          * <p>
8719          * Type: int
8720          */
8721         public static final String BOOT_COUNT = "boot_count";
8722 
8723         /**
8724          * Whether the safe boot is disallowed.
8725          *
8726          * <p>This setting should have the identical value as the corresponding user restriction.
8727          * The purpose of the setting is to make the restriction available in early boot stages
8728          * before the user restrictions are loaded.
8729          * @hide
8730          */
8731         public static final String SAFE_BOOT_DISALLOWED = "safe_boot_disallowed";
8732 
8733         /**
8734          * Whether this device is currently in retail demo mode. If true, device
8735          * usage is severely limited.
8736          * <p>
8737          * Type: int (0 for false, 1 for true)
8738          * @hide
8739          */
8740         public static final String DEVICE_DEMO_MODE = "device_demo_mode";
8741 
8742         /**
8743          * Retail mode specific settings. This is encoded as a key=value list, separated by commas.
8744          * Ex: "user_inactivity_timeout_ms=30000,warning_dialog_timeout_ms=10000". The following
8745          * keys are supported:
8746          *
8747          * <pre>
8748          * user_inactivity_timeout_ms  (long)
8749          * warning_dialog_timeout_ms   (long)
8750          * </pre>
8751          * <p>
8752          * Type: string
8753          *
8754          * @hide
8755          */
8756         public static final String RETAIL_DEMO_MODE_CONSTANTS = "retail_demo_mode_constants";
8757 
8758         /**
8759          * Settings to backup. This is here so that it's in the same place as the settings
8760          * keys and easy to update.
8761          *
8762          * These keys may be mentioned in the SETTINGS_TO_BACKUP arrays in System
8763          * and Secure as well.  This is because those tables drive both backup and
8764          * restore, and restore needs to properly whitelist keys that used to live
8765          * in those namespaces.  The keys will only actually be backed up / restored
8766          * if they are also mentioned in this table (Global.SETTINGS_TO_BACKUP).
8767          *
8768          * NOTE: Settings are backed up and restored in the order they appear
8769          *       in this array. If you have one setting depending on another,
8770          *       make sure that they are ordered appropriately.
8771          *
8772          * @hide
8773          */
8774         public static final String[] SETTINGS_TO_BACKUP = {
8775             BUGREPORT_IN_POWER_MENU,
8776             STAY_ON_WHILE_PLUGGED_IN,
8777             AUTO_TIME,
8778             AUTO_TIME_ZONE,
8779             POWER_SOUNDS_ENABLED,
8780             DOCK_SOUNDS_ENABLED,
8781             CHARGING_SOUNDS_ENABLED,
8782             USB_MASS_STORAGE_ENABLED,
8783             ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
8784             WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
8785             WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
8786             WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED,
8787             WIFI_NUM_OPEN_NETWORKS_KEPT,
8788             EMERGENCY_TONE,
8789             CALL_AUTO_RETRY,
8790             DOCK_AUDIO_MEDIA_ENABLED,
8791             ENCODED_SURROUND_OUTPUT,
8792             LOW_POWER_MODE_TRIGGER_LEVEL
8793         };
8794 
8795         // Populated lazily, guarded by class object:
8796         private static NameValueCache sNameValueCache = new NameValueCache(
8797                     CONTENT_URI,
8798                     CALL_METHOD_GET_GLOBAL,
8799                     CALL_METHOD_PUT_GLOBAL);
8800 
8801         // Certain settings have been moved from global to the per-user secure namespace
8802         private static final HashSet<String> MOVED_TO_SECURE;
8803         static {
8804             MOVED_TO_SECURE = new HashSet<String>(1);
8805             MOVED_TO_SECURE.add(Settings.Global.INSTALL_NON_MARKET_APPS);
8806         }
8807 
8808         /** @hide */
getMovedToSecureSettings(Set<String> outKeySet)8809         public static void getMovedToSecureSettings(Set<String> outKeySet) {
8810             outKeySet.addAll(MOVED_TO_SECURE);
8811         }
8812 
8813         /**
8814          * Look up a name in the database.
8815          * @param resolver to access the database with
8816          * @param name to look up in the table
8817          * @return the corresponding value, or null if not present
8818          */
getString(ContentResolver resolver, String name)8819         public static String getString(ContentResolver resolver, String name) {
8820             return getStringForUser(resolver, name, UserHandle.myUserId());
8821         }
8822 
8823         /** @hide */
getStringForUser(ContentResolver resolver, String name, int userHandle)8824         public static String getStringForUser(ContentResolver resolver, String name,
8825                 int userHandle) {
8826             if (MOVED_TO_SECURE.contains(name)) {
8827                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
8828                         + " to android.provider.Settings.Secure, returning read-only value.");
8829                 return Secure.getStringForUser(resolver, name, userHandle);
8830             }
8831             return sNameValueCache.getStringForUser(resolver, name, userHandle);
8832         }
8833 
8834         /**
8835          * Store a name/value pair into the database.
8836          * @param resolver to access the database with
8837          * @param name to store
8838          * @param value to associate with the name
8839          * @return true if the value was set, false on database errors
8840          */
putString(ContentResolver resolver, String name, String value)8841         public static boolean putString(ContentResolver resolver,
8842                 String name, String value) {
8843             return putStringForUser(resolver, name, value, UserHandle.myUserId());
8844         }
8845 
8846         /** @hide */
putStringForUser(ContentResolver resolver, String name, String value, int userHandle)8847         public static boolean putStringForUser(ContentResolver resolver,
8848                 String name, String value, int userHandle) {
8849             if (LOCAL_LOGV) {
8850                 Log.v(TAG, "Global.putString(name=" + name + ", value=" + value
8851                         + " for " + userHandle);
8852             }
8853             // Global and Secure have the same access policy so we can forward writes
8854             if (MOVED_TO_SECURE.contains(name)) {
8855                 Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
8856                         + " to android.provider.Settings.Secure, value is unchanged.");
8857                 return Secure.putStringForUser(resolver, name, value, userHandle);
8858             }
8859             return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
8860         }
8861 
8862         /**
8863          * Construct the content URI for a particular name/value pair,
8864          * useful for monitoring changes with a ContentObserver.
8865          * @param name to look up in the table
8866          * @return the corresponding content URI, or null if not present
8867          */
getUriFor(String name)8868         public static Uri getUriFor(String name) {
8869             return getUriFor(CONTENT_URI, name);
8870         }
8871 
8872         /**
8873          * Convenience function for retrieving a single secure settings value
8874          * as an integer.  Note that internally setting values are always
8875          * stored as strings; this function converts the string to an integer
8876          * for you.  The default value will be returned if the setting is
8877          * not defined or not an integer.
8878          *
8879          * @param cr The ContentResolver to access.
8880          * @param name The name of the setting to retrieve.
8881          * @param def Value to return if the setting is not defined.
8882          *
8883          * @return The setting's current value, or 'def' if it is not defined
8884          * or not a valid integer.
8885          */
getInt(ContentResolver cr, String name, int def)8886         public static int getInt(ContentResolver cr, String name, int def) {
8887             String v = getString(cr, name);
8888             try {
8889                 return v != null ? Integer.parseInt(v) : def;
8890             } catch (NumberFormatException e) {
8891                 return def;
8892             }
8893         }
8894 
8895         /**
8896          * Convenience function for retrieving a single secure settings value
8897          * as an integer.  Note that internally setting values are always
8898          * stored as strings; this function converts the string to an integer
8899          * for you.
8900          * <p>
8901          * This version does not take a default value.  If the setting has not
8902          * been set, or the string value is not a number,
8903          * it throws {@link SettingNotFoundException}.
8904          *
8905          * @param cr The ContentResolver to access.
8906          * @param name The name of the setting to retrieve.
8907          *
8908          * @throws SettingNotFoundException Thrown if a setting by the given
8909          * name can't be found or the setting value is not an integer.
8910          *
8911          * @return The setting's current value.
8912          */
getInt(ContentResolver cr, String name)8913         public static int getInt(ContentResolver cr, String name)
8914                 throws SettingNotFoundException {
8915             String v = getString(cr, name);
8916             try {
8917                 return Integer.parseInt(v);
8918             } catch (NumberFormatException e) {
8919                 throw new SettingNotFoundException(name);
8920             }
8921         }
8922 
8923         /**
8924          * Convenience function for updating a single settings value as an
8925          * integer. This will either create a new entry in the table if the
8926          * given name does not exist, or modify the value of the existing row
8927          * with that name.  Note that internally setting values are always
8928          * stored as strings, so this function converts the given value to a
8929          * string before storing it.
8930          *
8931          * @param cr The ContentResolver to access.
8932          * @param name The name of the setting to modify.
8933          * @param value The new value for the setting.
8934          * @return true if the value was set, false on database errors
8935          */
putInt(ContentResolver cr, String name, int value)8936         public static boolean putInt(ContentResolver cr, String name, int value) {
8937             return putString(cr, name, Integer.toString(value));
8938         }
8939 
8940         /**
8941          * Convenience function for retrieving a single secure settings value
8942          * as a {@code long}.  Note that internally setting values are always
8943          * stored as strings; this function converts the string to a {@code long}
8944          * for you.  The default value will be returned if the setting is
8945          * not defined or not a {@code long}.
8946          *
8947          * @param cr The ContentResolver to access.
8948          * @param name The name of the setting to retrieve.
8949          * @param def Value to return if the setting is not defined.
8950          *
8951          * @return The setting's current value, or 'def' if it is not defined
8952          * or not a valid {@code long}.
8953          */
getLong(ContentResolver cr, String name, long def)8954         public static long getLong(ContentResolver cr, String name, long def) {
8955             String valString = getString(cr, name);
8956             long value;
8957             try {
8958                 value = valString != null ? Long.parseLong(valString) : def;
8959             } catch (NumberFormatException e) {
8960                 value = def;
8961             }
8962             return value;
8963         }
8964 
8965         /**
8966          * Convenience function for retrieving a single secure settings value
8967          * as a {@code long}.  Note that internally setting values are always
8968          * stored as strings; this function converts the string to a {@code long}
8969          * for you.
8970          * <p>
8971          * This version does not take a default value.  If the setting has not
8972          * been set, or the string value is not a number,
8973          * it throws {@link SettingNotFoundException}.
8974          *
8975          * @param cr The ContentResolver to access.
8976          * @param name The name of the setting to retrieve.
8977          *
8978          * @return The setting's current value.
8979          * @throws SettingNotFoundException Thrown if a setting by the given
8980          * name can't be found or the setting value is not an integer.
8981          */
getLong(ContentResolver cr, String name)8982         public static long getLong(ContentResolver cr, String name)
8983                 throws SettingNotFoundException {
8984             String valString = getString(cr, name);
8985             try {
8986                 return Long.parseLong(valString);
8987             } catch (NumberFormatException e) {
8988                 throw new SettingNotFoundException(name);
8989             }
8990         }
8991 
8992         /**
8993          * Convenience function for updating a secure settings value as a long
8994          * integer. This will either create a new entry in the table if the
8995          * given name does not exist, or modify the value of the existing row
8996          * with that name.  Note that internally setting values are always
8997          * stored as strings, so this function converts the given value to a
8998          * string before storing it.
8999          *
9000          * @param cr The ContentResolver to access.
9001          * @param name The name of the setting to modify.
9002          * @param value The new value for the setting.
9003          * @return true if the value was set, false on database errors
9004          */
putLong(ContentResolver cr, String name, long value)9005         public static boolean putLong(ContentResolver cr, String name, long value) {
9006             return putString(cr, name, Long.toString(value));
9007         }
9008 
9009         /**
9010          * Convenience function for retrieving a single secure settings value
9011          * as a floating point number.  Note that internally setting values are
9012          * always stored as strings; this function converts the string to an
9013          * float for you. The default value will be returned if the setting
9014          * is not defined or not a valid float.
9015          *
9016          * @param cr The ContentResolver to access.
9017          * @param name The name of the setting to retrieve.
9018          * @param def Value to return if the setting is not defined.
9019          *
9020          * @return The setting's current value, or 'def' if it is not defined
9021          * or not a valid float.
9022          */
getFloat(ContentResolver cr, String name, float def)9023         public static float getFloat(ContentResolver cr, String name, float def) {
9024             String v = getString(cr, name);
9025             try {
9026                 return v != null ? Float.parseFloat(v) : def;
9027             } catch (NumberFormatException e) {
9028                 return def;
9029             }
9030         }
9031 
9032         /**
9033          * Convenience function for retrieving a single secure settings value
9034          * as a float.  Note that internally setting values are always
9035          * stored as strings; this function converts the string to a float
9036          * for you.
9037          * <p>
9038          * This version does not take a default value.  If the setting has not
9039          * been set, or the string value is not a number,
9040          * it throws {@link SettingNotFoundException}.
9041          *
9042          * @param cr The ContentResolver to access.
9043          * @param name The name of the setting to retrieve.
9044          *
9045          * @throws SettingNotFoundException Thrown if a setting by the given
9046          * name can't be found or the setting value is not a float.
9047          *
9048          * @return The setting's current value.
9049          */
getFloat(ContentResolver cr, String name)9050         public static float getFloat(ContentResolver cr, String name)
9051                 throws SettingNotFoundException {
9052             String v = getString(cr, name);
9053             if (v == null) {
9054                 throw new SettingNotFoundException(name);
9055             }
9056             try {
9057                 return Float.parseFloat(v);
9058             } catch (NumberFormatException e) {
9059                 throw new SettingNotFoundException(name);
9060             }
9061         }
9062 
9063         /**
9064          * Convenience function for updating a single settings value as a
9065          * floating point number. This will either create a new entry in the
9066          * table if the given name does not exist, or modify the value of the
9067          * existing row with that name.  Note that internally setting values
9068          * are always stored as strings, so this function converts the given
9069          * value to a string before storing it.
9070          *
9071          * @param cr The ContentResolver to access.
9072          * @param name The name of the setting to modify.
9073          * @param value The new value for the setting.
9074          * @return true if the value was set, false on database errors
9075          */
putFloat(ContentResolver cr, String name, float value)9076         public static boolean putFloat(ContentResolver cr, String name, float value) {
9077             return putString(cr, name, Float.toString(value));
9078         }
9079 
9080 
9081         /**
9082           * Subscription to be used for voice call on a multi sim device. The supported values
9083           * are 0 = SUB1, 1 = SUB2 and etc.
9084           * @hide
9085           */
9086         public static final String MULTI_SIM_VOICE_CALL_SUBSCRIPTION = "multi_sim_voice_call";
9087 
9088         /**
9089           * Used to provide option to user to select subscription during dial.
9090           * The supported values are 0 = disable or 1 = enable prompt.
9091           * @hide
9092           */
9093         public static final String MULTI_SIM_VOICE_PROMPT = "multi_sim_voice_prompt";
9094 
9095         /**
9096           * Subscription to be used for data call on a multi sim device. The supported values
9097           * are 0 = SUB1, 1 = SUB2 and etc.
9098           * @hide
9099           */
9100         public static final String MULTI_SIM_DATA_CALL_SUBSCRIPTION = "multi_sim_data_call";
9101 
9102         /**
9103           * Subscription to be used for SMS on a multi sim device. The supported values
9104           * are 0 = SUB1, 1 = SUB2 and etc.
9105           * @hide
9106           */
9107         public static final String MULTI_SIM_SMS_SUBSCRIPTION = "multi_sim_sms";
9108 
9109        /**
9110           * Used to provide option to user to select subscription during send SMS.
9111           * The value 1 - enable, 0 - disable
9112           * @hide
9113           */
9114         public static final String MULTI_SIM_SMS_PROMPT = "multi_sim_sms_prompt";
9115 
9116 
9117 
9118         /** User preferred subscriptions setting.
9119           * This holds the details of the user selected subscription from the card and
9120           * the activation status. Each settings string have the coma separated values
9121           * iccId,appType,appId,activationStatus,3gppIndex,3gpp2Index
9122           * @hide
9123          */
9124         public static final String[] MULTI_SIM_USER_PREFERRED_SUBS = {"user_preferred_sub1",
9125                 "user_preferred_sub2","user_preferred_sub3"};
9126 
9127         /**
9128          * Whether to enable new contacts aggregator or not.
9129          * The value 1 - enable, 0 - disable
9130          * @hide
9131          */
9132         public static final String NEW_CONTACT_AGGREGATOR = "new_contact_aggregator";
9133 
9134         /**
9135          * Whether to enable contacts metadata syncing or not
9136          * The value 1 - enable, 0 - disable
9137          *
9138          * @removed
9139          */
9140         @Deprecated
9141         public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
9142 
9143         /**
9144          * Whether to enable contacts metadata syncing or not
9145          * The value 1 - enable, 0 - disable
9146          */
9147         public static final String CONTACT_METADATA_SYNC_ENABLED = "contact_metadata_sync_enabled";
9148 
9149         /**
9150          * Whether to enable cellular on boot.
9151          * The value 1 - enable, 0 - disable
9152          * @hide
9153          */
9154         public static final String ENABLE_CELLULAR_ON_BOOT = "enable_cellular_on_boot";
9155 
9156         /**
9157          * The maximum allowed notification enqueue rate in Hertz.
9158          *
9159          * Should be a float, and includes both posts and updates.
9160          * @hide
9161          */
9162         public static final String MAX_NOTIFICATION_ENQUEUE_RATE = "max_notification_enqueue_rate";
9163 
9164         /**
9165          * Whether cell is enabled/disabled
9166          * @hide
9167          */
9168         public static final String CELL_ON = "cell_on";
9169     }
9170 
9171     /**
9172      * User-defined bookmarks and shortcuts.  The target of each bookmark is an
9173      * Intent URL, allowing it to be either a web page or a particular
9174      * application activity.
9175      *
9176      * @hide
9177      */
9178     public static final class Bookmarks implements BaseColumns
9179     {
9180         private static final String TAG = "Bookmarks";
9181 
9182         /**
9183          * The content:// style URL for this table
9184          */
9185         public static final Uri CONTENT_URI =
9186             Uri.parse("content://" + AUTHORITY + "/bookmarks");
9187 
9188         /**
9189          * The row ID.
9190          * <p>Type: INTEGER</p>
9191          */
9192         public static final String ID = "_id";
9193 
9194         /**
9195          * Descriptive name of the bookmark that can be displayed to the user.
9196          * If this is empty, the title should be resolved at display time (use
9197          * {@link #getTitle(Context, Cursor)} any time you want to display the
9198          * title of a bookmark.)
9199          * <P>
9200          * Type: TEXT
9201          * </P>
9202          */
9203         public static final String TITLE = "title";
9204 
9205         /**
9206          * Arbitrary string (displayed to the user) that allows bookmarks to be
9207          * organized into categories.  There are some special names for
9208          * standard folders, which all start with '@'.  The label displayed for
9209          * the folder changes with the locale (via {@link #getLabelForFolder}) but
9210          * the folder name does not change so you can consistently query for
9211          * the folder regardless of the current locale.
9212          *
9213          * <P>Type: TEXT</P>
9214          *
9215          */
9216         public static final String FOLDER = "folder";
9217 
9218         /**
9219          * The Intent URL of the bookmark, describing what it points to.  This
9220          * value is given to {@link android.content.Intent#getIntent} to create
9221          * an Intent that can be launched.
9222          * <P>Type: TEXT</P>
9223          */
9224         public static final String INTENT = "intent";
9225 
9226         /**
9227          * Optional shortcut character associated with this bookmark.
9228          * <P>Type: INTEGER</P>
9229          */
9230         public static final String SHORTCUT = "shortcut";
9231 
9232         /**
9233          * The order in which the bookmark should be displayed
9234          * <P>Type: INTEGER</P>
9235          */
9236         public static final String ORDERING = "ordering";
9237 
9238         private static final String[] sIntentProjection = { INTENT };
9239         private static final String[] sShortcutProjection = { ID, SHORTCUT };
9240         private static final String sShortcutSelection = SHORTCUT + "=?";
9241 
9242         /**
9243          * Convenience function to retrieve the bookmarked Intent for a
9244          * particular shortcut key.
9245          *
9246          * @param cr The ContentResolver to query.
9247          * @param shortcut The shortcut key.
9248          *
9249          * @return Intent The bookmarked URL, or null if there is no bookmark
9250          *         matching the given shortcut.
9251          */
getIntentForShortcut(ContentResolver cr, char shortcut)9252         public static Intent getIntentForShortcut(ContentResolver cr, char shortcut)
9253         {
9254             Intent intent = null;
9255 
9256             Cursor c = cr.query(CONTENT_URI,
9257                     sIntentProjection, sShortcutSelection,
9258                     new String[] { String.valueOf((int) shortcut) }, ORDERING);
9259             // Keep trying until we find a valid shortcut
9260             try {
9261                 while (intent == null && c.moveToNext()) {
9262                     try {
9263                         String intentURI = c.getString(c.getColumnIndexOrThrow(INTENT));
9264                         intent = Intent.parseUri(intentURI, 0);
9265                     } catch (java.net.URISyntaxException e) {
9266                         // The stored URL is bad...  ignore it.
9267                     } catch (IllegalArgumentException e) {
9268                         // Column not found
9269                         Log.w(TAG, "Intent column not found", e);
9270                     }
9271                 }
9272             } finally {
9273                 if (c != null) c.close();
9274             }
9275 
9276             return intent;
9277         }
9278 
9279         /**
9280          * Add a new bookmark to the system.
9281          *
9282          * @param cr The ContentResolver to query.
9283          * @param intent The desired target of the bookmark.
9284          * @param title Bookmark title that is shown to the user; null if none
9285          *            or it should be resolved to the intent's title.
9286          * @param folder Folder in which to place the bookmark; null if none.
9287          * @param shortcut Shortcut that will invoke the bookmark; 0 if none. If
9288          *            this is non-zero and there is an existing bookmark entry
9289          *            with this same shortcut, then that existing shortcut is
9290          *            cleared (the bookmark is not removed).
9291          * @return The unique content URL for the new bookmark entry.
9292          */
add(ContentResolver cr, Intent intent, String title, String folder, char shortcut, int ordering)9293         public static Uri add(ContentResolver cr,
9294                                            Intent intent,
9295                                            String title,
9296                                            String folder,
9297                                            char shortcut,
9298                                            int ordering)
9299         {
9300             // If a shortcut is supplied, and it is already defined for
9301             // another bookmark, then remove the old definition.
9302             if (shortcut != 0) {
9303                 cr.delete(CONTENT_URI, sShortcutSelection,
9304                         new String[] { String.valueOf((int) shortcut) });
9305             }
9306 
9307             ContentValues values = new ContentValues();
9308             if (title != null) values.put(TITLE, title);
9309             if (folder != null) values.put(FOLDER, folder);
9310             values.put(INTENT, intent.toUri(0));
9311             if (shortcut != 0) values.put(SHORTCUT, (int) shortcut);
9312             values.put(ORDERING, ordering);
9313             return cr.insert(CONTENT_URI, values);
9314         }
9315 
9316         /**
9317          * Return the folder name as it should be displayed to the user.  This
9318          * takes care of localizing special folders.
9319          *
9320          * @param r Resources object for current locale; only need access to
9321          *          system resources.
9322          * @param folder The value found in the {@link #FOLDER} column.
9323          *
9324          * @return CharSequence The label for this folder that should be shown
9325          *         to the user.
9326          */
getLabelForFolder(Resources r, String folder)9327         public static CharSequence getLabelForFolder(Resources r, String folder) {
9328             return folder;
9329         }
9330 
9331         /**
9332          * Return the title as it should be displayed to the user. This takes
9333          * care of localizing bookmarks that point to activities.
9334          *
9335          * @param context A context.
9336          * @param cursor A cursor pointing to the row whose title should be
9337          *        returned. The cursor must contain at least the {@link #TITLE}
9338          *        and {@link #INTENT} columns.
9339          * @return A title that is localized and can be displayed to the user,
9340          *         or the empty string if one could not be found.
9341          */
getTitle(Context context, Cursor cursor)9342         public static CharSequence getTitle(Context context, Cursor cursor) {
9343             int titleColumn = cursor.getColumnIndex(TITLE);
9344             int intentColumn = cursor.getColumnIndex(INTENT);
9345             if (titleColumn == -1 || intentColumn == -1) {
9346                 throw new IllegalArgumentException(
9347                         "The cursor must contain the TITLE and INTENT columns.");
9348             }
9349 
9350             String title = cursor.getString(titleColumn);
9351             if (!TextUtils.isEmpty(title)) {
9352                 return title;
9353             }
9354 
9355             String intentUri = cursor.getString(intentColumn);
9356             if (TextUtils.isEmpty(intentUri)) {
9357                 return "";
9358             }
9359 
9360             Intent intent;
9361             try {
9362                 intent = Intent.parseUri(intentUri, 0);
9363             } catch (URISyntaxException e) {
9364                 return "";
9365             }
9366 
9367             PackageManager packageManager = context.getPackageManager();
9368             ResolveInfo info = packageManager.resolveActivity(intent, 0);
9369             return info != null ? info.loadLabel(packageManager) : "";
9370         }
9371     }
9372 
9373     /**
9374      * Returns the device ID that we should use when connecting to the mobile gtalk server.
9375      * This is a string like "android-0x1242", where the hex string is the Android ID obtained
9376      * from the GoogleLoginService.
9377      *
9378      * @param androidId The Android ID for this device.
9379      * @return The device ID that should be used when connecting to the mobile gtalk server.
9380      * @hide
9381      */
getGTalkDeviceId(long androidId)9382     public static String getGTalkDeviceId(long androidId) {
9383         return "android-" + Long.toHexString(androidId);
9384     }
9385 
9386     private static final String[] PM_WRITE_SETTINGS = {
9387         android.Manifest.permission.WRITE_SETTINGS
9388     };
9389     private static final String[] PM_CHANGE_NETWORK_STATE = {
9390         android.Manifest.permission.CHANGE_NETWORK_STATE,
9391         android.Manifest.permission.WRITE_SETTINGS
9392     };
9393     private static final String[] PM_SYSTEM_ALERT_WINDOW = {
9394         android.Manifest.permission.SYSTEM_ALERT_WINDOW
9395     };
9396 
9397     /**
9398      * Performs a strict and comprehensive check of whether a calling package is allowed to
9399      * write/modify system settings, as the condition differs for pre-M, M+, and
9400      * privileged/preinstalled apps. If the provided uid does not match the
9401      * callingPackage, a negative result will be returned.
9402      * @hide
9403      */
isCallingPackageAllowedToWriteSettings(Context context, int uid, String callingPackage, boolean throwException)9404     public static boolean isCallingPackageAllowedToWriteSettings(Context context, int uid,
9405             String callingPackage, boolean throwException) {
9406         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9407                 callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
9408                 PM_WRITE_SETTINGS, false);
9409     }
9410 
9411     /**
9412      * Performs a strict and comprehensive check of whether a calling package is allowed to
9413      * write/modify system settings, as the condition differs for pre-M, M+, and
9414      * privileged/preinstalled apps. If the provided uid does not match the
9415      * callingPackage, a negative result will be returned. The caller is expected to have
9416      * the WRITE_SETTINGS permission declared.
9417      *
9418      * Note: if the check is successful, the operation of this app will be updated to the
9419      * current time.
9420      * @hide
9421      */
checkAndNoteWriteSettingsOperation(Context context, int uid, String callingPackage, boolean throwException)9422     public static boolean checkAndNoteWriteSettingsOperation(Context context, int uid,
9423             String callingPackage, boolean throwException) {
9424         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9425                 callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
9426                 PM_WRITE_SETTINGS, true);
9427     }
9428 
9429     /**
9430      * Performs a strict and comprehensive check of whether a calling package is allowed to
9431      * change the state of network, as the condition differs for pre-M, M+, and
9432      * privileged/preinstalled apps. The caller is expected to have either the
9433      * CHANGE_NETWORK_STATE or the WRITE_SETTINGS permission declared. Either of these
9434      * permissions allow changing network state; WRITE_SETTINGS is a runtime permission and
9435      * can be revoked, but (except in M, excluding M MRs), CHANGE_NETWORK_STATE is a normal
9436      * permission and cannot be revoked. See http://b/23597341
9437      *
9438      * Note: if the check succeeds because the application holds WRITE_SETTINGS, the operation
9439      * of this app will be updated to the current time.
9440      * @hide
9441      */
checkAndNoteChangeNetworkStateOperation(Context context, int uid, String callingPackage, boolean throwException)9442     public static boolean checkAndNoteChangeNetworkStateOperation(Context context, int uid,
9443             String callingPackage, boolean throwException) {
9444         if (context.checkCallingOrSelfPermission(android.Manifest.permission.CHANGE_NETWORK_STATE)
9445                 == PackageManager.PERMISSION_GRANTED) {
9446             return true;
9447         }
9448         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9449                 callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
9450                 PM_CHANGE_NETWORK_STATE, true);
9451     }
9452 
9453     /**
9454      * Performs a strict and comprehensive check of whether a calling package is allowed to
9455      * draw on top of other apps, as the conditions differs for pre-M, M+, and
9456      * privileged/preinstalled apps. If the provided uid does not match the callingPackage,
9457      * a negative result will be returned.
9458      * @hide
9459      */
isCallingPackageAllowedToDrawOverlays(Context context, int uid, String callingPackage, boolean throwException)9460     public static boolean isCallingPackageAllowedToDrawOverlays(Context context, int uid,
9461             String callingPackage, boolean throwException) {
9462         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9463                 callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
9464                 PM_SYSTEM_ALERT_WINDOW, false);
9465     }
9466 
9467     /**
9468      * Performs a strict and comprehensive check of whether a calling package is allowed to
9469      * draw on top of other apps, as the conditions differs for pre-M, M+, and
9470      * privileged/preinstalled apps. If the provided uid does not match the callingPackage,
9471      * a negative result will be returned.
9472      *
9473      * Note: if the check is successful, the operation of this app will be updated to the
9474      * current time.
9475      * @hide
9476      */
checkAndNoteDrawOverlaysOperation(Context context, int uid, String callingPackage, boolean throwException)9477     public static boolean checkAndNoteDrawOverlaysOperation(Context context, int uid, String
9478             callingPackage, boolean throwException) {
9479         return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9480                 callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
9481                 PM_SYSTEM_ALERT_WINDOW, true);
9482     }
9483 
9484     /**
9485      * Helper method to perform a general and comprehensive check of whether an operation that is
9486      * protected by appops can be performed by a caller or not. e.g. OP_SYSTEM_ALERT_WINDOW and
9487      * OP_WRITE_SETTINGS
9488      * @hide
9489      */
isCallingPackageAllowedToPerformAppOpsProtectedOperation(Context context, int uid, String callingPackage, boolean throwException, int appOpsOpCode, String[] permissions, boolean makeNote)9490     public static boolean isCallingPackageAllowedToPerformAppOpsProtectedOperation(Context context,
9491             int uid, String callingPackage, boolean throwException, int appOpsOpCode, String[]
9492             permissions, boolean makeNote) {
9493         if (callingPackage == null) {
9494             return false;
9495         }
9496 
9497         AppOpsManager appOpsMgr = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
9498         int mode = AppOpsManager.MODE_DEFAULT;
9499         if (makeNote) {
9500             mode = appOpsMgr.noteOpNoThrow(appOpsOpCode, uid, callingPackage);
9501         } else {
9502             mode = appOpsMgr.checkOpNoThrow(appOpsOpCode, uid, callingPackage);
9503         }
9504 
9505         switch (mode) {
9506             case AppOpsManager.MODE_ALLOWED:
9507                 return true;
9508 
9509             case AppOpsManager.MODE_DEFAULT:
9510                 // this is the default operating mode after an app's installation
9511                 // In this case we will check all associated static permission to see
9512                 // if it is granted during install time.
9513                 for (String permission : permissions) {
9514                     if (context.checkCallingOrSelfPermission(permission) == PackageManager
9515                             .PERMISSION_GRANTED) {
9516                         // if either of the permissions are granted, we will allow it
9517                         return true;
9518                     }
9519                 }
9520 
9521             default:
9522                 // this is for all other cases trickled down here...
9523                 if (!throwException) {
9524                     return false;
9525                 }
9526         }
9527 
9528         // prepare string to throw SecurityException
9529         StringBuilder exceptionMessage = new StringBuilder();
9530         exceptionMessage.append(callingPackage);
9531         exceptionMessage.append(" was not granted ");
9532         if (permissions.length > 1) {
9533             exceptionMessage.append(" either of these permissions: ");
9534         } else {
9535             exceptionMessage.append(" this permission: ");
9536         }
9537         for (int i = 0; i < permissions.length; i++) {
9538             exceptionMessage.append(permissions[i]);
9539             exceptionMessage.append((i == permissions.length - 1) ? "." : ", ");
9540         }
9541 
9542         throw new SecurityException(exceptionMessage.toString());
9543     }
9544 
9545     /**
9546      * Retrieves a correponding package name for a given uid. It will query all
9547      * packages that are associated with the given uid, but it will return only
9548      * the zeroth result.
9549      * Note: If package could not be found, a null is returned.
9550      * @hide
9551      */
getPackageNameForUid(Context context, int uid)9552     public static String getPackageNameForUid(Context context, int uid) {
9553         String[] packages = context.getPackageManager().getPackagesForUid(uid);
9554         if (packages == null) {
9555             return null;
9556         }
9557         return packages[0];
9558     }
9559 }
9560