/**
* Copyright (C) 2013 Johannes Schnatterer
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This file is part of nusic.
*
* nusic is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* nusic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with nusic. If not, see <http://www.gnu.org/licenses/>.
*/
package info.schnatterer.nusic.core.impl;
import info.schnatterer.nusic.core.PreferencesService;
import info.schnatterer.nusic.core.event.PreferenceChangedListener;
import info.schnatterer.nusic.util.DateUtil;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
import roboguice.inject.ContextSingleton;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.preference.PreferenceManager;
import com.google.inject.Provider;
/**
* Provides access to the preferences of the application via android's
* {@link SharedPreferences}.
*
* @author schnatterer
*
*/
@ContextSingleton
public class PreferencesServiceSharedPreferences implements PreferencesService,
OnSharedPreferenceChangeListener {
/*
* Preferences that are not accessible through preferences menu
* (preferences.xml)
*/
public final String KEY_LAST_RELEASES_REFRESH = "last_release_refresh";
public final Date DEFAULT_LAST_RELEASES_REFRESH = null;
public final String KEY_NEXT_RELEASES_REFRESH = "next_release_refresh";
public final Date DEFAULT_NEXT_RELEASES_REFRESH = null;
private final String KEY_JUST_ADDED_TIME_PERIOD = "just_added_time_period";
private final Integer DEFAULT_JUST_ADDED_TIME_PERIOD;
// Define in constructor!
public final String KEY_ENABLED_CONNECTIVITY_RECEIVER = "connectivityReceiver";
public final Boolean DEFAULT_ENABLED_CONNECTIVITY_RECEIVER = Boolean.FALSE;
/*
* Preferences that are defined in constants_prefernces.xml -> accessible
* for preferences.xml
*/
@Inject
@Named("PreferencesKeyDownloadOnlyOnWifi")
private String KEY_DOWLOAD_ONLY_ON_WIFI;
@Inject
@Named("PreferencesDefaultDownloadOnlyOnWifi")
private Boolean DEFAULT_DOWLOAD_ONLY_ON_WIFI;
@Inject
@Named("PreferencesKeyDownloadReleasesTimePeriod")
private String KEY_DOWNLOAD_RELEASES_TIME_PERIOD;
@Inject
@Named("PreferencesDefaultDownloadReleasesTimePeriod")
private String DEFAULT_DOWNLOAD_RELEASES_TIME_PERIOD;
@Inject
@Named("PreferencesKeyRefreshPeriod")
private String KEY_REFRESH_PERIOD;
@Inject
@Named("PreferencesDefaultRefreshPeriod")
private String DEFAULT_REFRESH_PERIOD;
@Inject
@Named("PreferencesKeyIsEnabledNotifyReleasedToday")
private String KEY_ENABLED_NOTIFY_RELEASED_TODAY;
@Inject
@Named("PreferencesDefaultIsEnabledNotifyReleasedToday")
private Boolean DEFAULT_ENABLED_NOTIFY_RELEASED_TODAY;
@Inject
@Named("PreferencesKeyIsEnabledNotifyNewReleases")
private String KEY_ENABLED_NOTIFY_NEW_RELEASES;
@Inject
@Named("PreferencesDefaultIsEnabledNotifyNewReleases")
private Boolean DEFAULT_ENABLED_NOTIFY_NEW_RELEASES;
@Inject
@Named("PreferencesKeyReleasedTodayHourOfDay")
private String KEY_RELEASED_TODAY_HOUR_OF_DAY;
@Inject
@Named("PreferencesDefaultReleasedTodayHourOfDay")
private Integer DEFAULT_RELEASED_TODAY_HOUR_OF_DAY;
@Inject
@Named("PreferencesKeyReleasedTodayMinute")
private String KEY_RELEASED_TODAY_MINUTE;
@Inject
@Named("PreferencesDefaultReleasedTodayMinute")
private Integer DEFAULT_RELEASED_TODAY_MINUTE;
@Inject
@Named("PreferencesKeyLogLevelFile")
private String KEY_LOG_LEVEL_FILE;
@Inject
@Named("PreferencesDefaultLogLevelFile")
private String DEFAULT_LOG_LEVEL_FILE;
@Inject
@Named("PreferencesKeyLogLevelLogCat")
private String KEY_LOG_LEVEL_LOGCAT;
@Inject
@Named("PreferencesDefaultLogLevelLogCat")
private String DEFAULT_LOG_LEVEL_LOGCAT;
@Inject
@Named("PreferencesKeyNotifyRefreshErrors")
private String KEY_NOTIFY_REFRESH_ERRORS;
@Inject
@Named("PreferencesDefaultNotifyRefreshErrors")
private boolean DEFAULT_NOTIFY_REFRESH_ERRORS;
private final SharedPreferences sharedPreferences;
private Set<PreferenceChangedListener> preferenceChangedListeners = new HashSet<PreferenceChangedListener>();
@Inject
private static Provider<Context> contextProvider;
@Inject
public PreferencesServiceSharedPreferences(
@Named("PreferencesKeyRefreshPeriod") String keyRefreshPeriod,
@Named("PreferencesDefaultRefreshPeriod") String defaultRefreshPerioid) {
Context context = contextProvider.get();
this.sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(context);
if (sharedPreferences != null) {
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
DEFAULT_JUST_ADDED_TIME_PERIOD = parseIntOrThrow(keyRefreshPeriod,
defaultRefreshPerioid);
}
private Integer parseIntFromPreferenceOrThrow(String key,
String defaultValue) {
String prefValue = sharedPreferences.getString(key, defaultValue);
return parseIntOrThrow(key, prefValue);
}
private Integer parseIntOrThrow(String key, String prefValue) {
try {
return Integer.parseInt(prefValue);
} catch (NumberFormatException e) {
throw new RuntimeException(
"Unable to parse integer from property \"" + key
+ "\", value:" + prefValue, e);
}
}
@Override
public Date getLastReleaseRefresh() {
long lastReleaseRefreshMillis = sharedPreferences.getLong(
KEY_LAST_RELEASES_REFRESH, 0);
if (lastReleaseRefreshMillis == 0) {
return DEFAULT_LAST_RELEASES_REFRESH;
}
return DateUtil.toDate(lastReleaseRefreshMillis);
}
@Override
public boolean setLastReleaseRefresh(Date date) {
return sharedPreferences.edit()
.putLong(KEY_LAST_RELEASES_REFRESH, DateUtil.toLong(date))
.commit();
}
@Override
public Date getNextReleaseRefresh() {
long nextReleaseRefreshMillis = sharedPreferences.getLong(
KEY_NEXT_RELEASES_REFRESH, 0);
if (nextReleaseRefreshMillis == 0) {
return DEFAULT_NEXT_RELEASES_REFRESH;
}
return DateUtil.toDate(nextReleaseRefreshMillis);
}
@Override
public boolean setNextReleaseRefresh(Date date) {
return sharedPreferences.edit()
.putLong(KEY_NEXT_RELEASES_REFRESH, DateUtil.toLong(date))
.commit();
}
@Override
public void clearPreferences() {
sharedPreferences.edit().clear().commit();
}
@Override
public boolean isUseOnlyWifi() {
return sharedPreferences.getBoolean(KEY_DOWLOAD_ONLY_ON_WIFI,
DEFAULT_DOWLOAD_ONLY_ON_WIFI);
}
@Override
public int getDownloadReleasesTimePeriod() {
return parseIntFromPreferenceOrThrow(KEY_DOWNLOAD_RELEASES_TIME_PERIOD,
DEFAULT_DOWNLOAD_RELEASES_TIME_PERIOD);
}
@Override
public int getRefreshPeriod() {
return parseIntFromPreferenceOrThrow(KEY_REFRESH_PERIOD,
DEFAULT_REFRESH_PERIOD);
}
@Override
public int getJustAddedTimePeriod() {
return sharedPreferences.getInt(KEY_JUST_ADDED_TIME_PERIOD,
DEFAULT_JUST_ADDED_TIME_PERIOD);
}
@Override
public void registerOnSharedPreferenceChangeListener(
PreferenceChangedListener preferenceChangedListener) {
preferenceChangedListeners.add(preferenceChangedListener);
}
@Override
public void unregisterOnSharedPreferenceChangeListener(
PreferenceChangedListener preferenceChangedListener) {
preferenceChangedListeners.remove(preferenceChangedListener);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
for (PreferenceChangedListener preferenceChangedListener : preferenceChangedListeners) {
preferenceChangedListener.onPreferenceChanged(key,
sharedPreferences.getAll().get(key));
}
}
@Override
public boolean isEnabledConnectivityReceiver() {
return sharedPreferences.getBoolean(KEY_ENABLED_CONNECTIVITY_RECEIVER,
DEFAULT_ENABLED_CONNECTIVITY_RECEIVER);
}
@Override
public boolean setEnabledConnectivityReceiver(boolean enabled) {
return sharedPreferences.edit()
.putBoolean(KEY_ENABLED_CONNECTIVITY_RECEIVER, enabled)
.commit();
}
@Override
public boolean isEnabledNotifyReleasedToday() {
return sharedPreferences.getBoolean(KEY_ENABLED_NOTIFY_RELEASED_TODAY,
DEFAULT_ENABLED_NOTIFY_RELEASED_TODAY);
}
@Override
public boolean isEnabledNotifyNewReleases() {
return sharedPreferences.getBoolean(KEY_ENABLED_NOTIFY_NEW_RELEASES,
DEFAULT_ENABLED_NOTIFY_NEW_RELEASES);
}
@Override
public int getReleasedTodayScheduleHourOfDay() {
return sharedPreferences.getInt(KEY_RELEASED_TODAY_HOUR_OF_DAY,
DEFAULT_RELEASED_TODAY_HOUR_OF_DAY);
}
@Override
public boolean setReleasedTodaySchedule(int hourOfDay, int minute) {
return sharedPreferences.edit()
.putInt(KEY_RELEASED_TODAY_HOUR_OF_DAY, hourOfDay)
.putInt(KEY_RELEASED_TODAY_MINUTE, minute).commit();
}
@Override
public int getReleasedTodayScheduleMinute() {
return sharedPreferences.getInt(KEY_RELEASED_TODAY_MINUTE,
DEFAULT_RELEASED_TODAY_MINUTE);
}
@Override
public String getLogLevelFile() {
return sharedPreferences.getString(KEY_LOG_LEVEL_FILE, DEFAULT_LOG_LEVEL_FILE);
}
@Override
public String getLogLevelLogCat() {
return sharedPreferences.getString(KEY_LOG_LEVEL_LOGCAT,
DEFAULT_LOG_LEVEL_LOGCAT);
}
@Override
public boolean isNotifyRefreshErrors() {
return sharedPreferences.getBoolean(KEY_NOTIFY_REFRESH_ERRORS, DEFAULT_NOTIFY_REFRESH_ERRORS);
}
}