package com.marverenic.music.data.store;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.audiofx.Equalizer;
import android.preference.PreferenceManager;
import android.support.annotation.StringRes;
import com.marverenic.music.R;
import com.marverenic.music.data.annotations.AccentTheme;
import com.marverenic.music.data.annotations.BaseTheme;
import com.marverenic.music.data.annotations.PrimaryTheme;
import com.marverenic.music.data.annotations.StartPage;
import com.marverenic.music.player.MusicPlayer;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import timber.log.Timber;
public class SharedPreferenceStore implements PreferenceStore {
private Context mContext;
private SharedPreferences mPrefs;
public SharedPreferenceStore(Context context) {
mContext = context;
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
}
private boolean contains(@StringRes int keyRes) {
return mPrefs.contains(mContext.getString(keyRes));
}
private boolean getBoolean(@StringRes int keyRes, boolean defaultValue) {
return mPrefs.getBoolean(mContext.getString(keyRes), defaultValue);
}
private int getInt(@StringRes int keyRes, int defaultValue) {
return mPrefs.getInt(mContext.getString(keyRes), defaultValue);
}
private long getLong(@StringRes int keyRes, long defaultValue) {
return mPrefs.getLong(mContext.getString(keyRes), defaultValue);
}
private String getString(@StringRes int keyRes, String defaultValue) {
return mPrefs.getString(mContext.getString(keyRes), defaultValue);
}
private Set<String> getStringSet(@StringRes int keyRes) {
return mPrefs.getStringSet(mContext.getString(keyRes), Collections.emptySet());
}
private void putBoolean(@StringRes int keyRes, boolean value) {
mPrefs.edit()
.putBoolean(mContext.getString(keyRes), value)
.apply();
}
private void putInt(@StringRes int keyRes, int value) {
mPrefs.edit()
.putInt(mContext.getString(keyRes), value)
.apply();
}
private void putLong(@StringRes int keyRes, long value) {
mPrefs.edit()
.putLong(mContext.getString(keyRes), value)
.apply();
}
private void putString(@StringRes int keyRes, String value) {
mPrefs.edit()
.putString(mContext.getString(keyRes), value)
.apply();
}
private void putStringSet(@StringRes int keyRes, Set<String> value) {
mPrefs.edit()
.putStringSet(mContext.getString(keyRes), value)
.apply();
}
@Override
public boolean showFirstStart() {
return getBoolean(R.string.pref_key_show_first_start, true);
}
@Override
public boolean allowLogging() {
return getBoolean(R.string.pref_key_allow_logging, false);
}
@Override
public boolean useMobileNetwork() {
return getBoolean(R.string.pref_key_use_mobile_net, true);
}
@Override
public boolean openNowPlayingOnNewQueue() {
return getBoolean(R.string.pref_key_switch_to_playing, true);
}
@Override
public boolean enableNowPlayingGestures() {
return getBoolean(R.string.pref_key_enable_gestures, true);
}
@Override
@SuppressWarnings("WrongConstant")
public int getDefaultPage() {
return getInt(R.string.pref_key_default_page, StartPage.SONGS);
}
@Override
@SuppressWarnings("WrongConstant")
public int getPrimaryColor() {
return getInt(R.string.pref_key_color_primary, PrimaryTheme.CYAN);
}
@Override
@SuppressWarnings("WrongConstant")
public int getAccentColor() {
return getInt(R.string.pref_key_color_accent, getPrimaryColor());
}
@Override
@SuppressWarnings("WrongConstant")
public int getBaseColor() {
return getInt(R.string.pref_key_color_base, BaseTheme.LIGHT);
}
@Override
public int getIconColor() {
//noinspection WrongConstant
return getInt(R.string.pref_key_color_icon, PrimaryTheme.CYAN);
}
@Override
public boolean resumeOnHeadphonesConnect() {
return getBoolean(R.string.pref_key_resume_with_headphones, false);
}
@Override
public boolean isShuffled() {
return getBoolean(R.string.pref_key_shuffle, false);
}
@Override
public int getRepeatMode() {
return getInt(R.string.pref_key_repeat, MusicPlayer.REPEAT_NONE);
}
@Override
public long getLastSleepTimerDuration() {
return getLong(R.string.pref_key_last_sleep_timer, TimeUnit.MINUTES.toMillis(15));
}
@Override
public int getEqualizerPresetId() {
return getInt(R.string.pref_key_eq_id, -1);
}
@Override
public boolean getEqualizerEnabled() {
return getBoolean(R.string.pref_key_eq_enabled, false);
}
@Override
public Equalizer.Settings getEqualizerSettings() {
if (contains(R.string.pref_key_eq_settings)) {
try {
return new Equalizer.Settings(getString(R.string.pref_key_eq_settings, null));
} catch (IllegalArgumentException exception) {
Timber.e(exception, "getEqualizerSettings: failed to parse equalizer settings");
}
}
return null;
}
@Override
public Set<String> getIncludedDirectories() {
return getStringSet(R.string.pref_key_included_dirs);
}
@Override
public Set<String> getExcludedDirectories() {
return getStringSet(R.string.pref_key_excluded_dirs);
}
@Override
public boolean commit() {
return mPrefs.edit().commit();
}
@Override
public void setShowFirstStart(boolean showFirstStart) {
putBoolean(R.string.pref_key_show_first_start, showFirstStart);
}
@Override
public void setAllowLogging(boolean allowLogging) {
putBoolean(R.string.pref_key_allow_logging, allowLogging);
}
@Override
public void setUseMobileNetwork(boolean useMobileNetwork) {
putBoolean(R.string.pref_key_use_mobile_net, useMobileNetwork);
}
@Override
public void setOpenNowPlayingOnNewQueue(boolean openNowPlayingOnNewQueue) {
putBoolean(R.string.pref_key_switch_to_playing, openNowPlayingOnNewQueue);
}
@Override
public void setEnableNowPlayingGestures(boolean enabled) {
putBoolean(R.string.pref_key_enable_gestures, enabled);
}
@Override
public void setDefaultPage(@StartPage int defaultPage) {
putInt(R.string.default_page_pref, defaultPage);
}
@Override
public void setPrimaryColor(@PrimaryTheme int colorChoice) {
putInt(R.string.pref_key_color_primary, colorChoice);
}
@Override
public void setAccentColor(@AccentTheme int accentColor) {
putInt(R.string.pref_key_color_accent, accentColor);
}
@Override
public void setBaseColor(@BaseTheme int themeChoice) {
putInt(R.string.pref_key_color_base, themeChoice);
}
@Override
public void setIconColor(@PrimaryTheme int theme) {
putInt(R.string.pref_key_color_icon, theme);
}
@Override
public void toggleShuffle() {
setShuffle(!isShuffled());
}
@Override
public void setShuffle(boolean shuffle) {
putBoolean(R.string.pref_key_shuffle, shuffle);
}
@Override
public void setRepeatMode(int repeatMode) {
putInt(R.string.pref_key_repeat, repeatMode);
}
@Override
public void setLastSleepTimerDuration(long timeInMillis) {
putLong(R.string.pref_key_last_sleep_timer, timeInMillis);
}
@Override
public void setEqualizerPresetId(int equalizerPresetId) {
putInt(R.string.pref_key_eq_id, equalizerPresetId);
}
@Override
public void setEqualizerEnabled(boolean equalizerEnabled) {
putBoolean(R.string.pref_key_eq_enabled, equalizerEnabled);
}
@Override
public void setEqualizerSettings(Equalizer.Settings settings) {
putString(R.string.pref_key_eq_settings, settings.toString());
}
@Override
public void setIncludedDirectories(Collection<String> directories) {
putStringSet(R.string.pref_key_included_dirs, new HashSet<>(directories));
}
@Override
public void setExcludedDirectories(Collection<String> directories) {
putStringSet(R.string.pref_key_excluded_dirs, new HashSet<>(directories));
}
}