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