package com.tevinjeffrey.rutgersct.ui.courseinfo;
import android.app.FragmentTransaction;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.transition.Fade;
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.tevinjeffrey.rutgersct.R;
import com.tevinjeffrey.rutgersct.ui.course.CourseView;
import com.tevinjeffrey.rutgersct.ui.utils.ItemClickListener;
import com.tevinjeffrey.rutgersct.ui.utils.CircleSharedElementCallback;
import com.tevinjeffrey.rutgersct.ui.utils.CircleView;
import com.tevinjeffrey.rutgersct.rutgersapi.model.Course;
import com.tevinjeffrey.rutgersct.rutgersapi.model.Course.Section;
import com.tevinjeffrey.rutgersct.rutgersapi.model.Request;
import com.tevinjeffrey.rutgersct.rutgersapi.model.Subject;
import com.tevinjeffrey.rutgersct.ui.base.MVPFragment;
import com.tevinjeffrey.rutgersct.ui.sectioninfo.SectionInfoFragment;
import com.tevinjeffrey.rutgersct.utils.Utils;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import icepick.Icicle;
import timber.log.Timber;
@SuppressWarnings("ClassWithTooManyMethods")
public class CourseInfoFragment extends MVPFragment implements CourseInfoView, ItemClickListener<Section, View> {
private static final String TAG = CourseInfoFragment.class.getSimpleName();
@Bind(R.id.toolbar)
Toolbar mToolbar;
@Bind(R.id.course_info_list)
RecyclerView mRecyclerView;
@Bind(R.id.course_title_text)
TextView mCourseTitleText;
@Bind(R.id.app_bar_layout)
AppBarLayout mAppBarLayout;
@Bind(R.id.coordinator_layout)
CoordinatorLayout mCoordinatorLayout;
@Bind(R.id.subtitle)
TextView mCreditsText;
@Bind(R.id.shortenedCourseInfo)
TextView mShortenedCourseInfo;
@Bind(R.id.openSections_text)
TextView mOpenSectionsText;
@Bind(R.id.totalSections_text)
TextView mTotalSectionsText;
@Icicle
Request mRequest;
@Icicle
Course mSelectedCourse;
@Icicle
CourseInfoViewState mViewState = new CourseInfoViewState();
private List<View> mHeaderViews = new ArrayList<>();
public CourseInfoFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
if (getArguments() != null) {
mSelectedCourse = getArguments().getParcelable(CourseView.SELECTED_COURSE);
if (mSelectedCourse != null) {
mRequest = mSelectedCourse.getRequest();
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
LayoutInflater themedInflator = inflater.cloneInContext(Utils.wrapContextTheme(getActivity(),
R.style.RutgersCT_Accent));
final View rootView = themedInflator.inflate(R.layout.fragment_course_info, container, false);
ButterKnife.bind(this, rootView);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewState.apply(this, savedInstanceState != null);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_fragment_info, menu);
}
@Override
public void onItemClicked(Section section, View view) {
Timber.i("Selected section: %s", section);
setIndexInRequestObject(section.getIndex());
Bundle bundle = new Bundle();
bundle.putParcelable(SELECTED_SECTION, section);
startSectionInfoFragment(bundle, view);
}
public void initViews() {
setCourseTitle();
setCredits();
setShortenedCourseInfo();
setOpenSections();
setTotalSections();
}
public void initRecyclerView() {
LinearLayoutManager layoutManager = new LinearLayoutManager(getParentActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
if (mRecyclerView.getAdapter() == null) {
mRecyclerView.setAdapter(new CourseInfoFragmentAdapter(mHeaderViews,
mSelectedCourse.getSections(), this));
}
}
public void initHeaderView() {
View courseMetadata = createCourseMetaDataView();
mHeaderViews.add(courseMetadata);
}
private void setCourseTitle() {
mCourseTitleText.setText(mSelectedCourse.getTrueTitle());
}
private void setShortenedCourseInfo() {
//String offeringUnitCode = mSelectedCourse.getOfferingUnitCode();
Subject subject = mSelectedCourse.getEnclosingSubject();
String courseNumber = mSelectedCourse.getCourseNumber();
if (subject != null) {
String shortenedCourseInfo = subject.getTitle() + " › " + courseNumber;
mShortenedCourseInfo.setText(shortenedCourseInfo);
} else {
Timber.i("http://crashes.to/s/0397fd79332 Selected course: %s\n" +
" Course number: %s\n" +
" Request: %s", mSelectedCourse, courseNumber, mSelectedCourse.getRequest());
}
}
private void setCredits() {
mCreditsText.setText(String.valueOf(mSelectedCourse.getCredits()));
}
private void setOpenSections() {
mOpenSectionsText.setText(String.valueOf(mSelectedCourse.getOpenSections()));
}
private void setTotalSections() {
mTotalSectionsText.setText(String.valueOf(mSelectedCourse.getSectionsTotal()));
}
private View createCourseMetaDataView() {
ViewGroup root = (ViewGroup) getParentActivity().getLayoutInflater().inflate(R.layout.course_info_metadata, null);
setPreReqNotes(root, mSelectedCourse);
setCourseNotes(root, mSelectedCourse);
setSubjectNotes(root, mSelectedCourse);
return root;
}
private void setPreReqNotes(View root, Course course) {
TextView prereqText = ButterKnife.findById(root, R.id.course_prereq_text);
RelativeLayout prereqContainer = ButterKnife.findById(root, R.id.course_prereq_layout);
if (course.getPreReqNotes() == null) {
prereqContainer.setVisibility(View.GONE);
} else {
prereqText.setText(Html.fromHtml(course.getPreReqNotes()));
prereqText.setMovementMethod(LinkMovementMethod.getInstance());
}
}
private void setCourseNotes(View root, Course course) {
TextView courseNotesText = ButterKnife.findById(root, R.id.course_notes_text);
RelativeLayout courseNotesContainer = ButterKnife.findById(root, R.id.course_notes_layout);
if (course.getCourseNotes() == null) {
courseNotesContainer.setVisibility(View.GONE);
} else {
courseNotesText.setText(Html.fromHtml(course.getCourseNotes()));
courseNotesText.setMovementMethod(LinkMovementMethod.getInstance());
}
}
private void setSubjectNotes(View root, Course course) {
TextView subjectNotesText = ButterKnife.findById(root, R.id.course_subject_notes_text);
RelativeLayout subjectNotesContainer = ButterKnife.findById(root, R.id.course_subject_notes_layout);
if (course.getSubjectNotes() == null) {
subjectNotesContainer.setVisibility(View.GONE);
} else {
subjectNotesText.setText(Html.fromHtml(course.getSubjectNotes()));
subjectNotesText.setMovementMethod(LinkMovementMethod.getInstance());
}
}
private void setIndexInRequestObject(String index) {
mRequest.setIndex(index);
}
private void startSectionInfoFragment(Bundle b, View clickedView) {
SectionInfoFragment sectionInfoFragment = new SectionInfoFragment();
FragmentTransaction ft =
this.getFragmentManager().beginTransaction();
CircleView circleView = ButterKnife.findById(clickedView, R.id.section_number_background);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
circleView.setTransitionName(getString(R.string.transition_name_circle_view));
ft.addSharedElement(circleView, getString(R.string.transition_name_circle_view));
mAppBarLayout.setTransitionName(null);
Transition cifSectionEnter = TransitionInflater
.from(getParentActivity())
.inflateTransition(R.transition.cif_section_enter);
Transition cifSectionReturn = TransitionInflater
.from(getParentActivity())
.inflateTransition(R.transition.cif_section_return);
sectionInfoFragment.setEnterTransition(cifSectionEnter);
sectionInfoFragment.setReturnTransition(cifSectionReturn);
setReenterTransition(new Fade(Fade.IN).setDuration(200));
Transition cifExit = TransitionInflater
.from(getParentActivity())
.inflateTransition(R.transition.cif_exit);
setExitTransition(cifExit);
sectionInfoFragment.setAllowReturnTransitionOverlap(false);
sectionInfoFragment.setAllowEnterTransitionOverlap(false);
Transition sharedElementsEnter = TransitionInflater
.from(getParentActivity()).inflateTransition(R.transition.cif_shared_element_enter);
Transition sharedElementsReturn = TransitionInflater
.from(getParentActivity()).inflateTransition(R.transition.cif_shared_element_return);
sectionInfoFragment.setSharedElementEnterTransition(sharedElementsEnter);
sectionInfoFragment.setSharedElementReturnTransition(sharedElementsReturn);
CircleSharedElementCallback sharedelementCallback = new CircleSharedElementCallback();
sectionInfoFragment.setEnterSharedElementCallback(sharedelementCallback);
sharedElementsEnter.addListener(sharedelementCallback.getTransitionCallback());
} else {
ft.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
}
sectionInfoFragment.setArguments(b);
startFragment(this, sectionInfoFragment, ft);
}
@Override
public String toString() {
return TAG;
}
@Override
public void initToolbar() {
setToolbar(mToolbar);
getParentActivity().getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}