|
1 package org.hedgewars.hedgeroid; |
|
2 |
|
3 import java.io.File; |
|
4 import java.io.FileNotFoundException; |
|
5 import java.io.IOException; |
|
6 import java.util.Collections; |
|
7 import java.util.List; |
|
8 |
|
9 import org.hedgewars.hedgeroid.R; |
|
10 import org.hedgewars.hedgeroid.Datastructures.FrontendDataUtils; |
|
11 import org.hedgewars.hedgeroid.Datastructures.MapRecipe; |
|
12 import org.hedgewars.hedgeroid.Datastructures.Scheme; |
|
13 import org.hedgewars.hedgeroid.Datastructures.Schemes; |
|
14 import org.hedgewars.hedgeroid.Datastructures.Weaponset; |
|
15 import org.hedgewars.hedgeroid.Datastructures.Weaponsets; |
|
16 import org.hedgewars.hedgeroid.util.FileUtils; |
|
17 |
|
18 import android.graphics.drawable.Drawable; |
|
19 import android.os.Bundle; |
|
20 import android.support.v4.app.Fragment; |
|
21 import android.util.Log; |
|
22 import android.view.LayoutInflater; |
|
23 import android.view.View; |
|
24 import android.view.ViewGroup; |
|
25 import android.widget.AdapterView; |
|
26 import android.widget.AdapterView.OnItemSelectedListener; |
|
27 import android.widget.ArrayAdapter; |
|
28 import android.widget.ImageView; |
|
29 import android.widget.Spinner; |
|
30 import android.widget.Toast; |
|
31 |
|
32 public class SettingsFragment extends Fragment implements RoomStateManager.Observer { |
|
33 private Spinner styleSpinner, schemeSpinner, weaponsetSpinner, themeSpinner; |
|
34 private ImageView themeIcon; |
|
35 |
|
36 private List<String> styles; |
|
37 private List<Scheme> schemes; |
|
38 private List<Weaponset> weaponsets; |
|
39 private List<String> themes; |
|
40 |
|
41 private RoomStateManager stateManager; |
|
42 |
|
43 @Override |
|
44 public View onCreateView(LayoutInflater inflater, ViewGroup container, |
|
45 Bundle savedInstanceState) { |
|
46 View v = inflater.inflate(R.layout.fragment_settings, container, false); |
|
47 themeIcon = (ImageView)v.findViewById(R.id.imgTheme); |
|
48 |
|
49 try { |
|
50 styles = FrontendDataUtils.getGameStyles(getActivity()); |
|
51 schemes = Schemes.loadAllSchemes(getActivity()); |
|
52 weaponsets = Weaponsets.loadAllWeaponsets(getActivity()); |
|
53 themes = FrontendDataUtils.getThemes(getActivity()); |
|
54 } catch (IOException e) { |
|
55 Toast.makeText(getActivity().getApplicationContext(), R.string.error_missing_sdcard_or_files, Toast.LENGTH_LONG).show(); |
|
56 getActivity().finish(); |
|
57 } |
|
58 |
|
59 Collections.sort(styles, String.CASE_INSENSITIVE_ORDER); |
|
60 Collections.sort(schemes, Scheme.NAME_ORDER); |
|
61 Collections.sort(weaponsets, Weaponset.NAME_ORDER); |
|
62 Collections.sort(themes, String.CASE_INSENSITIVE_ORDER); |
|
63 |
|
64 styleSpinner = prepareSpinner(v, R.id.spinGameplay, styles, styleSelectedListener); |
|
65 schemeSpinner = prepareSpinner(v, R.id.spinGamescheme, Schemes.toNameList(schemes), schemeSelectedListener); |
|
66 weaponsetSpinner = prepareSpinner(v, R.id.spinweapons, Weaponsets.toNameList(weaponsets), weaponsetSelectedListener); |
|
67 themeSpinner = prepareSpinner(v, R.id.spinTheme, themes, themeSelectedListener); |
|
68 |
|
69 stateManager.registerObserver(this); |
|
70 |
|
71 if(stateManager.getGameStyle() != null) { |
|
72 styleSpinner.setSelection(styles.indexOf(stateManager.getGameStyle()), false); |
|
73 } |
|
74 if(stateManager.getScheme() != null) { |
|
75 schemeSpinner.setSelection(getSchemePosition(schemes, stateManager.getScheme().name), false); |
|
76 } |
|
77 if(stateManager.getWeaponset() != null) { |
|
78 weaponsetSpinner.setSelection(getWeaponsetPosition(weaponsets, stateManager.getWeaponset().name), false); |
|
79 } |
|
80 if(stateManager.getMapRecipe() != null) { |
|
81 themeSpinner.setSelection(themes.indexOf(stateManager.getMapRecipe().theme), false); |
|
82 } |
|
83 |
|
84 setChiefState(stateManager.getChiefStatus()); |
|
85 |
|
86 return v; |
|
87 } |
|
88 |
|
89 private static Spinner prepareSpinner(View v, int id, List<String> items, OnItemSelectedListener itemSelectedListener) { |
|
90 Spinner spinner = (Spinner)v.findViewById(id); |
|
91 ArrayAdapter<String> adapter = new ArrayAdapter<String>(v.getContext(), R.layout.listview_item, items); |
|
92 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); |
|
93 spinner.setAdapter(adapter); |
|
94 spinner.setOnItemSelectedListener(itemSelectedListener); |
|
95 return spinner; |
|
96 } |
|
97 |
|
98 @Override |
|
99 public void onCreate(Bundle savedInstanceState) { |
|
100 super.onCreate(savedInstanceState); |
|
101 try { |
|
102 stateManager = ((RoomStateManager.Provider)getActivity()).getRoomStateManager(); |
|
103 } catch(ClassCastException e) { |
|
104 throw new RuntimeException("Hosting activity must implement RoomStateManager.Provider.", e); |
|
105 } |
|
106 } |
|
107 |
|
108 @Override |
|
109 public void onDestroy() { |
|
110 super.onDestroy(); |
|
111 stateManager.unregisterObserver(this); |
|
112 } |
|
113 |
|
114 private static int getSchemePosition(List<Scheme> schemes, String scheme) { |
|
115 for(int i=0; i<schemes.size(); i++) { |
|
116 if(schemes.get(i).name.equals(scheme)) { |
|
117 return i; |
|
118 } |
|
119 } |
|
120 return -1; |
|
121 } |
|
122 |
|
123 private static int getWeaponsetPosition(List<Weaponset> weaponsets, String weaponset) { |
|
124 for(int i=0; i<weaponsets.size(); i++) { |
|
125 if(weaponsets.get(i).name.equals(weaponset)) { |
|
126 return i; |
|
127 } |
|
128 } |
|
129 return -1; |
|
130 } |
|
131 |
|
132 private void setChiefState(boolean chiefState) { |
|
133 styleSpinner.setEnabled(chiefState); |
|
134 schemeSpinner.setEnabled(chiefState); |
|
135 weaponsetSpinner.setEnabled(chiefState); |
|
136 themeSpinner.setEnabled(chiefState); |
|
137 |
|
138 if(chiefState) { |
|
139 stateManager.changeGameStyle(styles.get(styleSpinner.getSelectedItemPosition())); |
|
140 stateManager.changeScheme(schemes.get(schemeSpinner.getSelectedItemPosition())); |
|
141 stateManager.changeWeaponset(weaponsets.get(weaponsetSpinner.getSelectedItemPosition())); |
|
142 stateManager.changeMapTheme(themes.get(themeSpinner.getSelectedItemPosition())); |
|
143 } |
|
144 } |
|
145 |
|
146 private final OnItemSelectedListener styleSelectedListener = new OnItemSelectedListener() { |
|
147 public void onItemSelected(AdapterView<?> adapter, View v, int position, long arg3) { |
|
148 stateManager.changeGameStyle(styles.get(position)); |
|
149 } |
|
150 public void onNothingSelected(AdapterView<?> arg0) {} |
|
151 }; |
|
152 |
|
153 private final OnItemSelectedListener schemeSelectedListener = new OnItemSelectedListener() { |
|
154 public void onItemSelected(AdapterView<?> adapter, View v, int position, long arg3) { |
|
155 stateManager.changeScheme(schemes.get(position)); |
|
156 } |
|
157 public void onNothingSelected(AdapterView<?> arg0) {} |
|
158 }; |
|
159 |
|
160 private final OnItemSelectedListener weaponsetSelectedListener = new OnItemSelectedListener() { |
|
161 public void onItemSelected(AdapterView<?> adapter, View v, int position, long arg3) { |
|
162 stateManager.changeWeaponset(weaponsets.get(position)); |
|
163 } |
|
164 public void onNothingSelected(AdapterView<?> arg0) {} |
|
165 }; |
|
166 |
|
167 private final OnItemSelectedListener themeSelectedListener = new OnItemSelectedListener() { |
|
168 public void onItemSelected(AdapterView<?> adapter, View v, int position, long arg3) { |
|
169 stateManager.changeMapTheme(themes.get(position)); |
|
170 String theme = themes.get(position); |
|
171 try { |
|
172 File iconFile = new File(FileUtils.getDataPathFile(getActivity()), "Themes/" + theme + "/icon@2X.png"); |
|
173 Drawable themeIconDrawable = Drawable.createFromPath(iconFile.getAbsolutePath()); |
|
174 themeIcon.setImageDrawable(themeIconDrawable); |
|
175 } catch (FileNotFoundException e) { |
|
176 Log.e("SettingsFragment", "Unable to find preview for theme "+theme, e); |
|
177 } |
|
178 }; |
|
179 public void onNothingSelected(AdapterView<?> arg0) {}; |
|
180 }; |
|
181 |
|
182 public void onChiefStatusChanged(boolean isChief) { |
|
183 setChiefState(isChief); |
|
184 } |
|
185 |
|
186 public void onGameStyleChanged(String gameStyle) { |
|
187 styleSpinner.setSelection(styles.indexOf(gameStyle)); |
|
188 } |
|
189 |
|
190 public void onMapChanged(MapRecipe recipe) { |
|
191 themeSpinner.setSelection(themes.indexOf(recipe.theme)); |
|
192 } |
|
193 |
|
194 public void onSchemeChanged(Scheme scheme) { |
|
195 schemeSpinner.setSelection(getSchemePosition(schemes, scheme.name)); |
|
196 } |
|
197 |
|
198 public void onWeaponsetChanged(Weaponset weaponset) { |
|
199 weaponsetSpinner.setSelection(getWeaponsetPosition(weaponsets, weaponset.name)); |
|
200 } |
|
201 } |