package br.augustoicaro.pathfindercombat; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import br.augustoicaro.pathfindercombat.database.DatabaseHelper; import br.augustoicaro.pathfindercombat.models.*; import br.augustoicaro.pathfindercombat.modifier.ModifierBase; import br.augustoicaro.pathfindercombat.modifier.ModifierBase.ModifierField; import com.j256.ormlite.android.apptools.OpenHelperManager; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.ForeignCollection; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; public abstract class FragmentBase extends Fragment { private static final String TAG = "PFCombat"; protected View _view; protected List<ModifierBase> _mods; private CharacterUpdateReceiver _receiver; private static int _lastCursor = 0; public abstract void onAfterUpdateCharacter(String field); protected abstract void populateStats(String field); private DatabaseHelper databaseHelper = null; public FragmentBase() { _mods = new ArrayList<ModifierBase>(); } public void setupIntentFilter() { IntentFilter filter = new IntentFilter("br.augustoicaro.pathfindercombat.UPDATE_CHARACTER"); _receiver = new CharacterUpdateReceiver(this); getActivity().registerReceiver(_receiver, filter); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "FragmentBase: requestCode == " + requestCode); Log.d(TAG, "FragmentBase: resultCode == " + resultCode); switch(requestCode) { case(2): if (resultCode == Activity.RESULT_OK) { Bundle extras = data.getExtras(); if (extras != null) { String field = extras.getString("FIELD"); if (field != null) { Log.d(TAG, "FragmentBase: extras field == " + field); if(field.equals("weapon_id")){ updateCharacterWeapon(field); } else{ updateCharacter(field); } } } } break; } } protected DatabaseHelper getHelper() { if (databaseHelper == null) { databaseHelper = OpenHelperManager.getHelper(getActivity(), DatabaseHelper.class); } return databaseHelper; } // saves the character after a field update and refreshes everything public void updateCharacter(String field) { Log.d(TAG, "FragmentBase: updateCharacter() field == " + field); Dao<PFCharacter, Integer> dao; PFCharacter cha = getCharacter(); try { dao = getHelper().getCharacterDao(); dao.update(cha); dao.refresh(cha); //cha = dao.queryForId((int) cha.getId()); //Dao<Weapon, Integer> weaponDao = getHelper().getWeaponDao(); //weaponDao.update(cha.getWeapon()); //weaponDao.refresh(cha.getWeapon()); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } PFCombatApplication app = PFCombatApplication.getApplication(); app.setCurrentCharacter(cha); Intent intent = new Intent(); intent.setAction("br.augustoicaro.pathfindercombat.UPDATE_CHARACTER"); intent.putExtra("field", new String(field)); getActivity().sendBroadcast(intent); } // saves the character after a field update and refreshes everything // and recive cursor position for fix edittext bug public void updateCharacter(String field, int cursor) { _lastCursor = cursor; Log.d(TAG, "FragmentBase: updateCharacter() field == " + field); Dao<PFCharacter, Integer> dao; PFCharacter cha = getCharacter(); try { dao = getHelper().getCharacterDao(); dao.update(cha); dao.refresh(cha); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } PFCombatApplication app = PFCombatApplication.getApplication(); app.setCurrentCharacter(cha); Intent intent = new Intent(); intent.setAction("br.augustoicaro.pathfindercombat.UPDATE_CHARACTER"); intent.putExtra("field", new String(field)); getActivity().sendBroadcast(intent); } // saves the character after a weapon update and refreshes everything public void updateCharacterWeapon(String field) { Log.d(TAG, "FragmentBase: updateCharacterWeapon() field == " + field); Dao<PFCharacter, Integer> dao; PFCharacter cha = getCharacter(); try { dao = getHelper().getCharacterDao(); cha = dao.queryForId((int) cha.getId()); dao.update(cha); dao.refresh(cha); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } PFCombatApplication app = PFCombatApplication.getApplication(); app.setCurrentCharacter(cha); Intent intent = new Intent(); intent.setAction("br.augustoicaro.pathfindercombat.UPDATE_CHARACTER"); intent.putExtra("field", new String(field)); getActivity().sendBroadcast(intent); } public void refreshCharacter(String field) { Log.d(TAG, "FragmentBase: refreshCharacter() field == " + field); Dao<PFCharacter, Integer> dao; PFCharacter cha = getCharacter(); try { dao = getHelper().getCharacterDao(); dao.refresh(cha); Dao<Weapon, Integer> weaponDao = getHelper().getWeaponDao(); weaponDao.refresh(cha.getWeapon()); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } PFCombatApplication app = PFCombatApplication.getApplication(); app.setCurrentCharacter(cha); Intent intent = new Intent(); intent.setAction("br.augustoicaro.pathfindercombat.UPDATE_CHARACTER"); intent.putExtra("field", field); getActivity().sendBroadcast(intent); } public PFCharacter getCharacter() { PFCombatApplication app = PFCombatApplication.getApplication(); return app.getCurrentCharacter(); } protected void setupEditTextTrigger(int id, String field) { EditText e = (EditText) findViewById(id); e.addTextChangedListener(new CustomTextWatcher(e, field, this)); } protected void setupSpinnerTrigger(int id, String field) { Spinner e = (Spinner) findViewById(id); e.setOnItemSelectedListener(new CustomSpinnerWatcher(e, field, this)); } protected void populateField(int id, String ignore, ModifierField field, String value) { if (!ignore.equals(field)) { View v = findViewById(id); String type = v.getClass().getName(); if (type.equals("android.widget.EditText")) { EditText e = (EditText) v; //e.clearFocus(); e.setText(value); //Log.d(TAG, "FragmentBase: Cursor position == " + _lastCursor + " and Text lenght == " + e.getText().length()); if(_lastCursor > e.getText().length()){ e.setSelection(e.getText().length()); } else{ e.setSelection(_lastCursor); } } else if (type.equals("android.widget.TextView")) { TextView e = (TextView) v; e.clearFocus(); e.setText(applyToggles(field, value)); } } } public void populateSpinner(int id, String selected, String[] options) { Spinner spinner = (Spinner) _view.findViewById(id); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, options); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); for (int i = 0; i < options.length; i++) { String test = options[i]; if (test.equals(selected)) { spinner.setSelection(i); } } } // apply the stats from all of the toggles to a single field protected String applyToggles(ModifierField field, String value) { Log.d(TAG, "FragmentBase: applyToggles(" + field + ", " + value +")"); // apply modifiers for (int i = 0; i < _mods.size(); i++) { ModifierBase mod = _mods.get(i); value = mod.apply(field, value); } Log.d(TAG, "FragmentBase: Toggle modifier applyed"); String value_aux = value; // apply conditions Log.d(TAG, "FragmentBase: " + getCharacter().getConditions()); if( getCharacter().getConditions() != null ){ ForeignCollection<Condition> conditions = getCharacter().getConditions(); Iterator<Condition> iter = conditions.iterator(); Log.d(TAG, "FragmentBase: Condition = " + conditions + " Iterator = " + iter); while(iter.hasNext()) { Condition cond = iter.next(); ModifierBase mod = cond.getModifier(); mod.setEnabled(true); value = mod.apply(field, value); Log.d(TAG, "FragmentBase: applying condition modifier name == " + mod.name()); } } Log.d(TAG, "FragmentBase: applyToggles returns value == " + value); if( value_aux.compareTo(value) < 0 ) return value_aux; else return value; } protected View findViewById(int id) { return _view.findViewById(id); } protected int parseIntField(int id) { View v = findViewById(id); String type = v.getClass().getName(); int i = 0; if (type.equals("android.widget.EditText")) { EditText tv = (EditText) v; i = Integer.parseInt(tv.getText().toString()); } else if (type.equals("android.widget.TextView")) { TextView tv = (TextView) v; i = Integer.parseInt(tv.getText().toString()); } else if (type.equals("android.widget.Spinner")) { Spinner sp = (Spinner) v; i = Integer.parseInt(sp.getSelectedItem().toString()); } return i; } @Override public void onResume() { IntentFilter filter = new IntentFilter("br.augustoicaro.pathfindercombat.UPDATE_CHARACTER"); getActivity().registerReceiver(_receiver, filter); refreshCharacter(""); super.onResume(); } @Override public void onPause() { getActivity().unregisterReceiver(_receiver); super.onPause(); } @Override public void onDestroy() { super.onDestroy(); if (databaseHelper != null) { OpenHelperManager.releaseHelper(); databaseHelper = null; } } }