package com.dozuki.ifixit.ui.topic_view;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FixedFragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.dozuki.ifixit.App;
import com.dozuki.ifixit.R;
import com.dozuki.ifixit.model.dozuki.Site;
import com.dozuki.ifixit.model.topic.TopicLeaf;
import com.dozuki.ifixit.model.topic.TopicNode;
import com.dozuki.ifixit.ui.BaseActivity;
import com.dozuki.ifixit.ui.BaseFragment;
import com.dozuki.ifixit.ui.guide.view.GuideViewActivity;
import com.dozuki.ifixit.ui.guide.view.NoGuidesFragment;
import com.dozuki.ifixit.ui.WebViewFragment;
import com.dozuki.ifixit.util.api.ApiCall;
import com.dozuki.ifixit.util.api.ApiEvent;
import com.dozuki.ifixit.util.api.Api;
import com.google.analytics.tracking.android.Fields;
import com.google.analytics.tracking.android.MapBuilder;
import com.google.analytics.tracking.android.Tracker;
import com.squareup.otto.Subscribe;
import com.viewpagerindicator.TitlePageIndicator;
import java.util.HashMap;
import java.util.Map;
public class TopicViewFragment extends BaseFragment implements ViewPager.OnPageChangeListener {
private static final int GUIDES_TAB = 0;
private static final int MORE_INFO_TAB = 1;
private static final int ANSWERS_TAB = 2;
private static final String CURRENT_PAGE = "CURRENT_PAGE";
private static final String CURRENT_TOPIC_LEAF = "CURRENT_TOPIC_LEAF";
private static final String CURRENT_TOPIC_NODE = "CURRENT_TOPIC_NODE";
private TopicNode mTopicNode;
private TopicLeaf mTopicLeaf;
private Site mSite;
private PageAdapter mPageAdapter;
private ViewPager mPager;
private TitlePageIndicator mTitleIndicator;
private int mSelectedTab = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mSite == null) {
mSite = ((App) getActivity().getApplication()).getSite();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.topic_view_fragment, container, false);
Bundle args = getArguments();
mPager = (ViewPager) view.findViewById(R.id.topic_view_view_pager);
mTitleIndicator = (TitlePageIndicator) view.findViewById(R.id.topic_view_indicator);
mTitleIndicator.setOnPageChangeListener(this);
if (savedInstanceState != null) {
mSelectedTab = savedInstanceState.getInt(CURRENT_PAGE, 0); // Default to Guide page
mTopicNode = (TopicNode) savedInstanceState.getSerializable(CURRENT_TOPIC_NODE);
TopicLeaf topicLeaf = (TopicLeaf) savedInstanceState.getSerializable(CURRENT_TOPIC_LEAF);
if (topicLeaf != null) {
setTopicLeaf(topicLeaf);
} else if (mTopicNode != null) {
getTopicLeaf(mTopicNode.getName());
}
} else if (args != null) {
if (args.containsKey(GuideViewActivity.TOPIC_NAME_KEY)) {
getTopicLeaf(args.getString(GuideViewActivity.TOPIC_NAME_KEY));
}
}
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(CURRENT_PAGE, mSelectedTab);
outState.putSerializable(CURRENT_TOPIC_LEAF, mTopicLeaf);
outState.putSerializable(CURRENT_TOPIC_NODE, mTopicNode);
}
@Subscribe
public void onTopic(ApiEvent.Topic event) {
if (!event.hasError()) {
setTopicLeaf(event.getResult());
} else {
Api.getErrorDialog(getActivity(), event).show();
}
}
public boolean isDisplayingTopic() {
return mTopicLeaf != null;
}
public void setTopicNode(TopicNode topicNode) {
if (topicNode == null) {
mTopicNode = null;
mTopicLeaf = null;
return;
}
if (mTopicNode == null || !mTopicNode.equals(topicNode)) {
getTopicLeaf(topicNode.getName());
} else {
selectDefaultTab();
}
mTopicNode = topicNode;
}
public void setTopicLeaf(TopicLeaf topicLeaf) {
if (topicLeaf != null) {
if (mTopicNode != null && !topicLeaf.getName().equals(mTopicNode.getName())) {
// Not the most recently selected topic... wait for another.
return;
} else if (mTopicLeaf != null && mTopicLeaf.equals(topicLeaf)) {
selectDefaultTab();
return;
}
}
mTopicLeaf = topicLeaf;
if (mTopicLeaf == null) {
// display error message
return;
}
mTitleIndicator.setVisibility(View.VISIBLE);
mPageAdapter = new PageAdapter(getChildFragmentManager());
mPager.setAdapter(mPageAdapter);
mTitleIndicator.setViewPager(mPager);
mPager.setOffscreenPageLimit(2);
selectDefaultTab();
}
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int position) {
App.sendScreenView(mPageAdapter.getFragmentScreenLabel(position));
}
@Override
public void onPageScrollStateChanged(int i) {
}
private void selectDefaultTab() {
if (mTopicLeaf == null) {
return;
}
boolean noGuides = (mTopicLeaf.getGuides().size() == 0);
int defaultTab = noGuides ? MORE_INFO_TAB : GUIDES_TAB;
mPager.setCurrentItem(defaultTab, false);
mTitleIndicator.setCurrentItem(defaultTab);
mPager.invalidate();
mTitleIndicator.invalidate();
((BaseActivity) getActivity()).hideLoading();
}
private void getTopicLeaf(String topicName) {
mTopicLeaf = null;
mSelectedTab = -1;
Api.call(getActivity(), ApiCall.topic(topicName));
}
public TopicLeaf getTopicLeaf() {
return mTopicLeaf;
}
public TopicNode getTopicNode() {
return mTopicNode;
}
public class PageAdapter extends FixedFragmentStatePagerAdapter {
private Map<Integer, String> mPageLabelMap;
public PageAdapter(FragmentManager fm) {
super(fm);
mPageLabelMap = new HashMap<Integer, String>();
}
@Override
public int getCount() {
if (mSite.mAnswers) {
return 3;
} else {
return 2;
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case GUIDES_TAB:
return getActivity().getString(R.string.guides);
case MORE_INFO_TAB:
return getActivity().getString(R.string.info);
case ANSWERS_TAB:
if (mSite.mAnswers) {
return getActivity().getString(R.string.answers);
} else {
return getActivity().getString(R.string.info);
}
}
return "";
}
@Override
public Fragment getItem(int position) {
String label = "/category/" + mTopicLeaf.getName();
Fragment selectedFragment;
switch (position) {
case GUIDES_TAB:
if (mTopicLeaf.getGuides().size() == 0) {
selectedFragment = new NoGuidesFragment();
} else {
selectedFragment = new TopicGuideListFragment(mTopicLeaf);
}
mSelectedTab = GUIDES_TAB;
label += "/guides";
break;
case MORE_INFO_TAB:
selectedFragment = new TopicInfoFragment(mTopicLeaf);
label += "/info";
mSelectedTab = MORE_INFO_TAB;
break;
case ANSWERS_TAB:
WebViewFragment webView = new WebViewFragment();
label += "/answers";
webView.loadUrl(mTopicLeaf.getSolutionsUrl());
selectedFragment = webView;
mSelectedTab = ANSWERS_TAB;
break;
default:
return null;
}
mPageLabelMap.put(position, label);
return selectedFragment;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
mSelectedTab = position;
}
public String getFragmentScreenLabel(int key) {
return mPageLabelMap.get(key);
}
@Override
public void destroyItem(View container, int position, Object object) {
super.destroyItem(container, position, object);
mPageLabelMap.remove(position);
}
}
}