/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker 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.
*
* Loop Habit Tracker 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.isoron.uhabits.preferences;
import android.content.*;
import android.preference.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.models.*;
import java.util.*;
import javax.inject.*;
@AppScope
public class Preferences
implements SharedPreferences.OnSharedPreferenceChangeListener
{
private final Context context;
private SharedPreferences prefs;
private Boolean shouldReverseCheckmarks = null;
private LinkedList<Listener> listeners;
@Inject
public Preferences(@AppContext Context context)
{
this.context = context;
listeners = new LinkedList<>();
prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);
}
public void addListener(Listener listener)
{
listeners.add(listener);
}
public Integer getDefaultHabitColor(int fallbackColor)
{
return prefs.getInt("pref_default_habit_palette_color", fallbackColor);
}
public HabitList.Order getDefaultOrder()
{
String name = prefs.getString("pref_default_order", "BY_POSITION");
try
{
return HabitList.Order.valueOf(name);
}
catch (IllegalArgumentException e)
{
setDefaultOrder(HabitList.Order.BY_POSITION);
return HabitList.Order.BY_POSITION;
}
}
public int getDefaultScoreSpinnerPosition()
{
int defaultScoreInterval = prefs.getInt("pref_score_view_interval", 1);
if (defaultScoreInterval > 5 || defaultScoreInterval < 0)
defaultScoreInterval = 1;
return defaultScoreInterval;
}
public void setDefaultOrder(HabitList.Order order)
{
prefs.edit().putString("pref_default_order", order.name()).apply();
}
public void setDefaultScoreSpinnerPosition(int position)
{
prefs.edit().putInt("pref_score_view_interval", position).apply();
}
/**
* Returns the number of the last hint shown to the user.
*
* @return number of last hint shown
*/
public int getLastHintNumber()
{
return prefs.getInt("last_hint_number", -1);
}
/**
* Returns the time when the last hint was shown to the user.
*
* @return timestamp of the day the last hint was shown
*/
public long getLastHintTimestamp()
{
return prefs.getLong("last_hint_timestamp", -1);
}
public boolean getShowArchived()
{
return prefs.getBoolean("pref_show_archived", false);
}
public void setShowArchived(boolean showArchived)
{
prefs.edit().putBoolean("pref_show_archived", showArchived).apply();
}
public boolean getShowCompleted()
{
return prefs.getBoolean("pref_show_completed", true);
}
public void setShowCompleted(boolean showCompleted)
{
prefs.edit().putBoolean("pref_show_completed", showCompleted).apply();
}
public long getSnoozeInterval()
{
return Long.parseLong(prefs.getString("pref_snooze_interval", "15"));
}
public int getTheme()
{
return prefs.getInt("pref_theme", ThemeSwitcher.THEME_LIGHT);
}
public void setTheme(int theme)
{
prefs.edit().putInt("pref_theme", theme).apply();
}
public void incrementLaunchCount()
{
int count = prefs.getInt("launch_count", 0);
prefs.edit().putInt("launch_count", count + 1).apply();
}
public void initialize()
{
PreferenceManager.setDefaultValues(context, R.xml.preferences, false);
}
public boolean isFirstRun()
{
return prefs.getBoolean("pref_first_run", true);
}
public void setFirstRun(boolean isFirstRun)
{
prefs.edit().putBoolean("pref_first_run", isFirstRun).apply();
}
public boolean isPureBlackEnabled()
{
return prefs.getBoolean("pref_pure_black", false);
}
public boolean isShortToggleEnabled()
{
return prefs.getBoolean("pref_short_toggle", false);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key)
{
if (key.equals("pref_checkmark_reverse_order"))
{
shouldReverseCheckmarks = null;
for(Listener l : listeners) l.onCheckmarkOrderChanged();
}
if(key.equals("pref_sticky_notifications"))
{
for(Listener l : listeners) l.onNotificationsChanged();
}
}
public void removeListener(Listener listener)
{
listeners.remove(listener);
}
public void setDefaultHabitColor(int color)
{
prefs.edit().putInt("pref_default_habit_palette_color", color).apply();
}
public void setShouldReverseCheckmarks(boolean reverse)
{
shouldReverseCheckmarks = null;
prefs
.edit()
.putBoolean("pref_checkmark_reverse_order", reverse)
.apply();
for(Listener l : listeners) l.onCheckmarkOrderChanged();
}
public boolean shouldReverseCheckmarks()
{
if (shouldReverseCheckmarks == null) shouldReverseCheckmarks =
prefs.getBoolean("pref_checkmark_reverse_order", false);
return shouldReverseCheckmarks;
}
public boolean shouldMakeNotificationsSticky()
{
return prefs.getBoolean("pref_sticky_notifications", false);
}
public void updateLastAppVersion()
{
prefs.edit().putInt("last_version", BuildConfig.VERSION_CODE).apply();
}
/**
* Sets the last hint shown to the user, and the time that it was shown.
*
* @param number number of the last hint shown
* @param timestamp timestamp for the day the last hint was shown
*/
public void updateLastHint(int number, long timestamp)
{
prefs
.edit()
.putInt("last_hint_number", number)
.putLong("last_hint_timestamp", timestamp)
.apply();
}
public interface Listener
{
default void onCheckmarkOrderChanged() {}
default void onNotificationsChanged() {}
}
}