package com.plusonelabs.calendar.prefs; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.text.TextUtils; import com.plusonelabs.calendar.Alignment; import com.plusonelabs.calendar.EndedSomeTimeAgo; import com.plusonelabs.calendar.Theme; import com.plusonelabs.calendar.widget.EventEntryLayout; import java.util.HashSet; import java.util.Set; public class ApplicationPreferences { public static final String PREF_WIDGET_ID = "widgetId"; static final String PREF_TEXT_SIZE_SCALE = "textSizeScale"; static final String PREF_TEXT_SIZE_SCALE_DEFAULT = "1.0"; static final String PREF_MULTILINE_TITLE = "multiline_title"; static final boolean PREF_MULTILINE_TITLE_DEFAULT = false; static final String PREF_ACTIVE_CALENDARS = "activeCalendars"; static final String PREF_SHOW_DAYS_WITHOUT_EVENTS = "showDaysWithoutEvents"; static final String PREF_SHOW_DAY_HEADERS = "showDayHeaders"; static final String PREF_SHOW_WIDGET_HEADER = "showHeader"; static final String PREF_INDICATE_RECURRING = "indicateRecurring"; static final String PREF_INDICATE_ALERTS = "indicateAlerts"; static final String PREF_BACKGROUND_COLOR = "backgroundColor"; static final int PREF_BACKGROUND_COLOR_DEFAULT = 0x80000000; static final String PREF_DATE_FORMAT = "dateFormat"; static final String PREF_DATE_FORMAT_DEFAULT = "auto"; static final String PREF_EVENT_RANGE = "eventRange"; static final String PREF_EVENT_RANGE_DEFAULT = "30"; static final String PREF_EVENTS_ENDED = "eventsEnded"; static final String PREF_SHOW_END_TIME = "showEndTime"; static final boolean PREF_SHOW_END_TIME_DEFAULT = true; static final String PREF_SHOW_LOCATION = "showLocation"; static final boolean PREF_SHOW_LOCATION_DEFAULT = true; static final String PREF_FILL_ALL_DAY = "fillAllDay"; static final boolean PREF_FILL_ALL_DAY_DEFAULT = true; static final String PREF_ENTRY_THEME = "entryTheme"; public static final String PREF_ENTRY_THEME_DEFAULT = Theme.BLACK.name(); static final String PREF_HEADER_THEME = "headerTheme"; static final String PREF_HEADER_THEME_DEFAULT = Theme.DARK.name(); static final String PREF_DAY_HEADER_ALIGNMENT = "dayHeaderAlignment"; static final String PREF_DAY_HEADER_ALIGNMENT_DEFAULT = Alignment.RIGHT.name(); static final String PREF_SHOW_PAST_EVENTS_WITH_DEFAULT_COLOR = "showPastEventsWithDefaultColor"; static final String PREF_PAST_EVENTS_BACKGROUND_COLOR = "pastEventsBackgroundColor"; static final int PREF_PAST_EVENTS_BACKGROUND_COLOR_DEFAULT = 0x4affff2b; static final String PREF_HIDE_BASED_ON_KEYWORDS = "hideBasedOnKeywords"; static final String KEY_SHARE_EVENTS_FOR_DEBUGGING = "shareEventsForDebugging"; static final String PREF_ABBREVIATE_DATES = "abbreviateDates"; static final boolean PREF_ABBREVIATE_DATES_DEFAULT = false; static final String PREF_LOCK_TIME_ZONE = "lockTimeZone"; static final String PREF_LOCKED_TIME_ZONE_ID = "lockedTimeZoneId"; static final String PREF_EVENT_ENTRY_LAYOUT = "eventEntryLayout"; static final String PREF_SHOW_ONLY_CLOSEST_INSTANCE_OF_RECURRING_EVENT = "showOnlyClosestInstanceOfRecurringEvent"; static final String PREF_WIDGET_INSTANCE_NAME = "widgetInstanceName"; private static volatile String lockedTimeZoneId = null; private ApplicationPreferences() { // prohibit instantiation } public static void startEditing(Context context, Integer widgetId) { InstanceSettings settings = InstanceSettings.fromId(context, widgetId); setWidgetId(context, settings.getWidgetId()); setString(context, PREF_WIDGET_INSTANCE_NAME, settings.getWidgetInstanceName()); setActiveCalendars(context, settings.getActiveCalendars()); setEventRange(context, settings.getEventRange()); setEventsEnded(context, settings.getEventsEnded()); setFillAllDayEvents(context, settings.getFillAllDayEvents()); setHideBasedOnKeywords(context, settings.getHideBasedOnKeywords()); setInt(context, PREF_PAST_EVENTS_BACKGROUND_COLOR, settings.getPastEventsBackgroundColor()); setShowDaysWithoutEvents(context, settings.getShowDaysWithoutEvents()); setShowDayHeaders(context, settings.getShowDayHeaders()); setShowPastEventsWithDefaultColor(context, settings.getShowPastEventsWithDefaultColor()); setBoolean(context, PREF_SHOW_END_TIME, settings.getShowEndTime()); setBoolean(context, PREF_SHOW_LOCATION, settings.getShowLocation()); setString(context, PREF_DATE_FORMAT, settings.getDateFormat()); setAbbreviateDates(context, settings.getAbbreviateDates()); setLockedTimeZoneId(context, settings.getLockedTimeZoneId()); setString(context, PREF_EVENT_ENTRY_LAYOUT, settings.getEventEntryLayout().value); setBoolean(context, PREF_MULTILINE_TITLE, settings.isTitleMultiline()); setBoolean(context, PREF_SHOW_ONLY_CLOSEST_INSTANCE_OF_RECURRING_EVENT, settings .getShowOnlyClosestInstanceOfRecurringEvent()); setBoolean(context, PREF_INDICATE_ALERTS, settings.getIndicateAlerts()); setBoolean(context, PREF_INDICATE_RECURRING, settings.getIndicateRecurring()); setString(context, PREF_ENTRY_THEME, settings.getEntryTheme()); setString(context, PREF_HEADER_THEME, settings.getHeaderTheme()); setBoolean(context, PREF_SHOW_WIDGET_HEADER, settings.getShowWidgetHeader()); setInt(context, PREF_BACKGROUND_COLOR, settings.getBackgroundColor()); setString(context, PREF_TEXT_SIZE_SCALE, settings.getTextSizeScale()); setString(context, PREF_DAY_HEADER_ALIGNMENT, settings.getDayHeaderAlignment()); } public static void save(Context context, int wigdetId) { if (wigdetId != 0 && wigdetId == getWidgetId(context)) { InstanceSettings.save(context, wigdetId); } } public static InstanceSettings currentSettings(Context context) { return InstanceSettings.fromId(context, getWidgetId(context)); } public static int getWidgetId(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getInt(PREF_WIDGET_ID, 0); } public static void setWidgetId(Context context, int value) { setInt(context, PREF_WIDGET_ID, value); } public static Set<String> getActiveCalendars(Context context) { Set<String> activeCalendars = PreferenceManager.getDefaultSharedPreferences(context) .getStringSet(PREF_ACTIVE_CALENDARS, null); if (activeCalendars == null) { activeCalendars = new HashSet<>(); } return activeCalendars; } public static void setActiveCalendars(Context context, Set<String> calendars) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putStringSet(PREF_ACTIVE_CALENDARS, calendars); editor.apply(); } public static int getEventRange(Context context) { return Integer.valueOf(PreferenceManager.getDefaultSharedPreferences(context) .getString(PREF_EVENT_RANGE, PREF_EVENT_RANGE_DEFAULT)); } public static void setEventRange(Context context, int value) { setString(context, PREF_EVENT_RANGE, Integer.toString(value)); } public static EndedSomeTimeAgo getEventsEnded(Context context) { return EndedSomeTimeAgo.fromValue(PreferenceManager.getDefaultSharedPreferences(context).getString( PREF_EVENTS_ENDED, "")); } public static void setEventsEnded(Context context, EndedSomeTimeAgo value) { setString(context, PREF_EVENTS_ENDED, value.save()); } public static boolean getFillAllDayEvents(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_FILL_ALL_DAY, PREF_FILL_ALL_DAY_DEFAULT); } private static void setFillAllDayEvents(Context context, boolean value) { setBoolean(context, PREF_FILL_ALL_DAY, value); } public static String getHideBasedOnKeywords(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getString(PREF_HIDE_BASED_ON_KEYWORDS, ""); } private static void setHideBasedOnKeywords(Context context, String value) { setString(context, PREF_HIDE_BASED_ON_KEYWORDS, value); } public static int getPastEventsBackgroundColor(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getInt( PREF_PAST_EVENTS_BACKGROUND_COLOR, PREF_PAST_EVENTS_BACKGROUND_COLOR_DEFAULT); } public static boolean getShowDaysWithoutEvents(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_SHOW_DAYS_WITHOUT_EVENTS, false); } private static void setShowDaysWithoutEvents(Context context, boolean value) { setBoolean(context, PREF_SHOW_DAYS_WITHOUT_EVENTS, value); } public static boolean getShowDayHeaders(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_SHOW_DAY_HEADERS, true); } private static void setShowDayHeaders(Context context, boolean value) { setBoolean(context, PREF_SHOW_DAY_HEADERS, value); } public static boolean getShowPastEventsWithDefaultColor(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_SHOW_PAST_EVENTS_WITH_DEFAULT_COLOR, false); } public static void setShowPastEventsWithDefaultColor(Context context, boolean value) { setBoolean(context, PREF_SHOW_PAST_EVENTS_WITH_DEFAULT_COLOR, value); } public static boolean getShowEndTime(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_SHOW_END_TIME, PREF_SHOW_END_TIME_DEFAULT); } public static boolean getShowLocation(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_SHOW_LOCATION, PREF_SHOW_LOCATION_DEFAULT); } public static String getDateFormat(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getString( PREF_DATE_FORMAT, PREF_DATE_FORMAT_DEFAULT); } public static boolean getAbbreviateDates(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_ABBREVIATE_DATES, PREF_ABBREVIATE_DATES_DEFAULT); } public static void setAbbreviateDates(Context context, boolean value) { setBoolean(context, PREF_ABBREVIATE_DATES, value); } public static String getLockedTimeZoneId(Context context) { if (lockedTimeZoneId != null) { return lockedTimeZoneId; } lockedTimeZoneId = PreferenceManager.getDefaultSharedPreferences(context).getString(PREF_LOCKED_TIME_ZONE_ID, ""); return lockedTimeZoneId; } public static void setLockedTimeZoneId(Context context, String value) { lockedTimeZoneId = value; setString(context, PREF_LOCKED_TIME_ZONE_ID, value); } public static boolean isTimeZoneLocked(Context context) { return !TextUtils.isEmpty(getLockedTimeZoneId(context)); } public static EventEntryLayout getEventEntryLayout(Context context) { return EventEntryLayout.fromValue(PreferenceManager.getDefaultSharedPreferences(context).getString( PREF_EVENT_ENTRY_LAYOUT, "")); } public static boolean isTitleMultiline(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_MULTILINE_TITLE, PREF_MULTILINE_TITLE_DEFAULT); } public static boolean getShowOnlyClosestInstanceOfRecurringEvent(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(PREF_SHOW_ONLY_CLOSEST_INSTANCE_OF_RECURRING_EVENT, false); } public static void setShowOnlyClosestInstanceOfRecurringEvent(Context context, boolean value) { setBoolean(context, PREF_SHOW_ONLY_CLOSEST_INSTANCE_OF_RECURRING_EVENT, value); } private static void setString(Context context, String key, String value) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putString(key, value); editor.apply(); } public static String getString(Context context, String key, String defaultValue) { return PreferenceManager.getDefaultSharedPreferences(context).getString(key, defaultValue); } private static void setBoolean(Context context, String key, boolean value) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(key, value); editor.apply(); } public static boolean getBoolean(Context context, String key, boolean defaultValue) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(key, defaultValue); } public static void setInt(Context context, String key, int value) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); editor.putInt(key, value); editor.apply(); } public static int getInt(Context context, String key, int defaultValue) { return PreferenceManager.getDefaultSharedPreferences(context).getInt(key, defaultValue); } public static String getWidgetInstanceName(Context context) { return getString(context, PREF_WIDGET_INSTANCE_NAME, ""); } }