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