package com.tevinjeffrey.rutgersct.ui.chooser;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.transition.ChangeBounds;
import android.transition.Fade;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.tevinjeffrey.rutgersct.R;
import com.tevinjeffrey.rutgersct.RutgersCTApp;
import com.tevinjeffrey.rutgersct.rutgersapi.model.Request;
import com.tevinjeffrey.rutgersct.rutgersapi.model.SystemMessage;
import com.tevinjeffrey.rutgersct.rutgersapi.utils.SemesterUtils;
import com.tevinjeffrey.rutgersct.rutgersapi.utils.SemesterUtils.Semester;
import com.tevinjeffrey.rutgersct.ui.base.MVPFragment;
import com.tevinjeffrey.rutgersct.ui.subject.SubjectFragment;
import com.tevinjeffrey.rutgersct.ui.trackedsections.TrackedSectionsView;
import com.tevinjeffrey.rutgersct.utils.Utils;
import com.tevinjeffrey.stringpicker.StringPicker;
import java.util.ArrayList;
import java.util.Calendar;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnLongClick;
import icepick.Icicle;
public class ChooserFragment extends MVPFragment implements ChooserView {
@Bind(R.id.systemMessage)
TextView mSystemMessage;
@Bind(R.id.semester_radiogroup)
RadioGroup mSemesterRadiogroup;
@Bind(R.id.location1)
CheckBox mLocation1;
@Bind(R.id.location2)
CheckBox mLocation2;
@Bind(R.id.location3)
CheckBox mLocation3;
@Bind(R.id.level1)
CheckBox mLevel1;
@Bind(R.id.level2)
CheckBox mLevel2;
@Bind(R.id.search_btn)
TextView mSearchButton;
@Bind(R.id.primarySemester)
RadioButton mPrimarySemester;
@Bind(R.id.secondarySemester)
RadioButton mSecondarySemester;
@Bind(R.id.otherSemester)
RadioButton mOtherSemester;
@Bind(R.id.toolbar)
Toolbar mToolbar;
@Icicle
ChooserViewState mViewState = new ChooserViewState();
public ChooserFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
LayoutInflater themedInflator = inflater.cloneInContext(Utils.wrapContextTheme(getActivity(), R.style.RutgersCT));
final View rootView = themedInflator.inflate(R.layout.fragment_chooser, container, false);
ButterKnife.bind(this, rootView);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (mBasePresenter == null) {
mBasePresenter = new ChooserPresenterImpl();
RutgersCTApp.getObjectGraph(getParentActivity()).inject(mBasePresenter);
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewState.apply(this, savedInstanceState != null);
//Attach view to presenter
mBasePresenter.attachView(this);
if (mIsInitialLoad) {
mSemesterRadiogroup.clearCheck();
}
//Silently refresh tracked sections
if (!getPresenter().isLoading()) {
getPresenter().loadSystemMessage();
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
@Override
public void initToolbar() {
setToolbar(mToolbar);
}
@Override
public void showMessage(SystemMessage systemMessage) {
if (systemMessage.getMessageText().length() > 0) {
mViewState.systemMessage = systemMessage;
mSystemMessage.setText(Html.fromHtml(systemMessage.getMessageText()));
}
}
@Override
public void initPicker() {
final SemesterUtils utils = new SemesterUtils(Calendar.getInstance());
mPrimarySemester.setText(utils.getPrimarySemester());
mPrimarySemester.setTag(utils.resolvePrimarySemester());
mSecondarySemester.setText(utils.getSecondarySemester());
mSecondarySemester.setTag(utils.resolveSecondarySemester());
mOtherSemester.setOnClickListener(new OnOtherSemesterClick(utils));
mSearchButton.setOnClickListener(new OnSearchButtonClick());
}
@Override
public void restoreOtherSemester(String text, Semester tag) {
mOtherSemester.setText(text);
mOtherSemester.setTag(tag);
}
@OnLongClick(R.id.systemMessage)
public boolean onSystemMessageLongClick(View view) {
mSystemMessage.setVisibility(View.GONE);
return true;
}
private void startSubjectFragment(Bundle b) {
SubjectFragment sf = new SubjectFragment();
sf.setArguments(b);
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
sf.setExitTransition(new Fade(Fade.OUT).excludeTarget(ImageView.class, true).setDuration(100));
sf.setReturnTransition(new Fade(Fade.OUT).excludeTarget(ImageView.class, true).setDuration(100));
sf.setAllowReturnTransitionOverlap(false);
sf.setAllowEnterTransitionOverlap(false);
sf.setSharedElementEnterTransition(new ChangeBounds().setInterpolator(new DecelerateInterpolator()));
sf.setSharedElementReturnTransition(new ChangeBounds().setInterpolator(new DecelerateInterpolator()));
ft.addSharedElement(mToolbar, getString(R.string.transition_name_tool_background));
} else {
ft.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
}
startFragment(this, sf, ft);
}
private Bundle createArgs(Parcelable p) {
Bundle args = new Bundle();
args.putParcelable(TrackedSectionsView.REQUEST, p);
return args;
}
private ChooserPresenter getPresenter() {
return (ChooserPresenter) mBasePresenter;
}
public static ChooserFragment newInstance() {
ChooserFragment newInstance = new ChooserFragment();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
newInstance.setExitTransition(new Fade(Fade.OUT).setDuration(50).excludeTarget(ImageView.class, true));
newInstance.setEnterTransition(new Fade(Fade.IN));
newInstance.setReturnTransition(new Fade(Fade.OUT).excludeTarget(ImageView.class, true).setDuration(50));
newInstance.setSharedElementEnterTransition(new ChangeBounds().setInterpolator(new DecelerateInterpolator()));
newInstance.setSharedElementReturnTransition(new ChangeBounds().setInterpolator(new DecelerateInterpolator()));
}
return newInstance;
}
private class OnOtherSemesterClick implements View.OnClickListener {
private final SemesterUtils su;
String currentYear;
String currentSeason;
View pickerRoot;
public OnOtherSemesterClick(SemesterUtils su) {
this.su = su;
currentYear = su.resolveCurrentSemester().getYear();
currentSeason = su.resolveCurrentSemester().getSeason().toString();
}
@Override
public void onClick(View v) {
pickerRoot = createPicker(su);
new MaterialDialog.Builder(getParentActivity())
.title("Choose a semester")
.customView(pickerRoot, false)
.positiveText("Done")
.negativeText("Cancel")
.dismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (mOtherSemester.getTag() == null) mSemesterRadiogroup.clearCheck();
}
})
.showListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Semester sm =
mOtherSemester.getTag() == null ? su.resolveCurrentSemester() :
(Semester) mOtherSemester.getTag();
currentSeason = sm.getSeason().toString();
currentYear = sm.getYear();
StringPicker yearPicker = (StringPicker) pickerRoot.findViewById(R.id.yearPicker);
StringPicker seasonPicker = (StringPicker) pickerRoot.findViewById(R.id.seasonPicker);
yearPicker.setCurrent(su.getListOfYears().indexOf(currentYear));
seasonPicker.setCurrent(sm.getSeason().ordinal());
}
})
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
StringPicker yearPicker = (StringPicker) pickerRoot.findViewById(R.id.yearPicker);
StringPicker seasonPicker = (StringPicker) pickerRoot.findViewById(R.id.seasonPicker);
currentYear = yearPicker.getCurrentValue();
currentSeason = seasonPicker.getCurrentValue();
Semester semester = new Semester(currentSeason, currentYear);
mViewState.otherSemesterText = semester.toString();
mViewState.otherSemesterTag = semester;
mOtherSemester.setText(semester.toString());
mOtherSemester.setTag(semester);
super.onPositive(dialog);
}
})
.show();
}
private View createPicker(SemesterUtils su) {
final LinearLayout pickerRoot = (LinearLayout) getParentActivity().getLayoutInflater().inflate(R.layout.picker, null);
final StringPicker seasonPicker = (StringPicker) pickerRoot.findViewById(R.id.seasonPicker);
seasonPicker.setValues(su.getListOfSeasons());
final StringPicker yearPicker = (StringPicker) pickerRoot.findViewById(R.id.yearPicker);
yearPicker.setValues(su.getListOfYears());
return pickerRoot;
}
@Override
public String toString() {
return "OnOtherSemesterClick{" +
"su=" + su +
", currentYear='" + currentYear + '\'' +
", currentSeason='" + currentSeason + '\'' +
", pickerRoot=" + pickerRoot +
'}';
}
}
private class OnSearchButtonClick implements View.OnClickListener {
@Override
public void onClick(View v) {
if (isValidInputs()) {
Answers.getInstance().logCustom(new CustomEvent("Search")
.putCustomAttribute("Location", Request.toStringList(getLocations()))
.putCustomAttribute("Level", Request.toStringList(getLevels()))
.putCustomAttribute("Semester", getSemester().toString()));
startSubjectFragment(createArgs(createRequest()));
}
}
public Parcelable createRequest() {
return new Request(null, getSemester(), getLocations(), getLevels());
}
private boolean isValidInputs() {
int checkedButton = mSemesterRadiogroup.getCheckedRadioButtonId();
RadioButton selectedButton = (RadioButton) getParentActivity().findViewById(checkedButton);
if (selectedButton == null) {
makeToast(getParentActivity().getString(R.string.select_a_semester));
return false;
} else if (!mLocation1.isChecked() && !mLocation2.isChecked() && !mLocation3.isChecked()) {
makeToast(getParentActivity().getString(R.string.select_a_location));
return false;
} else if (!mLevel1.isChecked() && !mLevel2.isChecked()) {
makeToast(getParentActivity().getString(R.string.select_a_level));
return false;
} else {
return true;
}
}
private void makeToast(CharSequence s) {
Toast.makeText(getParentActivity().getApplicationContext(), s, Toast.LENGTH_LONG).show();
}
private Semester getSemester() {
int checkedButton = mSemesterRadiogroup.getCheckedRadioButtonId();
RadioButton selectedButton = (RadioButton) getParentActivity().findViewById(checkedButton);
return (Semester) selectedButton.getTag();
}
private ArrayList<String> getLocations() {
ArrayList<String> locations = new ArrayList<>();
if (mLocation1.isChecked()) {
locations.add(mLocation1.getText().toString());
}
if (mLocation2.isChecked()) {
locations.add(mLocation2.getText().toString());
}
if (mLocation3.isChecked()) {
locations.add(mLocation3.getText().toString());
}
return locations;
}
private ArrayList<String> getLevels() {
ArrayList<String> levels = new ArrayList<>();
if (mLevel1.isChecked()) {
levels.add(mLevel1.getText().toString());
}
if (mLevel2.isChecked()) {
levels.add(mLevel2.getText().toString());
}
return levels;
}
}
}