1044 lines
42 KiB
Java
1044 lines
42 KiB
Java
|
/**
|
||
|
* Copyright (c) 2015, The CyanogenMod Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package cyanogenmod.providers;
|
||
|
|
||
|
import android.content.ContentResolver;
|
||
|
import android.content.IContentProvider;
|
||
|
import android.database.Cursor;
|
||
|
import android.net.Uri;
|
||
|
import android.os.RemoteException;
|
||
|
import android.os.SystemProperties;
|
||
|
import android.os.UserHandle;
|
||
|
import android.provider.Settings;
|
||
|
import android.util.AndroidException;
|
||
|
import android.util.Log;
|
||
|
|
||
|
import java.util.HashMap;
|
||
|
|
||
|
/**
|
||
|
* CMSettings contains CM specific preferences in System, Secure, and Global.
|
||
|
*/
|
||
|
public final class CMSettings {
|
||
|
private static final String TAG = "CMSettings";
|
||
|
private static final boolean LOCAL_LOGV = false;
|
||
|
|
||
|
public static final String AUTHORITY = "cmsettings";
|
||
|
|
||
|
public static class CMSettingNotFoundException extends AndroidException {
|
||
|
public CMSettingNotFoundException(String msg) {
|
||
|
super(msg);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Thread-safe.
|
||
|
private static class NameValueCache {
|
||
|
// TODO Add call options for fast path at insert and get
|
||
|
|
||
|
private final String mVersionSystemProperty;
|
||
|
private final Uri mUri;
|
||
|
|
||
|
private static final String[] SELECT_VALUE =
|
||
|
new String[] { Settings.NameValueTable.VALUE };
|
||
|
private static final String NAME_EQ_PLACEHOLDER = "name=?";
|
||
|
|
||
|
// Must synchronize on 'this' to access mValues and mValuesVersion.
|
||
|
private final HashMap<String, String> mValues = new HashMap<String, String>();
|
||
|
private long mValuesVersion = 0;
|
||
|
|
||
|
// Initially null; set lazily and held forever. Synchronized on 'this'.
|
||
|
private IContentProvider mContentProvider = null;
|
||
|
|
||
|
public NameValueCache(String versionSystemProperty, Uri uri) {
|
||
|
mVersionSystemProperty = versionSystemProperty;
|
||
|
mUri = uri;
|
||
|
}
|
||
|
|
||
|
private IContentProvider lazyGetProvider(ContentResolver cr) {
|
||
|
IContentProvider cp;
|
||
|
synchronized (this) {
|
||
|
cp = mContentProvider;
|
||
|
if (cp == null) {
|
||
|
cp = mContentProvider = cr.acquireProvider(mUri.getAuthority());
|
||
|
}
|
||
|
}
|
||
|
return cp;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets a a string value with the specified name from the name/value cache if possible. If
|
||
|
* not, it will use the content resolver and perform a query.
|
||
|
* @param cr Content resolver to use if name/value cache does not contain the name or if
|
||
|
* the cache version is older than the current version.
|
||
|
* @param name The name of the key to search for.
|
||
|
* @param userId The user id of the cache to look in.
|
||
|
* @return The string value of the specified key.
|
||
|
*/
|
||
|
public String getStringForUser(ContentResolver cr, String name, final int userId) {
|
||
|
final boolean isSelf = (userId == UserHandle.myUserId());
|
||
|
if (isSelf) {
|
||
|
long newValuesVersion = SystemProperties.getLong(mVersionSystemProperty, 0);
|
||
|
|
||
|
// Our own user's settings data uses a client-side cache
|
||
|
synchronized (this) {
|
||
|
if (mValuesVersion != newValuesVersion) {
|
||
|
if (LOCAL_LOGV || false) {
|
||
|
Log.v(TAG, "invalidate [" + mUri.getLastPathSegment() + "]: current "
|
||
|
+ newValuesVersion + " != cached " + mValuesVersion);
|
||
|
}
|
||
|
|
||
|
mValues.clear();
|
||
|
mValuesVersion = newValuesVersion;
|
||
|
}
|
||
|
|
||
|
if (mValues.containsKey(name)) {
|
||
|
return mValues.get(name); // Could be null, that's OK -- negative caching
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if (LOCAL_LOGV) Log.v(TAG, "get setting for user " + userId
|
||
|
+ " by user " + UserHandle.myUserId() + " so skipping cache");
|
||
|
}
|
||
|
|
||
|
IContentProvider cp = lazyGetProvider(cr);
|
||
|
|
||
|
Cursor c = null;
|
||
|
try {
|
||
|
c = cp.query(cr.getPackageName(), mUri, SELECT_VALUE, NAME_EQ_PLACEHOLDER,
|
||
|
new String[]{name}, null, null);
|
||
|
if (c == null) {
|
||
|
Log.w(TAG, "Can't get key " + name + " from " + mUri);
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
String value = c.moveToNext() ? c.getString(0) : null;
|
||
|
synchronized (this) {
|
||
|
mValues.put(name, value);
|
||
|
}
|
||
|
if (LOCAL_LOGV) {
|
||
|
Log.v(TAG, "cache miss [" + mUri.getLastPathSegment() + "]: " +
|
||
|
name + " = " + (value == null ? "(null)" : value));
|
||
|
}
|
||
|
return value;
|
||
|
} catch (RemoteException e) {
|
||
|
Log.w(TAG, "Can't get key " + name + " from " + mUri, e);
|
||
|
return null; // Return null, but don't cache it.
|
||
|
} finally {
|
||
|
if (c != null) c.close();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* System settings, containing miscellaneous CM system preferences. This
|
||
|
* table holds simple name/value pairs. There are convenience
|
||
|
* functions for accessing individual settings entries.
|
||
|
*/
|
||
|
public static final class System extends Settings.NameValueTable {
|
||
|
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/system");
|
||
|
|
||
|
public static final String SYS_PROP_CM_SETTING_VERSION = "sys.cm_settings_system_version";
|
||
|
|
||
|
private static final NameValueCache sNameValueCache = new NameValueCache(
|
||
|
SYS_PROP_CM_SETTING_VERSION,
|
||
|
CONTENT_URI);
|
||
|
|
||
|
// region Methods
|
||
|
|
||
|
/**
|
||
|
* Look up a name in the database.
|
||
|
* @param resolver to access the database with
|
||
|
* @param name to look up in the table
|
||
|
* @return the corresponding value, or null if not present
|
||
|
*/
|
||
|
public static String getString(ContentResolver resolver, String name) {
|
||
|
return getStringForUser(resolver, name, UserHandle.myUserId());
|
||
|
}
|
||
|
|
||
|
/** @hide */
|
||
|
public static String getStringForUser(ContentResolver resolver, String name,
|
||
|
int userHandle) {
|
||
|
return sNameValueCache.getStringForUser(resolver, name, userHandle);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Store a name/value pair into the database.
|
||
|
* @param resolver to access the database with
|
||
|
* @param name to store
|
||
|
* @param value to associate with the name
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putString(ContentResolver resolver, String name, String value) {
|
||
|
return putString(resolver, CONTENT_URI, name, value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as an integer. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to an integer
|
||
|
* for you. The default value will be returned if the setting is
|
||
|
* not defined or not an integer.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid integer.
|
||
|
*/
|
||
|
public static int getInt(ContentResolver cr, String name, int def) {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return v != null ? Integer.parseInt(v) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as an integer. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to an integer
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not an integer.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
*/
|
||
|
public static int getInt(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return Integer.parseInt(v);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a single settings value as an
|
||
|
* integer. This will either create a new entry in the table if the
|
||
|
* given name does not exist, or modify the value of the existing row
|
||
|
* with that name. Note that internally setting values are always
|
||
|
* stored as strings, so this function converts the given value to a
|
||
|
* string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putInt(ContentResolver cr, String name, int value) {
|
||
|
return putString(cr, name, Integer.toString(value));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a {@code long}. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a {@code long}
|
||
|
* for you. The default value will be returned if the setting is
|
||
|
* not defined or not a {@code long}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid {@code long}.
|
||
|
*/
|
||
|
public static long getLong(ContentResolver cr, String name, long def) {
|
||
|
String valString = getString(cr, name);
|
||
|
long value;
|
||
|
try {
|
||
|
value = valString != null ? Long.parseLong(valString) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
value = def;
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a {@code long}. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a {@code long}
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not an integer.
|
||
|
*/
|
||
|
public static long getLong(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String valString = getString(cr, name);
|
||
|
try {
|
||
|
return Long.parseLong(valString);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a secure settings value as a long
|
||
|
* integer. This will either create a new entry in the table if the
|
||
|
* given name does not exist, or modify the value of the existing row
|
||
|
* with that name. Note that internally setting values are always
|
||
|
* stored as strings, so this function converts the given value to a
|
||
|
* string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putLong(ContentResolver cr, String name, long value) {
|
||
|
return putString(cr, name, Long.toString(value));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a floating point number. Note that internally setting values are
|
||
|
* always stored as strings; this function converts the string to an
|
||
|
* float for you. The default value will be returned if the setting
|
||
|
* is not defined or not a valid float.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid float.
|
||
|
*/
|
||
|
public static float getFloat(ContentResolver cr, String name, float def) {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return v != null ? Float.parseFloat(v) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a float. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a float
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not a float.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
*/
|
||
|
public static float getFloat(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String v = getString(cr, name);
|
||
|
if (v == null) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
try {
|
||
|
return Float.parseFloat(v);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a single settings value as a
|
||
|
* floating point number. This will either create a new entry in the
|
||
|
* table if the given name does not exist, or modify the value of the
|
||
|
* existing row with that name. Note that internally setting values
|
||
|
* are always stored as strings, so this function converts the given
|
||
|
* value to a string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putFloat(ContentResolver cr, String name, float value) {
|
||
|
return putString(cr, name, Float.toString(value));
|
||
|
}
|
||
|
|
||
|
// endregion
|
||
|
|
||
|
// region System Settings
|
||
|
|
||
|
/**
|
||
|
* Quick Settings Quick Pulldown
|
||
|
* 0 = off, 1 = right, 2 = left
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String QS_QUICK_PULLDOWN = "qs_quick_pulldown";
|
||
|
|
||
|
// endregion
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Secure settings, containing miscellaneous CM secure preferences. This
|
||
|
* table holds simple name/value pairs. There are convenience
|
||
|
* functions for accessing individual settings entries.
|
||
|
*/
|
||
|
public static final class Secure extends Settings.NameValueTable {
|
||
|
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/secure");
|
||
|
|
||
|
public static final String SYS_PROP_CM_SETTING_VERSION = "sys.cm_settings_secure_version";
|
||
|
|
||
|
private static final NameValueCache sNameValueCache = new NameValueCache(
|
||
|
SYS_PROP_CM_SETTING_VERSION,
|
||
|
CONTENT_URI);
|
||
|
|
||
|
/**
|
||
|
* Look up a name in the database.
|
||
|
* @param resolver to access the database with
|
||
|
* @param name to look up in the table
|
||
|
* @return the corresponding value, or null if not present
|
||
|
*/
|
||
|
public static String getString(ContentResolver resolver, String name) {
|
||
|
return getStringForUser(resolver, name, UserHandle.myUserId());
|
||
|
}
|
||
|
|
||
|
/** @hide */
|
||
|
public static String getStringForUser(ContentResolver resolver, String name,
|
||
|
int userHandle) {
|
||
|
return sNameValueCache.getStringForUser(resolver, name, userHandle);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Store a name/value pair into the database.
|
||
|
* @param resolver to access the database with
|
||
|
* @param name to store
|
||
|
* @param value to associate with the name
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putString(ContentResolver resolver, String name, String value) {
|
||
|
return putString(resolver, CONTENT_URI, name, value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as an integer. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to an integer
|
||
|
* for you. The default value will be returned if the setting is
|
||
|
* not defined or not an integer.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid integer.
|
||
|
*/
|
||
|
public static int getInt(ContentResolver cr, String name, int def) {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return v != null ? Integer.parseInt(v) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as an integer. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to an integer
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not an integer.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
*/
|
||
|
public static int getInt(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return Integer.parseInt(v);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a single settings value as an
|
||
|
* integer. This will either create a new entry in the table if the
|
||
|
* given name does not exist, or modify the value of the existing row
|
||
|
* with that name. Note that internally setting values are always
|
||
|
* stored as strings, so this function converts the given value to a
|
||
|
* string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putInt(ContentResolver cr, String name, int value) {
|
||
|
return putString(cr, name, Integer.toString(value));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a {@code long}. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a {@code long}
|
||
|
* for you. The default value will be returned if the setting is
|
||
|
* not defined or not a {@code long}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid {@code long}.
|
||
|
*/
|
||
|
public static long getLong(ContentResolver cr, String name, long def) {
|
||
|
String valString = getString(cr, name);
|
||
|
long value;
|
||
|
try {
|
||
|
value = valString != null ? Long.parseLong(valString) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
value = def;
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a {@code long}. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a {@code long}
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not an integer.
|
||
|
*/
|
||
|
public static long getLong(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String valString = getString(cr, name);
|
||
|
try {
|
||
|
return Long.parseLong(valString);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a secure settings value as a long
|
||
|
* integer. This will either create a new entry in the table if the
|
||
|
* given name does not exist, or modify the value of the existing row
|
||
|
* with that name. Note that internally setting values are always
|
||
|
* stored as strings, so this function converts the given value to a
|
||
|
* string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putLong(ContentResolver cr, String name, long value) {
|
||
|
return putString(cr, name, Long.toString(value));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a floating point number. Note that internally setting values are
|
||
|
* always stored as strings; this function converts the string to an
|
||
|
* float for you. The default value will be returned if the setting
|
||
|
* is not defined or not a valid float.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid float.
|
||
|
*/
|
||
|
public static float getFloat(ContentResolver cr, String name, float def) {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return v != null ? Float.parseFloat(v) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a float. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a float
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not a float.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
*/
|
||
|
public static float getFloat(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String v = getString(cr, name);
|
||
|
if (v == null) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
try {
|
||
|
return Float.parseFloat(v);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a single settings value as a
|
||
|
* floating point number. This will either create a new entry in the
|
||
|
* table if the given name does not exist, or modify the value of the
|
||
|
* existing row with that name. Note that internally setting values
|
||
|
* are always stored as strings, so this function converts the given
|
||
|
* value to a string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putFloat(ContentResolver cr, String name, float value) {
|
||
|
return putString(cr, name, Float.toString(value));
|
||
|
}
|
||
|
|
||
|
// endregion
|
||
|
|
||
|
// region Secure Settings
|
||
|
|
||
|
/**
|
||
|
* Whether to enable "advanced mode" for the current user.
|
||
|
* Boolean setting. 0 = no, 1 = yes.
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String ADVANCED_MODE = "advanced_mode";
|
||
|
|
||
|
/**
|
||
|
* The time in ms to keep the button backlight on after pressing a button.
|
||
|
* A value of 0 will keep the buttons on for as long as the screen is on.
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String BUTTON_BACKLIGHT_TIMEOUT = "button_backlight_timeout";
|
||
|
|
||
|
/**
|
||
|
* The button brightness to be used while the screen is on or after a button press,
|
||
|
* depending on the value of {@link BUTTON_BACKLIGHT_TIMEOUT}.
|
||
|
* Valid value range is between 0 and {@link PowerManager#getMaximumButtonBrightness()}
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String BUTTON_BRIGHTNESS = "button_brightness";
|
||
|
|
||
|
/**
|
||
|
* A '|' delimited list of theme components to apply from the default theme on first boot.
|
||
|
* Components can be one or more of the "mods_XXXXXXX" found in
|
||
|
* {@link ThemesContract$ThemesColumns}. Leaving this field blank assumes all components
|
||
|
* will be applied.
|
||
|
*
|
||
|
* ex: mods_icons|mods_overlays|mods_homescreen
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String DEFAULT_THEME_COMPONENTS = "default_theme_components";
|
||
|
|
||
|
/**
|
||
|
* Default theme to use. If empty, use holo.
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String DEFAULT_THEME_PACKAGE = "default_theme_package";
|
||
|
|
||
|
/**
|
||
|
* Developer options - Navigation Bar show switch
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String DEV_FORCE_SHOW_NAVBAR = "dev_force_show_navbar";
|
||
|
|
||
|
/**
|
||
|
* The keyboard brightness to be used while the screen is on.
|
||
|
* Valid value range is between 0 and {@link PowerManager#getMaximumKeyboardBrightness()}
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String KEYBOARD_BRIGHTNESS = "keyboard_brightness";
|
||
|
|
||
|
/**
|
||
|
* Default theme config name
|
||
|
*/
|
||
|
public static final String NAME_THEME_CONFIG = "name_theme_config";
|
||
|
|
||
|
/**
|
||
|
* Custom navring actions
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String[] NAVIGATION_RING_TARGETS = new String[] {
|
||
|
"navigation_ring_targets_0",
|
||
|
"navigation_ring_targets_1",
|
||
|
"navigation_ring_targets_2",
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* String to contain power menu actions
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String POWER_MENU_ACTIONS = "power_menu_actions";
|
||
|
|
||
|
/**
|
||
|
* Whether to show the brightness slider in quick settings panel.
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String QS_SHOW_BRIGHTNESS_SLIDER = "qs_show_brightness_slider";
|
||
|
|
||
|
/**
|
||
|
* List of QS tile names
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String QS_TILES = "sysui_qs_tiles";
|
||
|
|
||
|
/**
|
||
|
* Use "main" tiles on the first row of the quick settings panel
|
||
|
* 0 = no, 1 = yes
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String QS_USE_MAIN_TILES = "sysui_qs_main_tiles";
|
||
|
|
||
|
/**
|
||
|
* Global stats collection
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String STATS_COLLECTION = "stats_collection";
|
||
|
|
||
|
/**
|
||
|
* Boolean value whether to link ringtone and notification volume
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String VOLUME_LINK_NOTIFICATION = "volume_link_notification";
|
||
|
|
||
|
// endregion
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Global settings, containing miscellaneous CM global preferences. This
|
||
|
* table holds simple name/value pairs. There are convenience
|
||
|
* functions for accessing individual settings entries.
|
||
|
*/
|
||
|
public static final class Global extends Settings.NameValueTable {
|
||
|
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/global");
|
||
|
|
||
|
public static final String SYS_PROP_CM_SETTING_VERSION = "sys.cm_settings_global_version";
|
||
|
|
||
|
private static final NameValueCache sNameValueCache = new NameValueCache(
|
||
|
SYS_PROP_CM_SETTING_VERSION,
|
||
|
CONTENT_URI);
|
||
|
|
||
|
// region Methods
|
||
|
|
||
|
/**
|
||
|
* Look up a name in the database.
|
||
|
* @param resolver to access the database with
|
||
|
* @param name to look up in the table
|
||
|
* @return the corresponding value, or null if not present
|
||
|
*/
|
||
|
public static String getString(ContentResolver resolver, String name) {
|
||
|
return getStringForUser(resolver, name, UserHandle.myUserId());
|
||
|
}
|
||
|
|
||
|
/** @hide */
|
||
|
public static String getStringForUser(ContentResolver resolver, String name,
|
||
|
int userHandle) {
|
||
|
return sNameValueCache.getStringForUser(resolver, name, userHandle);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Store a name/value pair into the database.
|
||
|
* @param resolver to access the database with
|
||
|
* @param name to store
|
||
|
* @param value to associate with the name
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putString(ContentResolver resolver, String name, String value) {
|
||
|
return putString(resolver, CONTENT_URI, name, value);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as an integer. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to an integer
|
||
|
* for you. The default value will be returned if the setting is
|
||
|
* not defined or not an integer.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid integer.
|
||
|
*/
|
||
|
public static int getInt(ContentResolver cr, String name, int def) {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return v != null ? Integer.parseInt(v) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as an integer. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to an integer
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not an integer.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
*/
|
||
|
public static int getInt(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return Integer.parseInt(v);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a single settings value as an
|
||
|
* integer. This will either create a new entry in the table if the
|
||
|
* given name does not exist, or modify the value of the existing row
|
||
|
* with that name. Note that internally setting values are always
|
||
|
* stored as strings, so this function converts the given value to a
|
||
|
* string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putInt(ContentResolver cr, String name, int value) {
|
||
|
return putString(cr, name, Integer.toString(value));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a {@code long}. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a {@code long}
|
||
|
* for you. The default value will be returned if the setting is
|
||
|
* not defined or not a {@code long}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid {@code long}.
|
||
|
*/
|
||
|
public static long getLong(ContentResolver cr, String name, long def) {
|
||
|
String valString = getString(cr, name);
|
||
|
long value;
|
||
|
try {
|
||
|
value = valString != null ? Long.parseLong(valString) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
value = def;
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a {@code long}. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a {@code long}
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not an integer.
|
||
|
*/
|
||
|
public static long getLong(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String valString = getString(cr, name);
|
||
|
try {
|
||
|
return Long.parseLong(valString);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a secure settings value as a long
|
||
|
* integer. This will either create a new entry in the table if the
|
||
|
* given name does not exist, or modify the value of the existing row
|
||
|
* with that name. Note that internally setting values are always
|
||
|
* stored as strings, so this function converts the given value to a
|
||
|
* string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putLong(ContentResolver cr, String name, long value) {
|
||
|
return putString(cr, name, Long.toString(value));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a floating point number. Note that internally setting values are
|
||
|
* always stored as strings; this function converts the string to an
|
||
|
* float for you. The default value will be returned if the setting
|
||
|
* is not defined or not a valid float.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
* @param def Value to return if the setting is not defined.
|
||
|
*
|
||
|
* @return The setting's current value, or 'def' if it is not defined
|
||
|
* or not a valid float.
|
||
|
*/
|
||
|
public static float getFloat(ContentResolver cr, String name, float def) {
|
||
|
String v = getString(cr, name);
|
||
|
try {
|
||
|
return v != null ? Float.parseFloat(v) : def;
|
||
|
} catch (NumberFormatException e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for retrieving a single secure settings value
|
||
|
* as a float. Note that internally setting values are always
|
||
|
* stored as strings; this function converts the string to a float
|
||
|
* for you.
|
||
|
* <p>
|
||
|
* This version does not take a default value. If the setting has not
|
||
|
* been set, or the string value is not a number,
|
||
|
* it throws {@link CMSettingNotFoundException}.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to retrieve.
|
||
|
*
|
||
|
* @throws CMSettingNotFoundException Thrown if a setting by the given
|
||
|
* name can't be found or the setting value is not a float.
|
||
|
*
|
||
|
* @return The setting's current value.
|
||
|
*/
|
||
|
public static float getFloat(ContentResolver cr, String name)
|
||
|
throws CMSettingNotFoundException {
|
||
|
String v = getString(cr, name);
|
||
|
if (v == null) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
try {
|
||
|
return Float.parseFloat(v);
|
||
|
} catch (NumberFormatException e) {
|
||
|
throw new CMSettingNotFoundException(name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convenience function for updating a single settings value as a
|
||
|
* floating point number. This will either create a new entry in the
|
||
|
* table if the given name does not exist, or modify the value of the
|
||
|
* existing row with that name. Note that internally setting values
|
||
|
* are always stored as strings, so this function converts the given
|
||
|
* value to a string before storing it.
|
||
|
*
|
||
|
* @param cr The ContentResolver to access.
|
||
|
* @param name The name of the setting to modify.
|
||
|
* @param value The new value for the setting.
|
||
|
* @return true if the value was set, false on database errors
|
||
|
*/
|
||
|
public static boolean putFloat(ContentResolver cr, String name, float value) {
|
||
|
return putString(cr, name, Float.toString(value));
|
||
|
}
|
||
|
|
||
|
// endregion
|
||
|
|
||
|
// region Global Settings
|
||
|
|
||
|
/**
|
||
|
* The name of the device
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String DEVICE_NAME = "device_name";
|
||
|
|
||
|
/**
|
||
|
* Defines global heads up toggle. One of HEADS_UP_OFF, HEADS_UP_ON.
|
||
|
*
|
||
|
* @hide
|
||
|
*/
|
||
|
public static final String HEADS_UP_NOTIFICATIONS_ENABLED =
|
||
|
"heads_up_notifications_enabled";
|
||
|
|
||
|
// endregion
|
||
|
}
|
||
|
}
|