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