blob: c76ccebaf74c51245af52164d5df4da487b5b9f4 [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source 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 com.android.tv.common.dev;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
/** Preferences available to developers */
public abstract class DeveloperPreference<T> {
private static final String PREFERENCE_FILE_NAME =
"com.android.tv.common.dev.DeveloperPreference";
/**
* Create a boolean developer preference.
*
* @param key the developer setting key.
* @param defaultValue the value to return if the setting is undefined or empty.
*/
public static DeveloperPreference<Boolean> create(String key, boolean defaultValue) {
return new DeveloperBooleanPreference(key, defaultValue);
}
@VisibleForTesting
static final SharedPreferences getPreferences(Context context) {
return context.getSharedPreferences(PREFERENCE_FILE_NAME, Context.MODE_PRIVATE);
}
/**
* Create a int developer preference.
*
* @param key the developer setting key.
* @param defaultValue the value to return if the setting is undefined or empty.
*/
public static DeveloperPreference<Integer> create(String key, int defaultValue) {
return new DeveloperIntegerPreference(key, defaultValue);
}
final String mKey;
final T mDefaultValue;
private T mValue;
private DeveloperPreference(String key, T defaultValue) {
mKey = key;
mValue = null;
mDefaultValue = defaultValue;
}
/** Set the value. */
public final void set(Context context, T value) {
mValue = value;
storeValue(context, value);
}
protected abstract void storeValue(Context context, T value);
/** Get the current value, or the default if the value is not set. */
public final T get(Context context) {
mValue = getStoredValue(context);
return mValue;
}
/** Get the current value, or the default if the value is not set or context is null. */
public final T getDefaultIfContextNull(@Nullable Context context) {
return context == null ? mDefaultValue : getStoredValue(context);
}
protected abstract T getStoredValue(Context context);
/**
* Clears the current value.
*
* <p>Future calls to {@link #get(Context)} will return the default value.
*/
public final void clear(Context context) {
getPreferences(context).edit().remove(mKey).apply();
}
@Override
public final String toString() {
return "[" + mKey + "]=" + mValue + " Default value : " + mDefaultValue;
}
private static final class DeveloperBooleanPreference extends DeveloperPreference<Boolean> {
private DeveloperBooleanPreference(String key, Boolean defaultValue) {
super(key, defaultValue);
}
@Override
public void storeValue(Context context, Boolean value) {
getPreferences(context).edit().putBoolean(mKey, value).apply();
}
@Override
public Boolean getStoredValue(Context context) {
return getPreferences(context).getBoolean(mKey, mDefaultValue);
}
}
private static final class DeveloperIntegerPreference extends DeveloperPreference<Integer> {
private DeveloperIntegerPreference(String key, Integer defaultValue) {
super(key, defaultValue);
}
@Override
protected void storeValue(Context context, Integer value) {
getPreferences(context).edit().putInt(mKey, value).apply();
}
@Override
protected Integer getStoredValue(Context context) {
return getPreferences(context).getInt(mKey, mDefaultValue);
}
}
}