project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SettingsFragment.java
changeset 7508 763d3961400b
child 7558 983ff426f91e
equal deleted inserted replaced
7504:ed1d52c5aa94 7508:763d3961400b
       
     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 }