1 package org.easyrpg.player.settings; 2 3 import android.content.Context; 4 import android.content.SharedPreferences; 5 import android.os.Environment; 6 import android.preference.PreferenceManager; 7 import android.widget.Toast; 8 9 import org.easyrpg.player.R; 10 import org.easyrpg.player.game_browser.GameBrowserHelper; 11 12 import java.io.File; 13 import java.util.ArrayList; 14 import java.util.List; 15 16 import static org.easyrpg.player.settings.SettingsEnum.AUDIO_ENABLED; 17 import static org.easyrpg.player.settings.SettingsEnum.FAST_FORWARD_MODE; 18 import static org.easyrpg.player.settings.SettingsEnum.FAST_FORWARD_MULTIPLIER; 19 import static org.easyrpg.player.settings.SettingsEnum.FAVORITE_GAMES; 20 import static org.easyrpg.player.settings.SettingsEnum.FORCED_LANDSCAPE; 21 import static org.easyrpg.player.settings.SettingsEnum.GAMES_DIRECTORY; 22 import static org.easyrpg.player.settings.SettingsEnum.IGNORE_LAYOUT_SIZE_SETTINGS; 23 import static org.easyrpg.player.settings.SettingsEnum.LAYOUT_SIZE; 24 import static org.easyrpg.player.settings.SettingsEnum.LAYOUT_TRANSPARENCY; 25 import static org.easyrpg.player.settings.SettingsEnum.MAIN_DIRECTORY; 26 import static org.easyrpg.player.settings.SettingsEnum.VIBRATE_WHEN_SLIDING_DIRECTION; 27 import static org.easyrpg.player.settings.SettingsEnum.VIBRATION_ENABLED; 28 29 public class SettingsManager { 30 private final static long VIBRATION_DURATION = 20; // ms 31 32 private static SharedPreferences pref; 33 private static SharedPreferences.Editor editor; 34 private static Context context; 35 36 private static boolean vibrationEnabled; 37 private static boolean vibrateWhenSlidingDirectionEnabled; 38 private static boolean audioEnabled; 39 private static boolean ignoreLayoutSizePreferencesEnabled; 40 private static boolean forcedLandscape; 41 private static int layoutTransparency, layoutSize, fastForwardMode, fastForwardMultiplier; 42 private static String easyRPGFolder; 43 private static List<String> gamesFolderList = new ArrayList<>(); 44 private static List<String> favoriteGamesList = new ArrayList<>(); 45 SettingsManager()46 private SettingsManager() { 47 } 48 init(Context context)49 public static void init(Context context) { 50 SettingsManager.context = context; 51 SettingsManager.pref = PreferenceManager.getDefaultSharedPreferences(context); 52 SettingsManager.editor = pref.edit(); 53 54 loadSettings(); 55 } 56 loadSettings()57 private static void loadSettings() { 58 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 59 60 vibrationEnabled = sharedPref.getBoolean(VIBRATION_ENABLED.toString(), true); 61 audioEnabled = sharedPref.getBoolean(AUDIO_ENABLED.toString(), true); 62 layoutTransparency = sharedPref.getInt(LAYOUT_TRANSPARENCY.toString(), 100); 63 vibrateWhenSlidingDirectionEnabled = sharedPref.getBoolean(VIBRATE_WHEN_SLIDING_DIRECTION.toString(), false); 64 ignoreLayoutSizePreferencesEnabled = sharedPref.getBoolean(IGNORE_LAYOUT_SIZE_SETTINGS.toString(), false); 65 layoutSize = sharedPref.getInt(LAYOUT_SIZE.toString(), 100); 66 easyRPGFolder = sharedPref.getString(MAIN_DIRECTORY.toString(), 67 Environment.getExternalStorageDirectory().getPath() + "/easyrpg"); 68 forcedLandscape = sharedPref.getBoolean(FORCED_LANDSCAPE.toString(), false); 69 fastForwardMode = sharedPref.getInt(FAST_FORWARD_MODE.toString(), 0); 70 fastForwardMultiplier = sharedPref.getInt(FAST_FORWARD_MULTIPLIER.toString(), 3); 71 72 // Fetch the games directories : 73 gamesFolderList = new ArrayList<>(); 74 // 1) The default directory (cannot be modified) 75 gamesFolderList.add(easyRPGFolder + "/games"); 76 // 2) Others defined by users (separator : "*") 77 String gameFolderListString = sharedPref.getString(GAMES_DIRECTORY.toString(), ""); 78 if (!gameFolderListString.isEmpty()) { 79 for (String folder : gameFolderListString.split("\\*")) { 80 if (!gamesFolderList.contains(folder)) { 81 gamesFolderList.add(folder); 82 } 83 } 84 } 85 86 // Fetch the favorite game list : 87 favoriteGamesList = new ArrayList<>(); 88 String favoriteGamesListString = sharedPref.getString(FAVORITE_GAMES.toString(), ""); 89 if (!favoriteGamesListString.isEmpty()) { 90 for (String folder : favoriteGamesListString.split("\\*")) { 91 if (!favoriteGamesList.contains(folder)) { 92 favoriteGamesList.add(folder); 93 } 94 // TODO : Remove folder that doesn't exist 95 } 96 } 97 } 98 getGamesFolderList()99 public static List<String> getGamesFolderList() { 100 return gamesFolderList; 101 } 102 getFavoriteGamesList()103 public static List<String> getFavoriteGamesList() { 104 return favoriteGamesList; 105 } 106 addGameDirectory(String pathToAdd)107 public static void addGameDirectory(String pathToAdd) { 108 pathToAdd = pathToAdd.trim(); 109 110 // 1) The game folder must not be already in the list 111 if (gamesFolderList.contains(pathToAdd)) { 112 return; 113 } 114 115 // 2) Verify read permission 116 File f = new File(pathToAdd); 117 if (!f.canRead()) { 118 Toast.makeText(context, context.getString(R.string.path_not_readable).replace("$PATH", pathToAdd), Toast.LENGTH_LONG).show(); 119 return; 120 } 121 122 // 3) When the user selects a directory containing a game, select automatically the folder above 123 if (GameBrowserHelper.isRpg2kGame(f)) { 124 pathToAdd = pathToAdd.substring(0, pathToAdd.lastIndexOf("/")); 125 } 126 127 // Update user's preferences 128 gamesFolderList.add(pathToAdd); 129 130 setGameFolderList(gamesFolderList); 131 } 132 removeAGameFolder(String path)133 public static void removeAGameFolder(String path) { 134 gamesFolderList.remove(path); 135 setGameFolderList(gamesFolderList); 136 } 137 setGameFolderList(List<String> folderList)138 private static void setGameFolderList(List<String> folderList) { 139 gamesFolderList = folderList; 140 141 StringBuilder sb = new StringBuilder(); 142 for (String folder : gamesFolderList) { 143 sb.append(folder).append('*'); 144 } 145 editor.putString(SettingsEnum.GAMES_DIRECTORY.toString(), sb.toString()); 146 editor.commit(); 147 } 148 addFavoriteGame(String pathToAdd)149 public static void addFavoriteGame(String pathToAdd) { 150 pathToAdd = pathToAdd.trim(); 151 152 // 1) The game folder must not be already in the list 153 if (favoriteGamesList.contains(pathToAdd)) { 154 return; 155 } 156 157 // 2) Verify read permission 158 File f = new File(pathToAdd); 159 if (!f.canRead()) { 160 Toast.makeText(context, context.getString(R.string.path_not_readable).replace("$PATH", pathToAdd), Toast.LENGTH_LONG).show(); 161 return; 162 } 163 164 // Update user's preferences 165 favoriteGamesList.add(pathToAdd); 166 167 setFavoriteGamesList(favoriteGamesList); 168 } 169 removeAFavoriteGame(String path)170 public static void removeAFavoriteGame(String path) { 171 favoriteGamesList.remove(path); 172 setFavoriteGamesList(favoriteGamesList); 173 } 174 setFavoriteGamesList(List<String> folderList)175 private static void setFavoriteGamesList(List<String> folderList) { 176 favoriteGamesList = folderList; 177 178 StringBuilder sb = new StringBuilder(); 179 for (String folder : favoriteGamesList) { 180 sb.append(folder).append('*'); 181 } 182 editor.putString(FAVORITE_GAMES.toString(), sb.toString()); 183 editor.commit(); 184 } 185 getEasyRPGFolder()186 public static String getEasyRPGFolder() { 187 return easyRPGFolder; 188 } 189 getVibrationDuration()190 public static long getVibrationDuration() { 191 return VIBRATION_DURATION; 192 } 193 isVibrationEnabled()194 public static boolean isVibrationEnabled() { 195 return vibrationEnabled; 196 } 197 setVibrationEnabled(boolean b)198 public static void setVibrationEnabled(boolean b) { 199 vibrationEnabled = b; 200 editor.putBoolean(SettingsEnum.VIBRATION_ENABLED.toString(), b); 201 editor.commit(); 202 } 203 getFastForwardMode()204 public static int getFastForwardMode() { 205 return fastForwardMode; 206 } 207 setFastForwardMode(int i)208 public static void setFastForwardMode(int i) { 209 fastForwardMode = i; 210 editor.putInt(SettingsEnum.FAST_FORWARD_MODE.toString(), i); 211 editor.commit(); 212 } 213 getFastForwardMultiplier()214 public static int getFastForwardMultiplier() { 215 return fastForwardMultiplier; 216 } 217 setFastForwardMultiplier(int i)218 public static void setFastForwardMultiplier(int i) { 219 fastForwardMultiplier = i; 220 editor.putInt(SettingsEnum.FAST_FORWARD_MULTIPLIER.toString(), i); 221 editor.commit(); 222 } 223 isVibrateWhenSlidingDirectionEnabled()224 public static boolean isVibrateWhenSlidingDirectionEnabled() { 225 return vibrateWhenSlidingDirectionEnabled; 226 } 227 setVibrateWhenSlidingDirectionEnabled(boolean b)228 public static void setVibrateWhenSlidingDirectionEnabled(boolean b) { 229 vibrateWhenSlidingDirectionEnabled = b; 230 editor.putBoolean(SettingsEnum.VIBRATE_WHEN_SLIDING_DIRECTION.toString(), b); 231 editor.commit(); 232 } 233 isAudioEnabled()234 public static boolean isAudioEnabled() { 235 return audioEnabled; 236 } 237 setAudioEnabled(boolean b)238 public static void setAudioEnabled(boolean b) { 239 audioEnabled = b; 240 editor.putBoolean(SettingsEnum.AUDIO_ENABLED.toString(), b); 241 editor.commit(); 242 } 243 isIgnoreLayoutSizePreferencesEnabled()244 public static boolean isIgnoreLayoutSizePreferencesEnabled() { 245 return ignoreLayoutSizePreferencesEnabled; 246 } 247 setIgnoreLayoutSizePreferencesEnabled(boolean b)248 public static void setIgnoreLayoutSizePreferencesEnabled(boolean b) { 249 ignoreLayoutSizePreferencesEnabled = b; 250 editor.putBoolean(SettingsEnum.IGNORE_LAYOUT_SIZE_SETTINGS.toString(), b); 251 editor.commit(); 252 253 } 254 getLayoutTransparency()255 public static int getLayoutTransparency() { 256 return layoutTransparency; 257 } 258 setLayoutTransparency(int t)259 public static void setLayoutTransparency(int t) { 260 layoutTransparency = t; 261 editor.putInt(SettingsEnum.LAYOUT_TRANSPARENCY.toString(), t); 262 editor.commit(); 263 } 264 getLayoutSize()265 public static int getLayoutSize() { 266 return layoutSize; 267 } 268 setLayoutSize(int i)269 public static void setLayoutSize(int i) { 270 layoutSize = i; 271 editor.putInt(SettingsEnum.LAYOUT_SIZE.toString(), i); 272 editor.commit(); 273 } 274 isForcedLandscape()275 public static boolean isForcedLandscape() { 276 return forcedLandscape; 277 } 278 setForcedLandscape(boolean b)279 public static void setForcedLandscape(boolean b) { 280 forcedLandscape = b; 281 editor.putBoolean(SettingsEnum.FORCED_LANDSCAPE.toString(), b); 282 editor.commit(); 283 } 284 } 285 286