package com.thomasdh.roosterpgplus.Fragments; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.AppCompatEditText; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import com.thomasdh.roosterpgplus.Adapters.AnimatedPagerAdapter; import com.thomasdh.roosterpgplus.CustomUI.DefaultSpinner; import com.thomasdh.roosterpgplus.Data.RoosterInfo; import com.thomasdh.roosterpgplus.Helpers.Apache.BasicNameValuePair; import com.thomasdh.roosterpgplus.Helpers.Apache.NameValuePair; import com.thomasdh.roosterpgplus.Helpers.FragmentTitle; import com.thomasdh.roosterpgplus.Models.Klas; import com.thomasdh.roosterpgplus.Models.Leerling; import com.thomasdh.roosterpgplus.R; import com.thomasdh.roosterpgplus.Settings.Constants; import java.util.ArrayList; import java.util.List; import fj.data.Array; import lombok.Getter; import lombok.Setter; @FragmentTitle(title = R.string.action_bar_dropdown_leerlingrooster) public class LeerlingRoosterFragment extends RoosterViewFragment implements AdapterView.OnItemSelectedListener { private static final Long MIN_REFRESH_WAIT_TIME = (long) 3600000; @Getter @Setter private Klas klas; @Getter @Setter private Leerling leerling; @Getter @Setter private Array<Klas> klassen; @Getter @Setter private Array<Leerling> leerlingen; private String llToGet = null; private DefaultSpinner klasSpinner; private DefaultSpinner leerlingSpinner; private AppCompatEditText leerlingNummerEditor; @Override public String getAnalyticsTitle() { return Constants.ANALYTICS_FRAGMENT_LERROOSTER; } //region Lifecycle @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); setRootView(inflater.inflate(R.layout.fragment_main_leerling, container, false)); viewPager = (ViewPager) getRootView().findViewById(R.id.rooster_viewPager); viewPager.setAdapter(new AnimatedPagerAdapter()); swipeRefreshLayout = (SwipeRefreshLayout) getRootView().findViewById(R.id.rooster_swiperefresh); setupSwipeRefreshLayout(); klasSpinner = (DefaultSpinner) getRootView().findViewById(R.id.main_fragment_spinner_leerling_klas); leerlingSpinner = (DefaultSpinner) getRootView().findViewById(R.id.main_fragment_spinner_leerling_naam); leerlingNummerEditor = (AppCompatEditText) getRootView().findViewById(R.id.rooster_leerling_leerlingNummer); if(savedInstanceState != null) { setLeerling((Leerling) savedInstanceState.getSerializable("LEERLING")); setKlas((Klas) savedInstanceState.getSerializable("KLAS")); } RoosterInfo.getLeerlingen(getContext(), s -> onLeerlingenLoaded((ArrayList<Klas>) s)); return getRootView(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putSerializable("KLAS", getKlas()); outState.putSerializable("LEERLING", getLeerling()); super.onSaveInstanceState(outState); } void onLeerlingenLoaded(ArrayList<Klas> result) { setKlassen(Array.iterableArray(result)); if(getKlassen() == null) return; Array<Klas> klassen = getKlassen(); String[] klasNamen = klassen.map(s -> s.klas).array(String[].class); ArrayAdapter<String> klasAdapter = new ArrayAdapter<>(getContext(), R.layout.spinner_title, klasNamen); klasAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); klasSpinner.setAdapter(klasAdapter); klasSpinner.setOnItemSelectedListener(this); leerlingSpinner.setOnItemSelectedListener(this); if(getLeerling() != null && getKlas() != null) { llToGet = getLeerling().getNaam(); klasSpinner.setSelection(klasAdapter.getPosition(getKlas().klas)); } leerlingen = Array.join(klassen.map(s -> Array.iterableArray(s.leerlingen))); leerlingNummerEditor.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { String text = s.toString(); Array<Leerling> opties = leerlingen.filter(e -> e.getLlnr().equals(text) || e.getNaam().equalsIgnoreCase(text)); if(!opties.isEmpty()) { setLeerling(opties.get(0)); llToGet = getLeerling().getNaam(); Klas leerlingKlas = klassen.filter(b -> Array.iterableArray(b.leerlingen).filter(a -> a.getLlnr().equals(getLeerling().getLlnr())).length() >= 1).get(0); if(getKlas() == null || getKlas().klas != leerlingKlas.klas) { klasSpinner.setSelection(klasAdapter.getPosition(leerlingKlas.klas)); } else { onKlasSelected(klasAdapter.getPosition(leerlingKlas.klas)); } } } }); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if(parent.equals(klasSpinner)) { onKlasSelected(position); } else if(parent.equals(leerlingSpinner)) { onLeerlingSelected(position); } } void onKlasSelected(int position) { setKlas(getKlassen().get(position)); String[] leerlingNamen = Array.iterableArray(getKlas().leerlingen).map(Leerling::getNaam).array(String[].class); ArrayAdapter<String> leerlingAdapter = new ArrayAdapter<>(getContext(), R.layout.spinner_title, leerlingNamen); leerlingAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); leerlingSpinner.setAdapter(leerlingAdapter); if(llToGet != null) { leerlingSpinner.setSelection(leerlingAdapter.getPosition(llToGet)); llToGet = null; } } void onLeerlingSelected(int position) { setLeerling(getKlas().leerlingen.get(position)); loadRooster(); } @Override public void onNothingSelected(AdapterView<?> parent) {} //endregion //region Statemanagement @Override public boolean canLoadRooster() { return getLeerling() != null; } @Override public List<NameValuePair> getURLQuery(List<NameValuePair> query) { query.add(new BasicNameValuePair("llnr", getLeerling().getLlnr())); return query; } @Override public LoadType getLoadType() { Long lastLoad = RoosterInfo.getLoad("leerling"+getLeerling().getLlnr()+getWeek(), getContext()); if(lastLoad == null || lastLoad == 0) { return LoadType.ONLINE; } else if(System.currentTimeMillis() > lastLoad + MIN_REFRESH_WAIT_TIME) { return LoadType.NEWONLINE; } else { return LoadType.OFFLINE; } } @Override public long getLoad() { return RoosterInfo.getLoad("leerling"+getLeerling().getLlnr()+getWeek(), getContext()); } @Override public void setLoad() { RoosterInfo.setLoad("leerling"+getLeerling().getLlnr()+getWeek(), System.currentTimeMillis(), getContext()); } //endregion }