package com.mechinn.android.ouralliance.fragment; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import com.activeandroid.ActiveAndroid; import com.activeandroid.Model; import com.activeandroid.query.Select; import com.mechinn.android.ouralliance.Prefs; import com.mechinn.android.ouralliance.R; import com.mechinn.android.ouralliance.Utility; import com.mechinn.android.ouralliance.adapter.MatchTeamSelectAdapter; import com.mechinn.android.ouralliance.data.Event; import com.mechinn.android.ouralliance.data.EventTeam; import com.mechinn.android.ouralliance.data.Match; import com.mechinn.android.ouralliance.data.frc2014.MatchScouting2014; import com.mechinn.android.ouralliance.data.frc2014.TeamScouting2014; import com.mechinn.android.ouralliance.data.frc2015.MatchScouting2015; import com.mechinn.android.ouralliance.data.frc2015.TeamScouting2015; import de.greenrobot.event.EventBus; import de.greenrobot.event.util.AsyncExecutor; import timber.log.Timber; public class InsertMatchDialogFragment extends DialogFragment { public static final String TAG = "InsertMatchDialogFrag"; public static final String MATCH_ARG = "match"; private Prefs prefs; private View dialog; private TextView practice; private Spinner type; private Spinner set; private Spinner matchSpin; private LinearLayout numberContainer; private EditText number; private Spinner[] spinners; private Spinner red1; private Spinner red2; private Spinner red3; private Spinner blue1; private Spinner blue2; private Spinner blue3; private Match match; private List<EventTeam> teams; private ArrayList<MatchTeamSelectAdapter> adapters; private MatchTeamSelectAdapter red1Adapter; private MatchTeamSelectAdapter red2Adapter; private MatchTeamSelectAdapter red3Adapter; private MatchTeamSelectAdapter blue1Adapter; private MatchTeamSelectAdapter blue2Adapter; private MatchTeamSelectAdapter blue3Adapter; private ArrayAdapter<Integer> quarterfinals; private ArrayAdapter<Integer> semifinals; private ArrayAdapter<Integer> matchAdapter; private int teamCount; private long eventId; @Override public void onAttach(Activity activity) { super.onAttach(activity); EventBus.getDefault().register(this); adapters = new ArrayList<MatchTeamSelectAdapter>(6); teamCount = 0; red1Adapter = new MatchTeamSelectAdapter(InsertMatchDialogFragment.this.getActivity(),null, teamCount++); red2Adapter = new MatchTeamSelectAdapter(InsertMatchDialogFragment.this.getActivity(),null, teamCount++); red3Adapter = new MatchTeamSelectAdapter(InsertMatchDialogFragment.this.getActivity(),null, teamCount++); blue1Adapter = new MatchTeamSelectAdapter(InsertMatchDialogFragment.this.getActivity(),null, teamCount++); blue2Adapter = new MatchTeamSelectAdapter(InsertMatchDialogFragment.this.getActivity(),null, teamCount++); blue3Adapter = new MatchTeamSelectAdapter(InsertMatchDialogFragment.this.getActivity(),null, teamCount++); adapters.add(red1Adapter); adapters.add(red2Adapter); adapters.add(red3Adapter); adapters.add(blue1Adapter); adapters.add(blue2Adapter); adapters.add(blue3Adapter); prefs = new Prefs(activity); quarterfinals = new ArrayAdapter<Integer>(InsertMatchDialogFragment.this.getActivity(),android.R.layout.simple_list_item_1, new Integer[]{1,2,3,4}); semifinals = new ArrayAdapter<Integer>(InsertMatchDialogFragment.this.getActivity(),android.R.layout.simple_list_item_1, new Integer[]{1,2}); matchAdapter = new ArrayAdapter<Integer>(InsertMatchDialogFragment.this.getActivity(),android.R.layout.simple_list_item_1, new Integer[]{1,2,3}); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { setRetainInstance(true); // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); dialog = inflater.inflate(R.layout.dialog_match_insert, null); practice = (TextView) dialog.findViewById(R.id.practice); type = (Spinner) dialog.findViewById(R.id.type); type.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { switch(position) { case 2: set.setVisibility(View.VISIBLE); set.setAdapter(quarterfinals); break; case 3: set.setVisibility(View.VISIBLE); set.setAdapter(semifinals); break; default: set.setVisibility(View.INVISIBLE); set.setSelection(0); break; } switch(position) { case 0: numberContainer.setVisibility(View.VISIBLE); matchSpin.setVisibility(View.GONE); break; default: numberContainer.setVisibility(View.GONE); matchSpin.setVisibility(View.VISIBLE); break; } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); set = (Spinner) dialog.findViewById(R.id.set); matchSpin = (Spinner) dialog.findViewById(R.id.match); numberContainer = (LinearLayout) dialog.findViewById(R.id.numberContainer); number = (EditText) dialog.findViewById(R.id.number); red1 = (Spinner) dialog.findViewById(R.id.red1); red2 = (Spinner) dialog.findViewById(R.id.red2); red3 = (Spinner) dialog.findViewById(R.id.red3); blue1 = (Spinner) dialog.findViewById(R.id.blue1); blue2 = (Spinner) dialog.findViewById(R.id.blue2); blue3 = (Spinner) dialog.findViewById(R.id.blue3); matchSpin.setAdapter(matchAdapter); spinners = new Spinner[] {red1, red2, red3, blue1, blue2, blue3}; if(prefs.isPractice()) { practice.setVisibility(View.VISIBLE); type.setVisibility(View.GONE); set.setVisibility(View.GONE); } else { practice.setVisibility(View.GONE); type.setVisibility(View.VISIBLE); } red1.setAdapter(red1Adapter); red2.setAdapter(red2Adapter); red3.setAdapter(red3Adapter); blue1.setAdapter(blue1Adapter); blue2.setAdapter(blue2Adapter); blue3.setAdapter(blue3Adapter); for(int spinner=0;spinner<teamCount;++spinner) { spinners[spinner].setSelection(spinner); } OnItemSelectedListener selectTeamListener = new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int map = ((MatchTeamSelectAdapter)parent.getAdapter()).getTeam(); for(MatchTeamSelectAdapter adapter : adapters) { Timber.d("disable " + position + " on " + adapter.getTeam()); adapter.disablePosition(map, position); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }; red1.setOnItemSelectedListener(selectTeamListener); red2.setOnItemSelectedListener(selectTeamListener); red3.setOnItemSelectedListener(selectTeamListener); blue1.setOnItemSelectedListener(selectTeamListener); blue2.setOnItemSelectedListener(selectTeamListener); blue3.setOnItemSelectedListener(selectTeamListener); int yes; try { match = (Match) this.getArguments().getSerializable(MATCH_ARG); number.setText(Integer.toString(match.getMatchNumber())); yes = R.string.update; Timber.d( "update"); } catch(NullPointerException e) { match = new Match(); yes = R.string.create; Timber.d( "insert"); } eventId = prefs.getComp(); builder.setView(dialog) .setPositiveButton(yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (prefs.isPractice()) { match.setCompLevel(Match.PRACTICE); } else { String level = Match.QUALIFIER; switch (type.getSelectedItemPosition()) { case 1: level = Match.EIGHTH_FINALS; break; case 2: level = Match.QUARTER_FINALS; break; case 3: level = Match.SEMI_FINALS; break; case 4: level = Match.FINALS; break; } match.setCompLevel(level); if (View.VISIBLE == set.getVisibility()) { match.setSetNumber(set.getSelectedItemPosition() + 1); } } if (View.VISIBLE == matchSpin.getVisibility()) { match.setMatchNumber(matchSpin.getSelectedItemPosition() + 1); } else { match.setMatchNumber(Utility.getIntFromText(number.getText())); } match.setRedScore(-1); match.setBlueScore(-1); AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() { @Override public void run() throws Exception { match.setEvent(Model.load(Event.class, eventId)); ActiveAndroid.beginTransaction(); try { match.saveMod(); switch (prefs.getYear()) { case 2014: for (int team = 0; team < teamCount; team++) { MatchScouting2014 scouting = new MatchScouting2014(); scouting.setMatch(match); EventTeam eventTeam = (EventTeam) ((MatchTeamSelectAdapter) spinners[team].getAdapter()).getItem(spinners[team].getSelectedItemPosition()); TeamScouting2014 scouting2014 = new Select().from(TeamScouting2014.class).where(TeamScouting2014.TEAM + "=?", eventTeam.getTeam().getId()).executeSingle(); scouting.setTeamScouting(scouting2014); if (team < teamCount / 2) { scouting.setPosition(team); scouting.setAlliance(false); } else { scouting.setPosition((team - teamCount) / 2); scouting.setAlliance(true); } scouting.saveMod(); } break; case 2015: for (int team = 0; team < teamCount; team++) { MatchScouting2015 scouting = new MatchScouting2015(); scouting.setMatch(match); EventTeam eventTeam = (EventTeam) ((MatchTeamSelectAdapter) spinners[team].getAdapter()).getItem(spinners[team].getSelectedItemPosition()); TeamScouting2015 scouting2015 = new Select().from(TeamScouting2015.class).where(TeamScouting2015.TEAM + "=?", eventTeam.getTeam().getId()).executeSingle(); scouting.setTeamScouting(scouting2015); if (team < teamCount / 2) { scouting.setPosition(team); scouting.setAlliance(false); } else { scouting.setPosition((team - teamCount) / 2); scouting.setAlliance(true); } scouting.saveMod(); } break; } ActiveAndroid.setTransactionSuccessful(); EventBus.getDefault().post(match); switch (prefs.getYear()) { case 2014: EventBus.getDefault().post(new MatchScouting2014()); break; case 2015: EventBus.getDefault().post(new MatchScouting2015()); break; } } finally { ActiveAndroid.endTransaction(); } } }); } }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick (DialogInterface dialog,int id){ dialog.cancel(); } }); loadEventTeams(); // Create the AlertDialog object and return it return builder.create(); } @Override public void onDestroyView() { super.onDestroyView(); EventBus.getDefault().unregister(this); } public void loadEventTeams() { AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() { @Override public void run() throws Exception { List<EventTeam> teams = new Select().from(EventTeam.class).where(EventTeam.EVENT+"=?",prefs.getComp()).execute(); EventBus.getDefault().post(new LoadEventTeams(teams)); } }); } public void onEventMainThread(EventTeam eventTeamsChanged) { loadEventTeams(); } public void onEventMainThread(LoadEventTeams teams) { for(MatchTeamSelectAdapter adapter : adapters) { adapter.setTeams(teams.getTeams()); adapter.notifyDataSetChanged(); } } private class LoadEventTeams { List<EventTeam> teams; public LoadEventTeams(List<EventTeam> teams) { this.teams = teams; Collections.sort(this.teams); } public List<EventTeam> getTeams() { return teams; } } }