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