Settings.java revision 682c24e22811d4ee17ae1cd61bf255c3f7e722b7
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.
535     * <p>
536     * In some cases, a matching Activity may not exist, so ensure you
537     * safeguard against this.
538     * <p>
539     * Input: Nothing.
540     * <p>
541     * Output: Nothing.
542     */
543    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
544    public static final String ACTION_HARD_KEYBOARD_SETTINGS =
545            "android.settings.HARD_KEYBOARD_SETTINGS";
546
547    /**
548     * Activity Action: Adds a word to the user dictionary.
549     * <p>
550     * In some cases, a matching Activity may not exist, so ensure you
551     * safeguard against this.
552     * <p>
553     * Input: An extra with key <code>word</code> that contains the word
554     * that should be added to the dictionary.
555     * <p>
556     * Output: Nothing.
557     *
558     * @hide
559     */
560    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
561    public static final String ACTION_USER_DICTIONARY_INSERT =
562            "com.android.settings.USER_DICTIONARY_INSERT";
563
564    /**
565     * Activity Action: Show settings to allow configuration of application-related settings.
566     * <p>
567     * In some cases, a matching Activity may not exist, so ensure you
568     * safeguard against this.
569     * <p>
570     * Input: Nothing.
571     * <p>
572     * Output: Nothing.
573     */
574    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
575    public static final String ACTION_APPLICATION_SETTINGS =
576            "android.settings.APPLICATION_SETTINGS";
577
578    /**
579     * Activity Action: Show settings to allow configuration of application
580     * development-related settings.  As of
581     * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} this action is
582     * a required part of the platform.
583     * <p>
584     * Input: Nothing.
585     * <p>
586     * Output: Nothing.
587     */
588    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
589    public static final String ACTION_APPLICATION_DEVELOPMENT_SETTINGS =
590            "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
591
592    /**
593     * Activity Action: Show settings to allow configuration of quick launch shortcuts.
594     * <p>
595     * In some cases, a matching Activity may not exist, so ensure you
596     * safeguard against this.
597     * <p>
598     * Input: Nothing.
599     * <p>
600     * Output: Nothing.
601     */
602    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
603    public static final String ACTION_QUICK_LAUNCH_SETTINGS =
604            "android.settings.QUICK_LAUNCH_SETTINGS";
605
606    /**
607     * Activity Action: Show settings to manage installed applications.
608     * <p>
609     * In some cases, a matching Activity may not exist, so ensure you
610     * safeguard against this.
611     * <p>
612     * Input: Nothing.
613     * <p>
614     * Output: Nothing.
615     */
616    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
617    public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS =
618            "android.settings.MANAGE_APPLICATIONS_SETTINGS";
619
620    /**
621     * Activity Action: Show settings to manage all applications.
622     * <p>
623     * In some cases, a matching Activity may not exist, so ensure you
624     * safeguard against this.
625     * <p>
626     * Input: Nothing.
627     * <p>
628     * Output: Nothing.
629     */
630    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
631    public static final String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS =
632            "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
633
634    /**
635     * Activity Action: Show screen for controlling which apps can draw on top of other apps.
636     * <p>
637     * In some cases, a matching Activity may not exist, so ensure you
638     * safeguard against this.
639     * <p>
640     * Input: Optionally, the Intent's data URI can specify the application package name to
641     * directly invoke the management GUI specific to the package name. For example
642     * "package:com.my.app".
643     * <p>
644     * Output: Nothing.
645     */
646    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
647    public static final String ACTION_MANAGE_OVERLAY_PERMISSION =
648            "android.settings.action.MANAGE_OVERLAY_PERMISSION";
649
650    /**
651     * Activity Action: Show screen for controlling which apps are allowed to write/modify
652     * system settings.
653     * <p>
654     * In some cases, a matching Activity may not exist, so ensure you
655     * safeguard against this.
656     * <p>
657     * Input: Optionally, the Intent's data URI can specify the application package name to
658     * directly invoke the management GUI specific to the package name. For example
659     * "package:com.my.app".
660     * <p>
661     * Output: Nothing.
662     */
663    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
664    public static final String ACTION_MANAGE_WRITE_SETTINGS =
665            "android.settings.action.MANAGE_WRITE_SETTINGS";
666
667    /**
668     * Activity Action: Show screen of details about a particular application.
669     * <p>
670     * In some cases, a matching Activity may not exist, so ensure you
671     * safeguard against this.
672     * <p>
673     * Input: The Intent's data URI specifies the application package name
674     * to be shown, with the "package" scheme.  That is "package:com.my.app".
675     * <p>
676     * Output: Nothing.
677     */
678    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
679    public static final String ACTION_APPLICATION_DETAILS_SETTINGS =
680            "android.settings.APPLICATION_DETAILS_SETTINGS";
681
682    /**
683     * Activity Action: Show screen for controlling which apps can ignore battery optimizations.
684     * <p>
685     * Input: Nothing.
686     * <p>
687     * Output: Nothing.
688     * <p>
689     * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations
690     * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is
691     * already ignoring optimizations.  You can use
692     * {@link #ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS} to ask the user to put you
693     * on this list.
694     */
695    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
696    public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS =
697            "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS";
698
699    /**
700     * Activity Action: Ask the user to allow an app to ignore battery optimizations (that is,
701     * put them on the whitelist of apps shown by
702     * {@link #ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}).  For an app to use this, it also
703     * must hold the {@link android.Manifest.permission#REQUEST_IGNORE_BATTERY_OPTIMIZATIONS}
704     * permission.
705     * <p><b>Note:</b> most applications should <em>not</em> use this; there are many facilities
706     * provided by the platform for applications to operate correctly in the various power
707     * saving modes.  This is only for unusual applications that need to deeply control their own
708     * execution, at the potential expense of the user's battery life.  Note that these applications
709     * greatly run the risk of showing to the user as high power consumers on their device.</p>
710     * <p>
711     * Input: The Intent's data URI must specify the application package name
712     * to be shown, with the "package" scheme.  That is "package:com.my.app".
713     * <p>
714     * Output: Nothing.
715     * <p>
716     * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations
717     * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is
718     * already ignoring optimizations.
719     */
720    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
721    public static final String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS =
722            "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
723
724    /**
725     * Activity Action: Show screen for controlling which apps can ignore background data
726     * restrictions.
727     * <p>
728     * Input: if the Intent's data URI is set with an application name (using the "package" schema,
729     * like "package:com.my.app"), then when the screen is displayed it will focus on such app. If
730     * the data is not set, it will just open the screen.
731     * <p>
732     * Output: Nothing.
733     * <p>
734     * Applications can also use {@link android.net.ConnectivityManager#getRestrictBackgroundStatus
735     * ConnectivityManager#getRestrictBackgroundStatus()} to determine the status of the background
736     * data restrictions for them.
737     */
738    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
739    public static final String ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS =
740            "android.settings.IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS";
741
742    /**
743     * @hide
744     * Activity Action: Show the "app ops" settings screen.
745     * <p>
746     * Input: Nothing.
747     * <p>
748     * Output: Nothing.
749     */
750    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
751    public static final String ACTION_APP_OPS_SETTINGS =
752            "android.settings.APP_OPS_SETTINGS";
753
754    /**
755     * Activity Action: Show settings for system update functionality.
756     * <p>
757     * In some cases, a matching Activity may not exist, so ensure you
758     * safeguard against this.
759     * <p>
760     * Input: Nothing.
761     * <p>
762     * Output: Nothing.
763     *
764     * @hide
765     */
766    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
767    public static final String ACTION_SYSTEM_UPDATE_SETTINGS =
768            "android.settings.SYSTEM_UPDATE_SETTINGS";
769
770    /**
771     * Activity Action: Show settings to allow configuration of sync settings.
772     * <p>
773     * In some cases, a matching Activity may not exist, so ensure you
774     * safeguard against this.
775     * <p>
776     * The account types available to add via the add account button may be restricted by adding an
777     * {@link #EXTRA_AUTHORITIES} extra to this Intent with one or more syncable content provider's
778     * authorities. Only account types which can sync with that content provider will be offered to
779     * the user.
780     * <p>
781     * Input: Nothing.
782     * <p>
783     * Output: Nothing.
784     */
785    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
786    public static final String ACTION_SYNC_SETTINGS =
787            "android.settings.SYNC_SETTINGS";
788
789    /**
790     * Activity Action: Show add account screen for creating a new account.
791     * <p>
792     * In some cases, a matching Activity may not exist, so ensure you
793     * safeguard against this.
794     * <p>
795     * The account types available to add may be restricted by adding an {@link #EXTRA_AUTHORITIES}
796     * extra to the Intent with one or more syncable content provider's authorities.  Only account
797     * types which can sync with that content provider will be offered to the user.
798     * <p>
799     * Account types can also be filtered by adding an {@link #EXTRA_ACCOUNT_TYPES} extra to the
800     * Intent with one or more account types.
801     * <p>
802     * Input: Nothing.
803     * <p>
804     * Output: Nothing.
805     */
806    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
807    public static final String ACTION_ADD_ACCOUNT =
808            "android.settings.ADD_ACCOUNT_SETTINGS";
809
810    /**
811     * Activity Action: Show settings for selecting the network operator.
812     * <p>
813     * In some cases, a matching Activity may not exist, so ensure you
814     * safeguard against this.
815     * <p>
816     * Input: Nothing.
817     * <p>
818     * Output: Nothing.
819     */
820    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
821    public static final String ACTION_NETWORK_OPERATOR_SETTINGS =
822            "android.settings.NETWORK_OPERATOR_SETTINGS";
823
824    /**
825     * Activity Action: Show settings for selection of 2G/3G.
826     * <p>
827     * In some cases, a matching Activity may not exist, so ensure you
828     * safeguard against this.
829     * <p>
830     * Input: Nothing.
831     * <p>
832     * Output: Nothing.
833     */
834    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
835    public static final String ACTION_DATA_ROAMING_SETTINGS =
836            "android.settings.DATA_ROAMING_SETTINGS";
837
838    /**
839     * Activity Action: Show settings for internal storage.
840     * <p>
841     * In some cases, a matching Activity may not exist, so ensure you
842     * safeguard against this.
843     * <p>
844     * Input: Nothing.
845     * <p>
846     * Output: Nothing.
847     */
848    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
849    public static final String ACTION_INTERNAL_STORAGE_SETTINGS =
850            "android.settings.INTERNAL_STORAGE_SETTINGS";
851    /**
852     * Activity Action: Show settings for memory card storage.
853     * <p>
854     * In some cases, a matching Activity may not exist, so ensure you
855     * safeguard against this.
856     * <p>
857     * Input: Nothing.
858     * <p>
859     * Output: Nothing.
860     */
861    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
862    public static final String ACTION_MEMORY_CARD_SETTINGS =
863            "android.settings.MEMORY_CARD_SETTINGS";
864
865    /**
866     * Activity Action: Show settings for global search.
867     * <p>
868     * In some cases, a matching Activity may not exist, so ensure you
869     * safeguard against this.
870     * <p>
871     * Input: Nothing.
872     * <p>
873     * Output: Nothing
874     */
875    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
876    public static final String ACTION_SEARCH_SETTINGS =
877        "android.search.action.SEARCH_SETTINGS";
878
879    /**
880     * Activity Action: Show general device information settings (serial
881     * number, software version, phone number, etc.).
882     * <p>
883     * In some cases, a matching Activity may not exist, so ensure you
884     * safeguard against this.
885     * <p>
886     * Input: Nothing.
887     * <p>
888     * Output: Nothing
889     */
890    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
891    public static final String ACTION_DEVICE_INFO_SETTINGS =
892        "android.settings.DEVICE_INFO_SETTINGS";
893
894    /**
895     * Activity Action: Show NFC settings.
896     * <p>
897     * This shows UI that allows NFC to be turned on or off.
898     * <p>
899     * In some cases, a matching Activity may not exist, so ensure you
900     * safeguard against this.
901     * <p>
902     * Input: Nothing.
903     * <p>
904     * Output: Nothing
905     * @see android.nfc.NfcAdapter#isEnabled()
906     */
907    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
908    public static final String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
909
910    /**
911     * Activity Action: Show NFC Sharing settings.
912     * <p>
913     * This shows UI that allows NDEF Push (Android Beam) to be turned on or
914     * off.
915     * <p>
916     * In some cases, a matching Activity may not exist, so ensure you
917     * safeguard against this.
918     * <p>
919     * Input: Nothing.
920     * <p>
921     * Output: Nothing
922     * @see android.nfc.NfcAdapter#isNdefPushEnabled()
923     */
924    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
925    public static final String ACTION_NFCSHARING_SETTINGS =
926        "android.settings.NFCSHARING_SETTINGS";
927
928    /**
929     * Activity Action: Show NFC Tap & Pay settings
930     * <p>
931     * This shows UI that allows the user to configure Tap&Pay
932     * settings.
933     * <p>
934     * In some cases, a matching Activity may not exist, so ensure you
935     * safeguard against this.
936     * <p>
937     * Input: Nothing.
938     * <p>
939     * Output: Nothing
940     */
941    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
942    public static final String ACTION_NFC_PAYMENT_SETTINGS =
943        "android.settings.NFC_PAYMENT_SETTINGS";
944
945    /**
946     * Activity Action: Show Daydream settings.
947     * <p>
948     * In some cases, a matching Activity may not exist, so ensure you
949     * safeguard against this.
950     * <p>
951     * Input: Nothing.
952     * <p>
953     * Output: Nothing.
954     * @see android.service.dreams.DreamService
955     */
956    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
957    public static final String ACTION_DREAM_SETTINGS = "android.settings.DREAM_SETTINGS";
958
959    /**
960     * Activity Action: Show Notification listener settings.
961     * <p>
962     * In some cases, a matching Activity may not exist, so ensure you
963     * safeguard against this.
964     * <p>
965     * Input: Nothing.
966     * <p>
967     * Output: Nothing.
968     * @see android.service.notification.NotificationListenerService
969     */
970    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
971    public static final String ACTION_NOTIFICATION_LISTENER_SETTINGS
972            = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
973
974    /**
975     * Activity Action: Show Do Not Disturb access settings.
976     * <p>
977     * Users can grant and deny access to Do Not Disturb configuration from here.
978     * See {@link android.app.NotificationManager#isNotificationPolicyAccessGranted()} for more
979     * details.
980     * <p>
981     * Input: Nothing.
982     * <p>
983     * Output: Nothing.
984     */
985    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
986    public static final String ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
987            = "android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS";
988
989    /**
990     * @hide
991     */
992    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
993    public static final String ACTION_CONDITION_PROVIDER_SETTINGS
994            = "android.settings.ACTION_CONDITION_PROVIDER_SETTINGS";
995
996    /**
997     * Activity Action: Show settings for video captioning.
998     * <p>
999     * In some cases, a matching Activity may not exist, so ensure you safeguard
1000     * against this.
1001     * <p>
1002     * Input: Nothing.
1003     * <p>
1004     * Output: Nothing.
1005     */
1006    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1007    public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
1008
1009    /**
1010     * Activity Action: Show the top level print settings.
1011     * <p>
1012     * In some cases, a matching Activity may not exist, so ensure you
1013     * safeguard against this.
1014     * <p>
1015     * Input: Nothing.
1016     * <p>
1017     * Output: Nothing.
1018     */
1019    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1020    public static final String ACTION_PRINT_SETTINGS =
1021            "android.settings.ACTION_PRINT_SETTINGS";
1022
1023    /**
1024     * Activity Action: Show Zen Mode configuration settings.
1025     *
1026     * @hide
1027     */
1028    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1029    public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
1030
1031    /**
1032     * Activity Action: Show Zen Mode priority configuration settings.
1033     *
1034     * @hide
1035     */
1036    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1037    public static final String ACTION_ZEN_MODE_PRIORITY_SETTINGS
1038            = "android.settings.ZEN_MODE_PRIORITY_SETTINGS";
1039
1040    /**
1041     * Activity Action: Show Zen Mode automation configuration settings.
1042     *
1043     * @hide
1044     */
1045    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1046    public static final String ACTION_ZEN_MODE_AUTOMATION_SETTINGS
1047            = "android.settings.ZEN_MODE_AUTOMATION_SETTINGS";
1048
1049    /**
1050     * Activity Action: Modify do not disturb mode settings.
1051     * <p>
1052     * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
1053     * <p>
1054     * This intent MUST be started using
1055     * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
1056     * startVoiceActivity}.
1057     * <p>
1058     * Note: The Activity implementing this intent MUST verify that
1059     * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction}.
1060     * returns true before modifying the setting.
1061     * <p>
1062     * Input: The optional {@link #EXTRA_DO_NOT_DISTURB_MODE_MINUTES} extra can be used to indicate
1063     * how long the user wishes to avoid interruptions for. The optional
1064     * {@link #EXTRA_DO_NOT_DISTURB_MODE_ENABLED} extra can be to indicate if the user is
1065     * enabling or disabling do not disturb mode. If either extra is not included, the
1066     * user maybe asked to provide the value.
1067     * <p>
1068     * Output: Nothing.
1069     */
1070    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1071    public static final String ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE =
1072            "android.settings.VOICE_CONTROL_DO_NOT_DISTURB_MODE";
1073
1074    /**
1075     * Activity Action: Show Zen Mode schedule rule configuration settings.
1076     *
1077     * @hide
1078     */
1079    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1080    public static final String ACTION_ZEN_MODE_SCHEDULE_RULE_SETTINGS
1081            = "android.settings.ZEN_MODE_SCHEDULE_RULE_SETTINGS";
1082
1083    /**
1084     * Activity Action: Show Zen Mode event rule configuration settings.
1085     *
1086     * @hide
1087     */
1088    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1089    public static final String ACTION_ZEN_MODE_EVENT_RULE_SETTINGS
1090            = "android.settings.ZEN_MODE_EVENT_RULE_SETTINGS";
1091
1092    /**
1093     * Activity Action: Show Zen Mode external rule configuration settings.
1094     *
1095     * @hide
1096     */
1097    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1098    public static final String ACTION_ZEN_MODE_EXTERNAL_RULE_SETTINGS
1099            = "android.settings.ZEN_MODE_EXTERNAL_RULE_SETTINGS";
1100
1101    /**
1102     * Activity Action: Show the regulatory information screen for the device.
1103     * <p>
1104     * In some cases, a matching Activity may not exist, so ensure you safeguard
1105     * against this.
1106     * <p>
1107     * Input: Nothing.
1108     * <p>
1109     * Output: Nothing.
1110     */
1111    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1112    public static final String
1113            ACTION_SHOW_REGULATORY_INFO = "android.settings.SHOW_REGULATORY_INFO";
1114
1115    /**
1116     * Activity Action: Show Device Name Settings.
1117     * <p>
1118     * In some cases, a matching Activity may not exist, so ensure you safeguard
1119     * against this.
1120     *
1121     * @hide
1122     */
1123    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1124    public static final String DEVICE_NAME_SETTINGS = "android.settings.DEVICE_NAME";
1125
1126    /**
1127     * Activity Action: Show pairing settings.
1128     * <p>
1129     * In some cases, a matching Activity may not exist, so ensure you safeguard
1130     * against this.
1131     *
1132     * @hide
1133     */
1134    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1135    public static final String ACTION_PAIRING_SETTINGS = "android.settings.PAIRING_SETTINGS";
1136
1137    /**
1138     * Activity Action: Show battery saver settings.
1139     * <p>
1140     * In some cases, a matching Activity may not exist, so ensure you safeguard
1141     * against this.
1142     */
1143    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1144    public static final String ACTION_BATTERY_SAVER_SETTINGS
1145            = "android.settings.BATTERY_SAVER_SETTINGS";
1146
1147    /**
1148     * Activity Action: Modify Battery Saver mode setting using a voice command.
1149     * <p>
1150     * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
1151     * <p>
1152     * This intent MUST be started using
1153     * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
1154     * startVoiceActivity}.
1155     * <p>
1156     * Note: The activity implementing this intent MUST verify that
1157     * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction} returns true before
1158     * modifying the setting.
1159     * <p>
1160     * Input: To tell which state batter saver mode should be set to, add the
1161     * {@link #EXTRA_BATTERY_SAVER_MODE_ENABLED} extra to this Intent with the state specified.
1162     * If the extra is not included, no changes will be made.
1163     * <p>
1164     * Output: Nothing.
1165     */
1166    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1167    public static final String ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE =
1168            "android.settings.VOICE_CONTROL_BATTERY_SAVER_MODE";
1169
1170    /**
1171     * Activity Action: Show Home selection settings. If there are multiple activities
1172     * that can satisfy the {@link Intent#CATEGORY_HOME} intent, this screen allows you
1173     * to pick your preferred activity.
1174     */
1175    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1176    public static final String ACTION_HOME_SETTINGS
1177            = "android.settings.HOME_SETTINGS";
1178
1179
1180
1181    /**
1182     * Activity Action: Show Default apps settings.
1183     * <p>
1184     * In some cases, a matching Activity may not exist, so ensure you
1185     * safeguard against this.
1186     * <p>
1187     * Input: Nothing.
1188     * <p>
1189     * Output: Nothing.
1190     */
1191    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1192    public static final String ACTION_MANAGE_DEFAULT_APPS_SETTINGS
1193            = "android.settings.MANAGE_DEFAULT_APPS_SETTINGS";
1194
1195    /**
1196     * Activity Action: Show notification settings.
1197     *
1198     * @hide
1199     */
1200    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1201    public static final String ACTION_NOTIFICATION_SETTINGS
1202            = "android.settings.NOTIFICATION_SETTINGS";
1203
1204    /**
1205     * Activity Action: Show notification settings for a single app.
1206     *
1207     * @hide
1208     */
1209    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1210    public static final String ACTION_APP_NOTIFICATION_SETTINGS
1211            = "android.settings.APP_NOTIFICATION_SETTINGS";
1212
1213    /**
1214     * Activity Action: Show notification redaction settings.
1215     *
1216     * @hide
1217     */
1218    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1219    public static final String ACTION_APP_NOTIFICATION_REDACTION
1220            = "android.settings.ACTION_APP_NOTIFICATION_REDACTION";
1221
1222    /** @hide */ public static final String EXTRA_APP_UID = "app_uid";
1223    /** @hide */ public static final String EXTRA_APP_PACKAGE = "app_package";
1224
1225    /**
1226     * Activity Action: Show a dialog with disabled by policy message.
1227     * <p> If an user action is disabled by policy, this dialog can be triggered to let
1228     * the user know about this.
1229     * <p>
1230     * Input: Nothing.
1231     * <p>
1232     * Output: Nothing.
1233     *
1234     * @hide
1235     */
1236    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1237    public static final String ACTION_SHOW_ADMIN_SUPPORT_DETAILS
1238            = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS";
1239
1240    /**
1241     * Activity Action: Show a dialog for remote bugreport flow.
1242     * <p>
1243     * Input: Nothing.
1244     * <p>
1245     * Output: Nothing.
1246     *
1247     * @hide
1248     */
1249    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1250    public static final String ACTION_SHOW_REMOTE_BUGREPORT_DIALOG
1251            = "android.settings.SHOW_REMOTE_BUGREPORT_DIALOG";
1252
1253    /**
1254     * Activity Action: Show VR listener settings.
1255     * <p>
1256     * Input: Nothing.
1257     * <p>
1258     * Output: Nothing.
1259     *
1260     * @see android.service.vr.VrListenerService
1261     */
1262    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1263    public static final String ACTION_VR_LISTENER_SETTINGS
1264            = "android.settings.VR_LISTENER_SETTINGS";
1265
1266    // End of Intent actions for Settings
1267
1268    /**
1269     * @hide - Private call() method on SettingsProvider to read from 'system' table.
1270     */
1271    public static final String CALL_METHOD_GET_SYSTEM = "GET_system";
1272
1273    /**
1274     * @hide - Private call() method on SettingsProvider to read from 'secure' table.
1275     */
1276    public static final String CALL_METHOD_GET_SECURE = "GET_secure";
1277
1278    /**
1279     * @hide - Private call() method on SettingsProvider to read from 'global' table.
1280     */
1281    public static final String CALL_METHOD_GET_GLOBAL = "GET_global";
1282
1283    /**
1284     * @hide - User handle argument extra to the fast-path call()-based requests
1285     */
1286    public static final String CALL_METHOD_USER_KEY = "_user";
1287
1288    /** @hide - Private call() method to write to 'system' table */
1289    public static final String CALL_METHOD_PUT_SYSTEM = "PUT_system";
1290
1291    /** @hide - Private call() method to write to 'secure' table */
1292    public static final String CALL_METHOD_PUT_SECURE = "PUT_secure";
1293
1294    /** @hide - Private call() method to write to 'global' table */
1295    public static final String CALL_METHOD_PUT_GLOBAL= "PUT_global";
1296
1297    /**
1298     * Activity Extra: Limit available options in launched activity based on the given authority.
1299     * <p>
1300     * This can be passed as an extra field in an Activity Intent with one or more syncable content
1301     * provider's authorities as a String[]. This field is used by some intents to alter the
1302     * behavior of the called activity.
1303     * <p>
1304     * Example: The {@link #ACTION_ADD_ACCOUNT} intent restricts the account types available based
1305     * on the authority given.
1306     */
1307    public static final String EXTRA_AUTHORITIES = "authorities";
1308
1309    /**
1310     * Activity Extra: Limit available options in launched activity based on the given account
1311     * types.
1312     * <p>
1313     * This can be passed as an extra field in an Activity Intent with one or more account types
1314     * as a String[]. This field is used by some intents to alter the behavior of the called
1315     * activity.
1316     * <p>
1317     * Example: The {@link #ACTION_ADD_ACCOUNT} intent restricts the account types to the specified
1318     * list.
1319     */
1320    public static final String EXTRA_ACCOUNT_TYPES = "account_types";
1321
1322    public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
1323
1324    /**
1325     * Activity Extra: The device identifier to act upon.
1326     * <p>
1327     * This can be passed as an extra field in an Activity Intent with a single
1328     * InputDeviceIdentifier. This field is used by some activities to jump straight into the
1329     * settings for the given device.
1330     * <p>
1331     * Example: The {@link #ACTION_INPUT_METHOD_SETTINGS} intent opens the keyboard layout
1332     * dialog for the given device.
1333     * @hide
1334     */
1335    public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
1336
1337    /**
1338     * Activity Extra: Enable or disable Airplane Mode.
1339     * <p>
1340     * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_AIRPLANE_MODE}
1341     * intent as a boolean to indicate if it should be enabled.
1342     */
1343    public static final String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
1344
1345    /**
1346     * Activity Extra: Enable or disable Battery saver mode.
1347     * <p>
1348     * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE}
1349     * intent as a boolean to indicate if it should be enabled.
1350     */
1351    public static final String EXTRA_BATTERY_SAVER_MODE_ENABLED =
1352            "android.settings.extra.battery_saver_mode_enabled";
1353
1354    /**
1355     * Activity Extra: Enable or disable Do Not Disturb mode.
1356     * <p>
1357     * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE}
1358     * intent as a boolean to indicate if it should be enabled.
1359     */
1360    public static final String EXTRA_DO_NOT_DISTURB_MODE_ENABLED =
1361            "android.settings.extra.do_not_disturb_mode_enabled";
1362
1363    /**
1364     * Activity Extra: How many minutes to enable do not disturb mode for.
1365     * <p>
1366     * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE}
1367     * intent to indicate how long do not disturb mode should be enabled for.
1368     */
1369    public static final String EXTRA_DO_NOT_DISTURB_MODE_MINUTES =
1370            "android.settings.extra.do_not_disturb_mode_minutes";
1371
1372    private static final String JID_RESOURCE_PREFIX = "android";
1373
1374    public static final String AUTHORITY = "settings";
1375
1376    private static final String TAG = "Settings";
1377    private static final boolean LOCAL_LOGV = false;
1378
1379    // Lock ensures that when enabling/disabling the master location switch, we don't end up
1380    // with a partial enable/disable state in multi-threaded situations.
1381    private static final Object mLocationSettingsLock = new Object();
1382
1383    public static class SettingNotFoundException extends AndroidException {
1384        public SettingNotFoundException(String msg) {
1385            super(msg);
1386        }
1387    }
1388
1389    /**
1390     * Common base for tables of name/value settings.
1391     */
1392    public static class NameValueTable implements BaseColumns {
1393        public static final String NAME = "name";
1394        public static final String VALUE = "value";
1395
1396        protected static boolean putString(ContentResolver resolver, Uri uri,
1397                String name, String value) {
1398            // The database will take care of replacing duplicates.
1399            try {
1400                ContentValues values = new ContentValues();
1401                values.put(NAME, name);
1402                values.put(VALUE, value);
1403                resolver.insert(uri, values);
1404                return true;
1405            } catch (SQLException e) {
1406                Log.w(TAG, "Can't set key " + name + " in " + uri, e);
1407                return false;
1408            }
1409        }
1410
1411        public static Uri getUriFor(Uri uri, String name) {
1412            return Uri.withAppendedPath(uri, name);
1413        }
1414    }
1415
1416    // Thread-safe.
1417    private static class NameValueCache {
1418        private final String mVersionSystemProperty;
1419        private final Uri mUri;
1420
1421        private static final String[] SELECT_VALUE =
1422            new String[] { Settings.NameValueTable.VALUE };
1423        private static final String NAME_EQ_PLACEHOLDER = "name=?";
1424
1425        // Must synchronize on 'this' to access mValues and mValuesVersion.
1426        private final HashMap<String, String> mValues = new HashMap<String, String>();
1427        private long mValuesVersion = 0;
1428
1429        // Initially null; set lazily and held forever.  Synchronized on 'this'.
1430        private IContentProvider mContentProvider = null;
1431
1432        // The method we'll call (or null, to not use) on the provider
1433        // for the fast path of retrieving settings.
1434        private final String mCallGetCommand;
1435        private final String mCallSetCommand;
1436
1437        public NameValueCache(String versionSystemProperty, Uri uri,
1438                String getCommand, String setCommand) {
1439            mVersionSystemProperty = versionSystemProperty;
1440            mUri = uri;
1441            mCallGetCommand = getCommand;
1442            mCallSetCommand = setCommand;
1443        }
1444
1445        private IContentProvider lazyGetProvider(ContentResolver cr) {
1446            IContentProvider cp = null;
1447            synchronized (this) {
1448                cp = mContentProvider;
1449                if (cp == null) {
1450                    cp = mContentProvider = cr.acquireProvider(mUri.getAuthority());
1451                }
1452            }
1453            return cp;
1454        }
1455
1456        public boolean putStringForUser(ContentResolver cr, String name, String value,
1457                final int userHandle) {
1458            try {
1459                Bundle arg = new Bundle();
1460                arg.putString(Settings.NameValueTable.VALUE, value);
1461                arg.putInt(CALL_METHOD_USER_KEY, userHandle);
1462                IContentProvider cp = lazyGetProvider(cr);
1463                cp.call(cr.getPackageName(), mCallSetCommand, name, arg);
1464            } catch (RemoteException e) {
1465                Log.w(TAG, "Can't set key " + name + " in " + mUri, e);
1466                return false;
1467            }
1468            return true;
1469        }
1470
1471        public String getStringForUser(ContentResolver cr, String name, final int userHandle) {
1472            final boolean isSelf = (userHandle == UserHandle.myUserId());
1473            if (isSelf) {
1474                long newValuesVersion = SystemProperties.getLong(mVersionSystemProperty, 0);
1475
1476                // Our own user's settings data uses a client-side cache
1477                synchronized (this) {
1478                    if (mValuesVersion != newValuesVersion) {
1479                        if (LOCAL_LOGV || false) {
1480                            Log.v(TAG, "invalidate [" + mUri.getLastPathSegment() + "]: current "
1481                                    + newValuesVersion + " != cached " + mValuesVersion);
1482                        }
1483
1484                        mValues.clear();
1485                        mValuesVersion = newValuesVersion;
1486                    }
1487
1488                    if (mValues.containsKey(name)) {
1489                        return mValues.get(name);  // Could be null, that's OK -- negative caching
1490                    }
1491                }
1492            } else {
1493                if (LOCAL_LOGV) Log.v(TAG, "get setting for user " + userHandle
1494                        + " by user " + UserHandle.myUserId() + " so skipping cache");
1495            }
1496
1497            IContentProvider cp = lazyGetProvider(cr);
1498
1499            // Try the fast path first, not using query().  If this
1500            // fails (alternate Settings provider that doesn't support
1501            // this interface?) then we fall back to the query/table
1502            // interface.
1503            if (mCallGetCommand != null) {
1504                try {
1505                    Bundle args = null;
1506                    if (!isSelf) {
1507                        args = new Bundle();
1508                        args.putInt(CALL_METHOD_USER_KEY, userHandle);
1509                    }
1510                    Bundle b = cp.call(cr.getPackageName(), mCallGetCommand, name, args);
1511                    if (b != null) {
1512                        String value = b.getPairValue();
1513                        // Don't update our cache for reads of other users' data
1514                        if (isSelf) {
1515                            synchronized (this) {
1516                                mValues.put(name, value);
1517                            }
1518                        } else {
1519                            if (LOCAL_LOGV) Log.i(TAG, "call-query of user " + userHandle
1520                                    + " by " + UserHandle.myUserId()
1521                                    + " so not updating cache");
1522                        }
1523                        return value;
1524                    }
1525                    // If the response Bundle is null, we fall through
1526                    // to the query interface below.
1527                } catch (RemoteException e) {
1528                    // Not supported by the remote side?  Fall through
1529                    // to query().
1530                }
1531            }
1532
1533            Cursor c = null;
1534            try {
1535                c = cp.query(cr.getPackageName(), mUri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
1536                             new String[]{name}, null, null);
1537                if (c == null) {
1538                    Log.w(TAG, "Can't get key " + name + " from " + mUri);
1539                    return null;
1540                }
1541
1542                String value = c.moveToNext() ? c.getString(0) : null;
1543                synchronized (this) {
1544                    mValues.put(name, value);
1545                }
1546                if (LOCAL_LOGV) {
1547                    Log.v(TAG, "cache miss [" + mUri.getLastPathSegment() + "]: " +
1548                            name + " = " + (value == null ? "(null)" : value));
1549                }
1550                return value;
1551            } catch (RemoteException e) {
1552                Log.w(TAG, "Can't get key " + name + " from " + mUri, e);
1553                return null;  // Return null, but don't cache it.
1554            } finally {
1555                if (c != null) c.close();
1556            }
1557        }
1558    }
1559
1560    /**
1561     * Checks if the specified context can draw on top of other apps. As of API
1562     * level 23, an app cannot draw on top of other apps unless it declares the
1563     * {@link android.Manifest.permission#SYSTEM_ALERT_WINDOW} permission in its
1564     * manifest, <em>and</em> the user specifically grants the app this
1565     * capability. To prompt the user to grant this approval, the app must send an
1566     * intent with the action
1567     * {@link android.provider.Settings#ACTION_MANAGE_OVERLAY_PERMISSION}, which
1568     * causes the system to display a permission management screen.
1569     *
1570     * @param context App context.
1571     * @return true if the specified context can draw on top of other apps, false otherwise
1572     */
1573    public static boolean canDrawOverlays(Context context) {
1574        return Settings.isCallingPackageAllowedToDrawOverlays(context, Process.myUid(),
1575                context.getOpPackageName(), false);
1576    }
1577
1578    /**
1579     * System settings, containing miscellaneous system preferences.  This
1580     * table holds simple name/value pairs.  There are convenience
1581     * functions for accessing individual settings entries.
1582     */
1583    public static final class System extends NameValueTable {
1584        public static final String SYS_PROP_SETTING_VERSION = "sys.settings_system_version";
1585
1586        private static final float DEFAULT_FONT_SCALE = 1.0f;
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, DEFAULT_FONT_SCALE, userHandle);
2097            if (outConfig.fontScale < 0) {
2098                outConfig.fontScale = DEFAULT_FONT_SCALE;
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         * Checks if the specified app can modify system settings. As of API
3881         * level 23, an app cannot modify system settings unless it declares the
3882         * {@link android.Manifest.permission#WRITE_SETTINGS}
3883         * permission in its manifest, <em>and</em> the user specifically grants
3884         * the app this capability. To prompt the user to grant this approval,
3885         * the app must send an intent with the action {@link
3886         * android.provider.Settings#ACTION_MANAGE_WRITE_SETTINGS}, which causes
3887         * the system to display a permission management screen.
3888         *
3889         * @param context App context.
3890         * @return true if the calling app can write to system settings, false otherwise
3891         */
3892        public static boolean canWrite(Context context) {
3893            return isCallingPackageAllowedToWriteSettings(context, Process.myUid(),
3894                    context.getOpPackageName(), false);
3895        }
3896    }
3897
3898    /**
3899     * Secure system settings, containing system preferences that applications
3900     * can read but are not allowed to write.  These are for preferences that
3901     * the user must explicitly modify through the system UI or specialized
3902     * APIs for those values, not modified directly by applications.
3903     */
3904    public static final class Secure extends NameValueTable {
3905        public static final String SYS_PROP_SETTING_VERSION = "sys.settings_secure_version";
3906
3907        /**
3908         * The content:// style URL for this table
3909         */
3910        public static final Uri CONTENT_URI =
3911            Uri.parse("content://" + AUTHORITY + "/secure");
3912
3913        // Populated lazily, guarded by class object:
3914        private static final NameValueCache sNameValueCache = new NameValueCache(
3915                SYS_PROP_SETTING_VERSION,
3916                CONTENT_URI,
3917                CALL_METHOD_GET_SECURE,
3918                CALL_METHOD_PUT_SECURE);
3919
3920        private static ILockSettings sLockSettings = null;
3921
3922        private static boolean sIsSystemProcess;
3923        private static final HashSet<String> MOVED_TO_LOCK_SETTINGS;
3924        private static final HashSet<String> MOVED_TO_GLOBAL;
3925        static {
3926            MOVED_TO_LOCK_SETTINGS = new HashSet<String>(3);
3927            MOVED_TO_LOCK_SETTINGS.add(Secure.LOCK_PATTERN_ENABLED);
3928            MOVED_TO_LOCK_SETTINGS.add(Secure.LOCK_PATTERN_VISIBLE);
3929            MOVED_TO_LOCK_SETTINGS.add(Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED);
3930
3931            MOVED_TO_GLOBAL = new HashSet<String>();
3932            MOVED_TO_GLOBAL.add(Settings.Global.ADB_ENABLED);
3933            MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_ENABLED);
3934            MOVED_TO_GLOBAL.add(Settings.Global.BLUETOOTH_ON);
3935            MOVED_TO_GLOBAL.add(Settings.Global.BUGREPORT_IN_POWER_MENU);
3936            MOVED_TO_GLOBAL.add(Settings.Global.CDMA_CELL_BROADCAST_SMS);
3937            MOVED_TO_GLOBAL.add(Settings.Global.CDMA_ROAMING_MODE);
3938            MOVED_TO_GLOBAL.add(Settings.Global.CDMA_SUBSCRIPTION_MODE);
3939            MOVED_TO_GLOBAL.add(Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE);
3940            MOVED_TO_GLOBAL.add(Settings.Global.DATA_ACTIVITY_TIMEOUT_WIFI);
3941            MOVED_TO_GLOBAL.add(Settings.Global.DATA_ROAMING);
3942            MOVED_TO_GLOBAL.add(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED);
3943            MOVED_TO_GLOBAL.add(Settings.Global.DEVICE_PROVISIONED);
3944            MOVED_TO_GLOBAL.add(Settings.Global.DISPLAY_SIZE_FORCED);
3945            MOVED_TO_GLOBAL.add(Settings.Global.DOWNLOAD_MAX_BYTES_OVER_MOBILE);
3946            MOVED_TO_GLOBAL.add(Settings.Global.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE);
3947            MOVED_TO_GLOBAL.add(Settings.Global.MOBILE_DATA);
3948            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_BUCKET_DURATION);
3949            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_DELETE_AGE);
3950            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_PERSIST_BYTES);
3951            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_DEV_ROTATE_AGE);
3952            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_ENABLED);
3953            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_GLOBAL_ALERT_BYTES);
3954            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_POLL_INTERVAL);
3955            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_SAMPLE_ENABLED);
3956            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_TIME_CACHE_MAX_AGE);
3957            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_BUCKET_DURATION);
3958            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_DELETE_AGE);
3959            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_PERSIST_BYTES);
3960            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_ROTATE_AGE);
3961            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_BUCKET_DURATION);
3962            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_DELETE_AGE);
3963            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES);
3964            MOVED_TO_GLOBAL.add(Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE);
3965            MOVED_TO_GLOBAL.add(Settings.Global.NETWORK_PREFERENCE);
3966            MOVED_TO_GLOBAL.add(Settings.Global.NITZ_UPDATE_DIFF);
3967            MOVED_TO_GLOBAL.add(Settings.Global.NITZ_UPDATE_SPACING);
3968            MOVED_TO_GLOBAL.add(Settings.Global.NTP_SERVER);
3969            MOVED_TO_GLOBAL.add(Settings.Global.NTP_TIMEOUT);
3970            MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_ERROR_POLL_COUNT);
3971            MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_LONG_POLL_INTERVAL_MS);
3972            MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT);
3973            MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_POLL_INTERVAL_MS);
3974            MOVED_TO_GLOBAL.add(Settings.Global.PDP_WATCHDOG_TRIGGER_PACKET_COUNT);
3975            MOVED_TO_GLOBAL.add(Settings.Global.SAMPLING_PROFILER_MS);
3976            MOVED_TO_GLOBAL.add(Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
3977            MOVED_TO_GLOBAL.add(Settings.Global.SETUP_PREPAID_DETECTION_REDIR_HOST);
3978            MOVED_TO_GLOBAL.add(Settings.Global.SETUP_PREPAID_DETECTION_TARGET_URL);
3979            MOVED_TO_GLOBAL.add(Settings.Global.TETHER_DUN_APN);
3980            MOVED_TO_GLOBAL.add(Settings.Global.TETHER_DUN_REQUIRED);
3981            MOVED_TO_GLOBAL.add(Settings.Global.TETHER_SUPPORTED);
3982            MOVED_TO_GLOBAL.add(Settings.Global.USB_MASS_STORAGE_ENABLED);
3983            MOVED_TO_GLOBAL.add(Settings.Global.USE_GOOGLE_MAIL);
3984            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_COUNTRY_CODE);
3985            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_FRAMEWORK_SCAN_INTERVAL_MS);
3986            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_FREQUENCY_BAND);
3987            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_IDLE_MS);
3988            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT);
3989            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS);
3990            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON);
3991            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY);
3992            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NUM_OPEN_NETWORKS_KEPT);
3993            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_ON);
3994            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_P2P_DEVICE_NAME);
3995            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SAVED_STATE);
3996            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS);
3997            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED);
3998            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED);
3999            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_ENHANCED_AUTO_JOIN);
4000            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_NETWORK_SHOW_RSSI);
4001            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_WATCHDOG_ON);
4002            MOVED_TO_GLOBAL.add(Settings.Global.WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED);
4003            MOVED_TO_GLOBAL.add(Settings.Global.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON);
4004            MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_ENABLE);
4005            MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_TIMEOUT);
4006            MOVED_TO_GLOBAL.add(Settings.Global.PACKAGE_VERIFIER_DEFAULT_RESPONSE);
4007            MOVED_TO_GLOBAL.add(Settings.Global.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS);
4008            MOVED_TO_GLOBAL.add(Settings.Global.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS);
4009            MOVED_TO_GLOBAL.add(Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS);
4010            MOVED_TO_GLOBAL.add(Settings.Global.WTF_IS_FATAL);
4011            MOVED_TO_GLOBAL.add(Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD);
4012            MOVED_TO_GLOBAL.add(Settings.Global.BATTERY_DISCHARGE_THRESHOLD);
4013            MOVED_TO_GLOBAL.add(Settings.Global.SEND_ACTION_APP_ERROR);
4014            MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_AGE_SECONDS);
4015            MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_MAX_FILES);
4016            MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_QUOTA_KB);
4017            MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_QUOTA_PERCENT);
4018            MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_RESERVE_PERCENT);
4019            MOVED_TO_GLOBAL.add(Settings.Global.DROPBOX_TAG_PREFIX);
4020            MOVED_TO_GLOBAL.add(Settings.Global.ERROR_LOGCAT_PREFIX);
4021            MOVED_TO_GLOBAL.add(Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL);
4022            MOVED_TO_GLOBAL.add(Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD);
4023            MOVED_TO_GLOBAL.add(Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE);
4024            MOVED_TO_GLOBAL.add(Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES);
4025            MOVED_TO_GLOBAL.add(Settings.Global.SYS_STORAGE_FULL_THRESHOLD_BYTES);
4026            MOVED_TO_GLOBAL.add(Settings.Global.SYNC_MAX_RETRY_DELAY_IN_SECONDS);
4027            MOVED_TO_GLOBAL.add(Settings.Global.CONNECTIVITY_CHANGE_DELAY);
4028            MOVED_TO_GLOBAL.add(Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED);
4029            MOVED_TO_GLOBAL.add(Settings.Global.CAPTIVE_PORTAL_SERVER);
4030            MOVED_TO_GLOBAL.add(Settings.Global.NSD_ON);
4031            MOVED_TO_GLOBAL.add(Settings.Global.SET_INSTALL_LOCATION);
4032            MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_INSTALL_LOCATION);
4033            MOVED_TO_GLOBAL.add(Settings.Global.INET_CONDITION_DEBOUNCE_UP_DELAY);
4034            MOVED_TO_GLOBAL.add(Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY);
4035            MOVED_TO_GLOBAL.add(Settings.Global.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT);
4036            MOVED_TO_GLOBAL.add(Settings.Global.HTTP_PROXY);
4037            MOVED_TO_GLOBAL.add(Settings.Global.GLOBAL_HTTP_PROXY_HOST);
4038            MOVED_TO_GLOBAL.add(Settings.Global.GLOBAL_HTTP_PROXY_PORT);
4039            MOVED_TO_GLOBAL.add(Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST);
4040            MOVED_TO_GLOBAL.add(Settings.Global.SET_GLOBAL_HTTP_PROXY);
4041            MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_DNS_SERVER);
4042            MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_NETWORK_MODE);
4043            MOVED_TO_GLOBAL.add(Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY);
4044        }
4045
4046        /** @hide */
4047        public static void getMovedToGlobalSettings(Set<String> outKeySet) {
4048            outKeySet.addAll(MOVED_TO_GLOBAL);
4049        }
4050
4051        /**
4052         * Look up a name in the database.
4053         * @param resolver to access the database with
4054         * @param name to look up in the table
4055         * @return the corresponding value, or null if not present
4056         */
4057        public static String getString(ContentResolver resolver, String name) {
4058            return getStringForUser(resolver, name, UserHandle.myUserId());
4059        }
4060
4061        /** @hide */
4062        public static String getStringForUser(ContentResolver resolver, String name,
4063                int userHandle) {
4064            if (MOVED_TO_GLOBAL.contains(name)) {
4065                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
4066                        + " to android.provider.Settings.Global.");
4067                return Global.getStringForUser(resolver, name, userHandle);
4068            }
4069
4070            if (MOVED_TO_LOCK_SETTINGS.contains(name)) {
4071                synchronized (Secure.class) {
4072                    if (sLockSettings == null) {
4073                        sLockSettings = ILockSettings.Stub.asInterface(
4074                                (IBinder) ServiceManager.getService("lock_settings"));
4075                        sIsSystemProcess = Process.myUid() == Process.SYSTEM_UID;
4076                    }
4077                }
4078                if (sLockSettings != null && !sIsSystemProcess) {
4079                    // No context; use the ActivityThread's context as an approximation for
4080                    // determining the target API level.
4081                    Application application = ActivityThread.currentApplication();
4082
4083                    boolean isPreMnc = application != null
4084                            && application.getApplicationInfo() != null
4085                            && application.getApplicationInfo().targetSdkVersion
4086                            <= VERSION_CODES.LOLLIPOP_MR1;
4087                    if (isPreMnc) {
4088                        try {
4089                            return sLockSettings.getString(name, "0", userHandle);
4090                        } catch (RemoteException re) {
4091                            // Fall through
4092                        }
4093                    } else {
4094                        throw new SecurityException("Settings.Secure." + name
4095                                + " is deprecated and no longer accessible."
4096                                + " See API documentation for potential replacements.");
4097                    }
4098                }
4099            }
4100
4101            return sNameValueCache.getStringForUser(resolver, name, userHandle);
4102        }
4103
4104        /**
4105         * Store a name/value pair into the database.
4106         * @param resolver to access the database with
4107         * @param name to store
4108         * @param value to associate with the name
4109         * @return true if the value was set, false on database errors
4110         */
4111        public static boolean putString(ContentResolver resolver, String name, String value) {
4112            return putStringForUser(resolver, name, value, UserHandle.myUserId());
4113        }
4114
4115        /** @hide */
4116        public static boolean putStringForUser(ContentResolver resolver, String name, String value,
4117                int userHandle) {
4118            if (LOCATION_MODE.equals(name)) {
4119                // HACK ALERT: temporary hack to work around b/10491283.
4120                // TODO: once b/10491283 fixed, remove this hack
4121                return setLocationModeForUser(resolver, Integer.parseInt(value), userHandle);
4122            }
4123            if (MOVED_TO_GLOBAL.contains(name)) {
4124                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
4125                        + " to android.provider.Settings.Global");
4126                return Global.putStringForUser(resolver, name, value, userHandle);
4127            }
4128            return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
4129        }
4130
4131        /**
4132         * Construct the content URI for a particular name/value pair,
4133         * useful for monitoring changes with a ContentObserver.
4134         * @param name to look up in the table
4135         * @return the corresponding content URI, or null if not present
4136         */
4137        public static Uri getUriFor(String name) {
4138            if (MOVED_TO_GLOBAL.contains(name)) {
4139                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
4140                        + " to android.provider.Settings.Global, returning global URI.");
4141                return Global.getUriFor(Global.CONTENT_URI, name);
4142            }
4143            return getUriFor(CONTENT_URI, name);
4144        }
4145
4146        /**
4147         * Convenience function for retrieving a single secure settings value
4148         * as an integer.  Note that internally setting values are always
4149         * stored as strings; this function converts the string to an integer
4150         * for you.  The default value will be returned if the setting is
4151         * not defined or not an integer.
4152         *
4153         * @param cr The ContentResolver to access.
4154         * @param name The name of the setting to retrieve.
4155         * @param def Value to return if the setting is not defined.
4156         *
4157         * @return The setting's current value, or 'def' if it is not defined
4158         * or not a valid integer.
4159         */
4160        public static int getInt(ContentResolver cr, String name, int def) {
4161            return getIntForUser(cr, name, def, UserHandle.myUserId());
4162        }
4163
4164        /** @hide */
4165        public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) {
4166            if (LOCATION_MODE.equals(name)) {
4167                // HACK ALERT: temporary hack to work around b/10491283.
4168                // TODO: once b/10491283 fixed, remove this hack
4169                return getLocationModeForUser(cr, userHandle);
4170            }
4171            String v = getStringForUser(cr, name, userHandle);
4172            try {
4173                return v != null ? Integer.parseInt(v) : def;
4174            } catch (NumberFormatException e) {
4175                return def;
4176            }
4177        }
4178
4179        /**
4180         * Convenience function for retrieving a single secure settings value
4181         * as an integer.  Note that internally setting values are always
4182         * stored as strings; this function converts the string to an integer
4183         * for you.
4184         * <p>
4185         * This version does not take a default value.  If the setting has not
4186         * been set, or the string value is not a number,
4187         * it throws {@link SettingNotFoundException}.
4188         *
4189         * @param cr The ContentResolver to access.
4190         * @param name The name of the setting to retrieve.
4191         *
4192         * @throws SettingNotFoundException Thrown if a setting by the given
4193         * name can't be found or the setting value is not an integer.
4194         *
4195         * @return The setting's current value.
4196         */
4197        public static int getInt(ContentResolver cr, String name)
4198                throws SettingNotFoundException {
4199            return getIntForUser(cr, name, UserHandle.myUserId());
4200        }
4201
4202        /** @hide */
4203        public static int getIntForUser(ContentResolver cr, String name, int userHandle)
4204                throws SettingNotFoundException {
4205            if (LOCATION_MODE.equals(name)) {
4206                // HACK ALERT: temporary hack to work around b/10491283.
4207                // TODO: once b/10491283 fixed, remove this hack
4208                return getLocationModeForUser(cr, userHandle);
4209            }
4210            String v = getStringForUser(cr, name, userHandle);
4211            try {
4212                return Integer.parseInt(v);
4213            } catch (NumberFormatException e) {
4214                throw new SettingNotFoundException(name);
4215            }
4216        }
4217
4218        /**
4219         * Convenience function for updating a single settings value as an
4220         * integer. This will either create a new entry in the table if the
4221         * given name does not exist, or modify the value of the existing row
4222         * with that name.  Note that internally setting values are always
4223         * stored as strings, so this function converts the given value to a
4224         * string before storing it.
4225         *
4226         * @param cr The ContentResolver to access.
4227         * @param name The name of the setting to modify.
4228         * @param value The new value for the setting.
4229         * @return true if the value was set, false on database errors
4230         */
4231        public static boolean putInt(ContentResolver cr, String name, int value) {
4232            return putIntForUser(cr, name, value, UserHandle.myUserId());
4233        }
4234
4235        /** @hide */
4236        public static boolean putIntForUser(ContentResolver cr, String name, int value,
4237                int userHandle) {
4238            return putStringForUser(cr, name, Integer.toString(value), userHandle);
4239        }
4240
4241        /**
4242         * Convenience function for retrieving a single secure settings value
4243         * as a {@code long}.  Note that internally setting values are always
4244         * stored as strings; this function converts the string to a {@code long}
4245         * for you.  The default value will be returned if the setting is
4246         * not defined or not a {@code long}.
4247         *
4248         * @param cr The ContentResolver to access.
4249         * @param name The name of the setting to retrieve.
4250         * @param def Value to return if the setting is not defined.
4251         *
4252         * @return The setting's current value, or 'def' if it is not defined
4253         * or not a valid {@code long}.
4254         */
4255        public static long getLong(ContentResolver cr, String name, long def) {
4256            return getLongForUser(cr, name, def, UserHandle.myUserId());
4257        }
4258
4259        /** @hide */
4260        public static long getLongForUser(ContentResolver cr, String name, long def,
4261                int userHandle) {
4262            String valString = getStringForUser(cr, name, userHandle);
4263            long value;
4264            try {
4265                value = valString != null ? Long.parseLong(valString) : def;
4266            } catch (NumberFormatException e) {
4267                value = def;
4268            }
4269            return value;
4270        }
4271
4272        /**
4273         * Convenience function for retrieving a single secure settings value
4274         * as a {@code long}.  Note that internally setting values are always
4275         * stored as strings; this function converts the string to a {@code long}
4276         * for you.
4277         * <p>
4278         * This version does not take a default value.  If the setting has not
4279         * been set, or the string value is not a number,
4280         * it throws {@link SettingNotFoundException}.
4281         *
4282         * @param cr The ContentResolver to access.
4283         * @param name The name of the setting to retrieve.
4284         *
4285         * @return The setting's current value.
4286         * @throws SettingNotFoundException Thrown if a setting by the given
4287         * name can't be found or the setting value is not an integer.
4288         */
4289        public static long getLong(ContentResolver cr, String name)
4290                throws SettingNotFoundException {
4291            return getLongForUser(cr, name, UserHandle.myUserId());
4292        }
4293
4294        /** @hide */
4295        public static long getLongForUser(ContentResolver cr, String name, int userHandle)
4296                throws SettingNotFoundException {
4297            String valString = getStringForUser(cr, name, userHandle);
4298            try {
4299                return Long.parseLong(valString);
4300            } catch (NumberFormatException e) {
4301                throw new SettingNotFoundException(name);
4302            }
4303        }
4304
4305        /**
4306         * Convenience function for updating a secure settings value as a long
4307         * integer. This will either create a new entry in the table if the
4308         * given name does not exist, or modify the value of the existing row
4309         * with that name.  Note that internally setting values are always
4310         * stored as strings, so this function converts the given value to a
4311         * string before storing it.
4312         *
4313         * @param cr The ContentResolver to access.
4314         * @param name The name of the setting to modify.
4315         * @param value The new value for the setting.
4316         * @return true if the value was set, false on database errors
4317         */
4318        public static boolean putLong(ContentResolver cr, String name, long value) {
4319            return putLongForUser(cr, name, value, UserHandle.myUserId());
4320        }
4321
4322        /** @hide */
4323        public static boolean putLongForUser(ContentResolver cr, String name, long value,
4324                int userHandle) {
4325            return putStringForUser(cr, name, Long.toString(value), userHandle);
4326        }
4327
4328        /**
4329         * Convenience function for retrieving a single secure settings value
4330         * as a floating point number.  Note that internally setting values are
4331         * always stored as strings; this function converts the string to an
4332         * float for you. The default value will be returned if the setting
4333         * is not defined or not a valid float.
4334         *
4335         * @param cr The ContentResolver to access.
4336         * @param name The name of the setting to retrieve.
4337         * @param def Value to return if the setting is not defined.
4338         *
4339         * @return The setting's current value, or 'def' if it is not defined
4340         * or not a valid float.
4341         */
4342        public static float getFloat(ContentResolver cr, String name, float def) {
4343            return getFloatForUser(cr, name, def, UserHandle.myUserId());
4344        }
4345
4346        /** @hide */
4347        public static float getFloatForUser(ContentResolver cr, String name, float def,
4348                int userHandle) {
4349            String v = getStringForUser(cr, name, userHandle);
4350            try {
4351                return v != null ? Float.parseFloat(v) : def;
4352            } catch (NumberFormatException e) {
4353                return def;
4354            }
4355        }
4356
4357        /**
4358         * Convenience function for retrieving a single secure settings value
4359         * as a float.  Note that internally setting values are always
4360         * stored as strings; this function converts the string to a float
4361         * for you.
4362         * <p>
4363         * This version does not take a default value.  If the setting has not
4364         * been set, or the string value is not a number,
4365         * it throws {@link SettingNotFoundException}.
4366         *
4367         * @param cr The ContentResolver to access.
4368         * @param name The name of the setting to retrieve.
4369         *
4370         * @throws SettingNotFoundException Thrown if a setting by the given
4371         * name can't be found or the setting value is not a float.
4372         *
4373         * @return The setting's current value.
4374         */
4375        public static float getFloat(ContentResolver cr, String name)
4376                throws SettingNotFoundException {
4377            return getFloatForUser(cr, name, UserHandle.myUserId());
4378        }
4379
4380        /** @hide */
4381        public static float getFloatForUser(ContentResolver cr, String name, int userHandle)
4382                throws SettingNotFoundException {
4383            String v = getStringForUser(cr, name, userHandle);
4384            if (v == null) {
4385                throw new SettingNotFoundException(name);
4386            }
4387            try {
4388                return Float.parseFloat(v);
4389            } catch (NumberFormatException e) {
4390                throw new SettingNotFoundException(name);
4391            }
4392        }
4393
4394        /**
4395         * Convenience function for updating a single settings value as a
4396         * floating point number. This will either create a new entry in the
4397         * table if the given name does not exist, or modify the value of the
4398         * existing row with that name.  Note that internally setting values
4399         * are always stored as strings, so this function converts the given
4400         * value to a string before storing it.
4401         *
4402         * @param cr The ContentResolver to access.
4403         * @param name The name of the setting to modify.
4404         * @param value The new value for the setting.
4405         * @return true if the value was set, false on database errors
4406         */
4407        public static boolean putFloat(ContentResolver cr, String name, float value) {
4408            return putFloatForUser(cr, name, value, UserHandle.myUserId());
4409        }
4410
4411        /** @hide */
4412        public static boolean putFloatForUser(ContentResolver cr, String name, float value,
4413                int userHandle) {
4414            return putStringForUser(cr, name, Float.toString(value), userHandle);
4415        }
4416
4417        /**
4418         * @deprecated Use {@link android.provider.Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}
4419         * instead
4420         */
4421        @Deprecated
4422        public static final String DEVELOPMENT_SETTINGS_ENABLED =
4423                Global.DEVELOPMENT_SETTINGS_ENABLED;
4424
4425        /**
4426         * When the user has enable the option to have a "bug report" command
4427         * in the power menu.
4428         * @deprecated Use {@link android.provider.Settings.Global#BUGREPORT_IN_POWER_MENU} instead
4429         * @hide
4430         */
4431        @Deprecated
4432        public static final String BUGREPORT_IN_POWER_MENU = "bugreport_in_power_menu";
4433
4434        /**
4435         * @deprecated Use {@link android.provider.Settings.Global#ADB_ENABLED} instead
4436         */
4437        @Deprecated
4438        public static final String ADB_ENABLED = Global.ADB_ENABLED;
4439
4440        /**
4441         * Setting to allow mock locations and location provider status to be injected into the
4442         * LocationManager service for testing purposes during application development.  These
4443         * locations and status values  override actual location and status information generated
4444         * by network, gps, or other location providers.
4445         *
4446         * @deprecated This settings is not used anymore.
4447         */
4448        @Deprecated
4449        public static final String ALLOW_MOCK_LOCATION = "mock_location";
4450
4451        /**
4452         * A 64-bit number (as a hex string) that is randomly
4453         * generated when the user first sets up the device and should remain
4454         * constant for the lifetime of the user's device. The value may
4455         * change if a factory reset is performed on the device.
4456         * <p class="note"><strong>Note:</strong> When a device has <a
4457         * href="{@docRoot}about/versions/android-4.2.html#MultipleUsers">multiple users</a>
4458         * (available on certain devices running Android 4.2 or higher), each user appears as a
4459         * completely separate device, so the {@code ANDROID_ID} value is unique to each
4460         * user.</p>
4461         */
4462        public static final String ANDROID_ID = "android_id";
4463
4464        /**
4465         * @deprecated Use {@link android.provider.Settings.Global#BLUETOOTH_ON} instead
4466         */
4467        @Deprecated
4468        public static final String BLUETOOTH_ON = Global.BLUETOOTH_ON;
4469
4470        /**
4471         * @deprecated Use {@link android.provider.Settings.Global#DATA_ROAMING} instead
4472         */
4473        @Deprecated
4474        public static final String DATA_ROAMING = Global.DATA_ROAMING;
4475
4476        /**
4477         * Setting to record the input method used by default, holding the ID
4478         * of the desired method.
4479         */
4480        public static final String DEFAULT_INPUT_METHOD = "default_input_method";
4481
4482        /**
4483         * Setting to record the input method subtype used by default, holding the ID
4484         * of the desired method.
4485         */
4486        public static final String SELECTED_INPUT_METHOD_SUBTYPE =
4487                "selected_input_method_subtype";
4488
4489        /**
4490         * Setting to record the history of input method subtype, holding the pair of ID of IME
4491         * and its last used subtype.
4492         * @hide
4493         */
4494        public static final String INPUT_METHODS_SUBTYPE_HISTORY =
4495                "input_methods_subtype_history";
4496
4497        /**
4498         * Setting to record the visibility of input method selector
4499         */
4500        public static final String INPUT_METHOD_SELECTOR_VISIBILITY =
4501                "input_method_selector_visibility";
4502
4503        /**
4504         * The currently selected voice interaction service flattened ComponentName.
4505         * @hide
4506         */
4507        @TestApi
4508        public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service";
4509
4510        /**
4511         * bluetooth HCI snoop log configuration
4512         * @hide
4513         */
4514        public static final String BLUETOOTH_HCI_LOG =
4515                "bluetooth_hci_log";
4516
4517        /**
4518         * @deprecated Use {@link android.provider.Settings.Global#DEVICE_PROVISIONED} instead
4519         */
4520        @Deprecated
4521        public static final String DEVICE_PROVISIONED = Global.DEVICE_PROVISIONED;
4522
4523        /**
4524         * Whether the current user has been set up via setup wizard (0 = false, 1 = true)
4525         * @hide
4526         */
4527        public static final String USER_SETUP_COMPLETE = "user_setup_complete";
4528
4529        /**
4530         * Prefix for category name that marks whether a suggested action from that category was
4531         * completed.
4532         * @hide
4533         */
4534        public static final String COMPLETED_CATEGORY_PREFIX = "suggested.completed_category.";
4535
4536        /**
4537         * List of input methods that are currently enabled.  This is a string
4538         * containing the IDs of all enabled input methods, each ID separated
4539         * by ':'.
4540         */
4541        public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
4542
4543        /**
4544         * List of system input methods that are currently disabled.  This is a string
4545         * containing the IDs of all disabled input methods, each ID separated
4546         * by ':'.
4547         * @hide
4548         */
4549        public static final String DISABLED_SYSTEM_INPUT_METHODS = "disabled_system_input_methods";
4550
4551        /**
4552         * Whether to show the IME when a hard keyboard is connected. This is a boolean that
4553         * determines if the IME should be shown when a hard keyboard is attached.
4554         * @hide
4555         */
4556        public static final String SHOW_IME_WITH_HARD_KEYBOARD = "show_ime_with_hard_keyboard";
4557
4558        /**
4559         * Host name and port for global http proxy. Uses ':' seperator for
4560         * between host and port.
4561         *
4562         * @deprecated Use {@link Global#HTTP_PROXY}
4563         */
4564        @Deprecated
4565        public static final String HTTP_PROXY = Global.HTTP_PROXY;
4566
4567        /**
4568         * Package designated as always-on VPN provider.
4569         *
4570         * @hide
4571         */
4572        public static final String ALWAYS_ON_VPN_APP = "always_on_vpn_app";
4573
4574        /**
4575         * Whether applications can be installed for this user via the system's
4576         * {@link Intent#ACTION_INSTALL_PACKAGE} mechanism.
4577         *
4578         * <p>1 = permit app installation via the system package installer intent
4579         * <p>0 = do not allow use of the package installer
4580         */
4581        public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
4582
4583        /**
4584         * Comma-separated list of location providers that activities may access. Do not rely on
4585         * this value being present in settings.db or on ContentObserver notifications on the
4586         * corresponding Uri.
4587         *
4588         * @deprecated use {@link #LOCATION_MODE} and
4589         * {@link LocationManager#MODE_CHANGED_ACTION} (or
4590         * {@link LocationManager#PROVIDERS_CHANGED_ACTION})
4591         */
4592        @Deprecated
4593        public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
4594
4595        /**
4596         * The degree of location access enabled by the user.
4597         * <p>
4598         * When used with {@link #putInt(ContentResolver, String, int)}, must be one of {@link
4599         * #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, {@link
4600         * #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. When used with {@link
4601         * #getInt(ContentResolver, String)}, the caller must gracefully handle additional location
4602         * modes that might be added in the future.
4603         * <p>
4604         * Note: do not rely on this value being present in settings.db or on ContentObserver
4605         * notifications for the corresponding Uri. Use {@link LocationManager#MODE_CHANGED_ACTION}
4606         * to receive changes in this value.
4607         */
4608        public static final String LOCATION_MODE = "location_mode";
4609        /**
4610         * Stores the previous location mode when {@link #LOCATION_MODE} is set to
4611         * {@link #LOCATION_MODE_OFF}
4612         * @hide
4613         */
4614        public static final String LOCATION_PREVIOUS_MODE = "location_previous_mode";
4615
4616        /**
4617         * Sets all location providers to the previous states before location was turned off.
4618         * @hide
4619         */
4620        public static final int LOCATION_MODE_PREVIOUS = -1;
4621        /**
4622         * Location access disabled.
4623         */
4624        public static final int LOCATION_MODE_OFF = 0;
4625        /**
4626         * Network Location Provider disabled, but GPS and other sensors enabled.
4627         */
4628        public static final int LOCATION_MODE_SENSORS_ONLY = 1;
4629        /**
4630         * Reduced power usage, such as limiting the number of GPS updates per hour. Requests
4631         * with {@link android.location.Criteria#POWER_HIGH} may be downgraded to
4632         * {@link android.location.Criteria#POWER_MEDIUM}.
4633         */
4634        public static final int LOCATION_MODE_BATTERY_SAVING = 2;
4635        /**
4636         * Best-effort location computation allowed.
4637         */
4638        public static final int LOCATION_MODE_HIGH_ACCURACY = 3;
4639
4640        /**
4641         * A flag containing settings used for biometric weak
4642         * @hide
4643         */
4644        @Deprecated
4645        public static final String LOCK_BIOMETRIC_WEAK_FLAGS =
4646                "lock_biometric_weak_flags";
4647
4648        /**
4649         * Whether lock-to-app will lock the keyguard when exiting.
4650         * @hide
4651         */
4652        public static final String LOCK_TO_APP_EXIT_LOCKED = "lock_to_app_exit_locked";
4653
4654        /**
4655         * Whether autolock is enabled (0 = false, 1 = true)
4656         *
4657         * @deprecated Use {@link android.app.KeyguardManager} to determine the state and security
4658         *             level of the keyguard. Accessing this setting from an app that is targeting
4659         *             {@link VERSION_CODES#M} or later throws a {@code SecurityException}.
4660         */
4661        @Deprecated
4662        public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
4663
4664        /**
4665         * Whether lock pattern is visible as user enters (0 = false, 1 = true)
4666         *
4667         * @deprecated Accessing this setting from an app that is targeting
4668         *             {@link VERSION_CODES#M} or later throws a {@code SecurityException}.
4669         */
4670        @Deprecated
4671        public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
4672
4673        /**
4674         * Whether lock pattern will vibrate as user enters (0 = false, 1 =
4675         * true)
4676         *
4677         * @deprecated Starting in {@link VERSION_CODES#JELLY_BEAN_MR1} the
4678         *             lockscreen uses
4679         *             {@link Settings.System#HAPTIC_FEEDBACK_ENABLED}.
4680         *             Accessing this setting from an app that is targeting
4681         *             {@link VERSION_CODES#M} or later throws a {@code SecurityException}.
4682         */
4683        @Deprecated
4684        public static final String
4685                LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
4686
4687        /**
4688         * This preference allows the device to be locked given time after screen goes off,
4689         * subject to current DeviceAdmin policy limits.
4690         * @hide
4691         */
4692        public static final String LOCK_SCREEN_LOCK_AFTER_TIMEOUT = "lock_screen_lock_after_timeout";
4693
4694
4695        /**
4696         * This preference contains the string that shows for owner info on LockScreen.
4697         * @hide
4698         * @deprecated
4699         */
4700        public static final String LOCK_SCREEN_OWNER_INFO = "lock_screen_owner_info";
4701
4702        /**
4703         * Ids of the user-selected appwidgets on the lockscreen (comma-delimited).
4704         * @hide
4705         */
4706        @Deprecated
4707        public static final String LOCK_SCREEN_APPWIDGET_IDS =
4708            "lock_screen_appwidget_ids";
4709
4710        /**
4711         * Id of the appwidget shown on the lock screen when appwidgets are disabled.
4712         * @hide
4713         */
4714        @Deprecated
4715        public static final String LOCK_SCREEN_FALLBACK_APPWIDGET_ID =
4716            "lock_screen_fallback_appwidget_id";
4717
4718        /**
4719         * Index of the lockscreen appwidget to restore, -1 if none.
4720         * @hide
4721         */
4722        @Deprecated
4723        public static final String LOCK_SCREEN_STICKY_APPWIDGET =
4724            "lock_screen_sticky_appwidget";
4725
4726        /**
4727         * This preference enables showing the owner info on LockScreen.
4728         * @hide
4729         * @deprecated
4730         */
4731        public static final String LOCK_SCREEN_OWNER_INFO_ENABLED =
4732            "lock_screen_owner_info_enabled";
4733
4734        /**
4735         * When set by a user, allows notifications to be shown atop a securely locked screen
4736         * in their full "private" form (same as when the device is unlocked).
4737         * @hide
4738         */
4739        public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS =
4740                "lock_screen_allow_private_notifications";
4741
4742        /**
4743         * When set by a user, allows notification remote input atop a securely locked screen
4744         * without having to unlock
4745         * @hide
4746         */
4747        public static final String LOCK_SCREEN_ALLOW_REMOTE_INPUT =
4748                "lock_screen_allow_remote_input";
4749
4750        /**
4751         * Set by the system to track if the user needs to see the call to action for
4752         * the lockscreen notification policy.
4753         * @hide
4754         */
4755        public static final String SHOW_NOTE_ABOUT_NOTIFICATION_HIDING =
4756                "show_note_about_notification_hiding";
4757
4758        /**
4759         * Set to 1 by the system after trust agents have been initialized.
4760         * @hide
4761         */
4762        public static final String TRUST_AGENTS_INITIALIZED =
4763                "trust_agents_initialized";
4764
4765        /**
4766         * The Logging ID (a unique 64-bit value) as a hex string.
4767         * Used as a pseudonymous identifier for logging.
4768         * @deprecated This identifier is poorly initialized and has
4769         * many collisions.  It should not be used.
4770         */
4771        @Deprecated
4772        public static final String LOGGING_ID = "logging_id";
4773
4774        /**
4775         * @deprecated Use {@link android.provider.Settings.Global#NETWORK_PREFERENCE} instead
4776         */
4777        @Deprecated
4778        public static final String NETWORK_PREFERENCE = Global.NETWORK_PREFERENCE;
4779
4780        /**
4781         * No longer supported.
4782         */
4783        public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
4784
4785        /**
4786         * No longer supported.
4787         */
4788        public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
4789
4790        /**
4791         * No longer supported.
4792         */
4793        public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
4794
4795        /**
4796         * Settings classname to launch when Settings is clicked from All
4797         * Applications.  Needed because of user testing between the old
4798         * and new Settings apps.
4799         */
4800        // TODO: 881807
4801        public static final String SETTINGS_CLASSNAME = "settings_classname";
4802
4803        /**
4804         * @deprecated Use {@link android.provider.Settings.Global#USB_MASS_STORAGE_ENABLED} instead
4805         */
4806        @Deprecated
4807        public static final String USB_MASS_STORAGE_ENABLED = Global.USB_MASS_STORAGE_ENABLED;
4808
4809        /**
4810         * @deprecated Use {@link android.provider.Settings.Global#USE_GOOGLE_MAIL} instead
4811         */
4812        @Deprecated
4813        public static final String USE_GOOGLE_MAIL = Global.USE_GOOGLE_MAIL;
4814
4815        /**
4816         * If accessibility is enabled.
4817         */
4818        public static final String ACCESSIBILITY_ENABLED = "accessibility_enabled";
4819
4820        /**
4821         * If touch exploration is enabled.
4822         */
4823        public static final String TOUCH_EXPLORATION_ENABLED = "touch_exploration_enabled";
4824
4825        /**
4826         * List of the enabled accessibility providers.
4827         */
4828        public static final String ENABLED_ACCESSIBILITY_SERVICES =
4829            "enabled_accessibility_services";
4830
4831        /**
4832         * List of the accessibility services to which the user has granted
4833         * permission to put the device into touch exploration mode.
4834         *
4835         * @hide
4836         */
4837        public static final String TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES =
4838            "touch_exploration_granted_accessibility_services";
4839
4840        /**
4841         * Whether to speak passwords while in accessibility mode.
4842         */
4843        public static final String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
4844
4845        /**
4846         * Whether to draw text with high contrast while in accessibility mode.
4847         *
4848         * @hide
4849         */
4850        public static final String ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED =
4851                "high_text_contrast_enabled";
4852
4853        /**
4854         * If injection of accessibility enhancing JavaScript screen-reader
4855         * is enabled.
4856         * <p>
4857         *   Note: The JavaScript based screen-reader is served by the
4858         *   Google infrastructure and enable users with disabilities to
4859         *   efficiently navigate in and explore web content.
4860         * </p>
4861         * <p>
4862         *   This property represents a boolean value.
4863         * </p>
4864         * @hide
4865         */
4866        public static final String ACCESSIBILITY_SCRIPT_INJECTION =
4867            "accessibility_script_injection";
4868
4869        /**
4870         * The URL for the injected JavaScript based screen-reader used
4871         * for providing accessibility of content in WebView.
4872         * <p>
4873         *   Note: The JavaScript based screen-reader is served by the
4874         *   Google infrastructure and enable users with disabilities to
4875         *   efficiently navigate in and explore web content.
4876         * </p>
4877         * <p>
4878         *   This property represents a string value.
4879         * </p>
4880         * @hide
4881         */
4882        public static final String ACCESSIBILITY_SCREEN_READER_URL =
4883            "accessibility_script_injection_url";
4884
4885        /**
4886         * Key bindings for navigation in built-in accessibility support for web content.
4887         * <p>
4888         *   Note: These key bindings are for the built-in accessibility navigation for
4889         *   web content which is used as a fall back solution if JavaScript in a WebView
4890         *   is not enabled or the user has not opted-in script injection from Google.
4891         * </p>
4892         * <p>
4893         *   The bindings are separated by semi-colon. A binding is a mapping from
4894         *   a key to a sequence of actions (for more details look at
4895         *   android.webkit.AccessibilityInjector). A key is represented as the hexademical
4896         *   string representation of an integer obtained from a meta state (optional) shifted
4897         *   sixteen times left and bitwise ored with a key code. An action is represented
4898         *   as a hexademical string representation of an integer where the first two digits
4899         *   are navigation action index, the second, the third, and the fourth digit pairs
4900         *   represent the action arguments. The separate actions in a binding are colon
4901         *   separated. The key and the action sequence it maps to are separated by equals.
4902         * </p>
4903         * <p>
4904         *   For example, the binding below maps the DPAD right button to traverse the
4905         *   current navigation axis once without firing an accessibility event and to
4906         *   perform the same traversal again but to fire an event:
4907         *   <code>
4908         *     0x16=0x01000100:0x01000101;
4909         *   </code>
4910         * </p>
4911         * <p>
4912         *   The goal of this binding is to enable dynamic rebinding of keys to
4913         *   navigation actions for web content without requiring a framework change.
4914         * </p>
4915         * <p>
4916         *   This property represents a string value.
4917         * </p>
4918         * @hide
4919         */
4920        public static final String ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS =
4921            "accessibility_web_content_key_bindings";
4922
4923        /**
4924         * Setting that specifies whether the display magnification is enabled.
4925         * Display magnifications allows the user to zoom in the display content
4926         * and is targeted to low vision users. The current magnification scale
4927         * is controlled by {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}.
4928         *
4929         * @hide
4930         */
4931        public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED =
4932                "accessibility_display_magnification_enabled";
4933
4934        /**
4935         * Setting that specifies what the display magnification scale is.
4936         * Display magnifications allows the user to zoom in the display
4937         * content and is targeted to low vision users. Whether a display
4938         * magnification is performed is controlled by
4939         * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED}
4940         *
4941         * @hide
4942         */
4943        public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE =
4944                "accessibility_display_magnification_scale";
4945
4946        /**
4947         * Setting that specifies whether the display magnification should be
4948         * automatically updated. If this fearture is enabled the system will
4949         * exit magnification mode or pan the viewport when a context change
4950         * occurs. For example, on staring a new activity or rotating the screen,
4951         * the system may zoom out so the user can see the new context he is in.
4952         * Another example is on showing a window that is not visible in the
4953         * magnified viewport the system may pan the viewport to make the window
4954         * the has popped up so the user knows that the context has changed.
4955         * Whether a screen magnification is performed is controlled by
4956         * {@link #ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED}
4957         *
4958         * @hide
4959         */
4960        public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE =
4961                "accessibility_display_magnification_auto_update";
4962
4963        /**
4964         * Setting that specifies what mode the soft keyboard is in (default or hidden). Can be
4965         * modified from an AccessibilityService using the SoftKeyboardController.
4966         *
4967         * @hide
4968         */
4969        public static final String ACCESSIBILITY_SOFT_KEYBOARD_MODE =
4970                "accessibility_soft_keyboard_mode";
4971
4972        /**
4973         * Default soft keyboard behavior.
4974         *
4975         * @hide
4976         */
4977        public static final int SHOW_MODE_AUTO = 0;
4978
4979        /**
4980         * Soft keyboard is never shown.
4981         *
4982         * @hide
4983         */
4984        public static final int SHOW_MODE_HIDDEN = 1;
4985
4986        /**
4987         * Setting that specifies whether timed text (captions) should be
4988         * displayed in video content. Text display properties are controlled by
4989         * the following settings:
4990         * <ul>
4991         * <li>{@link #ACCESSIBILITY_CAPTIONING_LOCALE}
4992         * <li>{@link #ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR}
4993         * <li>{@link #ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR}
4994         * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_COLOR}
4995         * <li>{@link #ACCESSIBILITY_CAPTIONING_EDGE_TYPE}
4996         * <li>{@link #ACCESSIBILITY_CAPTIONING_TYPEFACE}
4997         * <li>{@link #ACCESSIBILITY_CAPTIONING_FONT_SCALE}
4998         * </ul>
4999         *
5000         * @hide
5001         */
5002        public static final String ACCESSIBILITY_CAPTIONING_ENABLED =
5003                "accessibility_captioning_enabled";
5004
5005        /**
5006         * Setting that specifies the language for captions as a locale string,
5007         * e.g. en_US.
5008         *
5009         * @see java.util.Locale#toString
5010         * @hide
5011         */
5012        public static final String ACCESSIBILITY_CAPTIONING_LOCALE =
5013                "accessibility_captioning_locale";
5014
5015        /**
5016         * Integer property that specifies the preset style for captions, one
5017         * of:
5018         * <ul>
5019         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESET_CUSTOM}
5020         * <li>a valid index of {@link android.view.accessibility.CaptioningManager.CaptionStyle#PRESETS}
5021         * </ul>
5022         *
5023         * @see java.util.Locale#toString
5024         * @hide
5025         */
5026        public static final String ACCESSIBILITY_CAPTIONING_PRESET =
5027                "accessibility_captioning_preset";
5028
5029        /**
5030         * Integer property that specifes the background color for captions as a
5031         * packed 32-bit color.
5032         *
5033         * @see android.graphics.Color#argb
5034         * @hide
5035         */
5036        public static final String ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR =
5037                "accessibility_captioning_background_color";
5038
5039        /**
5040         * Integer property that specifes the foreground color for captions as a
5041         * packed 32-bit color.
5042         *
5043         * @see android.graphics.Color#argb
5044         * @hide
5045         */
5046        public static final String ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR =
5047                "accessibility_captioning_foreground_color";
5048
5049        /**
5050         * Integer property that specifes the edge type for captions, one of:
5051         * <ul>
5052         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_NONE}
5053         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_OUTLINE}
5054         * <li>{@link android.view.accessibility.CaptioningManager.CaptionStyle#EDGE_TYPE_DROP_SHADOW}
5055         * </ul>
5056         *
5057         * @see #ACCESSIBILITY_CAPTIONING_EDGE_COLOR
5058         * @hide
5059         */
5060        public static final String ACCESSIBILITY_CAPTIONING_EDGE_TYPE =
5061                "accessibility_captioning_edge_type";
5062
5063        /**
5064         * Integer property that specifes the edge color for captions as a
5065         * packed 32-bit color.
5066         *
5067         * @see #ACCESSIBILITY_CAPTIONING_EDGE_TYPE
5068         * @see android.graphics.Color#argb
5069         * @hide
5070         */
5071        public static final String ACCESSIBILITY_CAPTIONING_EDGE_COLOR =
5072                "accessibility_captioning_edge_color";
5073
5074        /**
5075         * Integer property that specifes the window color for captions as a
5076         * packed 32-bit color.
5077         *
5078         * @see android.graphics.Color#argb
5079         * @hide
5080         */
5081        public static final String ACCESSIBILITY_CAPTIONING_WINDOW_COLOR =
5082                "accessibility_captioning_window_color";
5083
5084        /**
5085         * String property that specifies the typeface for captions, one of:
5086         * <ul>
5087         * <li>DEFAULT
5088         * <li>MONOSPACE
5089         * <li>SANS_SERIF
5090         * <li>SERIF
5091         * </ul>
5092         *
5093         * @see android.graphics.Typeface
5094         * @hide
5095         */
5096        public static final String ACCESSIBILITY_CAPTIONING_TYPEFACE =
5097                "accessibility_captioning_typeface";
5098
5099        /**
5100         * Floating point property that specifies font scaling for captions.
5101         *
5102         * @hide
5103         */
5104        public static final String ACCESSIBILITY_CAPTIONING_FONT_SCALE =
5105                "accessibility_captioning_font_scale";
5106
5107        /**
5108         * Setting that specifies whether display color inversion is enabled.
5109         */
5110        public static final String ACCESSIBILITY_DISPLAY_INVERSION_ENABLED =
5111                "accessibility_display_inversion_enabled";
5112
5113        /**
5114         * Setting that specifies whether display color space adjustment is
5115         * enabled.
5116         *
5117         * @hide
5118         */
5119        public static final String ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED =
5120                "accessibility_display_daltonizer_enabled";
5121
5122        /**
5123         * Integer property that specifies the type of color space adjustment to
5124         * perform. Valid values are defined in AccessibilityManager.
5125         *
5126         * @hide
5127         */
5128        public static final String ACCESSIBILITY_DISPLAY_DALTONIZER =
5129                "accessibility_display_daltonizer";
5130
5131        /**
5132         * Float list that specifies the color matrix to apply to
5133         * the display. Valid values are defined in AccessibilityManager.
5134         *
5135         * @hide
5136         */
5137        public static final String ACCESSIBILITY_DISPLAY_COLOR_MATRIX =
5138                "accessibility_display_color_matrix";
5139
5140        /**
5141         * Setting that specifies whether automatic click when the mouse pointer stops moving is
5142         * enabled.
5143         *
5144         * @hide
5145         */
5146        public static final String ACCESSIBILITY_AUTOCLICK_ENABLED =
5147                "accessibility_autoclick_enabled";
5148
5149        /**
5150         * Integer setting specifying amount of time in ms the mouse pointer has to stay still
5151         * before performing click when {@link #ACCESSIBILITY_AUTOCLICK_ENABLED} is set.
5152         *
5153         * @see #ACCESSIBILITY_AUTOCLICK_ENABLED
5154         * @hide
5155         */
5156        public static final String ACCESSIBILITY_AUTOCLICK_DELAY =
5157                "accessibility_autoclick_delay";
5158
5159        /**
5160         * Whether or not larger size icons are used for the pointer of mouse/trackpad for
5161         * accessibility.
5162         * (0 = false, 1 = true)
5163         * @hide
5164         */
5165        public static final String ACCESSIBILITY_LARGE_POINTER_ICON =
5166                "accessibility_large_pointer_icon";
5167
5168        /**
5169         * The timeout for considering a press to be a long press in milliseconds.
5170         * @hide
5171         */
5172        public static final String LONG_PRESS_TIMEOUT = "long_press_timeout";
5173
5174        /**
5175         * List of the enabled print services.
5176         *
5177         * N and beyond uses {@link #DISABLED_PRINT_SERVICES}. But this might be used in an upgrade
5178         * from pre-N.
5179         *
5180         * @hide
5181         */
5182        public static final String ENABLED_PRINT_SERVICES =
5183            "enabled_print_services";
5184
5185        /**
5186         * List of the disabled print services.
5187         *
5188         * @hide
5189         */
5190        public static final String DISABLED_PRINT_SERVICES =
5191            "disabled_print_services";
5192
5193        /**
5194         * The saved value for WindowManagerService.setForcedDisplayDensity()
5195         * formatted as a single integer representing DPI. If unset, then use
5196         * the real display density.
5197         *
5198         * @hide
5199         */
5200        public static final String DISPLAY_DENSITY_FORCED = "display_density_forced";
5201
5202        /**
5203         * Setting to always use the default text-to-speech settings regardless
5204         * of the application settings.
5205         * 1 = override application settings,
5206         * 0 = use application settings (if specified).
5207         *
5208         * @deprecated  The value of this setting is no longer respected by
5209         * the framework text to speech APIs as of the Ice Cream Sandwich release.
5210         */
5211        @Deprecated
5212        public static final String TTS_USE_DEFAULTS = "tts_use_defaults";
5213
5214        /**
5215         * Default text-to-speech engine speech rate. 100 = 1x
5216         */
5217        public static final String TTS_DEFAULT_RATE = "tts_default_rate";
5218
5219        /**
5220         * Default text-to-speech engine pitch. 100 = 1x
5221         */
5222        public static final String TTS_DEFAULT_PITCH = "tts_default_pitch";
5223
5224        /**
5225         * Default text-to-speech engine.
5226         */
5227        public static final String TTS_DEFAULT_SYNTH = "tts_default_synth";
5228
5229        /**
5230         * Default text-to-speech language.
5231         *
5232         * @deprecated this setting is no longer in use, as of the Ice Cream
5233         * Sandwich release. Apps should never need to read this setting directly,
5234         * instead can query the TextToSpeech framework classes for the default
5235         * locale. {@link TextToSpeech#getLanguage()}.
5236         */
5237        @Deprecated
5238        public static final String TTS_DEFAULT_LANG = "tts_default_lang";
5239
5240        /**
5241         * Default text-to-speech country.
5242         *
5243         * @deprecated this setting is no longer in use, as of the Ice Cream
5244         * Sandwich release. Apps should never need to read this setting directly,
5245         * instead can query the TextToSpeech framework classes for the default
5246         * locale. {@link TextToSpeech#getLanguage()}.
5247         */
5248        @Deprecated
5249        public static final String TTS_DEFAULT_COUNTRY = "tts_default_country";
5250
5251        /**
5252         * Default text-to-speech locale variant.
5253         *
5254         * @deprecated this setting is no longer in use, as of the Ice Cream
5255         * Sandwich release. Apps should never need to read this setting directly,
5256         * instead can query the TextToSpeech framework classes for the
5257         * locale that is in use {@link TextToSpeech#getLanguage()}.
5258         */
5259        @Deprecated
5260        public static final String TTS_DEFAULT_VARIANT = "tts_default_variant";
5261
5262        /**
5263         * Stores the default tts locales on a per engine basis. Stored as
5264         * a comma seperated list of values, each value being of the form
5265         * {@code engine_name:locale} for example,
5266         * {@code com.foo.ttsengine:eng-USA,com.bar.ttsengine:esp-ESP}. This
5267         * supersedes {@link #TTS_DEFAULT_LANG}, {@link #TTS_DEFAULT_COUNTRY} and
5268         * {@link #TTS_DEFAULT_VARIANT}. Apps should never need to read this
5269         * setting directly, and can query the TextToSpeech framework classes
5270         * for the locale that is in use.
5271         *
5272         * @hide
5273         */
5274        public static final String TTS_DEFAULT_LOCALE = "tts_default_locale";
5275
5276        /**
5277         * Space delimited list of plugin packages that are enabled.
5278         */
5279        public static final String TTS_ENABLED_PLUGINS = "tts_enabled_plugins";
5280
5281        /**
5282         * @deprecated Use {@link android.provider.Settings.Global#WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON}
5283         * instead.
5284         */
5285        @Deprecated
5286        public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
5287                Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON;
5288
5289        /**
5290         * @deprecated Use {@link android.provider.Settings.Global#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY}
5291         * instead.
5292         */
5293        @Deprecated
5294        public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
5295                Global.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY;
5296
5297        /**
5298         * @deprecated Use {@link android.provider.Settings.Global#WIFI_NUM_OPEN_NETWORKS_KEPT}
5299         * instead.
5300         */
5301        @Deprecated
5302        public static final String WIFI_NUM_OPEN_NETWORKS_KEPT =
5303                Global.WIFI_NUM_OPEN_NETWORKS_KEPT;
5304
5305        /**
5306         * @deprecated Use {@link android.provider.Settings.Global#WIFI_ON}
5307         * instead.
5308         */
5309        @Deprecated
5310        public static final String WIFI_ON = Global.WIFI_ON;
5311
5312        /**
5313         * The acceptable packet loss percentage (range 0 - 100) before trying
5314         * another AP on the same network.
5315         * @deprecated This setting is not used.
5316         */
5317        @Deprecated
5318        public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE =
5319                "wifi_watchdog_acceptable_packet_loss_percentage";
5320
5321        /**
5322         * The number of access points required for a network in order for the
5323         * watchdog to monitor it.
5324         * @deprecated This setting is not used.
5325         */
5326        @Deprecated
5327        public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
5328
5329        /**
5330         * The delay between background checks.
5331         * @deprecated This setting is not used.
5332         */
5333        @Deprecated
5334        public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS =
5335                "wifi_watchdog_background_check_delay_ms";
5336
5337        /**
5338         * Whether the Wi-Fi watchdog is enabled for background checking even
5339         * after it thinks the user has connected to a good access point.
5340         * @deprecated This setting is not used.
5341         */
5342        @Deprecated
5343        public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED =
5344                "wifi_watchdog_background_check_enabled";
5345
5346        /**
5347         * The timeout for a background ping
5348         * @deprecated This setting is not used.
5349         */
5350        @Deprecated
5351        public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS =
5352                "wifi_watchdog_background_check_timeout_ms";
5353
5354        /**
5355         * The number of initial pings to perform that *may* be ignored if they
5356         * fail. Again, if these fail, they will *not* be used in packet loss
5357         * calculation. For example, one network always seemed to time out for
5358         * the first couple pings, so this is set to 3 by default.
5359         * @deprecated This setting is not used.
5360         */
5361        @Deprecated
5362        public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT =
5363            "wifi_watchdog_initial_ignored_ping_count";
5364
5365        /**
5366         * The maximum number of access points (per network) to attempt to test.
5367         * If this number is reached, the watchdog will no longer monitor the
5368         * initial connection state for the network. This is a safeguard for
5369         * networks containing multiple APs whose DNS does not respond to pings.
5370         * @deprecated This setting is not used.
5371         */
5372        @Deprecated
5373        public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
5374
5375        /**
5376         * @deprecated Use {@link android.provider.Settings.Global#WIFI_WATCHDOG_ON} instead
5377         */
5378        @Deprecated
5379        public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
5380
5381        /**
5382         * A comma-separated list of SSIDs for which the Wi-Fi watchdog should be enabled.
5383         * @deprecated This setting is not used.
5384         */
5385        @Deprecated
5386        public static final String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
5387
5388        /**
5389         * The number of pings to test if an access point is a good connection.
5390         * @deprecated This setting is not used.
5391         */
5392        @Deprecated
5393        public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
5394
5395        /**
5396         * The delay between pings.
5397         * @deprecated This setting is not used.
5398         */
5399        @Deprecated
5400        public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
5401
5402        /**
5403         * The timeout per ping.
5404         * @deprecated This setting is not used.
5405         */
5406        @Deprecated
5407        public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
5408
5409        /**
5410         * @deprecated Use
5411         * {@link android.provider.Settings.Global#WIFI_MAX_DHCP_RETRY_COUNT} instead
5412         */
5413        @Deprecated
5414        public static final String WIFI_MAX_DHCP_RETRY_COUNT = Global.WIFI_MAX_DHCP_RETRY_COUNT;
5415
5416        /**
5417         * @deprecated Use
5418         * {@link android.provider.Settings.Global#WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS} instead
5419         */
5420        @Deprecated
5421        public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
5422                Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS;
5423
5424        /**
5425         * The number of milliseconds to hold on to a PendingIntent based request. This delay gives
5426         * the receivers of the PendingIntent an opportunity to make a new network request before
5427         * the Network satisfying the request is potentially removed.
5428         *
5429         * @hide
5430         */
5431        public static final String CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS =
5432                "connectivity_release_pending_intent_delay_ms";
5433
5434        /**
5435         * Whether background data usage is allowed.
5436         *
5437         * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH},
5438         *             availability of background data depends on several
5439         *             combined factors. When background data is unavailable,
5440         *             {@link ConnectivityManager#getActiveNetworkInfo()} will
5441         *             now appear disconnected.
5442         */
5443        @Deprecated
5444        public static final String BACKGROUND_DATA = "background_data";
5445
5446        /**
5447         * Origins for which browsers should allow geolocation by default.
5448         * The value is a space-separated list of origins.
5449         */
5450        public static final String ALLOWED_GEOLOCATION_ORIGINS
5451                = "allowed_geolocation_origins";
5452
5453        /**
5454         * The preferred TTY mode     0 = TTy Off, CDMA default
5455         *                            1 = TTY Full
5456         *                            2 = TTY HCO
5457         *                            3 = TTY VCO
5458         * @hide
5459         */
5460        public static final String PREFERRED_TTY_MODE =
5461                "preferred_tty_mode";
5462
5463        /**
5464         * Whether the enhanced voice privacy mode is enabled.
5465         * 0 = normal voice privacy
5466         * 1 = enhanced voice privacy
5467         * @hide
5468         */
5469        public static final String ENHANCED_VOICE_PRIVACY_ENABLED = "enhanced_voice_privacy_enabled";
5470
5471        /**
5472         * Whether the TTY mode mode is enabled.
5473         * 0 = disabled
5474         * 1 = enabled
5475         * @hide
5476         */
5477        public static final String TTY_MODE_ENABLED = "tty_mode_enabled";
5478
5479        /**
5480         * Controls whether settings backup is enabled.
5481         * Type: int ( 0 = disabled, 1 = enabled )
5482         * @hide
5483         */
5484        public static final String BACKUP_ENABLED = "backup_enabled";
5485
5486        /**
5487         * Controls whether application data is automatically restored from backup
5488         * at install time.
5489         * Type: int ( 0 = disabled, 1 = enabled )
5490         * @hide
5491         */
5492        public static final String BACKUP_AUTO_RESTORE = "backup_auto_restore";
5493
5494        /**
5495         * Indicates whether settings backup has been fully provisioned.
5496         * Type: int ( 0 = unprovisioned, 1 = fully provisioned )
5497         * @hide
5498         */
5499        public static final String BACKUP_PROVISIONED = "backup_provisioned";
5500
5501        /**
5502         * Component of the transport to use for backup/restore.
5503         * @hide
5504         */
5505        public static final String BACKUP_TRANSPORT = "backup_transport";
5506
5507        /**
5508         * Version for which the setup wizard was last shown.  Bumped for
5509         * each release when there is new setup information to show.
5510         * @hide
5511         */
5512        public static final String LAST_SETUP_SHOWN = "last_setup_shown";
5513
5514        /**
5515         * The interval in milliseconds after which Wi-Fi is considered idle.
5516         * When idle, it is possible for the device to be switched from Wi-Fi to
5517         * the mobile data network.
5518         * @hide
5519         * @deprecated Use {@link android.provider.Settings.Global#WIFI_IDLE_MS}
5520         * instead.
5521         */
5522        @Deprecated
5523        public static final String WIFI_IDLE_MS = Global.WIFI_IDLE_MS;
5524
5525        /**
5526         * The global search provider chosen by the user (if multiple global
5527         * search providers are installed). This will be the provider returned
5528         * by {@link SearchManager#getGlobalSearchActivity()} if it's still
5529         * installed. This setting is stored as a flattened component name as
5530         * per {@link ComponentName#flattenToString()}.
5531         *
5532         * @hide
5533         */
5534        public static final String SEARCH_GLOBAL_SEARCH_ACTIVITY =
5535                "search_global_search_activity";
5536
5537        /**
5538         * The number of promoted sources in GlobalSearch.
5539         * @hide
5540         */
5541        public static final String SEARCH_NUM_PROMOTED_SOURCES = "search_num_promoted_sources";
5542        /**
5543         * The maximum number of suggestions returned by GlobalSearch.
5544         * @hide
5545         */
5546        public static final String SEARCH_MAX_RESULTS_TO_DISPLAY = "search_max_results_to_display";
5547        /**
5548         * The number of suggestions GlobalSearch will ask each non-web search source for.
5549         * @hide
5550         */
5551        public static final String SEARCH_MAX_RESULTS_PER_SOURCE = "search_max_results_per_source";
5552        /**
5553         * The number of suggestions the GlobalSearch will ask the web search source for.
5554         * @hide
5555         */
5556        public static final String SEARCH_WEB_RESULTS_OVERRIDE_LIMIT =
5557                "search_web_results_override_limit";
5558        /**
5559         * The number of milliseconds that GlobalSearch will wait for suggestions from
5560         * promoted sources before continuing with all other sources.
5561         * @hide
5562         */
5563        public static final String SEARCH_PROMOTED_SOURCE_DEADLINE_MILLIS =
5564                "search_promoted_source_deadline_millis";
5565        /**
5566         * The number of milliseconds before GlobalSearch aborts search suggesiton queries.
5567         * @hide
5568         */
5569        public static final String SEARCH_SOURCE_TIMEOUT_MILLIS = "search_source_timeout_millis";
5570        /**
5571         * The maximum number of milliseconds that GlobalSearch shows the previous results
5572         * after receiving a new query.
5573         * @hide
5574         */
5575        public static final String SEARCH_PREFILL_MILLIS = "search_prefill_millis";
5576        /**
5577         * The maximum age of log data used for shortcuts in GlobalSearch.
5578         * @hide
5579         */
5580        public static final String SEARCH_MAX_STAT_AGE_MILLIS = "search_max_stat_age_millis";
5581        /**
5582         * The maximum age of log data used for source ranking in GlobalSearch.
5583         * @hide
5584         */
5585        public static final String SEARCH_MAX_SOURCE_EVENT_AGE_MILLIS =
5586                "search_max_source_event_age_millis";
5587        /**
5588         * The minimum number of impressions needed to rank a source in GlobalSearch.
5589         * @hide
5590         */
5591        public static final String SEARCH_MIN_IMPRESSIONS_FOR_SOURCE_RANKING =
5592                "search_min_impressions_for_source_ranking";
5593        /**
5594         * The minimum number of clicks needed to rank a source in GlobalSearch.
5595         * @hide
5596         */
5597        public static final String SEARCH_MIN_CLICKS_FOR_SOURCE_RANKING =
5598                "search_min_clicks_for_source_ranking";
5599        /**
5600         * The maximum number of shortcuts shown by GlobalSearch.
5601         * @hide
5602         */
5603        public static final String SEARCH_MAX_SHORTCUTS_RETURNED = "search_max_shortcuts_returned";
5604        /**
5605         * The size of the core thread pool for suggestion queries in GlobalSearch.
5606         * @hide
5607         */
5608        public static final String SEARCH_QUERY_THREAD_CORE_POOL_SIZE =
5609                "search_query_thread_core_pool_size";
5610        /**
5611         * The maximum size of the thread pool for suggestion queries in GlobalSearch.
5612         * @hide
5613         */
5614        public static final String SEARCH_QUERY_THREAD_MAX_POOL_SIZE =
5615                "search_query_thread_max_pool_size";
5616        /**
5617         * The size of the core thread pool for shortcut refreshing in GlobalSearch.
5618         * @hide
5619         */
5620        public static final String SEARCH_SHORTCUT_REFRESH_CORE_POOL_SIZE =
5621                "search_shortcut_refresh_core_pool_size";
5622        /**
5623         * The maximum size of the thread pool for shortcut refreshing in GlobalSearch.
5624         * @hide
5625         */
5626        public static final String SEARCH_SHORTCUT_REFRESH_MAX_POOL_SIZE =
5627                "search_shortcut_refresh_max_pool_size";
5628        /**
5629         * The maximun time that excess threads in the GlobalSeach thread pools will
5630         * wait before terminating.
5631         * @hide
5632         */
5633        public static final String SEARCH_THREAD_KEEPALIVE_SECONDS =
5634                "search_thread_keepalive_seconds";
5635        /**
5636         * The maximum number of concurrent suggestion queries to each source.
5637         * @hide
5638         */
5639        public static final String SEARCH_PER_SOURCE_CONCURRENT_QUERY_LIMIT =
5640                "search_per_source_concurrent_query_limit";
5641
5642        /**
5643         * Whether or not alert sounds are played on MountService events. (0 = false, 1 = true)
5644         * @hide
5645         */
5646        public static final String MOUNT_PLAY_NOTIFICATION_SND = "mount_play_not_snd";
5647
5648        /**
5649         * Whether or not UMS auto-starts on UMS host detection. (0 = false, 1 = true)
5650         * @hide
5651         */
5652        public static final String MOUNT_UMS_AUTOSTART = "mount_ums_autostart";
5653
5654        /**
5655         * Whether or not a notification is displayed on UMS host detection. (0 = false, 1 = true)
5656         * @hide
5657         */
5658        public static final String MOUNT_UMS_PROMPT = "mount_ums_prompt";
5659
5660        /**
5661         * Whether or not a notification is displayed while UMS is enabled. (0 = false, 1 = true)
5662         * @hide
5663         */
5664        public static final String MOUNT_UMS_NOTIFY_ENABLED = "mount_ums_notify_enabled";
5665
5666        /**
5667         * If nonzero, ANRs in invisible background processes bring up a dialog.
5668         * Otherwise, the process will be silently killed.
5669         * @hide
5670         */
5671        public static final String ANR_SHOW_BACKGROUND = "anr_show_background";
5672
5673        /**
5674         * The {@link ComponentName} string of the service to be used as the voice recognition
5675         * service.
5676         *
5677         * @hide
5678         */
5679        public static final String VOICE_RECOGNITION_SERVICE = "voice_recognition_service";
5680
5681        /**
5682         * Stores whether an user has consented to have apps verified through PAM.
5683         * The value is boolean (1 or 0).
5684         *
5685         * @hide
5686         */
5687        public static final String PACKAGE_VERIFIER_USER_CONSENT =
5688            "package_verifier_user_consent";
5689
5690        /**
5691         * The {@link ComponentName} string of the selected spell checker service which is
5692         * one of the services managed by the text service manager.
5693         *
5694         * @hide
5695         */
5696        public static final String SELECTED_SPELL_CHECKER = "selected_spell_checker";
5697
5698        /**
5699         * The {@link ComponentName} string of the selected subtype of the selected spell checker
5700         * service which is one of the services managed by the text service manager.
5701         *
5702         * @hide
5703         */
5704        public static final String SELECTED_SPELL_CHECKER_SUBTYPE =
5705                "selected_spell_checker_subtype";
5706
5707        /**
5708         * The {@link ComponentName} string whether spell checker is enabled or not.
5709         *
5710         * @hide
5711         */
5712        public static final String SPELL_CHECKER_ENABLED = "spell_checker_enabled";
5713
5714        /**
5715         * What happens when the user presses the Power button while in-call
5716         * and the screen is on.<br/>
5717         * <b>Values:</b><br/>
5718         * 1 - The Power button turns off the screen and locks the device. (Default behavior)<br/>
5719         * 2 - The Power button hangs up the current call.<br/>
5720         *
5721         * @hide
5722         */
5723        public static final String INCALL_POWER_BUTTON_BEHAVIOR = "incall_power_button_behavior";
5724
5725        /**
5726         * INCALL_POWER_BUTTON_BEHAVIOR value for "turn off screen".
5727         * @hide
5728         */
5729        public static final int INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF = 0x1;
5730
5731        /**
5732         * INCALL_POWER_BUTTON_BEHAVIOR value for "hang up".
5733         * @hide
5734         */
5735        public static final int INCALL_POWER_BUTTON_BEHAVIOR_HANGUP = 0x2;
5736
5737        /**
5738         * INCALL_POWER_BUTTON_BEHAVIOR default value.
5739         * @hide
5740         */
5741        public static final int INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT =
5742                INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF;
5743
5744        /**
5745         * Whether the device should wake when the wake gesture sensor detects motion.
5746         * @hide
5747         */
5748        public static final String WAKE_GESTURE_ENABLED = "wake_gesture_enabled";
5749
5750        /**
5751         * Whether the device should doze if configured.
5752         * @hide
5753         */
5754        public static final String DOZE_ENABLED = "doze_enabled";
5755
5756        /**
5757         * The current night mode that has been selected by the user.  Owned
5758         * and controlled by UiModeManagerService.  Constants are as per
5759         * UiModeManager.
5760         * @hide
5761         */
5762        public static final String UI_NIGHT_MODE = "ui_night_mode";
5763
5764        /**
5765         * Whether screensavers are enabled.
5766         * @hide
5767         */
5768        public static final String SCREENSAVER_ENABLED = "screensaver_enabled";
5769
5770        /**
5771         * The user's chosen screensaver components.
5772         *
5773         * These will be launched by the PhoneWindowManager after a timeout when not on
5774         * battery, or upon dock insertion (if SCREENSAVER_ACTIVATE_ON_DOCK is set to 1).
5775         * @hide
5776         */
5777        public static final String SCREENSAVER_COMPONENTS = "screensaver_components";
5778
5779        /**
5780         * If screensavers are enabled, whether the screensaver should be automatically launched
5781         * when the device is inserted into a (desk) dock.
5782         * @hide
5783         */
5784        public static final String SCREENSAVER_ACTIVATE_ON_DOCK = "screensaver_activate_on_dock";
5785
5786        /**
5787         * If screensavers are enabled, whether the screensaver should be automatically launched
5788         * when the screen times out when not on battery.
5789         * @hide
5790         */
5791        public static final String SCREENSAVER_ACTIVATE_ON_SLEEP = "screensaver_activate_on_sleep";
5792
5793        /**
5794         * If screensavers are enabled, the default screensaver component.
5795         * @hide
5796         */
5797        public static final String SCREENSAVER_DEFAULT_COMPONENT = "screensaver_default_component";
5798
5799        /**
5800         * The default NFC payment component
5801         * @hide
5802         */
5803        public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component";
5804
5805        /**
5806         * Whether NFC payment is handled by the foreground application or a default.
5807         * @hide
5808         */
5809        public static final String NFC_PAYMENT_FOREGROUND = "nfc_payment_foreground";
5810
5811        /**
5812         * Specifies the package name currently configured to be the primary sms application
5813         * @hide
5814         */
5815        public static final String SMS_DEFAULT_APPLICATION = "sms_default_application";
5816
5817        /**
5818         * Specifies the package name currently configured to be the default dialer application
5819         * @hide
5820         */
5821        public static final String DIALER_DEFAULT_APPLICATION = "dialer_default_application";
5822
5823        /**
5824         * Specifies the package name currently configured to be the emergency assistance application
5825         *
5826         * @see android.telephony.TelephonyManager#ACTION_EMERGENCY_ASSISTANCE
5827         *
5828         * @hide
5829         */
5830        public static final String EMERGENCY_ASSISTANCE_APPLICATION = "emergency_assistance_application";
5831
5832        /**
5833         * Specifies whether the current app context on scren (assist data) will be sent to the
5834         * assist application (active voice interaction service).
5835         *
5836         * @hide
5837         */
5838        public static final String ASSIST_STRUCTURE_ENABLED = "assist_structure_enabled";
5839
5840        /**
5841         * Specifies whether a screenshot of the screen contents will be sent to the assist
5842         * application (active voice interaction service).
5843         *
5844         * @hide
5845         */
5846        public static final String ASSIST_SCREENSHOT_ENABLED = "assist_screenshot_enabled";
5847
5848        /**
5849         * Names of the service components that the current user has explicitly allowed to
5850         * see all of the user's notifications, separated by ':'.
5851         *
5852         * @hide
5853         */
5854        public static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners";
5855
5856        /**
5857         * Names of the packages that the current user has explicitly allowed to
5858         * manage notification policy configuration, separated by ':'.
5859         */
5860        public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES =
5861                "enabled_notification_policy_access_packages";
5862
5863        /** @hide */
5864        public static final String BAR_SERVICE_COMPONENT = "bar_service_component";
5865
5866        /** @hide */
5867        public static final String VOLUME_CONTROLLER_SERVICE_COMPONENT
5868                = "volume_controller_service_component";
5869
5870        /** @hide */
5871        public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations";
5872
5873        /**
5874         * This is the query URI for finding a print service to install.
5875         *
5876         * @hide
5877         */
5878        public static final String PRINT_SERVICE_SEARCH_URI = "print_service_search_uri";
5879
5880        /**
5881         * This is the query URI for finding a NFC payment service to install.
5882         *
5883         * @hide
5884         */
5885        public static final String PAYMENT_SERVICE_SEARCH_URI = "payment_service_search_uri";
5886
5887        /**
5888         * If enabled, apps should try to skip any introductory hints on first launch. This might
5889         * apply to users that are already familiar with the environment or temporary users.
5890         * <p>
5891         * Type : int (0 to show hints, 1 to skip showing hints)
5892         */
5893        public static final String SKIP_FIRST_USE_HINTS = "skip_first_use_hints";
5894
5895        /**
5896         * Persisted playback time after a user confirmation of an unsafe volume level.
5897         *
5898         * @hide
5899         */
5900        public static final String UNSAFE_VOLUME_MUSIC_ACTIVE_MS = "unsafe_volume_music_active_ms";
5901
5902        /**
5903         * This preference enables notification display on the lockscreen.
5904         * @hide
5905         */
5906        public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS =
5907                "lock_screen_show_notifications";
5908
5909        /**
5910         * List of TV inputs that are currently hidden. This is a string
5911         * containing the IDs of all hidden TV inputs. Each ID is encoded by
5912         * {@link android.net.Uri#encode(String)} and separated by ':'.
5913         * @hide
5914         */
5915        public static final String TV_INPUT_HIDDEN_INPUTS = "tv_input_hidden_inputs";
5916
5917        /**
5918         * List of custom TV input labels. This is a string containing <TV input id, custom name>
5919         * pairs. TV input id and custom name are encoded by {@link android.net.Uri#encode(String)}
5920         * and separated by ','. Each pair is separated by ':'.
5921         * @hide
5922         */
5923        public static final String TV_INPUT_CUSTOM_LABELS = "tv_input_custom_labels";
5924
5925        /**
5926         * Whether automatic routing of system audio to USB audio peripheral is disabled.
5927         * The value is boolean (1 or 0), where 1 means automatic routing is disabled,
5928         * and 0 means automatic routing is enabled.
5929         *
5930         * @hide
5931         */
5932        public static final String USB_AUDIO_AUTOMATIC_ROUTING_DISABLED =
5933                "usb_audio_automatic_routing_disabled";
5934
5935        /**
5936         * The timeout in milliseconds before the device fully goes to sleep after
5937         * a period of inactivity.  This value sets an upper bound on how long the device
5938         * will stay awake or dreaming without user activity.  It should generally
5939         * be longer than {@link Settings.System#SCREEN_OFF_TIMEOUT} as otherwise the device
5940         * will sleep before it ever has a chance to dream.
5941         * <p>
5942         * Use -1 to disable this timeout.
5943         * </p>
5944         *
5945         * @hide
5946         */
5947        public static final String SLEEP_TIMEOUT = "sleep_timeout";
5948
5949        /**
5950         * Controls whether double tap to wake is enabled.
5951         * @hide
5952         */
5953        public static final String DOUBLE_TAP_TO_WAKE = "double_tap_to_wake";
5954
5955        /**
5956         * The current assistant component. It could be a voice interaction service,
5957         * or an activity that handles ACTION_ASSIST, or empty which means using the default
5958         * handling.
5959         *
5960         * @hide
5961         */
5962        public static final String ASSISTANT = "assistant";
5963
5964        /**
5965         * Whether the camera launch gesture should be disabled.
5966         *
5967         * @hide
5968         */
5969        public static final String CAMERA_GESTURE_DISABLED = "camera_gesture_disabled";
5970
5971        /**
5972         * Whether the camera launch gesture to double tap the power button when the screen is off
5973         * should be disabled.
5974         *
5975         * @hide
5976         */
5977        public static final String CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED =
5978                "camera_double_tap_power_gesture_disabled";
5979
5980        /**
5981
5982        /**
5983         * Behavior of twilight on the device.
5984         * One of {@link #TWILIGHT_MODE_LOCKED_OFF}, {@link #TWILIGHT_MODE_LOCKED_ON}
5985         * or {@link #TWILIGHT_MODE_AUTO}.
5986         * @hide
5987         */
5988        public static final String TWILIGHT_MODE = "twilight_mode";
5989
5990        /**
5991         * Twilight mode always off.
5992         * @hide
5993         */
5994        public static final int TWILIGHT_MODE_LOCKED_OFF = 0;
5995
5996        /**
5997         * Twilight mode always on.
5998         * @hide
5999         */
6000        public static final int TWILIGHT_MODE_LOCKED_ON = 1;
6001
6002        /**
6003         * Twilight mode auto.
6004         * @hide
6005         */
6006        public static final int TWILIGHT_MODE_AUTO = 2;
6007
6008        /**
6009         * Twilight mode auto, temporarily overriden to on.
6010         * @hide
6011         */
6012        public static final int TWILIGHT_MODE_AUTO_OVERRIDE_OFF = 3;
6013
6014        /**
6015         * Twilight mode auto, temporarily overriden to off.
6016         * @hide
6017         */
6018        public static final int TWILIGHT_MODE_AUTO_OVERRIDE_ON = 4;
6019
6020        /**
6021         * Whether brightness should automatically adjust based on twilight state.
6022         * @hide
6023         */
6024        public static final String BRIGHTNESS_USE_TWILIGHT = "brightness_use_twilight";
6025
6026        /**
6027         * Names of the service components that the current user has explicitly allowed to
6028         * be a VR mode listener, separated by ':'.
6029         *
6030         * @hide
6031         */
6032        public static final String ENABLED_VR_LISTENERS = "enabled_vr_listeners";
6033
6034        /**
6035         * This are the settings to be backed up.
6036         *
6037         * NOTE: Settings are backed up and restored in the order they appear
6038         *       in this array. If you have one setting depending on another,
6039         *       make sure that they are ordered appropriately.
6040         *
6041         * @hide
6042         */
6043        public static final String[] SETTINGS_TO_BACKUP = {
6044            BUGREPORT_IN_POWER_MENU,                            // moved to global
6045            ALLOW_MOCK_LOCATION,
6046            PARENTAL_CONTROL_ENABLED,
6047            PARENTAL_CONTROL_REDIRECT_URL,
6048            USB_MASS_STORAGE_ENABLED,                           // moved to global
6049            ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
6050            ACCESSIBILITY_DISPLAY_DALTONIZER,
6051            ACCESSIBILITY_DISPLAY_COLOR_MATRIX,
6052            ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
6053            ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
6054            ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
6055            ACCESSIBILITY_DISPLAY_MAGNIFICATION_AUTO_UPDATE,
6056            ACCESSIBILITY_SCRIPT_INJECTION,
6057            ACCESSIBILITY_WEB_CONTENT_KEY_BINDINGS,
6058            BACKUP_AUTO_RESTORE,
6059            ENABLED_ACCESSIBILITY_SERVICES,
6060            ENABLED_NOTIFICATION_LISTENERS,
6061            ENABLED_VR_LISTENERS,
6062            ENABLED_INPUT_METHODS,
6063            TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
6064            TOUCH_EXPLORATION_ENABLED,
6065            ACCESSIBILITY_ENABLED,
6066            ACCESSIBILITY_SPEAK_PASSWORD,
6067            ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
6068            ACCESSIBILITY_CAPTIONING_PRESET,
6069            ACCESSIBILITY_CAPTIONING_ENABLED,
6070            ACCESSIBILITY_CAPTIONING_LOCALE,
6071            ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
6072            ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
6073            ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
6074            ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
6075            ACCESSIBILITY_CAPTIONING_TYPEFACE,
6076            ACCESSIBILITY_CAPTIONING_FONT_SCALE,
6077            ACCESSIBILITY_CAPTIONING_WINDOW_COLOR,
6078            TTS_USE_DEFAULTS,
6079            TTS_DEFAULT_RATE,
6080            TTS_DEFAULT_PITCH,
6081            TTS_DEFAULT_SYNTH,
6082            TTS_DEFAULT_LANG,
6083            TTS_DEFAULT_COUNTRY,
6084            TTS_ENABLED_PLUGINS,
6085            TTS_DEFAULT_LOCALE,
6086            SHOW_IME_WITH_HARD_KEYBOARD,
6087            WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,            // moved to global
6088            WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,               // moved to global
6089            WIFI_NUM_OPEN_NETWORKS_KEPT,                        // moved to global
6090            SELECTED_SPELL_CHECKER,
6091            SELECTED_SPELL_CHECKER_SUBTYPE,
6092            SPELL_CHECKER_ENABLED,
6093            MOUNT_PLAY_NOTIFICATION_SND,
6094            MOUNT_UMS_AUTOSTART,
6095            MOUNT_UMS_PROMPT,
6096            MOUNT_UMS_NOTIFY_ENABLED,
6097            SLEEP_TIMEOUT,
6098            DOUBLE_TAP_TO_WAKE,
6099            WAKE_GESTURE_ENABLED,
6100            LONG_PRESS_TIMEOUT,
6101            CAMERA_GESTURE_DISABLED,
6102            ACCESSIBILITY_AUTOCLICK_ENABLED,
6103            ACCESSIBILITY_AUTOCLICK_DELAY,
6104            ACCESSIBILITY_LARGE_POINTER_ICON,
6105            PREFERRED_TTY_MODE,
6106            ENHANCED_VOICE_PRIVACY_ENABLED,
6107            TTY_MODE_ENABLED,
6108            INCALL_POWER_BUTTON_BEHAVIOR
6109        };
6110
6111        /**
6112         * These entries are considered common between the personal and the managed profile,
6113         * since the managed profile doesn't get to change them.
6114         */
6115        private static final Set<String> CLONE_TO_MANAGED_PROFILE = new ArraySet<>();
6116
6117        static {
6118            CLONE_TO_MANAGED_PROFILE.add(ACCESSIBILITY_ENABLED);
6119            CLONE_TO_MANAGED_PROFILE.add(ALLOW_MOCK_LOCATION);
6120            CLONE_TO_MANAGED_PROFILE.add(ALLOWED_GEOLOCATION_ORIGINS);
6121            CLONE_TO_MANAGED_PROFILE.add(DEFAULT_INPUT_METHOD);
6122            CLONE_TO_MANAGED_PROFILE.add(ENABLED_ACCESSIBILITY_SERVICES);
6123            CLONE_TO_MANAGED_PROFILE.add(ENABLED_INPUT_METHODS);
6124            CLONE_TO_MANAGED_PROFILE.add(LOCATION_MODE);
6125            CLONE_TO_MANAGED_PROFILE.add(LOCATION_PREVIOUS_MODE);
6126            CLONE_TO_MANAGED_PROFILE.add(LOCATION_PROVIDERS_ALLOWED);
6127            CLONE_TO_MANAGED_PROFILE.add(SELECTED_INPUT_METHOD_SUBTYPE);
6128            CLONE_TO_MANAGED_PROFILE.add(SELECTED_SPELL_CHECKER);
6129            CLONE_TO_MANAGED_PROFILE.add(SELECTED_SPELL_CHECKER_SUBTYPE);
6130        }
6131
6132        /** @hide */
6133        public static void getCloneToManagedProfileSettings(Set<String> outKeySet) {
6134            outKeySet.addAll(CLONE_TO_MANAGED_PROFILE);
6135        }
6136
6137        /**
6138         * Helper method for determining if a location provider is enabled.
6139         *
6140         * @param cr the content resolver to use
6141         * @param provider the location provider to query
6142         * @return true if the provider is enabled
6143         *
6144         * @deprecated use {@link #LOCATION_MODE} or
6145         *             {@link LocationManager#isProviderEnabled(String)}
6146         */
6147        @Deprecated
6148        public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) {
6149            return isLocationProviderEnabledForUser(cr, provider, UserHandle.myUserId());
6150        }
6151
6152        /**
6153         * Helper method for determining if a location provider is enabled.
6154         * @param cr the content resolver to use
6155         * @param provider the location provider to query
6156         * @param userId the userId to query
6157         * @return true if the provider is enabled
6158         * @deprecated use {@link #LOCATION_MODE} or
6159         *             {@link LocationManager#isProviderEnabled(String)}
6160         * @hide
6161         */
6162        @Deprecated
6163        public static final boolean isLocationProviderEnabledForUser(ContentResolver cr, String provider, int userId) {
6164            String allowedProviders = Settings.Secure.getStringForUser(cr,
6165                    LOCATION_PROVIDERS_ALLOWED, userId);
6166            return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
6167        }
6168
6169        /**
6170         * Thread-safe method for enabling or disabling a single location provider.
6171         * @param cr the content resolver to use
6172         * @param provider the location provider to enable or disable
6173         * @param enabled true if the provider should be enabled
6174         * @deprecated use {@link #putInt(ContentResolver, String, int)} and {@link #LOCATION_MODE}
6175         */
6176        @Deprecated
6177        public static final void setLocationProviderEnabled(ContentResolver cr,
6178                String provider, boolean enabled) {
6179            setLocationProviderEnabledForUser(cr, provider, enabled, UserHandle.myUserId());
6180        }
6181
6182        /**
6183         * Thread-safe method for enabling or disabling a single location provider.
6184         *
6185         * @param cr the content resolver to use
6186         * @param provider the location provider to enable or disable
6187         * @param enabled true if the provider should be enabled
6188         * @param userId the userId for which to enable/disable providers
6189         * @return true if the value was set, false on database errors
6190         * @deprecated use {@link #putIntForUser(ContentResolver, String, int, int)} and
6191         *             {@link #LOCATION_MODE}
6192         * @hide
6193         */
6194        @Deprecated
6195        public static final boolean setLocationProviderEnabledForUser(ContentResolver cr,
6196                String provider, boolean enabled, int userId) {
6197            synchronized (mLocationSettingsLock) {
6198                // to ensure thread safety, we write the provider name with a '+' or '-'
6199                // and let the SettingsProvider handle it rather than reading and modifying
6200                // the list of enabled providers.
6201                if (enabled) {
6202                    provider = "+" + provider;
6203                } else {
6204                    provider = "-" + provider;
6205                }
6206                return putStringForUser(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider,
6207                        userId);
6208            }
6209        }
6210
6211        /**
6212         * Saves the current location mode into {@link #LOCATION_PREVIOUS_MODE}.
6213         */
6214        private static final boolean saveLocationModeForUser(ContentResolver cr, int userId) {
6215            final int mode = getLocationModeForUser(cr, userId);
6216            return putIntForUser(cr, Settings.Secure.LOCATION_PREVIOUS_MODE, mode, userId);
6217        }
6218
6219        /**
6220         * Restores the current location mode from {@link #LOCATION_PREVIOUS_MODE}.
6221         */
6222        private static final boolean restoreLocationModeForUser(ContentResolver cr, int userId) {
6223            int mode = getIntForUser(cr, Settings.Secure.LOCATION_PREVIOUS_MODE,
6224                    LOCATION_MODE_HIGH_ACCURACY, userId);
6225            // Make sure that the previous mode is never "off". Otherwise the user won't be able to
6226            // turn on location any longer.
6227            if (mode == LOCATION_MODE_OFF) {
6228                mode = LOCATION_MODE_HIGH_ACCURACY;
6229            }
6230            return setLocationModeForUser(cr, mode, userId);
6231        }
6232
6233        /**
6234         * Thread-safe method for setting the location mode to one of
6235         * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY},
6236         * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}.
6237         *
6238         * @param cr the content resolver to use
6239         * @param mode such as {@link #LOCATION_MODE_HIGH_ACCURACY}
6240         * @param userId the userId for which to change mode
6241         * @return true if the value was set, false on database errors
6242         *
6243         * @throws IllegalArgumentException if mode is not one of the supported values
6244         */
6245        private static final boolean setLocationModeForUser(ContentResolver cr, int mode,
6246                int userId) {
6247            synchronized (mLocationSettingsLock) {
6248                boolean gps = false;
6249                boolean network = false;
6250                switch (mode) {
6251                    case LOCATION_MODE_PREVIOUS:
6252                        // Retrieve the actual mode and set to that mode.
6253                        return restoreLocationModeForUser(cr, userId);
6254                    case LOCATION_MODE_OFF:
6255                        saveLocationModeForUser(cr, userId);
6256                        break;
6257                    case LOCATION_MODE_SENSORS_ONLY:
6258                        gps = true;
6259                        break;
6260                    case LOCATION_MODE_BATTERY_SAVING:
6261                        network = true;
6262                        break;
6263                    case LOCATION_MODE_HIGH_ACCURACY:
6264                        gps = true;
6265                        network = true;
6266                        break;
6267                    default:
6268                        throw new IllegalArgumentException("Invalid location mode: " + mode);
6269                }
6270                // Note it's important that we set the NLP mode first. The Google implementation
6271                // of NLP clears its NLP consent setting any time it receives a
6272                // LocationManager.PROVIDERS_CHANGED_ACTION broadcast and NLP is disabled. Also,
6273                // it shows an NLP consent dialog any time it receives the broadcast, NLP is
6274                // enabled, and the NLP consent is not set. If 1) we were to enable GPS first,
6275                // 2) a setup wizard has its own NLP consent UI that sets the NLP consent setting,
6276                // and 3) the receiver happened to complete before we enabled NLP, then the Google
6277                // NLP would detect the attempt to enable NLP and show a redundant NLP consent
6278                // dialog. Then the people who wrote the setup wizard would be sad.
6279                boolean nlpSuccess = Settings.Secure.setLocationProviderEnabledForUser(
6280                        cr, LocationManager.NETWORK_PROVIDER, network, userId);
6281                boolean gpsSuccess = Settings.Secure.setLocationProviderEnabledForUser(
6282                        cr, LocationManager.GPS_PROVIDER, gps, userId);
6283                return gpsSuccess && nlpSuccess;
6284            }
6285        }
6286
6287        /**
6288         * Thread-safe method for reading the location mode, returns one of
6289         * {@link #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY},
6290         * {@link #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}.
6291         *
6292         * @param cr the content resolver to use
6293         * @param userId the userId for which to read the mode
6294         * @return the location mode
6295         */
6296        private static final int getLocationModeForUser(ContentResolver cr, int userId) {
6297            synchronized (mLocationSettingsLock) {
6298                boolean gpsEnabled = Settings.Secure.isLocationProviderEnabledForUser(
6299                        cr, LocationManager.GPS_PROVIDER, userId);
6300                boolean networkEnabled = Settings.Secure.isLocationProviderEnabledForUser(
6301                        cr, LocationManager.NETWORK_PROVIDER, userId);
6302                if (gpsEnabled && networkEnabled) {
6303                    return LOCATION_MODE_HIGH_ACCURACY;
6304                } else if (gpsEnabled) {
6305                    return LOCATION_MODE_SENSORS_ONLY;
6306                } else if (networkEnabled) {
6307                    return LOCATION_MODE_BATTERY_SAVING;
6308                } else {
6309                    return LOCATION_MODE_OFF;
6310                }
6311            }
6312        }
6313    }
6314
6315    /**
6316     * Global system settings, containing preferences that always apply identically
6317     * to all defined users.  Applications can read these but are not allowed to write;
6318     * like the "Secure" settings, these are for preferences that the user must
6319     * explicitly modify through the system UI or specialized APIs for those values.
6320     */
6321    public static final class Global extends NameValueTable {
6322        public static final String SYS_PROP_SETTING_VERSION = "sys.settings_global_version";
6323
6324        /**
6325         * The content:// style URL for global secure settings items.  Not public.
6326         */
6327        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/global");
6328
6329        /**
6330         * Whether users are allowed to add more users or guest from lockscreen.
6331         * <p>
6332         * Type: int
6333         * @hide
6334         */
6335        public static final String ADD_USERS_WHEN_LOCKED = "add_users_when_locked";
6336
6337        /**
6338         * Setting whether the global gesture for enabling accessibility is enabled.
6339         * If this gesture is enabled the user will be able to perfrom it to enable
6340         * the accessibility state without visiting the settings app.
6341         * @hide
6342         */
6343        public static final String ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED =
6344                "enable_accessibility_global_gesture_enabled";
6345
6346        /**
6347         * Whether Airplane Mode is on.
6348         */
6349        public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
6350
6351        /**
6352         * Whether Theater Mode is on.
6353         * {@hide}
6354         */
6355        @SystemApi
6356        public static final String THEATER_MODE_ON = "theater_mode_on";
6357
6358        /**
6359         * Constant for use in AIRPLANE_MODE_RADIOS to specify Bluetooth radio.
6360         */
6361        public static final String RADIO_BLUETOOTH = "bluetooth";
6362
6363        /**
6364         * Constant for use in AIRPLANE_MODE_RADIOS to specify Wi-Fi radio.
6365         */
6366        public static final String RADIO_WIFI = "wifi";
6367
6368        /**
6369         * {@hide}
6370         */
6371        public static final String RADIO_WIMAX = "wimax";
6372        /**
6373         * Constant for use in AIRPLANE_MODE_RADIOS to specify Cellular radio.
6374         */
6375        public static final String RADIO_CELL = "cell";
6376
6377        /**
6378         * Constant for use in AIRPLANE_MODE_RADIOS to specify NFC radio.
6379         */
6380        public static final String RADIO_NFC = "nfc";
6381
6382        /**
6383         * A comma separated list of radios that need to be disabled when airplane mode
6384         * is on. This overrides WIFI_ON and BLUETOOTH_ON, if Wi-Fi and bluetooth are
6385         * included in the comma separated list.
6386         */
6387        public static final String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
6388
6389        /**
6390         * A comma separated list of radios that should to be disabled when airplane mode
6391         * is on, but can be manually reenabled by the user.  For example, if RADIO_WIFI is
6392         * added to both AIRPLANE_MODE_RADIOS and AIRPLANE_MODE_TOGGLEABLE_RADIOS, then Wifi
6393         * will be turned off when entering airplane mode, but the user will be able to reenable
6394         * Wifi in the Settings app.
6395         *
6396         * {@hide}
6397         */
6398        public static final String AIRPLANE_MODE_TOGGLEABLE_RADIOS = "airplane_mode_toggleable_radios";
6399
6400        /**
6401         * A Long representing a bitmap of profiles that should be disabled when bluetooth starts.
6402         * See {@link android.bluetooth.BluetoothProfile}.
6403         * {@hide}
6404         */
6405        public static final String BLUETOOTH_DISABLED_PROFILES = "bluetooth_disabled_profiles";
6406
6407        /**
6408         * A semi-colon separated list of Bluetooth interoperability workarounds.
6409         * Each entry is a partial Bluetooth device address string and an integer representing
6410         * the feature to be disabled, separated by a comma. The integer must correspond
6411         * to a interoperability feature as defined in "interop.h" in /system/bt.
6412         * <p>
6413         * Example: <br/>
6414         *   "00:11:22,0;01:02:03:04,2"
6415         * @hide
6416         */
6417       public static final String BLUETOOTH_INTEROPERABILITY_LIST = "bluetooth_interoperability_list";
6418
6419        /**
6420         * The policy for deciding when Wi-Fi should go to sleep (which will in
6421         * turn switch to using the mobile data as an Internet connection).
6422         * <p>
6423         * Set to one of {@link #WIFI_SLEEP_POLICY_DEFAULT},
6424         * {@link #WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED}, or
6425         * {@link #WIFI_SLEEP_POLICY_NEVER}.
6426         */
6427        public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
6428
6429        /**
6430         * Value for {@link #WIFI_SLEEP_POLICY} to use the default Wi-Fi sleep
6431         * policy, which is to sleep shortly after the turning off
6432         * according to the {@link #STAY_ON_WHILE_PLUGGED_IN} setting.
6433         */
6434        public static final int WIFI_SLEEP_POLICY_DEFAULT = 0;
6435
6436        /**
6437         * Value for {@link #WIFI_SLEEP_POLICY} to use the default policy when
6438         * the device is on battery, and never go to sleep when the device is
6439         * plugged in.
6440         */
6441        public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1;
6442
6443        /**
6444         * Value for {@link #WIFI_SLEEP_POLICY} to never go to sleep.
6445         */
6446        public static final int WIFI_SLEEP_POLICY_NEVER = 2;
6447
6448        /**
6449         * Value to specify if the user prefers the date, time and time zone
6450         * to be automatically fetched from the network (NITZ). 1=yes, 0=no
6451         */
6452        public static final String AUTO_TIME = "auto_time";
6453
6454        /**
6455         * Value to specify if the user prefers the time zone
6456         * to be automatically fetched from the network (NITZ). 1=yes, 0=no
6457         */
6458        public static final String AUTO_TIME_ZONE = "auto_time_zone";
6459
6460        /**
6461         * URI for the car dock "in" event sound.
6462         * @hide
6463         */
6464        public static final String CAR_DOCK_SOUND = "car_dock_sound";
6465
6466        /**
6467         * URI for the car dock "out" event sound.
6468         * @hide
6469         */
6470        public static final String CAR_UNDOCK_SOUND = "car_undock_sound";
6471
6472        /**
6473         * URI for the desk dock "in" event sound.
6474         * @hide
6475         */
6476        public static final String DESK_DOCK_SOUND = "desk_dock_sound";
6477
6478        /**
6479         * URI for the desk dock "out" event sound.
6480         * @hide
6481         */
6482        public static final String DESK_UNDOCK_SOUND = "desk_undock_sound";
6483
6484        /**
6485         * Whether to play a sound for dock events.
6486         * @hide
6487         */
6488        public static final String DOCK_SOUNDS_ENABLED = "dock_sounds_enabled";
6489
6490        /**
6491         * URI for the "device locked" (keyguard shown) sound.
6492         * @hide
6493         */
6494        public static final String LOCK_SOUND = "lock_sound";
6495
6496        /**
6497         * URI for the "device unlocked" sound.
6498         * @hide
6499         */
6500        public static final String UNLOCK_SOUND = "unlock_sound";
6501
6502        /**
6503         * URI for the "device is trusted" sound, which is played when the device enters the trusted
6504         * state without unlocking.
6505         * @hide
6506         */
6507        public static final String TRUSTED_SOUND = "trusted_sound";
6508
6509        /**
6510         * URI for the low battery sound file.
6511         * @hide
6512         */
6513        public static final String LOW_BATTERY_SOUND = "low_battery_sound";
6514
6515        /**
6516         * Whether to play a sound for low-battery alerts.
6517         * @hide
6518         */
6519        public static final String POWER_SOUNDS_ENABLED = "power_sounds_enabled";
6520
6521        /**
6522         * URI for the "wireless charging started" sound.
6523         * @hide
6524         */
6525        public static final String WIRELESS_CHARGING_STARTED_SOUND =
6526                "wireless_charging_started_sound";
6527
6528        /**
6529         * Whether to play a sound for charging events.
6530         * @hide
6531         */
6532        public static final String CHARGING_SOUNDS_ENABLED = "charging_sounds_enabled";
6533
6534        /**
6535         * Whether we keep the device on while the device is plugged in.
6536         * Supported values are:
6537         * <ul>
6538         * <li>{@code 0} to never stay on while plugged in</li>
6539         * <li>{@link BatteryManager#BATTERY_PLUGGED_AC} to stay on for AC charger</li>
6540         * <li>{@link BatteryManager#BATTERY_PLUGGED_USB} to stay on for USB charger</li>
6541         * <li>{@link BatteryManager#BATTERY_PLUGGED_WIRELESS} to stay on for wireless charger</li>
6542         * </ul>
6543         * These values can be OR-ed together.
6544         */
6545        public static final String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
6546
6547        /**
6548         * When the user has enable the option to have a "bug report" command
6549         * in the power menu.
6550         * @hide
6551         */
6552        public static final String BUGREPORT_IN_POWER_MENU = "bugreport_in_power_menu";
6553
6554        /**
6555         * Whether ADB is enabled.
6556         */
6557        public static final String ADB_ENABLED = "adb_enabled";
6558
6559        /**
6560         * Whether Views are allowed to save their attribute data.
6561         * @hide
6562         */
6563        public static final String DEBUG_VIEW_ATTRIBUTES = "debug_view_attributes";
6564
6565        /**
6566         * Whether assisted GPS should be enabled or not.
6567         * @hide
6568         */
6569        public static final String ASSISTED_GPS_ENABLED = "assisted_gps_enabled";
6570
6571        /**
6572         * Whether bluetooth is enabled/disabled
6573         * 0=disabled. 1=enabled.
6574         */
6575        public static final String BLUETOOTH_ON = "bluetooth_on";
6576
6577        /**
6578         * CDMA Cell Broadcast SMS
6579         *                            0 = CDMA Cell Broadcast SMS disabled
6580         *                            1 = CDMA Cell Broadcast SMS enabled
6581         * @hide
6582         */
6583        public static final String CDMA_CELL_BROADCAST_SMS =
6584                "cdma_cell_broadcast_sms";
6585
6586        /**
6587         * The CDMA roaming mode 0 = Home Networks, CDMA default
6588         *                       1 = Roaming on Affiliated networks
6589         *                       2 = Roaming on any networks
6590         * @hide
6591         */
6592        public static final String CDMA_ROAMING_MODE = "roaming_settings";
6593
6594        /**
6595         * The CDMA subscription mode 0 = RUIM/SIM (default)
6596         *                                1 = NV
6597         * @hide
6598         */
6599        public static final String CDMA_SUBSCRIPTION_MODE = "subscription_mode";
6600
6601        /** Inactivity timeout to track mobile data activity.
6602        *
6603        * If set to a positive integer, it indicates the inactivity timeout value in seconds to
6604        * infer the data activity of mobile network. After a period of no activity on mobile
6605        * networks with length specified by the timeout, an {@code ACTION_DATA_ACTIVITY_CHANGE}
6606        * intent is fired to indicate a transition of network status from "active" to "idle". Any
6607        * subsequent activity on mobile networks triggers the firing of {@code
6608        * ACTION_DATA_ACTIVITY_CHANGE} intent indicating transition from "idle" to "active".
6609        *
6610        * Network activity refers to transmitting or receiving data on the network interfaces.
6611        *
6612        * Tracking is disabled if set to zero or negative value.
6613        *
6614        * @hide
6615        */
6616       public static final String DATA_ACTIVITY_TIMEOUT_MOBILE = "data_activity_timeout_mobile";
6617
6618       /** Timeout to tracking Wifi data activity. Same as {@code DATA_ACTIVITY_TIMEOUT_MOBILE}
6619        * but for Wifi network.
6620        * @hide
6621        */
6622       public static final String DATA_ACTIVITY_TIMEOUT_WIFI = "data_activity_timeout_wifi";
6623
6624       /**
6625        * Whether or not data roaming is enabled. (0 = false, 1 = true)
6626        */
6627       public static final String DATA_ROAMING = "data_roaming";
6628
6629       /**
6630        * The value passed to a Mobile DataConnection via bringUp which defines the
6631        * number of retries to preform when setting up the initial connection. The default
6632        * value defined in DataConnectionTrackerBase#DEFAULT_MDC_INITIAL_RETRY is currently 1.
6633        * @hide
6634        */
6635       public static final String MDC_INITIAL_MAX_RETRY = "mdc_initial_max_retry";
6636
6637       /**
6638        * Whether any package can be on external storage. When this is true, any
6639        * package, regardless of manifest values, is a candidate for installing
6640        * or moving onto external storage. (0 = false, 1 = true)
6641        * @hide
6642        */
6643       public static final String FORCE_ALLOW_ON_EXTERNAL = "force_allow_on_external";
6644
6645        /**
6646         * Whether any activity can be resized. When this is true, any
6647         * activity, regardless of manifest values, can be resized for multi-window.
6648         * (0 = false, 1 = true)
6649         * @hide
6650         */
6651        public static final String DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES
6652                = "force_resizable_activities";
6653
6654        /**
6655         * Whether to enable experimental freeform support for windows.
6656         * @hide
6657         */
6658        public static final String DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT
6659                = "enable_freeform_support";
6660
6661       /**
6662        * Whether user has enabled development settings.
6663        */
6664       public static final String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
6665
6666       /**
6667        * Whether the device has been provisioned (0 = false, 1 = true).
6668        * <p>On a multiuser device with a separate system user, the screen may be locked
6669        * as soon as this is set to true and further activities cannot be launched on the
6670        * system user unless they are marked to show over keyguard.
6671        */
6672       public static final String DEVICE_PROVISIONED = "device_provisioned";
6673
6674       /**
6675        * Whether mobile data should be allowed while the device is being provisioned.
6676        * This allows the provisioning process to turn off mobile data before the user
6677        * has an opportunity to set things up, preventing other processes from burning
6678        * precious bytes before wifi is setup.
6679        * (0 = false, 1 = true)
6680        * @hide
6681        */
6682       public static final String DEVICE_PROVISIONING_MOBILE_DATA_ENABLED =
6683               "device_provisioning_mobile_data";
6684
6685       /**
6686        * The saved value for WindowManagerService.setForcedDisplaySize().
6687        * Two integers separated by a comma.  If unset, then use the real display size.
6688        * @hide
6689        */
6690       public static final String DISPLAY_SIZE_FORCED = "display_size_forced";
6691
6692       /**
6693        * The saved value for WindowManagerService.setForcedDisplayScalingMode().
6694        * 0 or unset if scaling is automatic, 1 if scaling is disabled.
6695        * @hide
6696        */
6697       public static final String DISPLAY_SCALING_FORCE = "display_scaling_force";
6698
6699       /**
6700        * The maximum size, in bytes, of a download that the download manager will transfer over
6701        * a non-wifi connection.
6702        * @hide
6703        */
6704       public static final String DOWNLOAD_MAX_BYTES_OVER_MOBILE =
6705               "download_manager_max_bytes_over_mobile";
6706
6707       /**
6708        * The recommended maximum size, in bytes, of a download that the download manager should
6709        * transfer over a non-wifi connection. Over this size, the use will be warned, but will
6710        * have the option to start the download over the mobile connection anyway.
6711        * @hide
6712        */
6713       public static final String DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE =
6714               "download_manager_recommended_max_bytes_over_mobile";
6715
6716       /**
6717        * @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
6718        */
6719       @Deprecated
6720       public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
6721
6722       /**
6723        * Whether HDMI control shall be enabled. If disabled, no CEC/MHL command will be
6724        * sent or processed. (0 = false, 1 = true)
6725        * @hide
6726        */
6727       public static final String HDMI_CONTROL_ENABLED = "hdmi_control_enabled";
6728
6729       /**
6730        * Whether HDMI system audio is enabled. If enabled, TV internal speaker is muted,
6731        * and the output is redirected to AV Receiver connected via
6732        * {@Global#HDMI_SYSTEM_AUDIO_OUTPUT}.
6733        * @hide
6734        */
6735       public static final String HDMI_SYSTEM_AUDIO_ENABLED = "hdmi_system_audio_enabled";
6736
6737       /**
6738        * Whether TV will automatically turn on upon reception of the CEC command
6739        * &lt;Text View On&gt; or &lt;Image View On&gt;. (0 = false, 1 = true)
6740        * @hide
6741        */
6742       public static final String HDMI_CONTROL_AUTO_WAKEUP_ENABLED =
6743               "hdmi_control_auto_wakeup_enabled";
6744
6745       /**
6746        * Whether TV will also turn off other CEC devices when it goes to standby mode.
6747        * (0 = false, 1 = true)
6748        * @hide
6749        */
6750       public static final String HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED =
6751               "hdmi_control_auto_device_off_enabled";
6752
6753       /**
6754        * Whether to use the DHCP client from Lollipop and earlier instead of the newer Android DHCP
6755        * client.
6756        * (0 = false, 1 = true)
6757        * @hide
6758        */
6759       public static final String LEGACY_DHCP_CLIENT = "legacy_dhcp_client";
6760
6761       /**
6762        * Whether TV will switch to MHL port when a mobile device is plugged in.
6763        * (0 = false, 1 = true)
6764        * @hide
6765        */
6766       public static final String MHL_INPUT_SWITCHING_ENABLED = "mhl_input_switching_enabled";
6767
6768       /**
6769        * Whether TV will charge the mobile device connected at MHL port. (0 = false, 1 = true)
6770        * @hide
6771        */
6772       public static final String MHL_POWER_CHARGE_ENABLED = "mhl_power_charge_enabled";
6773
6774       /**
6775        * Whether mobile data connections are allowed by the user.  See
6776        * ConnectivityManager for more info.
6777        * @hide
6778        */
6779       public static final String MOBILE_DATA = "mobile_data";
6780
6781       /**
6782        * Whether the mobile data connection should remain active even when higher
6783        * priority networks like WiFi are active, to help make network switching faster.
6784        *
6785        * See ConnectivityService for more info.
6786        *
6787        * (0 = disabled, 1 = enabled)
6788        * @hide
6789        */
6790       public static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on";
6791
6792       /** {@hide} */
6793       public static final String NETSTATS_ENABLED = "netstats_enabled";
6794       /** {@hide} */
6795       public static final String NETSTATS_POLL_INTERVAL = "netstats_poll_interval";
6796       /** {@hide} */
6797       public static final String NETSTATS_TIME_CACHE_MAX_AGE = "netstats_time_cache_max_age";
6798       /** {@hide} */
6799       public static final String NETSTATS_GLOBAL_ALERT_BYTES = "netstats_global_alert_bytes";
6800       /** {@hide} */
6801       public static final String NETSTATS_SAMPLE_ENABLED = "netstats_sample_enabled";
6802
6803       /** {@hide} */
6804       public static final String NETSTATS_DEV_BUCKET_DURATION = "netstats_dev_bucket_duration";
6805       /** {@hide} */
6806       public static final String NETSTATS_DEV_PERSIST_BYTES = "netstats_dev_persist_bytes";
6807       /** {@hide} */
6808       public static final String NETSTATS_DEV_ROTATE_AGE = "netstats_dev_rotate_age";
6809       /** {@hide} */
6810       public static final String NETSTATS_DEV_DELETE_AGE = "netstats_dev_delete_age";
6811
6812       /** {@hide} */
6813       public static final String NETSTATS_UID_BUCKET_DURATION = "netstats_uid_bucket_duration";
6814       /** {@hide} */
6815       public static final String NETSTATS_UID_PERSIST_BYTES = "netstats_uid_persist_bytes";
6816       /** {@hide} */
6817       public static final String NETSTATS_UID_ROTATE_AGE = "netstats_uid_rotate_age";
6818       /** {@hide} */
6819       public static final String NETSTATS_UID_DELETE_AGE = "netstats_uid_delete_age";
6820
6821       /** {@hide} */
6822       public static final String NETSTATS_UID_TAG_BUCKET_DURATION = "netstats_uid_tag_bucket_duration";
6823       /** {@hide} */
6824       public static final String NETSTATS_UID_TAG_PERSIST_BYTES = "netstats_uid_tag_persist_bytes";
6825       /** {@hide} */
6826       public static final String NETSTATS_UID_TAG_ROTATE_AGE = "netstats_uid_tag_rotate_age";
6827       /** {@hide} */
6828       public static final String NETSTATS_UID_TAG_DELETE_AGE = "netstats_uid_tag_delete_age";
6829
6830       /**
6831        * User preference for which network(s) should be used. Only the
6832        * connectivity service should touch this.
6833        */
6834       public static final String NETWORK_PREFERENCE = "network_preference";
6835
6836       /**
6837        * Which package name to use for network scoring. If null, or if the package is not a valid
6838        * scorer app, external network scores will neither be requested nor accepted.
6839        * @hide
6840        */
6841       public static final String NETWORK_SCORER_APP = "network_scorer_app";
6842
6843       /**
6844        * If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment
6845        * to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been
6846        * exceeded.
6847        * @hide
6848        */
6849       public static final String NITZ_UPDATE_DIFF = "nitz_update_diff";
6850
6851       /**
6852        * The length of time in milli-seconds that automatic small adjustments to
6853        * SystemClock are ignored if NITZ_UPDATE_DIFF is not exceeded.
6854        * @hide
6855        */
6856       public static final String NITZ_UPDATE_SPACING = "nitz_update_spacing";
6857
6858       /** Preferred NTP server. {@hide} */
6859       public static final String NTP_SERVER = "ntp_server";
6860       /** Timeout in milliseconds to wait for NTP server. {@hide} */
6861       public static final String NTP_TIMEOUT = "ntp_timeout";
6862
6863       /** {@hide} */
6864       public static final String STORAGE_BENCHMARK_INTERVAL = "storage_benchmark_interval";
6865
6866       /**
6867        * Whether to disable the automatic scheduling of system updates.
6868        * 1 = system updates won't be automatically scheduled (will always
6869        * present notification instead).
6870        * 0 = system updates will be automatically scheduled. (default)
6871        * @hide
6872        */
6873       @SystemApi
6874       public static final String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update";
6875
6876       /**
6877        * Whether the package manager should send package verification broadcasts for verifiers to
6878        * review apps prior to installation.
6879        * 1 = request apps to be verified prior to installation, if a verifier exists.
6880        * 0 = do not verify apps before installation
6881        * @hide
6882        */
6883       public static final String PACKAGE_VERIFIER_ENABLE = "package_verifier_enable";
6884
6885       /** Timeout for package verification.
6886        * @hide */
6887       public static final String PACKAGE_VERIFIER_TIMEOUT = "verifier_timeout";
6888
6889       /** Default response code for package verification.
6890        * @hide */
6891       public static final String PACKAGE_VERIFIER_DEFAULT_RESPONSE = "verifier_default_response";
6892
6893       /**
6894        * Show package verification setting in the Settings app.
6895        * 1 = show (default)
6896        * 0 = hide
6897        * @hide
6898        */
6899       public static final String PACKAGE_VERIFIER_SETTING_VISIBLE = "verifier_setting_visible";
6900
6901       /**
6902        * Run package verification on apps installed through ADB/ADT/USB
6903        * 1 = perform package verification on ADB installs (default)
6904        * 0 = bypass package verification on ADB installs
6905        * @hide
6906        */
6907       public static final String PACKAGE_VERIFIER_INCLUDE_ADB = "verifier_verify_adb_installs";
6908
6909       /**
6910        * Time since last fstrim (milliseconds) after which we force one to happen
6911        * during device startup.  If unset, the default is 3 days.
6912        * @hide
6913        */
6914       public static final String FSTRIM_MANDATORY_INTERVAL = "fstrim_mandatory_interval";
6915
6916       /**
6917        * The interval in milliseconds at which to check packet counts on the
6918        * mobile data interface when screen is on, to detect possible data
6919        * connection problems.
6920        * @hide
6921        */
6922       public static final String PDP_WATCHDOG_POLL_INTERVAL_MS =
6923               "pdp_watchdog_poll_interval_ms";
6924
6925       /**
6926        * The interval in milliseconds at which to check packet counts on the
6927        * mobile data interface when screen is off, to detect possible data
6928        * connection problems.
6929        * @hide
6930        */
6931       public static final String PDP_WATCHDOG_LONG_POLL_INTERVAL_MS =
6932               "pdp_watchdog_long_poll_interval_ms";
6933
6934       /**
6935        * The interval in milliseconds at which to check packet counts on the
6936        * mobile data interface after {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT}
6937        * outgoing packets has been reached without incoming packets.
6938        * @hide
6939        */
6940       public static final String PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS =
6941               "pdp_watchdog_error_poll_interval_ms";
6942
6943       /**
6944        * The number of outgoing packets sent without seeing an incoming packet
6945        * that triggers a countdown (of {@link #PDP_WATCHDOG_ERROR_POLL_COUNT}
6946        * device is logged to the event log
6947        * @hide
6948        */
6949       public static final String PDP_WATCHDOG_TRIGGER_PACKET_COUNT =
6950               "pdp_watchdog_trigger_packet_count";
6951
6952       /**
6953        * The number of polls to perform (at {@link #PDP_WATCHDOG_ERROR_POLL_INTERVAL_MS})
6954        * after hitting {@link #PDP_WATCHDOG_TRIGGER_PACKET_COUNT} before
6955        * attempting data connection recovery.
6956        * @hide
6957        */
6958       public static final String PDP_WATCHDOG_ERROR_POLL_COUNT =
6959               "pdp_watchdog_error_poll_count";
6960
6961       /**
6962        * The number of failed PDP reset attempts before moving to something more
6963        * drastic: re-registering to the network.
6964        * @hide
6965        */
6966       public static final String PDP_WATCHDOG_MAX_PDP_RESET_FAIL_COUNT =
6967               "pdp_watchdog_max_pdp_reset_fail_count";
6968
6969       /**
6970        * A positive value indicates how often the SamplingProfiler
6971        * should take snapshots. Zero value means SamplingProfiler
6972        * is disabled.
6973        *
6974        * @hide
6975        */
6976       public static final String SAMPLING_PROFILER_MS = "sampling_profiler_ms";
6977
6978       /**
6979        * URL to open browser on to allow user to manage a prepay account
6980        * @hide
6981        */
6982       public static final String SETUP_PREPAID_DATA_SERVICE_URL =
6983               "setup_prepaid_data_service_url";
6984
6985       /**
6986        * URL to attempt a GET on to see if this is a prepay device
6987        * @hide
6988        */
6989       public static final String SETUP_PREPAID_DETECTION_TARGET_URL =
6990               "setup_prepaid_detection_target_url";
6991
6992       /**
6993        * Host to check for a redirect to after an attempt to GET
6994        * SETUP_PREPAID_DETECTION_TARGET_URL. (If we redirected there,
6995        * this is a prepaid device with zero balance.)
6996        * @hide
6997        */
6998       public static final String SETUP_PREPAID_DETECTION_REDIR_HOST =
6999               "setup_prepaid_detection_redir_host";
7000
7001       /**
7002        * The interval in milliseconds at which to check the number of SMS sent out without asking
7003        * for use permit, to limit the un-authorized SMS usage.
7004        *
7005        * @hide
7006        */
7007       public static final String SMS_OUTGOING_CHECK_INTERVAL_MS =
7008               "sms_outgoing_check_interval_ms";
7009
7010       /**
7011        * The number of outgoing SMS sent without asking for user permit (of {@link
7012        * #SMS_OUTGOING_CHECK_INTERVAL_MS}
7013        *
7014        * @hide
7015        */
7016       public static final String SMS_OUTGOING_CHECK_MAX_COUNT =
7017               "sms_outgoing_check_max_count";
7018
7019       /**
7020        * Used to disable SMS short code confirmation - defaults to true.
7021        * True indcates we will do the check, etc.  Set to false to disable.
7022        * @see com.android.internal.telephony.SmsUsageMonitor
7023        * @hide
7024        */
7025       public static final String SMS_SHORT_CODE_CONFIRMATION = "sms_short_code_confirmation";
7026
7027        /**
7028         * Used to select which country we use to determine premium sms codes.
7029         * One of com.android.internal.telephony.SMSDispatcher.PREMIUM_RULE_USE_SIM,
7030         * com.android.internal.telephony.SMSDispatcher.PREMIUM_RULE_USE_NETWORK,
7031         * or com.android.internal.telephony.SMSDispatcher.PREMIUM_RULE_USE_BOTH.
7032         * @hide
7033         */
7034        public static final String SMS_SHORT_CODE_RULE = "sms_short_code_rule";
7035
7036       /**
7037        * Used to select TCP's default initial receiver window size in segments - defaults to a build config value
7038        * @hide
7039        */
7040       public static final String TCP_DEFAULT_INIT_RWND = "tcp_default_init_rwnd";
7041
7042       /**
7043        * Used to disable Tethering on a device - defaults to true
7044        * @hide
7045        */
7046       public static final String TETHER_SUPPORTED = "tether_supported";
7047
7048       /**
7049        * Used to require DUN APN on the device or not - defaults to a build config value
7050        * which defaults to false
7051        * @hide
7052        */
7053       public static final String TETHER_DUN_REQUIRED = "tether_dun_required";
7054
7055       /**
7056        * Used to hold a gservices-provisioned apn value for DUN.  If set, or the
7057        * corresponding build config values are set it will override the APN DB
7058        * values.
7059        * Consists of a comma seperated list of strings:
7060        * "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
7061        * note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN"
7062        * @hide
7063        */
7064       public static final String TETHER_DUN_APN = "tether_dun_apn";
7065
7066       /**
7067        * List of carrier apps which are whitelisted to prompt the user for install when
7068        * a sim card with matching uicc carrier privilege rules is inserted.
7069        *
7070        * The value is "package1;package2;..."
7071        * @hide
7072        */
7073       public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
7074
7075       /**
7076        * USB Mass Storage Enabled
7077        */
7078       public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
7079
7080       /**
7081        * If this setting is set (to anything), then all references
7082        * to Gmail on the device must change to Google Mail.
7083        */
7084       public static final String USE_GOOGLE_MAIL = "use_google_mail";
7085
7086        /**
7087         * Webview Data reduction proxy key.
7088         * @hide
7089         */
7090        public static final String WEBVIEW_DATA_REDUCTION_PROXY_KEY =
7091                "webview_data_reduction_proxy_key";
7092
7093        /**
7094         * Whether or not the WebView fallback mechanism should be enabled.
7095         * 0=disabled, 1=enabled.
7096         * @hide
7097         */
7098        public static final String WEBVIEW_FALLBACK_LOGIC_ENABLED =
7099                "webview_fallback_logic_enabled";
7100
7101        /**
7102         * Name of the package used as WebView provider (if unset the provider is instead determined
7103         * by the system).
7104         * @hide
7105         */
7106        public static final String WEBVIEW_PROVIDER = "webview_provider";
7107
7108        /**
7109         * Developer setting to enable WebView multiprocess rendering.
7110         * @hide
7111         */
7112        @SystemApi
7113        public static final String WEBVIEW_MULTIPROCESS = "webview_multiprocess";
7114
7115       /**
7116        * Whether Wifi display is enabled/disabled
7117        * 0=disabled. 1=enabled.
7118        * @hide
7119        */
7120       public static final String WIFI_DISPLAY_ON = "wifi_display_on";
7121
7122       /**
7123        * Whether Wifi display certification mode is enabled/disabled
7124        * 0=disabled. 1=enabled.
7125        * @hide
7126        */
7127       public static final String WIFI_DISPLAY_CERTIFICATION_ON =
7128               "wifi_display_certification_on";
7129
7130       /**
7131        * WPS Configuration method used by Wifi display, this setting only
7132        * takes effect when WIFI_DISPLAY_CERTIFICATION_ON is 1 (enabled).
7133        *
7134        * Possible values are:
7135        *
7136        * WpsInfo.INVALID: use default WPS method chosen by framework
7137        * WpsInfo.PBC    : use Push button
7138        * WpsInfo.KEYPAD : use Keypad
7139        * WpsInfo.DISPLAY: use Display
7140        * @hide
7141        */
7142       public static final String WIFI_DISPLAY_WPS_CONFIG =
7143           "wifi_display_wps_config";
7144
7145       /**
7146        * Whether to notify the user of open networks.
7147        * <p>
7148        * If not connected and the scan results have an open network, we will
7149        * put this notification up. If we attempt to connect to a network or
7150        * the open network(s) disappear, we remove the notification. When we
7151        * show the notification, we will not show it again for
7152        * {@link android.provider.Settings.Secure#WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY} time.
7153        */
7154       public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON =
7155               "wifi_networks_available_notification_on";
7156       /**
7157        * {@hide}
7158        */
7159       public static final String WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON =
7160               "wimax_networks_available_notification_on";
7161
7162       /**
7163        * Delay (in seconds) before repeating the Wi-Fi networks available notification.
7164        * Connecting to a network will reset the timer.
7165        */
7166       public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY =
7167               "wifi_networks_available_repeat_delay";
7168
7169       /**
7170        * 802.11 country code in ISO 3166 format
7171        * @hide
7172        */
7173       public static final String WIFI_COUNTRY_CODE = "wifi_country_code";
7174
7175       /**
7176        * The interval in milliseconds to issue wake up scans when wifi needs
7177        * to connect. This is necessary to connect to an access point when
7178        * device is on the move and the screen is off.
7179        * @hide
7180        */
7181       public static final String WIFI_FRAMEWORK_SCAN_INTERVAL_MS =
7182               "wifi_framework_scan_interval_ms";
7183
7184       /**
7185        * The interval in milliseconds after which Wi-Fi is considered idle.
7186        * When idle, it is possible for the device to be switched from Wi-Fi to
7187        * the mobile data network.
7188        * @hide
7189        */
7190       public static final String WIFI_IDLE_MS = "wifi_idle_ms";
7191
7192       /**
7193        * When the number of open networks exceeds this number, the
7194        * least-recently-used excess networks will be removed.
7195        */
7196       public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
7197
7198       /**
7199        * Whether the Wi-Fi should be on.  Only the Wi-Fi service should touch this.
7200        */
7201       public static final String WIFI_ON = "wifi_on";
7202
7203       /**
7204        * Setting to allow scans to be enabled even wifi is turned off for connectivity.
7205        * @hide
7206        */
7207       public static final String WIFI_SCAN_ALWAYS_AVAILABLE =
7208                "wifi_scan_always_enabled";
7209
7210       /**
7211        * Settings to allow BLE scans to be enabled even when Bluetooth is turned off for
7212        * connectivity.
7213        * @hide
7214        */
7215       public static final String BLE_SCAN_ALWAYS_AVAILABLE =
7216               "ble_scan_always_enabled";
7217
7218       /**
7219        * Used to save the Wifi_ON state prior to tethering.
7220        * This state will be checked to restore Wifi after
7221        * the user turns off tethering.
7222        *
7223        * @hide
7224        */
7225       public static final String WIFI_SAVED_STATE = "wifi_saved_state";
7226
7227       /**
7228        * The interval in milliseconds to scan as used by the wifi supplicant
7229        * @hide
7230        */
7231       public static final String WIFI_SUPPLICANT_SCAN_INTERVAL_MS =
7232               "wifi_supplicant_scan_interval_ms";
7233
7234        /**
7235         * whether frameworks handles wifi auto-join
7236         * @hide
7237         */
7238       public static final String WIFI_ENHANCED_AUTO_JOIN =
7239                "wifi_enhanced_auto_join";
7240
7241        /**
7242         * whether settings show RSSI
7243         * @hide
7244         */
7245        public static final String WIFI_NETWORK_SHOW_RSSI =
7246                "wifi_network_show_rssi";
7247
7248        /**
7249        * The interval in milliseconds to scan at supplicant when p2p is connected
7250        * @hide
7251        */
7252       public static final String WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS =
7253               "wifi_scan_interval_p2p_connected_ms";
7254
7255       /**
7256        * Whether the Wi-Fi watchdog is enabled.
7257        */
7258       public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
7259
7260       /**
7261        * Setting to turn off poor network avoidance on Wi-Fi. Feature is enabled by default and
7262        * the setting needs to be set to 0 to disable it.
7263        * @hide
7264        */
7265       public static final String WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED =
7266               "wifi_watchdog_poor_network_test_enabled";
7267
7268       /**
7269        * Setting to turn on suspend optimizations at screen off on Wi-Fi. Enabled by default and
7270        * needs to be set to 0 to disable it.
7271        * @hide
7272        */
7273       public static final String WIFI_SUSPEND_OPTIMIZATIONS_ENABLED =
7274               "wifi_suspend_optimizations_enabled";
7275
7276       /**
7277        * Setting to enable verbose logging in Wi-Fi; disabled by default, and setting to 1
7278        * will enable it. In the future, additional values may be supported.
7279        * @hide
7280        */
7281       public static final String WIFI_VERBOSE_LOGGING_ENABLED =
7282               "wifi_verbose_logging_enabled";
7283
7284       /**
7285        * The maximum number of times we will retry a connection to an access
7286        * point for which we have failed in acquiring an IP address from DHCP.
7287        * A value of N means that we will make N+1 connection attempts in all.
7288        */
7289       public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
7290
7291       /**
7292        * Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile
7293        * data connectivity to be established after a disconnect from Wi-Fi.
7294        */
7295       public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
7296           "wifi_mobile_data_transition_wakelock_timeout_ms";
7297
7298       /**
7299        * This setting controls whether WiFi configurations created by a Device Owner app
7300        * should be locked down (that is, be editable or removable only by the Device Owner App,
7301        * not even by Settings app).
7302        * This setting takes integer values. Non-zero values mean DO created configurations
7303        * are locked down. Value of zero means they are not. Default value in the absence of
7304        * actual value to this setting is 0.
7305        */
7306       public static final String WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN =
7307               "wifi_device_owner_configs_lockdown";
7308
7309       /**
7310        * The operational wifi frequency band
7311        * Set to one of {@link WifiManager#WIFI_FREQUENCY_BAND_AUTO},
7312        * {@link WifiManager#WIFI_FREQUENCY_BAND_5GHZ} or
7313        * {@link WifiManager#WIFI_FREQUENCY_BAND_2GHZ}
7314        *
7315        * @hide
7316        */
7317       public static final String WIFI_FREQUENCY_BAND = "wifi_frequency_band";
7318
7319       /**
7320        * The Wi-Fi peer-to-peer device name
7321        * @hide
7322        */
7323       public static final String WIFI_P2P_DEVICE_NAME = "wifi_p2p_device_name";
7324
7325       /**
7326        * The min time between wifi disable and wifi enable
7327        * @hide
7328        */
7329       public static final String WIFI_REENABLE_DELAY_MS = "wifi_reenable_delay";
7330
7331       /**
7332        * Timeout for ephemeral networks when all known BSSIDs go out of range. We will disconnect
7333        * from an ephemeral network if there is no BSSID for that network with a non-null score that
7334        * has been seen in this time period.
7335        *
7336        * If this is less than or equal to zero, we use a more conservative behavior and only check
7337        * for a non-null score from the currently connected or target BSSID.
7338        * @hide
7339        */
7340       public static final String WIFI_EPHEMERAL_OUT_OF_RANGE_TIMEOUT_MS =
7341               "wifi_ephemeral_out_of_range_timeout_ms";
7342
7343       /**
7344        * The number of milliseconds to delay when checking for data stalls during
7345        * non-aggressive detection. (screen is turned off.)
7346        * @hide
7347        */
7348       public static final String DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS =
7349               "data_stall_alarm_non_aggressive_delay_in_ms";
7350
7351       /**
7352        * The number of milliseconds to delay when checking for data stalls during
7353        * aggressive detection. (screen on or suspected data stall)
7354        * @hide
7355        */
7356       public static final String DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS =
7357               "data_stall_alarm_aggressive_delay_in_ms";
7358
7359       /**
7360        * The number of milliseconds to allow the provisioning apn to remain active
7361        * @hide
7362        */
7363       public static final String PROVISIONING_APN_ALARM_DELAY_IN_MS =
7364               "provisioning_apn_alarm_delay_in_ms";
7365
7366       /**
7367        * The interval in milliseconds at which to check gprs registration
7368        * after the first registration mismatch of gprs and voice service,
7369        * to detect possible data network registration problems.
7370        *
7371        * @hide
7372        */
7373       public static final String GPRS_REGISTER_CHECK_PERIOD_MS =
7374               "gprs_register_check_period_ms";
7375
7376       /**
7377        * Nonzero causes Log.wtf() to crash.
7378        * @hide
7379        */
7380       public static final String WTF_IS_FATAL = "wtf_is_fatal";
7381
7382       /**
7383        * Ringer mode. This is used internally, changing this value will not
7384        * change the ringer mode. See AudioManager.
7385        */
7386       public static final String MODE_RINGER = "mode_ringer";
7387
7388       /**
7389        * Overlay display devices setting.
7390        * The associated value is a specially formatted string that describes the
7391        * size and density of simulated secondary display devices.
7392        * <p>
7393        * Format: {width}x{height}/{dpi};...
7394        * </p><p>
7395        * Example:
7396        * <ul>
7397        * <li><code>1280x720/213</code>: make one overlay that is 1280x720 at 213dpi.</li>
7398        * <li><code>1920x1080/320;1280x720/213</code>: make two overlays, the first
7399        * at 1080p and the second at 720p.</li>
7400        * <li>If the value is empty, then no overlay display devices are created.</li>
7401        * </ul></p>
7402        *
7403        * @hide
7404        */
7405       public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices";
7406
7407        /**
7408         * Threshold values for the duration and level of a discharge cycle,
7409         * under which we log discharge cycle info.
7410         *
7411         * @hide
7412         */
7413        public static final String
7414                BATTERY_DISCHARGE_DURATION_THRESHOLD = "battery_discharge_duration_threshold";
7415
7416        /** @hide */
7417        public static final String BATTERY_DISCHARGE_THRESHOLD = "battery_discharge_threshold";
7418
7419        /**
7420         * Flag for allowing ActivityManagerService to send ACTION_APP_ERROR
7421         * intents on application crashes and ANRs. If this is disabled, the
7422         * crash/ANR dialog will never display the "Report" button.
7423         * <p>
7424         * Type: int (0 = disallow, 1 = allow)
7425         *
7426         * @hide
7427         */
7428        public static final String SEND_ACTION_APP_ERROR = "send_action_app_error";
7429
7430        /**
7431         * Maximum age of entries kept by {@link DropBoxManager}.
7432         *
7433         * @hide
7434         */
7435        public static final String DROPBOX_AGE_SECONDS = "dropbox_age_seconds";
7436
7437        /**
7438         * Maximum number of entry files which {@link DropBoxManager} will keep
7439         * around.
7440         *
7441         * @hide
7442         */
7443        public static final String DROPBOX_MAX_FILES = "dropbox_max_files";
7444
7445        /**
7446         * Maximum amount of disk space used by {@link DropBoxManager} no matter
7447         * what.
7448         *
7449         * @hide
7450         */
7451        public static final String DROPBOX_QUOTA_KB = "dropbox_quota_kb";
7452
7453        /**
7454         * Percent of free disk (excluding reserve) which {@link DropBoxManager}
7455         * will use.
7456         *
7457         * @hide
7458         */
7459        public static final String DROPBOX_QUOTA_PERCENT = "dropbox_quota_percent";
7460
7461        /**
7462         * Percent of total disk which {@link DropBoxManager} will never dip
7463         * into.
7464         *
7465         * @hide
7466         */
7467        public static final String DROPBOX_RESERVE_PERCENT = "dropbox_reserve_percent";
7468
7469        /**
7470         * Prefix for per-tag dropbox disable/enable settings.
7471         *
7472         * @hide
7473         */
7474        public static final String DROPBOX_TAG_PREFIX = "dropbox:";
7475
7476        /**
7477         * Lines of logcat to include with system crash/ANR/etc. reports, as a
7478         * prefix of the dropbox tag of the report type. For example,
7479         * "logcat_for_system_server_anr" controls the lines of logcat captured
7480         * with system server ANR reports. 0 to disable.
7481         *
7482         * @hide
7483         */
7484        public static final String ERROR_LOGCAT_PREFIX = "logcat_for_";
7485
7486        /**
7487         * The interval in minutes after which the amount of free storage left
7488         * on the device is logged to the event log
7489         *
7490         * @hide
7491         */
7492        public static final String SYS_FREE_STORAGE_LOG_INTERVAL = "sys_free_storage_log_interval";
7493
7494        /**
7495         * Threshold for the amount of change in disk free space required to
7496         * report the amount of free space. Used to prevent spamming the logs
7497         * when the disk free space isn't changing frequently.
7498         *
7499         * @hide
7500         */
7501        public static final String
7502                DISK_FREE_CHANGE_REPORTING_THRESHOLD = "disk_free_change_reporting_threshold";
7503
7504        /**
7505         * Minimum percentage of free storage on the device that is used to
7506         * determine if the device is running low on storage. The default is 10.
7507         * <p>
7508         * Say this value is set to 10, the device is considered running low on
7509         * storage if 90% or more of the device storage is filled up.
7510         *
7511         * @hide
7512         */
7513        public static final String
7514                SYS_STORAGE_THRESHOLD_PERCENTAGE = "sys_storage_threshold_percentage";
7515
7516        /**
7517         * Maximum byte size of the low storage threshold. This is to ensure
7518         * that {@link #SYS_STORAGE_THRESHOLD_PERCENTAGE} does not result in an
7519         * overly large threshold for large storage devices. Currently this must
7520         * be less than 2GB. This default is 500MB.
7521         *
7522         * @hide
7523         */
7524        public static final String
7525                SYS_STORAGE_THRESHOLD_MAX_BYTES = "sys_storage_threshold_max_bytes";
7526
7527        /**
7528         * Minimum bytes of free storage on the device before the data partition
7529         * is considered full. By default, 1 MB is reserved to avoid system-wide
7530         * SQLite disk full exceptions.
7531         *
7532         * @hide
7533         */
7534        public static final String
7535                SYS_STORAGE_FULL_THRESHOLD_BYTES = "sys_storage_full_threshold_bytes";
7536
7537        /**
7538         * The maximum reconnect delay for short network outages or when the
7539         * network is suspended due to phone use.
7540         *
7541         * @hide
7542         */
7543        public static final String
7544                SYNC_MAX_RETRY_DELAY_IN_SECONDS = "sync_max_retry_delay_in_seconds";
7545
7546        /**
7547         * The number of milliseconds to delay before sending out
7548         * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcasts. Ignored.
7549         *
7550         * @hide
7551         */
7552        public static final String CONNECTIVITY_CHANGE_DELAY = "connectivity_change_delay";
7553
7554
7555        /**
7556         * Network sampling interval, in seconds. We'll generate link information
7557         * about bytes/packets sent and error rates based on data sampled in this interval
7558         *
7559         * @hide
7560         */
7561
7562        public static final String CONNECTIVITY_SAMPLING_INTERVAL_IN_SECONDS =
7563                "connectivity_sampling_interval_in_seconds";
7564
7565        /**
7566         * The series of successively longer delays used in retrying to download PAC file.
7567         * Last delay is used between successful PAC downloads.
7568         *
7569         * @hide
7570         */
7571        public static final String PAC_CHANGE_DELAY = "pac_change_delay";
7572
7573        /**
7574         * Setting to turn off captive portal detection. Feature is enabled by
7575         * default and the setting needs to be set to 0 to disable it.
7576         *
7577         * @hide
7578         */
7579        public static final String
7580                CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled";
7581
7582        /**
7583         * The server used for captive portal detection upon a new conection. A
7584         * 204 response code from the server is used for validation.
7585         *
7586         * @hide
7587         */
7588        public static final String CAPTIVE_PORTAL_SERVER = "captive_portal_server";
7589
7590        /**
7591         * Whether network service discovery is enabled.
7592         *
7593         * @hide
7594         */
7595        public static final String NSD_ON = "nsd_on";
7596
7597        /**
7598         * Let user pick default install location.
7599         *
7600         * @hide
7601         */
7602        public static final String SET_INSTALL_LOCATION = "set_install_location";
7603
7604        /**
7605         * Default install location value.
7606         * 0 = auto, let system decide
7607         * 1 = internal
7608         * 2 = sdcard
7609         * @hide
7610         */
7611        public static final String DEFAULT_INSTALL_LOCATION = "default_install_location";
7612
7613        /**
7614         * ms during which to consume extra events related to Inet connection
7615         * condition after a transtion to fully-connected
7616         *
7617         * @hide
7618         */
7619        public static final String
7620                INET_CONDITION_DEBOUNCE_UP_DELAY = "inet_condition_debounce_up_delay";
7621
7622        /**
7623         * ms during which to consume extra events related to Inet connection
7624         * condtion after a transtion to partly-connected
7625         *
7626         * @hide
7627         */
7628        public static final String
7629                INET_CONDITION_DEBOUNCE_DOWN_DELAY = "inet_condition_debounce_down_delay";
7630
7631        /** {@hide} */
7632        public static final String
7633                READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT = "read_external_storage_enforced_default";
7634
7635        /**
7636         * Host name and port for global http proxy. Uses ':' seperator for
7637         * between host and port.
7638         */
7639        public static final String HTTP_PROXY = "http_proxy";
7640
7641        /**
7642         * Host name for global http proxy. Set via ConnectivityManager.
7643         *
7644         * @hide
7645         */
7646        public static final String GLOBAL_HTTP_PROXY_HOST = "global_http_proxy_host";
7647
7648        /**
7649         * Integer host port for global http proxy. Set via ConnectivityManager.
7650         *
7651         * @hide
7652         */
7653        public static final String GLOBAL_HTTP_PROXY_PORT = "global_http_proxy_port";
7654
7655        /**
7656         * Exclusion list for global proxy. This string contains a list of
7657         * comma-separated domains where the global proxy does not apply.
7658         * Domains should be listed in a comma- separated list. Example of
7659         * acceptable formats: ".domain1.com,my.domain2.com" Use
7660         * ConnectivityManager to set/get.
7661         *
7662         * @hide
7663         */
7664        public static final String
7665                GLOBAL_HTTP_PROXY_EXCLUSION_LIST = "global_http_proxy_exclusion_list";
7666
7667        /**
7668         * The location PAC File for the proxy.
7669         * @hide
7670         */
7671        public static final String
7672                GLOBAL_HTTP_PROXY_PAC = "global_proxy_pac_url";
7673
7674        /**
7675         * Enables the UI setting to allow the user to specify the global HTTP
7676         * proxy and associated exclusion list.
7677         *
7678         * @hide
7679         */
7680        public static final String SET_GLOBAL_HTTP_PROXY = "set_global_http_proxy";
7681
7682        /**
7683         * Setting for default DNS in case nobody suggests one
7684         *
7685         * @hide
7686         */
7687        public static final String DEFAULT_DNS_SERVER = "default_dns_server";
7688
7689        /** {@hide} */
7690        public static final String
7691                BLUETOOTH_HEADSET_PRIORITY_PREFIX = "bluetooth_headset_priority_";
7692        /** {@hide} */
7693        public static final String
7694                BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX = "bluetooth_a2dp_sink_priority_";
7695        /** {@hide} */
7696        public static final String
7697                BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX = "bluetooth_a2dp_src_priority_";
7698        /** {@hide} */
7699        public static final String
7700                BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX = "bluetooth_input_device_priority_";
7701        /** {@hide} */
7702        public static final String
7703                BLUETOOTH_MAP_PRIORITY_PREFIX = "bluetooth_map_priority_";
7704        /** {@hide} */
7705        public static final String
7706                BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX = "bluetooth_pbap_client_priority_";
7707        /** {@hide} */
7708        public static final String
7709                BLUETOOTH_SAP_PRIORITY_PREFIX = "bluetooth_sap_priority_";
7710
7711        /**
7712         * Device Idle (Doze) specific settings.
7713         * This is encoded as a key=value list, separated by commas. Ex:
7714         *
7715         * "inactive_timeout=60000,sensing_timeout=400000"
7716         *
7717         * The following keys are supported:
7718         *
7719         * <pre>
7720         * inactive_to                      (long)
7721         * sensing_to                       (long)
7722         * motion_inactive_to               (long)
7723         * idle_after_inactive_to           (long)
7724         * idle_pending_to                  (long)
7725         * max_idle_pending_to              (long)
7726         * idle_pending_factor              (float)
7727         * idle_to                          (long)
7728         * max_idle_to                      (long)
7729         * idle_factor                      (float)
7730         * min_time_to_alarm                (long)
7731         * max_temp_app_whitelist_duration  (long)
7732         * </pre>
7733         *
7734         * <p>
7735         * Type: string
7736         * @hide
7737         * @see com.android.server.DeviceIdleController.Constants
7738         */
7739        public static final String DEVICE_IDLE_CONSTANTS = "device_idle_constants";
7740
7741        /**
7742         * Device Idle (Doze) specific settings for watches. See {@code #DEVICE_IDLE_CONSTANTS}
7743         *
7744         * <p>
7745         * Type: string
7746         * @hide
7747         * @see com.android.server.DeviceIdleController.Constants
7748         */
7749        public static final String DEVICE_IDLE_CONSTANTS_WATCH = "device_idle_constants_watch";
7750
7751        /**
7752         * App standby (app idle) specific settings.
7753         * This is encoded as a key=value list, separated by commas. Ex:
7754         *
7755         * "idle_duration=5000,parole_interval=4500"
7756         *
7757         * The following keys are supported:
7758         *
7759         * <pre>
7760         * idle_duration2       (long)
7761         * wallclock_threshold  (long)
7762         * parole_interval      (long)
7763         * parole_duration      (long)
7764         *
7765         * idle_duration        (long) // This is deprecated and used to circumvent b/26355386.
7766         * </pre>
7767         *
7768         * <p>
7769         * Type: string
7770         * @hide
7771         * @see com.android.server.usage.UsageStatsService.SettingsObserver
7772         */
7773        public static final String APP_IDLE_CONSTANTS = "app_idle_constants";
7774
7775        /**
7776         * Alarm manager specific settings.
7777         * This is encoded as a key=value list, separated by commas. Ex:
7778         *
7779         * "min_futurity=5000,allow_while_idle_short_time=4500"
7780         *
7781         * The following keys are supported:
7782         *
7783         * <pre>
7784         * min_futurity                         (long)
7785         * min_interval                         (long)
7786         * allow_while_idle_short_time          (long)
7787         * allow_while_idle_long_time           (long)
7788         * allow_while_idle_whitelist_duration  (long)
7789         * </pre>
7790         *
7791         * <p>
7792         * Type: string
7793         * @hide
7794         * @see com.android.server.AlarmManagerService.Constants
7795         */
7796        public static final String ALARM_MANAGER_CONSTANTS = "alarm_manager_constants";
7797
7798        /**
7799         * ShortcutManager specific settings.
7800         * This is encoded as a key=value list, separated by commas. Ex:
7801         *
7802         * "reset_interval_sec=86400,max_daily_updates=5"
7803         *
7804         * The following keys are supported:
7805         *
7806         * <pre>
7807         * reset_interval_sec              (long)
7808         * max_daily_updates               (int)
7809         * max_icon_dimension_dp           (int, DP)
7810         * max_icon_dimension_dp_lowram    (int, DP)
7811         * max_shortcuts                   (int)
7812         * icon_quality                    (int, 0-100)
7813         * icon_format                     (String)
7814         * </pre>
7815         *
7816         * <p>
7817         * Type: string
7818         * @hide
7819         * @see com.android.server.pm.ShortcutService.ConfigConstants
7820         */
7821        public static final String SHORTCUT_MANAGER_CONSTANTS = "shortcut_manager_constants";
7822
7823        /**
7824         * Get the key that retrieves a bluetooth headset's priority.
7825         * @hide
7826         */
7827        public static final String getBluetoothHeadsetPriorityKey(String address) {
7828            return BLUETOOTH_HEADSET_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7829        }
7830
7831        /**
7832         * Get the key that retrieves a bluetooth a2dp sink's priority.
7833         * @hide
7834         */
7835        public static final String getBluetoothA2dpSinkPriorityKey(String address) {
7836            return BLUETOOTH_A2DP_SINK_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7837        }
7838
7839        /**
7840         * Get the key that retrieves a bluetooth a2dp src's priority.
7841         * @hide
7842         */
7843        public static final String getBluetoothA2dpSrcPriorityKey(String address) {
7844            return BLUETOOTH_A2DP_SRC_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7845        }
7846
7847        /**
7848         * Get the key that retrieves a bluetooth Input Device's priority.
7849         * @hide
7850         */
7851        public static final String getBluetoothInputDevicePriorityKey(String address) {
7852            return BLUETOOTH_INPUT_DEVICE_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7853        }
7854
7855        /**
7856         * Get the key that retrieves a bluetooth map priority.
7857         * @hide
7858         */
7859        public static final String getBluetoothMapPriorityKey(String address) {
7860            return BLUETOOTH_MAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7861        }
7862
7863        /**
7864         * Get the key that retrieves a bluetooth pbap client priority.
7865         * @hide
7866         */
7867        public static final String getBluetoothPbapClientPriorityKey(String address) {
7868            return BLUETOOTH_PBAP_CLIENT_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7869        }
7870
7871        /**
7872         * Get the key that retrieves a bluetooth map priority.
7873         * @hide
7874         */
7875        public static final String getBluetoothSapPriorityKey(String address) {
7876            return BLUETOOTH_SAP_PRIORITY_PREFIX + address.toUpperCase(Locale.ROOT);
7877        }
7878
7879        /**
7880         * Scaling factor for normal window animations. Setting to 0 will
7881         * disable window animations.
7882         */
7883        public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
7884
7885        /**
7886         * Scaling factor for activity transition animations. Setting to 0 will
7887         * disable window animations.
7888         */
7889        public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
7890
7891        /**
7892         * Scaling factor for Animator-based animations. This affects both the
7893         * start delay and duration of all such animations. Setting to 0 will
7894         * cause animations to end immediately. The default value is 1.
7895         */
7896        public static final String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
7897
7898        /**
7899         * Scaling factor for normal window animations. Setting to 0 will
7900         * disable window animations.
7901         *
7902         * @hide
7903         */
7904        public static final String FANCY_IME_ANIMATIONS = "fancy_ime_animations";
7905
7906        /**
7907         * If 0, the compatibility mode is off for all applications.
7908         * If 1, older applications run under compatibility mode.
7909         * TODO: remove this settings before code freeze (bug/1907571)
7910         * @hide
7911         */
7912        public static final String COMPATIBILITY_MODE = "compatibility_mode";
7913
7914        /**
7915         * CDMA only settings
7916         * Emergency Tone  0 = Off
7917         *                 1 = Alert
7918         *                 2 = Vibrate
7919         * @hide
7920         */
7921        public static final String EMERGENCY_TONE = "emergency_tone";
7922
7923        /**
7924         * CDMA only settings
7925         * Whether the auto retry is enabled. The value is
7926         * boolean (1 or 0).
7927         * @hide
7928         */
7929        public static final String CALL_AUTO_RETRY = "call_auto_retry";
7930
7931        /**
7932         * See RIL_PreferredNetworkType in ril.h
7933         * @hide
7934         */
7935        public static final String PREFERRED_NETWORK_MODE =
7936                "preferred_network_mode";
7937
7938        /**
7939         * Name of an application package to be debugged.
7940         */
7941        public static final String DEBUG_APP = "debug_app";
7942
7943        /**
7944         * If 1, when launching DEBUG_APP it will wait for the debugger before
7945         * starting user code.  If 0, it will run normally.
7946         */
7947        public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
7948
7949        /**
7950         * Control whether the process CPU usage meter should be shown.
7951         */
7952        public static final String SHOW_PROCESSES = "show_processes";
7953
7954        /**
7955         * If 1 low power mode is enabled.
7956         * @hide
7957         */
7958        public static final String LOW_POWER_MODE = "low_power";
7959
7960        /**
7961         * Battery level [1-99] at which low power mode automatically turns on.
7962         * If 0, it will not automatically turn on.
7963         * @hide
7964         */
7965        public static final String LOW_POWER_MODE_TRIGGER_LEVEL = "low_power_trigger_level";
7966
7967         /**
7968         * If not 0, the activity manager will aggressively finish activities and
7969         * processes as soon as they are no longer needed.  If 0, the normal
7970         * extended lifetime is used.
7971         */
7972        public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
7973
7974        /**
7975         * @hide
7976         * If not 0, the activity manager will implement a looser version of background
7977         * check that is more compatible with existing apps.
7978         */
7979        public static final String LENIENT_BACKGROUND_CHECK = "lenient_background_check";
7980
7981        /**
7982         * Use Dock audio output for media:
7983         *      0 = disabled
7984         *      1 = enabled
7985         * @hide
7986         */
7987        public static final String DOCK_AUDIO_MEDIA_ENABLED = "dock_audio_media_enabled";
7988
7989        /**
7990         * The surround sound formats AC3, DTS or IEC61937 are
7991         * available for use if they are detected.
7992         * This is the default mode.
7993         *
7994         * Note that AUTO is equivalent to ALWAYS for Android TVs and other
7995         * devices that have an S/PDIF output. This is because S/PDIF
7996         * is unidirectional and the TV cannot know if a decoder is
7997         * connected. So it assumes they are always available.
7998         * @hide
7999         */
8000         public static final int ENCODED_SURROUND_OUTPUT_AUTO = 0;
8001
8002        /**
8003         * AC3, DTS or IEC61937 are NEVER available, even if they
8004         * are detected by the hardware. Those formats will not be
8005         * reported.
8006         *
8007         * An example use case would be an AVR reports that it is capable of
8008         * surround sound decoding but is broken. If NEVER is chosen
8009         * then apps must use PCM output instead of encoded output.
8010         * @hide
8011         */
8012         public static final int ENCODED_SURROUND_OUTPUT_NEVER = 1;
8013
8014        /**
8015         * AC3, DTS or IEC61937 are ALWAYS available, even if they
8016         * are not detected by the hardware. Those formats will be
8017         * reported as part of the HDMI output capability. Applications
8018         * are then free to use either PCM or encoded output.
8019         *
8020         * An example use case would be a when TV was connected over
8021         * TOS-link to an AVR. But the TV could not see it because TOS-link
8022         * is unidirectional.
8023         * @hide
8024         */
8025         public static final int ENCODED_SURROUND_OUTPUT_ALWAYS = 2;
8026
8027        /**
8028         * Set to ENCODED_SURROUND_OUTPUT_AUTO,
8029         * ENCODED_SURROUND_OUTPUT_NEVER or
8030         * ENCODED_SURROUND_OUTPUT_ALWAYS
8031         * @hide
8032         */
8033        public static final String ENCODED_SURROUND_OUTPUT = "encoded_surround_output";
8034
8035        /**
8036         * Persisted safe headphone volume management state by AudioService
8037         * @hide
8038         */
8039        public static final String AUDIO_SAFE_VOLUME_STATE = "audio_safe_volume_state";
8040
8041        /**
8042         * URL for tzinfo (time zone) updates
8043         * @hide
8044         */
8045        public static final String TZINFO_UPDATE_CONTENT_URL = "tzinfo_content_url";
8046
8047        /**
8048         * URL for tzinfo (time zone) update metadata
8049         * @hide
8050         */
8051        public static final String TZINFO_UPDATE_METADATA_URL = "tzinfo_metadata_url";
8052
8053        /**
8054         * URL for selinux (mandatory access control) updates
8055         * @hide
8056         */
8057        public static final String SELINUX_UPDATE_CONTENT_URL = "selinux_content_url";
8058
8059        /**
8060         * URL for selinux (mandatory access control) update metadata
8061         * @hide
8062         */
8063        public static final String SELINUX_UPDATE_METADATA_URL = "selinux_metadata_url";
8064
8065        /**
8066         * URL for sms short code updates
8067         * @hide
8068         */
8069        public static final String SMS_SHORT_CODES_UPDATE_CONTENT_URL =
8070                "sms_short_codes_content_url";
8071
8072        /**
8073         * URL for sms short code update metadata
8074         * @hide
8075         */
8076        public static final String SMS_SHORT_CODES_UPDATE_METADATA_URL =
8077                "sms_short_codes_metadata_url";
8078
8079        /**
8080         * URL for apn_db updates
8081         * @hide
8082         */
8083        public static final String APN_DB_UPDATE_CONTENT_URL = "apn_db_content_url";
8084
8085        /**
8086         * URL for apn_db update metadata
8087         * @hide
8088         */
8089        public static final String APN_DB_UPDATE_METADATA_URL = "apn_db_metadata_url";
8090
8091        /**
8092         * URL for cert pinlist updates
8093         * @hide
8094         */
8095        public static final String CERT_PIN_UPDATE_CONTENT_URL = "cert_pin_content_url";
8096
8097        /**
8098         * URL for cert pinlist updates
8099         * @hide
8100         */
8101        public static final String CERT_PIN_UPDATE_METADATA_URL = "cert_pin_metadata_url";
8102
8103        /**
8104         * URL for intent firewall updates
8105         * @hide
8106         */
8107        public static final String INTENT_FIREWALL_UPDATE_CONTENT_URL =
8108                "intent_firewall_content_url";
8109
8110        /**
8111         * URL for intent firewall update metadata
8112         * @hide
8113         */
8114        public static final String INTENT_FIREWALL_UPDATE_METADATA_URL =
8115                "intent_firewall_metadata_url";
8116
8117        /**
8118         * SELinux enforcement status. If 0, permissive; if 1, enforcing.
8119         * @hide
8120         */
8121        public static final String SELINUX_STATUS = "selinux_status";
8122
8123        /**
8124         * Developer setting to force RTL layout.
8125         * @hide
8126         */
8127        public static final String DEVELOPMENT_FORCE_RTL = "debug.force_rtl";
8128
8129        /**
8130         * Milliseconds after screen-off after which low battery sounds will be silenced.
8131         *
8132         * If zero, battery sounds will always play.
8133         * Defaults to @integer/def_low_battery_sound_timeout in SettingsProvider.
8134         *
8135         * @hide
8136         */
8137        public static final String LOW_BATTERY_SOUND_TIMEOUT = "low_battery_sound_timeout";
8138
8139        /**
8140         * Milliseconds to wait before bouncing Wi-Fi after settings is restored. Note that after
8141         * the caller is done with this, they should call {@link ContentResolver#delete} to
8142         * clean up any value that they may have written.
8143         *
8144         * @hide
8145         */
8146        public static final String WIFI_BOUNCE_DELAY_OVERRIDE_MS = "wifi_bounce_delay_override_ms";
8147
8148        /**
8149         * Defines global runtime overrides to window policy.
8150         *
8151         * See {@link com.android.server.policy.PolicyControl} for value format.
8152         *
8153         * @hide
8154         */
8155        public static final String POLICY_CONTROL = "policy_control";
8156
8157        /**
8158         * Defines global zen mode.  ZEN_MODE_OFF, ZEN_MODE_IMPORTANT_INTERRUPTIONS,
8159         * or ZEN_MODE_NO_INTERRUPTIONS.
8160         *
8161         * @hide
8162         */
8163        public static final String ZEN_MODE = "zen_mode";
8164
8165        /** @hide */ public static final int ZEN_MODE_OFF = 0;
8166        /** @hide */ public static final int ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
8167        /** @hide */ public static final int ZEN_MODE_NO_INTERRUPTIONS = 2;
8168        /** @hide */ public static final int ZEN_MODE_ALARMS = 3;
8169
8170        /** @hide */ public static String zenModeToString(int mode) {
8171            if (mode == ZEN_MODE_IMPORTANT_INTERRUPTIONS) return "ZEN_MODE_IMPORTANT_INTERRUPTIONS";
8172            if (mode == ZEN_MODE_ALARMS) return "ZEN_MODE_ALARMS";
8173            if (mode == ZEN_MODE_NO_INTERRUPTIONS) return "ZEN_MODE_NO_INTERRUPTIONS";
8174            return "ZEN_MODE_OFF";
8175        }
8176
8177        /** @hide */ public static boolean isValidZenMode(int value) {
8178            switch (value) {
8179                case Global.ZEN_MODE_OFF:
8180                case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
8181                case Global.ZEN_MODE_ALARMS:
8182                case Global.ZEN_MODE_NO_INTERRUPTIONS:
8183                    return true;
8184                default:
8185                    return false;
8186            }
8187        }
8188
8189        /**
8190         * Value of the ringer before entering zen mode.
8191         *
8192         * @hide
8193         */
8194        public static final String ZEN_MODE_RINGER_LEVEL = "zen_mode_ringer_level";
8195
8196        /**
8197         * Opaque value, changes when persisted zen mode configuration changes.
8198         *
8199         * @hide
8200         */
8201        public static final String ZEN_MODE_CONFIG_ETAG = "zen_mode_config_etag";
8202
8203        /**
8204         * Defines global heads up toggle.  One of HEADS_UP_OFF, HEADS_UP_ON.
8205         *
8206         * @hide
8207         */
8208        public static final String HEADS_UP_NOTIFICATIONS_ENABLED =
8209                "heads_up_notifications_enabled";
8210
8211        /** @hide */ public static final int HEADS_UP_OFF = 0;
8212        /** @hide */ public static final int HEADS_UP_ON = 1;
8213
8214        /**
8215         * The name of the device
8216         *
8217         * @hide
8218         */
8219        public static final String DEVICE_NAME = "device_name";
8220
8221        /**
8222         * Whether the NetworkScoringService has been first initialized.
8223         * <p>
8224         * Type: int (0 for false, 1 for true)
8225         * @hide
8226         */
8227        public static final String NETWORK_SCORING_PROVISIONED = "network_scoring_provisioned";
8228
8229        /**
8230         * Whether the user wants to be prompted for password to decrypt the device on boot.
8231         * This only matters if the storage is encrypted.
8232         * <p>
8233         * Type: int (0 for false, 1 for true)
8234         * @hide
8235         */
8236        public static final String REQUIRE_PASSWORD_TO_DECRYPT = "require_password_to_decrypt";
8237
8238        /**
8239         * Whether the Volte is enabled
8240         * <p>
8241         * Type: int (0 for false, 1 for true)
8242         * @hide
8243         */
8244        public static final String ENHANCED_4G_MODE_ENABLED = "volte_vt_enabled";
8245
8246        /**
8247         * Whether VT (Video Telephony over IMS) is enabled
8248         * <p>
8249         * Type: int (0 for false, 1 for true)
8250         *
8251         * @hide
8252         */
8253        public static final String VT_IMS_ENABLED = "vt_ims_enabled";
8254
8255        /**
8256         * Whether WFC is enabled
8257         * <p>
8258         * Type: int (0 for false, 1 for true)
8259         *
8260         * @hide
8261         */
8262        public static final String WFC_IMS_ENABLED = "wfc_ims_enabled";
8263
8264        /**
8265         * WFC Mode.
8266         * <p>
8267         * Type: int - 2=Wi-Fi preferred, 1=Cellular preferred, 0=Wi-Fi only
8268         *
8269         * @hide
8270         */
8271        public static final String WFC_IMS_MODE = "wfc_ims_mode";
8272
8273        /**
8274         * Whether WFC roaming is enabled
8275         * <p>
8276         * Type: int (0 for false, 1 for true)
8277         *
8278         * @hide
8279         */
8280        public static final String WFC_IMS_ROAMING_ENABLED = "wfc_ims_roaming_enabled";
8281
8282        /**
8283         * Whether user can enable/disable LTE as a preferred network. A carrier might control
8284         * this via gservices, OMA-DM, carrier app, etc.
8285         * <p>
8286         * Type: int (0 for false, 1 for true)
8287         * @hide
8288         */
8289        public static final String LTE_SERVICE_FORCED = "lte_service_forced";
8290
8291        /**
8292         * Ephemeral app cookie max size in bytes.
8293         * <p>
8294         * Type: int
8295         * @hide
8296         */
8297        public static final String EPHEMERAL_COOKIE_MAX_SIZE_BYTES =
8298                "ephemeral_cookie_max_size_bytes";
8299
8300        /**
8301         * The duration for caching uninstalled ephemeral apps.
8302         * <p>
8303         * Type: long
8304         * @hide
8305         */
8306        public static final String UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS =
8307                "uninstalled_ephemeral_app_cache_duration_millis";
8308
8309        /**
8310         * Allows switching users when system user is locked.
8311         * <p>
8312         * Type: int
8313         * @hide
8314         */
8315        public static final String ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED =
8316                "allow_user_switching_when_system_user_locked";
8317
8318        /**
8319         * Boot count since the device starts running APK level 24.
8320         * <p>
8321         * Type: int
8322         */
8323        public static final String BOOT_COUNT = "boot_count";
8324
8325        /**
8326         * Whether the safe boot is disallowed.
8327         *
8328         * <p>This setting should have the identical value as the corresponding user restriction.
8329         * The purpose of the setting is to make the restriction available in early boot stages
8330         * before the user restrictions are loaded.
8331         * @hide
8332         */
8333        public static final String SAFE_BOOT_DISALLOWED = "safe_boot_disallowed";
8334
8335        /**
8336         * Settings to backup. This is here so that it's in the same place as the settings
8337         * keys and easy to update.
8338         *
8339         * These keys may be mentioned in the SETTINGS_TO_BACKUP arrays in System
8340         * and Secure as well.  This is because those tables drive both backup and
8341         * restore, and restore needs to properly whitelist keys that used to live
8342         * in those namespaces.  The keys will only actually be backed up / restored
8343         * if they are also mentioned in this table (Global.SETTINGS_TO_BACKUP).
8344         *
8345         * NOTE: Settings are backed up and restored in the order they appear
8346         *       in this array. If you have one setting depending on another,
8347         *       make sure that they are ordered appropriately.
8348         *
8349         * @hide
8350         */
8351        public static final String[] SETTINGS_TO_BACKUP = {
8352            BUGREPORT_IN_POWER_MENU,
8353            STAY_ON_WHILE_PLUGGED_IN,
8354            AUTO_TIME,
8355            AUTO_TIME_ZONE,
8356            POWER_SOUNDS_ENABLED,
8357            DOCK_SOUNDS_ENABLED,
8358            CHARGING_SOUNDS_ENABLED,
8359            USB_MASS_STORAGE_ENABLED,
8360            ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
8361            WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
8362            WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
8363            WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED,
8364            WIFI_NUM_OPEN_NETWORKS_KEPT,
8365            EMERGENCY_TONE,
8366            CALL_AUTO_RETRY,
8367            DOCK_AUDIO_MEDIA_ENABLED,
8368            ENCODED_SURROUND_OUTPUT,
8369            LOW_POWER_MODE_TRIGGER_LEVEL
8370        };
8371
8372        // Populated lazily, guarded by class object:
8373        private static NameValueCache sNameValueCache = new NameValueCache(
8374                    SYS_PROP_SETTING_VERSION,
8375                    CONTENT_URI,
8376                    CALL_METHOD_GET_GLOBAL,
8377                    CALL_METHOD_PUT_GLOBAL);
8378
8379        // Certain settings have been moved from global to the per-user secure namespace
8380        private static final HashSet<String> MOVED_TO_SECURE;
8381        static {
8382            MOVED_TO_SECURE = new HashSet<String>(1);
8383            MOVED_TO_SECURE.add(Settings.Global.INSTALL_NON_MARKET_APPS);
8384        }
8385
8386        /** @hide */
8387        public static void getMovedToSecureSettings(Set<String> outKeySet) {
8388            outKeySet.addAll(MOVED_TO_SECURE);
8389        }
8390
8391        /**
8392         * Look up a name in the database.
8393         * @param resolver to access the database with
8394         * @param name to look up in the table
8395         * @return the corresponding value, or null if not present
8396         */
8397        public static String getString(ContentResolver resolver, String name) {
8398            return getStringForUser(resolver, name, UserHandle.myUserId());
8399        }
8400
8401        /** @hide */
8402        public static String getStringForUser(ContentResolver resolver, String name,
8403                int userHandle) {
8404            if (MOVED_TO_SECURE.contains(name)) {
8405                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
8406                        + " to android.provider.Settings.Secure, returning read-only value.");
8407                return Secure.getStringForUser(resolver, name, userHandle);
8408            }
8409            return sNameValueCache.getStringForUser(resolver, name, userHandle);
8410        }
8411
8412        /**
8413         * Store a name/value pair into the database.
8414         * @param resolver to access the database with
8415         * @param name to store
8416         * @param value to associate with the name
8417         * @return true if the value was set, false on database errors
8418         */
8419        public static boolean putString(ContentResolver resolver,
8420                String name, String value) {
8421            return putStringForUser(resolver, name, value, UserHandle.myUserId());
8422        }
8423
8424        /** @hide */
8425        public static boolean putStringForUser(ContentResolver resolver,
8426                String name, String value, int userHandle) {
8427            if (LOCAL_LOGV) {
8428                Log.v(TAG, "Global.putString(name=" + name + ", value=" + value
8429                        + " for " + userHandle);
8430            }
8431            // Global and Secure have the same access policy so we can forward writes
8432            if (MOVED_TO_SECURE.contains(name)) {
8433                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Global"
8434                        + " to android.provider.Settings.Secure, value is unchanged.");
8435                return Secure.putStringForUser(resolver, name, value, userHandle);
8436            }
8437            return sNameValueCache.putStringForUser(resolver, name, value, userHandle);
8438        }
8439
8440        /**
8441         * Construct the content URI for a particular name/value pair,
8442         * useful for monitoring changes with a ContentObserver.
8443         * @param name to look up in the table
8444         * @return the corresponding content URI, or null if not present
8445         */
8446        public static Uri getUriFor(String name) {
8447            return getUriFor(CONTENT_URI, name);
8448        }
8449
8450        /**
8451         * Convenience function for retrieving a single secure settings value
8452         * as an integer.  Note that internally setting values are always
8453         * stored as strings; this function converts the string to an integer
8454         * for you.  The default value will be returned if the setting is
8455         * not defined or not an integer.
8456         *
8457         * @param cr The ContentResolver to access.
8458         * @param name The name of the setting to retrieve.
8459         * @param def Value to return if the setting is not defined.
8460         *
8461         * @return The setting's current value, or 'def' if it is not defined
8462         * or not a valid integer.
8463         */
8464        public static int getInt(ContentResolver cr, String name, int def) {
8465            String v = getString(cr, name);
8466            try {
8467                return v != null ? Integer.parseInt(v) : def;
8468            } catch (NumberFormatException e) {
8469                return def;
8470            }
8471        }
8472
8473        /**
8474         * Convenience function for retrieving a single secure settings value
8475         * as an integer.  Note that internally setting values are always
8476         * stored as strings; this function converts the string to an integer
8477         * for you.
8478         * <p>
8479         * This version does not take a default value.  If the setting has not
8480         * been set, or the string value is not a number,
8481         * it throws {@link SettingNotFoundException}.
8482         *
8483         * @param cr The ContentResolver to access.
8484         * @param name The name of the setting to retrieve.
8485         *
8486         * @throws SettingNotFoundException Thrown if a setting by the given
8487         * name can't be found or the setting value is not an integer.
8488         *
8489         * @return The setting's current value.
8490         */
8491        public static int getInt(ContentResolver cr, String name)
8492                throws SettingNotFoundException {
8493            String v = getString(cr, name);
8494            try {
8495                return Integer.parseInt(v);
8496            } catch (NumberFormatException e) {
8497                throw new SettingNotFoundException(name);
8498            }
8499        }
8500
8501        /**
8502         * Convenience function for updating a single settings value as an
8503         * integer. This will either create a new entry in the table if the
8504         * given name does not exist, or modify the value of the existing row
8505         * with that name.  Note that internally setting values are always
8506         * stored as strings, so this function converts the given value to a
8507         * string before storing it.
8508         *
8509         * @param cr The ContentResolver to access.
8510         * @param name The name of the setting to modify.
8511         * @param value The new value for the setting.
8512         * @return true if the value was set, false on database errors
8513         */
8514        public static boolean putInt(ContentResolver cr, String name, int value) {
8515            return putString(cr, name, Integer.toString(value));
8516        }
8517
8518        /**
8519         * Convenience function for retrieving a single secure settings value
8520         * as a {@code long}.  Note that internally setting values are always
8521         * stored as strings; this function converts the string to a {@code long}
8522         * for you.  The default value will be returned if the setting is
8523         * not defined or not a {@code long}.
8524         *
8525         * @param cr The ContentResolver to access.
8526         * @param name The name of the setting to retrieve.
8527         * @param def Value to return if the setting is not defined.
8528         *
8529         * @return The setting's current value, or 'def' if it is not defined
8530         * or not a valid {@code long}.
8531         */
8532        public static long getLong(ContentResolver cr, String name, long def) {
8533            String valString = getString(cr, name);
8534            long value;
8535            try {
8536                value = valString != null ? Long.parseLong(valString) : def;
8537            } catch (NumberFormatException e) {
8538                value = def;
8539            }
8540            return value;
8541        }
8542
8543        /**
8544         * Convenience function for retrieving a single secure settings value
8545         * as a {@code long}.  Note that internally setting values are always
8546         * stored as strings; this function converts the string to a {@code long}
8547         * for you.
8548         * <p>
8549         * This version does not take a default value.  If the setting has not
8550         * been set, or the string value is not a number,
8551         * it throws {@link SettingNotFoundException}.
8552         *
8553         * @param cr The ContentResolver to access.
8554         * @param name The name of the setting to retrieve.
8555         *
8556         * @return The setting's current value.
8557         * @throws SettingNotFoundException Thrown if a setting by the given
8558         * name can't be found or the setting value is not an integer.
8559         */
8560        public static long getLong(ContentResolver cr, String name)
8561                throws SettingNotFoundException {
8562            String valString = getString(cr, name);
8563            try {
8564                return Long.parseLong(valString);
8565            } catch (NumberFormatException e) {
8566                throw new SettingNotFoundException(name);
8567            }
8568        }
8569
8570        /**
8571         * Convenience function for updating a secure settings value as a long
8572         * integer. This will either create a new entry in the table if the
8573         * given name does not exist, or modify the value of the existing row
8574         * with that name.  Note that internally setting values are always
8575         * stored as strings, so this function converts the given value to a
8576         * string before storing it.
8577         *
8578         * @param cr The ContentResolver to access.
8579         * @param name The name of the setting to modify.
8580         * @param value The new value for the setting.
8581         * @return true if the value was set, false on database errors
8582         */
8583        public static boolean putLong(ContentResolver cr, String name, long value) {
8584            return putString(cr, name, Long.toString(value));
8585        }
8586
8587        /**
8588         * Convenience function for retrieving a single secure settings value
8589         * as a floating point number.  Note that internally setting values are
8590         * always stored as strings; this function converts the string to an
8591         * float for you. The default value will be returned if the setting
8592         * is not defined or not a valid float.
8593         *
8594         * @param cr The ContentResolver to access.
8595         * @param name The name of the setting to retrieve.
8596         * @param def Value to return if the setting is not defined.
8597         *
8598         * @return The setting's current value, or 'def' if it is not defined
8599         * or not a valid float.
8600         */
8601        public static float getFloat(ContentResolver cr, String name, float def) {
8602            String v = getString(cr, name);
8603            try {
8604                return v != null ? Float.parseFloat(v) : def;
8605            } catch (NumberFormatException e) {
8606                return def;
8607            }
8608        }
8609
8610        /**
8611         * Convenience function for retrieving a single secure settings value
8612         * as a float.  Note that internally setting values are always
8613         * stored as strings; this function converts the string to a float
8614         * for you.
8615         * <p>
8616         * This version does not take a default value.  If the setting has not
8617         * been set, or the string value is not a number,
8618         * it throws {@link SettingNotFoundException}.
8619         *
8620         * @param cr The ContentResolver to access.
8621         * @param name The name of the setting to retrieve.
8622         *
8623         * @throws SettingNotFoundException Thrown if a setting by the given
8624         * name can't be found or the setting value is not a float.
8625         *
8626         * @return The setting's current value.
8627         */
8628        public static float getFloat(ContentResolver cr, String name)
8629                throws SettingNotFoundException {
8630            String v = getString(cr, name);
8631            if (v == null) {
8632                throw new SettingNotFoundException(name);
8633            }
8634            try {
8635                return Float.parseFloat(v);
8636            } catch (NumberFormatException e) {
8637                throw new SettingNotFoundException(name);
8638            }
8639        }
8640
8641        /**
8642         * Convenience function for updating a single settings value as a
8643         * floating point number. This will either create a new entry in the
8644         * table if the given name does not exist, or modify the value of the
8645         * existing row with that name.  Note that internally setting values
8646         * are always stored as strings, so this function converts the given
8647         * value to a string before storing it.
8648         *
8649         * @param cr The ContentResolver to access.
8650         * @param name The name of the setting to modify.
8651         * @param value The new value for the setting.
8652         * @return true if the value was set, false on database errors
8653         */
8654        public static boolean putFloat(ContentResolver cr, String name, float value) {
8655            return putString(cr, name, Float.toString(value));
8656        }
8657
8658
8659        /**
8660          * Subscription to be used for voice call on a multi sim device. The supported values
8661          * are 0 = SUB1, 1 = SUB2 and etc.
8662          * @hide
8663          */
8664        public static final String MULTI_SIM_VOICE_CALL_SUBSCRIPTION = "multi_sim_voice_call";
8665
8666        /**
8667          * Used to provide option to user to select subscription during dial.
8668          * The supported values are 0 = disable or 1 = enable prompt.
8669          * @hide
8670          */
8671        public static final String MULTI_SIM_VOICE_PROMPT = "multi_sim_voice_prompt";
8672
8673        /**
8674          * Subscription to be used for data call on a multi sim device. The supported values
8675          * are 0 = SUB1, 1 = SUB2 and etc.
8676          * @hide
8677          */
8678        public static final String MULTI_SIM_DATA_CALL_SUBSCRIPTION = "multi_sim_data_call";
8679
8680        /**
8681          * Subscription to be used for SMS on a multi sim device. The supported values
8682          * are 0 = SUB1, 1 = SUB2 and etc.
8683          * @hide
8684          */
8685        public static final String MULTI_SIM_SMS_SUBSCRIPTION = "multi_sim_sms";
8686
8687       /**
8688          * Used to provide option to user to select subscription during send SMS.
8689          * The value 1 - enable, 0 - disable
8690          * @hide
8691          */
8692        public static final String MULTI_SIM_SMS_PROMPT = "multi_sim_sms_prompt";
8693
8694
8695
8696        /** User preferred subscriptions setting.
8697          * This holds the details of the user selected subscription from the card and
8698          * the activation status. Each settings string have the coma separated values
8699          * iccId,appType,appId,activationStatus,3gppIndex,3gpp2Index
8700          * @hide
8701         */
8702        public static final String[] MULTI_SIM_USER_PREFERRED_SUBS = {"user_preferred_sub1",
8703                "user_preferred_sub2","user_preferred_sub3"};
8704
8705        /**
8706         * Whether to enable new contacts aggregator or not.
8707         * The value 1 - enable, 0 - disable
8708         * @hide
8709         */
8710        public static final String NEW_CONTACT_AGGREGATOR = "new_contact_aggregator";
8711
8712        /**
8713         * Whether to enable contacts metadata syncing or not
8714         * The value 1 - enable, 0 - disable
8715         */
8716        public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
8717
8718        /**
8719         * Whether to enable cellular on boot.
8720         * The value 1 - enable, 0 - disable
8721         * @hide
8722         */
8723        public static final String ENABLE_CELLULAR_ON_BOOT = "enable_cellular_on_boot";
8724    }
8725
8726    /**
8727     * User-defined bookmarks and shortcuts.  The target of each bookmark is an
8728     * Intent URL, allowing it to be either a web page or a particular
8729     * application activity.
8730     *
8731     * @hide
8732     */
8733    public static final class Bookmarks implements BaseColumns
8734    {
8735        private static final String TAG = "Bookmarks";
8736
8737        /**
8738         * The content:// style URL for this table
8739         */
8740        public static final Uri CONTENT_URI =
8741            Uri.parse("content://" + AUTHORITY + "/bookmarks");
8742
8743        /**
8744         * The row ID.
8745         * <p>Type: INTEGER</p>
8746         */
8747        public static final String ID = "_id";
8748
8749        /**
8750         * Descriptive name of the bookmark that can be displayed to the user.
8751         * If this is empty, the title should be resolved at display time (use
8752         * {@link #getTitle(Context, Cursor)} any time you want to display the
8753         * title of a bookmark.)
8754         * <P>
8755         * Type: TEXT
8756         * </P>
8757         */
8758        public static final String TITLE = "title";
8759
8760        /**
8761         * Arbitrary string (displayed to the user) that allows bookmarks to be
8762         * organized into categories.  There are some special names for
8763         * standard folders, which all start with '@'.  The label displayed for
8764         * the folder changes with the locale (via {@link #getLabelForFolder}) but
8765         * the folder name does not change so you can consistently query for
8766         * the folder regardless of the current locale.
8767         *
8768         * <P>Type: TEXT</P>
8769         *
8770         */
8771        public static final String FOLDER = "folder";
8772
8773        /**
8774         * The Intent URL of the bookmark, describing what it points to.  This
8775         * value is given to {@link android.content.Intent#getIntent} to create
8776         * an Intent that can be launched.
8777         * <P>Type: TEXT</P>
8778         */
8779        public static final String INTENT = "intent";
8780
8781        /**
8782         * Optional shortcut character associated with this bookmark.
8783         * <P>Type: INTEGER</P>
8784         */
8785        public static final String SHORTCUT = "shortcut";
8786
8787        /**
8788         * The order in which the bookmark should be displayed
8789         * <P>Type: INTEGER</P>
8790         */
8791        public static final String ORDERING = "ordering";
8792
8793        private static final String[] sIntentProjection = { INTENT };
8794        private static final String[] sShortcutProjection = { ID, SHORTCUT };
8795        private static final String sShortcutSelection = SHORTCUT + "=?";
8796
8797        /**
8798         * Convenience function to retrieve the bookmarked Intent for a
8799         * particular shortcut key.
8800         *
8801         * @param cr The ContentResolver to query.
8802         * @param shortcut The shortcut key.
8803         *
8804         * @return Intent The bookmarked URL, or null if there is no bookmark
8805         *         matching the given shortcut.
8806         */
8807        public static Intent getIntentForShortcut(ContentResolver cr, char shortcut)
8808        {
8809            Intent intent = null;
8810
8811            Cursor c = cr.query(CONTENT_URI,
8812                    sIntentProjection, sShortcutSelection,
8813                    new String[] { String.valueOf((int) shortcut) }, ORDERING);
8814            // Keep trying until we find a valid shortcut
8815            try {
8816                while (intent == null && c.moveToNext()) {
8817                    try {
8818                        String intentURI = c.getString(c.getColumnIndexOrThrow(INTENT));
8819                        intent = Intent.parseUri(intentURI, 0);
8820                    } catch (java.net.URISyntaxException e) {
8821                        // The stored URL is bad...  ignore it.
8822                    } catch (IllegalArgumentException e) {
8823                        // Column not found
8824                        Log.w(TAG, "Intent column not found", e);
8825                    }
8826                }
8827            } finally {
8828                if (c != null) c.close();
8829            }
8830
8831            return intent;
8832        }
8833
8834        /**
8835         * Add a new bookmark to the system.
8836         *
8837         * @param cr The ContentResolver to query.
8838         * @param intent The desired target of the bookmark.
8839         * @param title Bookmark title that is shown to the user; null if none
8840         *            or it should be resolved to the intent's title.
8841         * @param folder Folder in which to place the bookmark; null if none.
8842         * @param shortcut Shortcut that will invoke the bookmark; 0 if none. If
8843         *            this is non-zero and there is an existing bookmark entry
8844         *            with this same shortcut, then that existing shortcut is
8845         *            cleared (the bookmark is not removed).
8846         * @return The unique content URL for the new bookmark entry.
8847         */
8848        public static Uri add(ContentResolver cr,
8849                                           Intent intent,
8850                                           String title,
8851                                           String folder,
8852                                           char shortcut,
8853                                           int ordering)
8854        {
8855            // If a shortcut is supplied, and it is already defined for
8856            // another bookmark, then remove the old definition.
8857            if (shortcut != 0) {
8858                cr.delete(CONTENT_URI, sShortcutSelection,
8859                        new String[] { String.valueOf((int) shortcut) });
8860            }
8861
8862            ContentValues values = new ContentValues();
8863            if (title != null) values.put(TITLE, title);
8864            if (folder != null) values.put(FOLDER, folder);
8865            values.put(INTENT, intent.toUri(0));
8866            if (shortcut != 0) values.put(SHORTCUT, (int) shortcut);
8867            values.put(ORDERING, ordering);
8868            return cr.insert(CONTENT_URI, values);
8869        }
8870
8871        /**
8872         * Return the folder name as it should be displayed to the user.  This
8873         * takes care of localizing special folders.
8874         *
8875         * @param r Resources object for current locale; only need access to
8876         *          system resources.
8877         * @param folder The value found in the {@link #FOLDER} column.
8878         *
8879         * @return CharSequence The label for this folder that should be shown
8880         *         to the user.
8881         */
8882        public static CharSequence getLabelForFolder(Resources r, String folder) {
8883            return folder;
8884        }
8885
8886        /**
8887         * Return the title as it should be displayed to the user. This takes
8888         * care of localizing bookmarks that point to activities.
8889         *
8890         * @param context A context.
8891         * @param cursor A cursor pointing to the row whose title should be
8892         *        returned. The cursor must contain at least the {@link #TITLE}
8893         *        and {@link #INTENT} columns.
8894         * @return A title that is localized and can be displayed to the user,
8895         *         or the empty string if one could not be found.
8896         */
8897        public static CharSequence getTitle(Context context, Cursor cursor) {
8898            int titleColumn = cursor.getColumnIndex(TITLE);
8899            int intentColumn = cursor.getColumnIndex(INTENT);
8900            if (titleColumn == -1 || intentColumn == -1) {
8901                throw new IllegalArgumentException(
8902                        "The cursor must contain the TITLE and INTENT columns.");
8903            }
8904
8905            String title = cursor.getString(titleColumn);
8906            if (!TextUtils.isEmpty(title)) {
8907                return title;
8908            }
8909
8910            String intentUri = cursor.getString(intentColumn);
8911            if (TextUtils.isEmpty(intentUri)) {
8912                return "";
8913            }
8914
8915            Intent intent;
8916            try {
8917                intent = Intent.parseUri(intentUri, 0);
8918            } catch (URISyntaxException e) {
8919                return "";
8920            }
8921
8922            PackageManager packageManager = context.getPackageManager();
8923            ResolveInfo info = packageManager.resolveActivity(intent, 0);
8924            return info != null ? info.loadLabel(packageManager) : "";
8925        }
8926    }
8927
8928    /**
8929     * Returns the device ID that we should use when connecting to the mobile gtalk server.
8930     * This is a string like "android-0x1242", where the hex string is the Android ID obtained
8931     * from the GoogleLoginService.
8932     *
8933     * @param androidId The Android ID for this device.
8934     * @return The device ID that should be used when connecting to the mobile gtalk server.
8935     * @hide
8936     */
8937    public static String getGTalkDeviceId(long androidId) {
8938        return "android-" + Long.toHexString(androidId);
8939    }
8940
8941    private static final String[] PM_WRITE_SETTINGS = {
8942        android.Manifest.permission.WRITE_SETTINGS
8943    };
8944    private static final String[] PM_CHANGE_NETWORK_STATE = {
8945        android.Manifest.permission.CHANGE_NETWORK_STATE,
8946        android.Manifest.permission.WRITE_SETTINGS
8947    };
8948    private static final String[] PM_SYSTEM_ALERT_WINDOW = {
8949        android.Manifest.permission.SYSTEM_ALERT_WINDOW
8950    };
8951
8952    /**
8953     * Performs a strict and comprehensive check of whether a calling package is allowed to
8954     * write/modify system settings, as the condition differs for pre-M, M+, and
8955     * privileged/preinstalled apps. If the provided uid does not match the
8956     * callingPackage, a negative result will be returned.
8957     * @hide
8958     */
8959    public static boolean isCallingPackageAllowedToWriteSettings(Context context, int uid,
8960            String callingPackage, boolean throwException) {
8961        return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
8962                callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
8963                PM_WRITE_SETTINGS, false);
8964    }
8965
8966    /**
8967     * Performs a strict and comprehensive check of whether a calling package is allowed to
8968     * write/modify system settings, as the condition differs for pre-M, M+, and
8969     * privileged/preinstalled apps. If the provided uid does not match the
8970     * callingPackage, a negative result will be returned. The caller is expected to have
8971     * the WRITE_SETTINGS permission declared.
8972     *
8973     * Note: if the check is successful, the operation of this app will be updated to the
8974     * current time.
8975     * @hide
8976     */
8977    public static boolean checkAndNoteWriteSettingsOperation(Context context, int uid,
8978            String callingPackage, boolean throwException) {
8979        return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
8980                callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
8981                PM_WRITE_SETTINGS, true);
8982    }
8983
8984    /**
8985     * Performs a strict and comprehensive check of whether a calling package is allowed to
8986     * change the state of network, as the condition differs for pre-M, M+, and
8987     * privileged/preinstalled apps. The caller is expected to have either the
8988     * CHANGE_NETWORK_STATE or the WRITE_SETTINGS permission declared. Either of these
8989     * permissions allow changing network state; WRITE_SETTINGS is a runtime permission and
8990     * can be revoked, but (except in M, excluding M MRs), CHANGE_NETWORK_STATE is a normal
8991     * permission and cannot be revoked. See http://b/23597341
8992     *
8993     * Note: if the check succeeds because the application holds WRITE_SETTINGS, the operation
8994     * of this app will be updated to the current time.
8995     * @hide
8996     */
8997    public static boolean checkAndNoteChangeNetworkStateOperation(Context context, int uid,
8998            String callingPackage, boolean throwException) {
8999        if (context.checkCallingOrSelfPermission(android.Manifest.permission.CHANGE_NETWORK_STATE)
9000                == PackageManager.PERMISSION_GRANTED) {
9001            return true;
9002        }
9003        return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9004                callingPackage, throwException, AppOpsManager.OP_WRITE_SETTINGS,
9005                PM_CHANGE_NETWORK_STATE, true);
9006    }
9007
9008    /**
9009     * Performs a strict and comprehensive check of whether a calling package is allowed to
9010     * draw on top of other apps, as the conditions differs for pre-M, M+, and
9011     * privileged/preinstalled apps. If the provided uid does not match the callingPackage,
9012     * a negative result will be returned.
9013     * @hide
9014     */
9015    public static boolean isCallingPackageAllowedToDrawOverlays(Context context, int uid,
9016            String callingPackage, boolean throwException) {
9017        return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9018                callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
9019                PM_SYSTEM_ALERT_WINDOW, false);
9020    }
9021
9022    /**
9023     * Performs a strict and comprehensive check of whether a calling package is allowed to
9024     * draw on top of other apps, as the conditions differs for pre-M, M+, and
9025     * privileged/preinstalled apps. If the provided uid does not match the callingPackage,
9026     * a negative result will be returned.
9027     *
9028     * Note: if the check is successful, the operation of this app will be updated to the
9029     * current time.
9030     * @hide
9031     */
9032    public static boolean checkAndNoteDrawOverlaysOperation(Context context, int uid, String
9033            callingPackage, boolean throwException) {
9034        return isCallingPackageAllowedToPerformAppOpsProtectedOperation(context, uid,
9035                callingPackage, throwException, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
9036                PM_SYSTEM_ALERT_WINDOW, true);
9037    }
9038
9039    /**
9040     * Helper method to perform a general and comprehensive check of whether an operation that is
9041     * protected by appops can be performed by a caller or not. e.g. OP_SYSTEM_ALERT_WINDOW and
9042     * OP_WRITE_SETTINGS
9043     * @hide
9044     */
9045    public static boolean isCallingPackageAllowedToPerformAppOpsProtectedOperation(Context context,
9046            int uid, String callingPackage, boolean throwException, int appOpsOpCode, String[]
9047            permissions, boolean makeNote) {
9048        if (callingPackage == null) {
9049            return false;
9050        }
9051
9052        AppOpsManager appOpsMgr = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
9053        int mode = AppOpsManager.MODE_DEFAULT;
9054        if (makeNote) {
9055            mode = appOpsMgr.noteOpNoThrow(appOpsOpCode, uid, callingPackage);
9056        } else {
9057            mode = appOpsMgr.checkOpNoThrow(appOpsOpCode, uid, callingPackage);
9058        }
9059
9060        switch (mode) {
9061            case AppOpsManager.MODE_ALLOWED:
9062                return true;
9063
9064            case AppOpsManager.MODE_DEFAULT:
9065                // this is the default operating mode after an app's installation
9066                // In this case we will check all associated static permission to see
9067                // if it is granted during install time.
9068                for (String permission : permissions) {
9069                    if (context.checkCallingOrSelfPermission(permission) == PackageManager
9070                            .PERMISSION_GRANTED) {
9071                        // if either of the permissions are granted, we will allow it
9072                        return true;
9073                    }
9074                }
9075
9076            default:
9077                // this is for all other cases trickled down here...
9078                if (!throwException) {
9079                    return false;
9080                }
9081        }
9082
9083        // prepare string to throw SecurityException
9084        StringBuilder exceptionMessage = new StringBuilder();
9085        exceptionMessage.append(callingPackage);
9086        exceptionMessage.append(" was not granted ");
9087        if (permissions.length > 1) {
9088            exceptionMessage.append(" either of these permissions: ");
9089        } else {
9090            exceptionMessage.append(" this permission: ");
9091        }
9092        for (int i = 0; i < permissions.length; i++) {
9093            exceptionMessage.append(permissions[i]);
9094            exceptionMessage.append((i == permissions.length - 1) ? "." : ", ");
9095        }
9096
9097        throw new SecurityException(exceptionMessage.toString());
9098    }
9099
9100    /**
9101     * Retrieves a correponding package name for a given uid. It will query all
9102     * packages that are associated with the given uid, but it will return only
9103     * the zeroth result.
9104     * Note: If package could not be found, a null is returned.
9105     * @hide
9106     */
9107    public static String getPackageNameForUid(Context context, int uid) {
9108        String[] packages = context.getPackageManager().getPackagesForUid(uid);
9109        if (packages == null) {
9110            return null;
9111        }
9112        return packages[0];
9113    }
9114}
9115