package com.andrewpham.android.khanacademy_learnanything.controllers;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.NavUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.andrewpham.android.khanacademy_learnanything.R;
import com.andrewpham.android.khanacademy_learnanything.adapters.TopicItemAdapter;
import com.andrewpham.android.khanacademy_learnanything.adapters.VideoItemAdapter;
import com.andrewpham.android.khanacademy_learnanything.api.ApiClient;
import com.andrewpham.android.khanacademy_learnanything.exercise_model.ExerciseData;
import com.andrewpham.android.khanacademy_learnanything.node_object.NodeObject;
import com.andrewpham.android.khanacademy_learnanything.topic_model.Child;
import com.andrewpham.android.khanacademy_learnanything.topic_model.TopicData;
import com.andrewpham.android.khanacademy_learnanything.video_model.VideoData;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
/**
* Created by andrewpham on 8/26/14.
*/
public class TopicFragment extends Fragment {
public static final String EXTRA_NODE_SLUG =
"com.andrewpham.android.khanacademy_learnanything.controllers.node_slug";
public static final String EXTRA_TITLE =
"com.andrewpham.android.khanacademy_learnanything.controllers.title";
public static final String EXTRA_ID =
"com.andrewpham.android.khanacademy_learnanything.controllers.id";
public static final String EXTRA_URL = "com.andrewpham.android.khanacademy_learnanything.controllers.url";
public static final int DELAY_MILLIS = 1000;
private static final String NODE_SLUG_TAG = "NodeSlugId";
private String mNodeSlug;
private ArrayList<NodeObject> mNodeObjects = new ArrayList<>();
TopicItemAdapter mTopicItemAdapter;
VideoItemAdapter mVideoItemAdapter;
ListView mListView;
TextView mTextView;
public static final TopicFragment newInstance(String nodeSlug) {
TopicFragment fragment = new TopicFragment();
Bundle bundle = new Bundle(1);
bundle.putString(NODE_SLUG_TAG, nodeSlug);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
mNodeSlug = getArguments().getString(NODE_SLUG_TAG);
super.onCreate(savedInstanceState);
setRetainInstance(true);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_topic, container, false);
if (NavUtils.getParentActivityName(getActivity()) != null) {
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
mListView = (ListView) v.findViewById(R.id.listView);
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout headerLayout = (LinearLayout) layoutInflater.inflate(R.layout.topic_list_header, null, false);
mTextView = (TextView) headerLayout.findViewById(R.id.textView);
mListView.addHeaderView(headerLayout, null, false);
ApiClient.get().getTopicData(mNodeSlug, new Callback<TopicData>() {
@Override
public void success(final TopicData topicData, Response response) {
mTextView.setText(topicData.getDescription());
for (Child child : topicData.getChildren()) {
final String nodeSlug = child.getNodeSlug();
final NodeObject nodeObject = new NodeObject();
if (nodeSlug.startsWith("v/") || nodeSlug.startsWith("e/") ||
nodeSlug.startsWith("a/") || nodeSlug.startsWith("p/")) continue;
nodeObject.setNodeSlug(nodeSlug);
ApiClient.get().getTopicData(nodeSlug, new Callback<TopicData>() {
@Override
public void success(final TopicData topicData, Response response) {
nodeObject.setTitle(topicData.getTitle());
nodeObject.setDescription(topicData.getDescription());
if (mTopicItemAdapter == null) {
setupAdapter();
} else {
mTopicItemAdapter.notifyDataSetChanged();
}
}
@Override
public void failure(RetrofitError error) {
}
});
mNodeObjects.add(nodeObject);
}
}
@Override
public void failure(RetrofitError error) {
}
});
ApiClient.get().getTopicVideos(mNodeSlug, new Callback<List<VideoData>>() {
@Override
public void success(List<VideoData> videoDataList, Response response) {
for (VideoData videoData : videoDataList) {
String nodeSlug = videoData.getNodeSlug();
NodeObject nodeObject = new NodeObject();
nodeObject.setNodeSlug(nodeSlug);
nodeObject.setTitle(videoData.getTitle());
nodeObject.setDescription(videoData.getDescription());
int duration = videoData.getDuration();
String remainder = Integer.toString(duration % 60);
String seconds = (Integer.parseInt(remainder) < 10) ? "0" + remainder : remainder;
nodeObject.setDuration(Integer.toString(duration / 60) +
":" + seconds);
try {
nodeObject.setDateAdded(new SimpleDateFormat("yyyy-MM-dd")
.parse(videoData.getDateAdded().substring(0, 10)));
} catch (ParseException e) {
e.printStackTrace();
}
nodeObject.setId(videoData.getYoutubeId());
nodeObject.setImageUrl(videoData.getImageUrl());
nodeObject.setDownloadUrl(videoData.getDownloadUrls().getMp4());
if (mVideoItemAdapter == null) {
setupAdapter();
} else {
mVideoItemAdapter.notifyDataSetChanged();
}
mNodeObjects.add(nodeObject);
}
}
@Override
public void failure(RetrofitError error) {
}
});
ApiClient.get().getTopicExercises(mNodeSlug, new Callback<List<ExerciseData>>() {
@Override
public void success(List<ExerciseData> exerciseDataList, Response response) {
for (ExerciseData exerciseData : exerciseDataList) {
String nodeSlug = exerciseData.getNodeSlug();
NodeObject nodeObject = new NodeObject();
nodeObject.setNodeSlug(nodeSlug);
nodeObject.setTitle(exerciseData.getTitle());
nodeObject.setDescription(exerciseData.getDescription());
try {
nodeObject.setDateAdded(new SimpleDateFormat("yyyy-MM-dd")
.parse(exerciseData.getCreationDate().substring(0, 10)));
} catch (ParseException e) {
e.printStackTrace();
}
nodeObject.setImageUrl(exerciseData.getImageUrl256());
nodeObject.setKaUrl(exerciseData.getKaUrl());
if (mVideoItemAdapter == null) {
setupAdapter();
} else {
mVideoItemAdapter.notifyDataSetChanged();
}
mNodeObjects.add(nodeObject);
}
}
@Override
public void failure(RetrofitError error) {
}
});
return v;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (NavUtils.getParentActivityName(getActivity()) != null) {
NavUtils.navigateUpFromSameTask(getActivity());
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
void setupAdapter() {
if (getActivity() == null || mListView == null) return;
if (mNodeObjects.size() > 0) {
if (mNodeObjects.get(0).getNodeSlug().startsWith("v/") ||
mNodeObjects.get(0).getNodeSlug().startsWith("e/")) {
mVideoItemAdapter = new VideoItemAdapter(getActivity(), getActivity(), mNodeObjects);
mListView.setAdapter(mVideoItemAdapter);
} else {
mTopicItemAdapter = new TopicItemAdapter(getActivity(), getActivity(), mNodeObjects);
mListView.setAdapter(mTopicItemAdapter);
}
} else {
mListView.setAdapter(null);
}
}
public static boolean isAClick(float startX, float endX, float startY, float endY) {
float differenceX = Math.abs(startX - endX);
float differenceY = Math.abs(startY - endY);
if (differenceX > 10 || differenceY > 10) {
return false;
}
return true;
}
}