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