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