//Created by 170461416 and 170333995 package com.dfe.team11_demo.demo.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.dfe.team11_demo.demo.R; import com.dfe.team11_demo.demo.database.GetCriteria; public class SearchFragment extends Fragment { public static int noOfCriteria = 0; private static ArrayAdapter entries; private static int maxCriteria = 4; public static View[] boxesUsed = new View[getMaxCriteria()]; private boolean[] criteriaUsed = new boolean[8]; private String[] array; private LinearLayout criteriaHolder; private LayoutInflater li; private Spinner spinner; public SearchFragment() { } // Required empty public constructor public static int getMaxCriteria() { return maxCriteria; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Restore the fragment's state here } // onCreate is just required too @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_search, container, false); view.setId(View.generateViewId()); li = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); return view; } // When entering fragment View gets created public void onViewCreated(View view, Bundle outState) { Toolbar toolbar = (Toolbar) getView().findViewById(R.id.toolbar1); toolbar.setTitle("Search"); final Spinner firstSpinner = (Spinner) view.findViewById(R.id.firstCriteria); final Button button = (Button) view.findViewById(R.id.addCriteriaButton); criteriaHolder = (LinearLayout) getView().findViewById(R.id.criteriaHolder); // This will be used for the first criteria that will be added button.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { firstSpinner.performClick(); firstSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int pos, long id) { if (pos != 0) { Object item = parent.getItemAtPosition(pos); AddCriteria(item.toString()); firstSpinner.setSelection(0); } // This used to figure out what criteria has been clicked on } public void onNothingSelected(AdapterView parent) { } }); } }); // This trigger the first button that is being clicked on } // After view created you can use this method to start the functionality private void AddCriteria(String criteria) {//Adds a criteria box String query; String column; boolean toAdd = true; //Switch allows to select a specific criteria and to pull the correct info from database switch (criteria) { case "Town": if (criteriaUsed[0] == false) { query = "select DISTINCT Name from town"; column = "Name"; getCriteriaArray(query, column); criteriaUsed[0] = true; } else { toAdd = false; } break; case "County": if (criteriaUsed[1] == false) { query = "select DISTINCT CountyName from county"; column = "CountyName"; getCriteriaArray(query, column); criteriaUsed[1] = true; } else { toAdd = false; } break; case "Rating": if (criteriaUsed[2] == false) { query = "select DISTINCT OfstedRating from Rating"; column = "OfstedRating"; getCriteriaArray(query, column); criteriaUsed[2] = true; } else { toAdd = false; } break; case "Region": if (criteriaUsed[3] == false) { query = "select DISTINCT RSCRegion_name from Location WHERE RSCRegion_name IS NOT NULL"; column = "RSCRegion_name"; getCriteriaArray(query, column); criteriaUsed[3] = true; } else { toAdd = false; } break; case "Entry Gender": if (criteriaUsed[4] == false) { query = "select DISTINCT Gender from EntryGender"; column = "Gender"; getCriteriaArray(query, column); criteriaUsed[4] = true; } else { toAdd = false; } break; case "Religion": if (criteriaUsed[5] == false) { query = "select DISTINCT ReligiousCharacter from religious"; column = "ReligiousCharacter"; getCriteriaArray(query, column); criteriaUsed[5] = true; } else { toAdd = false; } break; case "School Type": if (criteriaUsed[6] == false) { query = "select DISTINCT EstablishmentTypeGroup from EstablishmentGroup"; column = "EstablishmentTypeGroup"; getCriteriaArray(query, column); criteriaUsed[6] = true; } else { toAdd = false; } break; case "Phase Of Education": if (criteriaUsed[7] == false) { query = "select DISTINCT PhaseOfEducation from PhaseOfEducation"; column = "PhaseOfEducation"; getCriteriaArray(query, column); criteriaUsed[7] = true; } else { toAdd = false; } break; // This get the criteria and then selects the second spinner that the information is retrieved from the database default: toAdd = false; break; } if (toAdd == true && noOfCriteria <= maxCriteria) { numberOfCriteria(criteria); } } // Takes in the criteria then sets the second spinner private void getCriteriaArray(String query, String column) { // Cleaning code up for the switch statement! getUrl from jeff builder, send objects to GetCriteria and set the queried results for the spinner array list String url = getURL(query); Object transferData[] = new Object[2]; transferData[0] = url; transferData[1] = column; try { GetCriteria criteriaGet = new GetCriteria(); criteriaGet.execute(transferData); array = criteriaGet.get(); Log.d("RMAS", "getCriteriaArray: " + array.toString()); entries = new ArrayAdapter(getActivity(), R.layout.spinner_item, array); } catch (Exception ex) { Log.d("RMAS", "getCriteriaArray: ERROR"); ex.printStackTrace(); } } // This gets the criteria array for the second spinner private String getURL(String query) { // Adds SQL query to URL to be connected to StringBuilder jeff = new StringBuilder("http://homepages.cs.ncl.ac.uk/2018-19/CSC2022/Team11/website/restapi.php?"); jeff.append("query=" + query); Log.d("query database", "url = " + jeff.toString()); return jeff.toString(); } // This is used to access the php server private void numberOfCriteria(String criteria) { int i = 0; while (boxesUsed[i] != null) { i++; } boxesUsed[i] = li.inflate(R.layout.criteria_layout, null); // (ViewGroup) getView().findViewById(R.id.criteriaHolder),true boxesUsed[i].setId(View.generateViewId()); criteriaHolder.addView(boxesUsed[i]); // Set Selections spinner = (Spinner) boxesUsed[i].findViewById(R.id.spinner); spinner.setAdapter(entries); TextView criteriaName = (TextView) boxesUsed[i].findViewById(R.id.criteriaName); criteriaName.setText(criteria); noOfCriteria++; //Hide addCriteriaButton when max criteria reached if (noOfCriteria >= maxCriteria) { Button button = (Button) getView().findViewById(R.id.addCriteriaButton); button.setVisibility(getView().INVISIBLE); Toast maxLimit = Toast.makeText(getContext(), "Max limit reached!", Toast.LENGTH_SHORT); maxLimit.show(); } } // This sets the criteria limits for adding and deleting public void deleteCriteria(int i) { clearCriteriaUsed(i); boxesUsed[i] = null; noOfCriteria--; restoreAddButton(); reOrder(); } // This is used to delete criteria box private void restoreAddButton() { if (noOfCriteria <= maxCriteria) { Button button = (Button) getView().findViewById(R.id.addCriteriaButton); button.setVisibility(getView().VISIBLE); } } // When criteria has been added this is used to restore the add button private void reOrder() { criteriaHolder.removeAllViews(); for (int i = 0; i < boxesUsed.length; i++) { if (boxesUsed[i] != null) { criteriaHolder.addView(boxesUsed[i]); } } } // This is to make sure criteria boxes in correct order when it is deleted private void clearCriteriaUsed(int i) { TextView name = (TextView) boxesUsed[i].findViewById(R.id.criteriaName); String criteria = name.getText().toString(); switch (criteria) { case "Town": criteriaUsed[0] = false; break; case "County": criteriaUsed[1] = false; break; case "Rating": criteriaUsed[2] = false; break; case "Region": criteriaUsed[3] = false; break; case "Entry Gender": criteriaUsed[4] = false; break; case "Religion": criteriaUsed[5] = false; break; case "School Type": criteriaUsed[6] = false; break; case "Phase Of Education": criteriaUsed[7] = false; break; } } // This is so you can click on criteria again if removed public void resetCriteriaUsed() { for (int i = 0; i < criteriaUsed.length; i++) { criteriaUsed[i] = false; } for (int i = 0; i < boxesUsed.length; i++) { boxesUsed[i] = null; } noOfCriteria = 0; } // When you go to searchResults fragment this is used to when you go back to reset criteria so you can use them again }