/* * Copyright (C) 2011 The original author or authors. * * 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.zapta.apps.maniana.settings; import javax.annotation.Nullable; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import com.zapta.apps.maniana.annotations.MainActivityScope; import com.zapta.apps.maniana.util.LogUtil; /** * Provides a layer of caching on for some of PreferencesReader's preferences. * * TODO: simplify this class by removing settings that are not used often. These * settings will be read directly from the preferences reader. * * @author Tal Dayan */ @MainActivityScope public class PreferencesTracker { public static interface PreferenceChangeListener { void onPreferenceChange(PreferenceKind preferenceKind); } private final PreferencesReader mPreferencesReader; private final PreferenceChangeListener mOutgoingListener; private final OnSharedPreferenceChangeListener mIncomingListener; // Sound private boolean mCachedAllowSoundsPreference; private ApplauseLevel mCachedApplauseLevelPreference; // Behavior private boolean mCachedStartupAnimationPreference; private boolean mCachedVerboseMessagesPreference; private boolean mCachedAutoSortPreference; private boolean mCachedAddToTopPreference; private ItemColorsSet mCachedItemColorsPreference; private boolean mCachedShakerEnabledPreference; private int mCachedShakerSensitivityPreference; // Page private boolean mCachedPageBackgroundPaperPreference; private int mCachedPagePaperColorPreference; private int mCachedPageBackgroundSolidColorPreference; private PageIconSet mCachedPageIconSetPreference; private Font mCachedPageTitleFontPreference; private int mCachedPageTitleFontSizePreference; private int mCachedPageTitleTodayColorPreference; private int mCachedPageTitleTomorrowColorPreference; private Font mCachedPageItemFontPreference; private int mCachedPageItemFontSizePreference; private int mCachedPageItemActiveTextColorPreference; private int mCachedPageItemCompletedTextColorPreference; private int mCachedPageItemDividerColorPreference; @Nullable private ItemFontVariation mCachedPageItemFontVariation; // This is a hack to keep the listener from being garbage collected per // http://tinyurl.com/blkycrk. Should be unregistered explicitly when main activity is // destroyed. public PreferencesTracker(PreferencesReader preferencesReader, PreferenceChangeListener outgoingListener) { mPreferencesReader = preferencesReader; mOutgoingListener = outgoingListener; // Get initial values updateCachedAllowSoundsPreference(); updateCachedApplauseLevelPreference(); updateCachedAutoSortPreference(); updateCachedAddToTopPreference(); updateCachedItemColorsPreference(); updateCachedShakerEnabledPreference(); updateCachedShakerSensitivityPreference(); updateCachedPageIconSetPreference(); updateCachedPageItemFontPreference(); updateCachedPageTitleFontPreference(); updateCachedPageTitleFontSizePreference(); updateCachedPageTitleTodayTextColorPreference(); updateCachedPageTitleTomorrowTextColorPreference(); updateCachedPageFontSizePreference(); updateCachedPageItemActiveTextColorPreference(); updateCachedPageItemCompletedTextColorPreference(); updateCachedPageBackgroundPaperPreference(); updateCachedPagePaperColorPreference(); updateCachedPageBackgroundSolidColorPreference(); updateCachedPageItemDividerColorPreference(); updateCachedVerboseMessagesPreference(); updateCachedStartupAnimationPreference(); mIncomingListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { onPreferenceChange(key); } }; mPreferencesReader.sharedPreferences().registerOnSharedPreferenceChangeListener( this.mIncomingListener); } public final PreferencesReader reader() { return mPreferencesReader; } // --------------- Sound --------------------- private final void updateCachedAllowSoundsPreference() { mCachedAllowSoundsPreference = mPreferencesReader.getAllowSoundsPreference(); } // TODO: consistent name for this pref public final boolean getSoundEnabledPreference() { return mCachedAllowSoundsPreference; } private final void updateCachedApplauseLevelPreference() { mCachedApplauseLevelPreference = mPreferencesReader.getApplauseLevelPreference(); } /** Should be ignored if sound is disabled */ public final ApplauseLevel getApplauseLevelPreference() { return mCachedApplauseLevelPreference; } // --------------- Behavior --------------------- private final void updateCachedStartupAnimationPreference() { mCachedStartupAnimationPreference = mPreferencesReader.getStartupAnimationPreference(); } public final boolean getStartupAnimationPreference() { return mCachedStartupAnimationPreference; } private final void updateCachedVerboseMessagesPreference() { mCachedVerboseMessagesPreference = mPreferencesReader.getVerboseMessagesPreference(); } public final boolean getVerboseMessagesEnabledPreference() { return mCachedVerboseMessagesPreference; } private final void updateCachedAutoSortPreference() { mCachedAutoSortPreference = mPreferencesReader.getAutoSortPreference(); } public final boolean getAutoSortPreference() { return mCachedAutoSortPreference; } private final void updateCachedAddToTopPreference() { mCachedAddToTopPreference = mPreferencesReader.getAddToTopPreference(); } public final boolean getAddToTopPreference() { return mCachedAddToTopPreference; } private final void updateCachedItemColorsPreference() { mCachedItemColorsPreference = mPreferencesReader.getItemColorsPreference(); } public final ItemColorsSet getItemColorsPreference() { return mCachedItemColorsPreference; } private final void updateCachedShakerEnabledPreference() { mCachedShakerEnabledPreference = mPreferencesReader.getShakerEnabledPreference(); } public final boolean getShakerEnabledPreference() { return mCachedShakerEnabledPreference; } private final void updateCachedShakerSensitivityPreference() { mCachedShakerSensitivityPreference = mPreferencesReader.getShakerSensitivityPreference(); } public final int getShakerSensitivityPreference() { return mCachedShakerSensitivityPreference; } // --------------- Pages ------------------------ private final void updateCachedPageBackgroundPaperPreference() { mCachedPageBackgroundPaperPreference = mPreferencesReader .getPageBackgroundPaperPreference(); } public final boolean getBackgroundPaperPreference() { return mCachedPageBackgroundPaperPreference; } private final void updateCachedPagePaperColorPreference() { mCachedPagePaperColorPreference = mPreferencesReader.getPagePaperColorPreference(); } public final int getPagePaperColorPreference() { return mCachedPagePaperColorPreference; } private final void updateCachedPageBackgroundSolidColorPreference() { mCachedPageBackgroundSolidColorPreference = mPreferencesReader .getPageBackgroundSolidColorPreference(); } public final int getPageBackgroundSolidColorPreference() { return mCachedPageBackgroundSolidColorPreference; } private final void updateCachedPageIconSetPreference() { mCachedPageIconSetPreference = mPreferencesReader.getPageIconSetPreference(); } public final PageIconSet getPageIconSetPreference() { return mCachedPageIconSetPreference; } private final void updateCachedPageTitleFontPreference() { mCachedPageTitleFontPreference = mPreferencesReader.getPageTitleFontPreference(); } public final Font getPageTitleFontPreference() { return mCachedPageTitleFontPreference; } private final void updateCachedPageTitleFontSizePreference() { mCachedPageTitleFontSizePreference = mPreferencesReader.getPageTitleFontSizePreference(); } public final int getPageTitleFontSizePreference() { return mCachedPageTitleFontSizePreference; } private final void updateCachedPageTitleTodayTextColorPreference() { mCachedPageTitleTodayColorPreference = mPreferencesReader .getPageTitleTodayTextColorPreference(); } public final int getPageTitleTodayColor() { return mCachedPageTitleTodayColorPreference; } private final void updateCachedPageTitleTomorrowTextColorPreference() { mCachedPageTitleTomorrowColorPreference = mPreferencesReader .getPageTitleTomorrowTextColorPreference(); } public final int getPageTitleTomorowColor() { return mCachedPageTitleTomorrowColorPreference; } private final void updateCachedPageItemFontPreference() { mCachedPageItemFontPreference = mPreferencesReader.getPageItemFontPreference(); } public final Font getItemFontPreference() { return mCachedPageItemFontPreference; } private final void updateCachedPageFontSizePreference() { mCachedPageItemFontSizePreference = mPreferencesReader.getPageFontSizePreference(); } public final int getItemFontSizePreference() { return mCachedPageItemFontSizePreference; } private final void updateCachedPageItemActiveTextColorPreference() { mCachedPageItemActiveTextColorPreference = mPreferencesReader .getPageItemActiveTextColorPreference(); } public int getPageItemActiveTextColorPreference() { return mCachedPageItemActiveTextColorPreference; } private final void updateCachedPageItemCompletedTextColorPreference() { mCachedPageItemCompletedTextColorPreference = mPreferencesReader .getPageItemCompletedTextColorPreference(); } public int getPageItemCompletedTextColorPreference() { return mCachedPageItemCompletedTextColorPreference; } private final void updateCachedPageItemDividerColorPreference() { mCachedPageItemDividerColorPreference = mPreferencesReader .getPageItemDividerColorPreference(); } public final int getPageItemDividerColorPreference() { return mCachedPageItemDividerColorPreference; } /** Get current item font variation */ public final ItemFontVariation getPageItemFontVariation() { if (mCachedPageItemFontVariation == null) { mCachedPageItemFontVariation = ItemFontVariation.newFromPagePreferences( mPreferencesReader.context(), this); } return mCachedPageItemFontVariation; } /** * Handle preferences change. * * @param key the preference key string as defined in preferences.xml. */ private final void onPreferenceChange(String key) { // Map key to enum value. Do nothing if not found. final PreferenceKind id = PreferenceKind.fromKey(key); if (id == null) { LogUtil.error("Unknown setting key: " + key); return; } // TODO: order by definition order of PreferenceKind. switch (id) { // Sound case SOUND_ENABLED: updateCachedAllowSoundsPreference(); break; case APPLAUSE_LEVEL: updateCachedApplauseLevelPreference(); break; // Behavior case AUTO_SORT: updateCachedAutoSortPreference(); break; case ADD_TO_TOP: updateCachedAddToTopPreference(); break; case ITEM_COLORS: updateCachedItemColorsPreference(); break; case AUTO_DAILY_CLEANUP: case LOCK_PERIOD: // Not cached break; case VERBOSE_MESSAGES: updateCachedVerboseMessagesPreference(); break; case STARTUP_ANIMATION: updateCachedStartupAnimationPreference(); break; case DAILY_NOTIFICATION: case NOTIFICATION_LED: // Do nothing break; // Shaker case SHAKER_ENABLED: updateCachedShakerEnabledPreference(); break; case SHAKER_ACTION: // Not cached break; case SHAKER_SENSITIVITY: updateCachedShakerSensitivityPreference(); break; // Page case PAGE_ICON_SET: updateCachedPageIconSetPreference(); break; case PAGE_TITLE_FONT: updateCachedPageTitleFontPreference(); break; case PAGE_TITLE_FONT_SIZE: updateCachedPageTitleFontSizePreference(); break; case PAGE_TITLE_TODAY_COLOR: updateCachedPageTitleTodayTextColorPreference(); break; case PAGE_TITLE_TOMORROW_COLOR: updateCachedPageTitleTomorrowTextColorPreference(); break; case PAGE_ITEM_FONT: mCachedPageItemFontVariation = null; updateCachedPageItemFontPreference(); break; case PAGE_ITEM_FONT_SIZE: mCachedPageItemFontVariation = null; updateCachedPageFontSizePreference(); break; case PAGE_ITEM_ACTIVE_TEXT_COLOR: mCachedPageItemFontVariation = null; updateCachedPageItemActiveTextColorPreference(); break; case PAGE_ITEM_COMPLETED_TEXT_COLOR: mCachedPageItemFontVariation = null; updateCachedPageItemCompletedTextColorPreference(); break; case PAGE_BACKGROUND_PAPER: updateCachedPageBackgroundPaperPreference(); break; case PAGE_PAPER_COLOR: updateCachedPagePaperColorPreference(); break; case PAGE_BACKGROUND_SOLID_COLOR: updateCachedPageBackgroundSolidColorPreference(); break; case PAGE_ITEM_DIVIDER_COLOR: updateCachedPageItemDividerColorPreference(); break; // Widget case WIDGET_BACKGROUND_PAPER: case WIDGET_PAPER_COLOR: case WIDGET_BACKGROUND_COLOR: case WIDGET_ITEM_FONT: case WIDGET_ITEM_TEXT_COLOR: case WIDGET_ITEM_FONT_SIZE: case WIDGET_AUTO_FIT: case WIDGET_SHOW_COMPLETED_ITEMS: case WIDGET_ITEM_COMPLETED_TEXT_COLOR: case WIDGET_SHOW_TOOLBAR: case WIDGET_SHOW_DATE: case WIDGET_SINGLE_LINE: case DEBUG_MODE: case CALENDAR_LAUNCH: // These ones are not cached or used here. Just reported to controller to // trigger the widget update and backup service. break; default: // Report and ignore this call. LogUtil.error("Unknown changed preference key: %s", key); return; } // Inform the controller about the prefernce change. At this point, this object already // cached the new values. mOutgoingListener.onPreferenceChange(id); } /** Release resources. This is the last call to this instance. */ public void release() { // Per http://tinyurl.com/blkycrk mPreferencesReader.sharedPreferences().unregisterOnSharedPreferenceChangeListener( this.mIncomingListener); } }