package org.liberty.android.fantastischmemo.entity; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import org.liberty.android.fantastischmemo.common.AMPrefKeys; import org.liberty.android.fantastischmemo.modules.ForApplication; import org.liberty.android.fantastischmemo.modules.PerApplication; import javax.inject.Inject; @PerApplication public class SchedulingAlgorithmParameters { private SharedPreferences settings; private SharedPreferences.Editor editor; private static float[] defaultInitialIntervals = {0.0f, 0.0f, 1.0f, 3.0f, 4.0f, 5.0f}; private static float defaultMinimalInterval = 0.9f; private static float[] defaultFailedGradingIntervals = {0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f}; private static float defaultInitialEasiness = 2.5f; private static float defaultMinimalEasiness = 1.3f; private static float[] defaultEasinessIncrementals = {0.0f, 0.0f, -0.16f, -0.14f, 0.0f, 0.10f}; private static boolean defaultEnableNoise = true; private static String defaultReviewOrdering = "HardestFirst"; @Inject public SchedulingAlgorithmParameters(@ForApplication Context context) { settings = PreferenceManager.getDefaultSharedPreferences(context); editor = settings.edit(); } public float getInitialInterval(int grade) { assert grade < defaultInitialIntervals.length; return settings.getFloat(AMPrefKeys.getInitialGradingIntervalKey(grade), defaultInitialIntervals[grade]); } public float getMinimalInterval() { return settings.getFloat(AMPrefKeys.MINIMAL_INTERVAL_KEY, defaultMinimalInterval); } public float getFailedGradingInterval(int grade) { assert grade < defaultFailedGradingIntervals.length; return settings.getFloat(AMPrefKeys.getFailedGradingIntervalKey(grade), defaultFailedGradingIntervals[grade]); } public float getInitialEasiness() { return settings.getFloat(AMPrefKeys.INITIAL_EASINESS_KEY, defaultInitialEasiness); } public float getMinimalEasiness() { return settings.getFloat(AMPrefKeys.MINIMAL_EASINESS_KEY, defaultMinimalEasiness); } public float getEasinessIncremental(int grade) { assert grade < defaultFailedGradingIntervals.length; return settings.getFloat(AMPrefKeys.getEasinessIncrementalKey(grade), defaultEasinessIncrementals[grade]); } public boolean getEnableNoise() { return settings.getBoolean(AMPrefKeys.ENABLE_NOISE_KEY, defaultEnableNoise); } /** * Get the review ordering * @return the review ordering */ public ReviewOrdering getReviewOrdering() { return ReviewOrdering.valueOf(settings.getString("review_ordering", "HardestFirst")); } /* * Reset all the scheduling algorithm parameters to default. */ public void reset() { int[] grades = {0, 1, 2, 3, 4, 5}; for (int grade : grades) { editor.putFloat(AMPrefKeys.getInitialGradingIntervalKey(grade), defaultInitialIntervals[grade]); editor.putFloat(AMPrefKeys.getFailedGradingIntervalKey(grade), defaultFailedGradingIntervals[grade]); editor.putFloat(AMPrefKeys.getEasinessIncrementalKey(grade), defaultEasinessIncrementals[grade]); } editor.putBoolean(AMPrefKeys.ENABLE_NOISE_KEY, defaultEnableNoise); editor.putFloat(AMPrefKeys.MINIMAL_INTERVAL_KEY, defaultMinimalInterval); editor.putFloat(AMPrefKeys.INITIAL_EASINESS_KEY, defaultInitialEasiness); editor.putFloat(AMPrefKeys.MINIMAL_EASINESS_KEY, defaultMinimalEasiness); editor.putString(AMPrefKeys.REVIEW_ORDERING_KEY, defaultReviewOrdering); editor.putString(AMPrefKeys.LEARN_QUEUE_SIZE_KEY, "10"); editor.commit(); } }