package org.commcare.android.view;
import org.commcare.android.adapters.EntityDetailPagerAdapter;
import org.commcare.android.util.MediaUtil;
import org.commcare.dalvik.R;
import org.commcare.suite.model.Detail;
import org.commcare.suite.model.DisplayUnit;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
* Widget that combines a ViewPager with a set of page titles styled to look like tabs.
* User can navigate either by swiping through pages or by tapping the tabs.
* @author jschweers
*
*/
public class TabbedDetailView extends RelativeLayout {
private FragmentActivity mContext;
private LinearLayout mMenu;
private EntityDetailPagerAdapter mEntityDetailPagerAdapter;
private ViewPager mViewPager;
private View mViewPagerWrapper;
public TabbedDetailView(Context context) {
super(context);
mContext = (FragmentActivity) context;
}
public TabbedDetailView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = (FragmentActivity) context;
}
@SuppressLint("NewApi")
public TabbedDetailView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = (FragmentActivity) context;
}
/*
* Attach this view to a layout.
*/
public void setRoot(ViewGroup root) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.tabbed_detail_view, root, true);
mMenu = (LinearLayout) root.findViewById(R.id.tabbed_detail_menu);
mViewPager = (ViewPager) root.findViewById(R.id.tabbed_detail_pager);
mViewPagerWrapper = root.findViewById(R.id.tabbed_detail_pager_wrapper);
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) { markSelectedTab(position); }
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageScrollStateChanged(int arg0) { }
});
}
/*
* Populate view with content from given Detail.
*/
public void setDetail(Detail detail) {
Detail[] details = detail.getDetails();
LinearLayout.LayoutParams pagerLayout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
int margin = 0;
int menuVisibility = View.GONE;
int backgroundColor = Color.TRANSPARENT;
if (details.length > 0) {
mMenu.setWeightSum(details.length);
LinearLayout.LayoutParams fillLayout = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1
);
for (Detail d : details) {
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
int index = ((ViewGroup) v.getParent()).indexOfChild(v);
mViewPager.setCurrentItem(index, true);
markSelectedTab(index);
}
};
// Create TextImageAudioView for tab
TextImageAudioView view = new TextImageAudioView(mContext);
DisplayUnit title = d.getTitle();
view.setAVT(title.getText().evaluate(), title.getAudioURI(), title.getImageURI());
view.setGravity(Gravity.CENTER);
view.setClickable(true);
view.setOnClickListener(listener);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.title_neutral_tab_vertical));
mMenu.addView(view, fillLayout);
}
markSelectedTab(0);
menuVisibility = View.VISIBLE;
backgroundColor = mContext.getResources().getColor(R.color.yellow_green);
margin = (int) getResources().getDimension(R.dimen.spacer);
pagerLayout.setMargins(0, margin, margin, margin);
}
mMenu.setVisibility(menuVisibility);
mViewPagerWrapper.setBackgroundColor(backgroundColor);
pagerLayout.setMargins(0, margin, margin, margin);
mViewPager.setLayoutParams(pagerLayout);
}
/*
* Get form list from database and insert into view.
*/
public void refresh(Detail detail, int index, boolean hasDetailCalloutListener) {
mEntityDetailPagerAdapter = new EntityDetailPagerAdapter(mContext.getSupportFragmentManager(), detail, index, hasDetailCalloutListener);
mViewPager.setAdapter(mEntityDetailPagerAdapter);
markSelectedTab(0);
}
/*
* Style one tab as "selected".
*/
private void markSelectedTab(int position) {
if (mMenu.getChildCount() <= position) {
return;
}
for (int i = 0; i < mMenu.getChildCount(); i++) {
mMenu.getChildAt(i).setBackgroundDrawable(getResources().getDrawable(R.drawable.title_neutral_tab_vertical));
}
mMenu.getChildAt(position).setBackgroundDrawable(getResources().getDrawable(R.drawable.title_case_tab_vertical));
}
}