package com.nuscomputing.ivle; import java.util.ArrayList; import java.util.Arrays; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.SpinnerAdapter; import android.widget.TextView; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockFragment; import com.nuscomputing.ivle.online.ModuleInfoFragment; import com.nuscomputing.ivle.online.ModuleLecturersFragment; import com.nuscomputing.ivle.online.ModuleWeblinksFragment; /** * A fragment that hosts most of the module options. * @author yjwong */ public class ModuleFragment extends SherlockFragment { // {{{ properties /** TAG for logging */ public static final String TAG = "ModuleFragment"; /** The module ID */ public long moduleId; /** The module IVLE ID */ public String moduleIvleId; /** The module name */ public String moduleCourseName; /** The view pager */ private ViewPager mViewPager; /** Pager adapter for the pager */ private PagerAdapter mPagerAdapter; /** The spinner adapter for the drop down */ private SpinnerAdapter mSpinnerAdapter; /** Handler to run stuff on the UI */ private Handler mHandler = new Handler(); // }}} // {{{ methods @Override public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstanceState) { return inflater.inflate(R.layout.module_fragment, null); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Obtain the requested module ID. Bundle args = getArguments(); moduleCourseName = args.getString("moduleCourseName"); moduleIvleId = args.getString("moduleIvleId"); moduleId = args.getLong("moduleId", -1); if (moduleId == -1) { throw new IllegalStateException("No module ID was passed to ModuleActivity"); } // Create the view pager. mViewPager = (ViewPager) getActivity().findViewById(R.id.module_activity_view_pager); // Configure the action bar. ActionBar bar = getSherlockActivity().getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); bar.setDisplayHomeAsUpEnabled(true); bar.setDisplayShowTitleEnabled(false); // Create a new spinner adapter. ArrayList<String> spinnerItems = new ArrayList<String>(); spinnerItems.addAll(Arrays.asList( getString(R.string.module_activity_info), getString(R.string.module_activity_announcements), getString(R.string.module_activity_lecturers), getString(R.string.module_activity_webcasts), getString(R.string.module_activity_weblinks), getString(R.string.module_activity_workbins) )); mSpinnerAdapter = new ModuleActivitySpinnerAdapter(bar.getThemedContext(), spinnerItems); bar.setListNavigationCallbacks(mSpinnerAdapter, new ModuleActivityOnNavigationListener()); // Plug the pager tabs. ArrayList<Fragment> fragmentList = new ArrayList<Fragment>(); fragmentList.add(Fragment.instantiate(getActivity(), ModuleInfoFragment.class.getName(), args)); fragmentList.add(Fragment.instantiate(getActivity(), ModuleAnnouncementsFragment.class.getName(), args)); fragmentList.add(Fragment.instantiate(getActivity(), ModuleLecturersFragment.class.getName(), args)); fragmentList.add(Fragment.instantiate(getActivity(), ModuleWebcastsFragment.class.getName(), args)); fragmentList.add(Fragment.instantiate(getActivity(), ModuleWeblinksFragment.class.getName(), args)); fragmentList.add(Fragment.instantiate(getActivity(), ModuleWorkbinsFragment.class.getName(), args)); mPagerAdapter = new ModuleActivityPagerAdapter(getActivity().getSupportFragmentManager(), fragmentList); // Configure the view pager. mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { getSherlockActivity().getSupportActionBar().setSelectedNavigationItem(position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); // HACK: Fragments inside fragments. mHandler.post(new Runnable() { @Override public void run() { mViewPager.setAdapter(mPagerAdapter); } }); } // }}} // {{{ classes /** * Helper class for the activity spinner. * @author yjwong */ public class ModuleActivitySpinnerAdapter extends ArrayAdapter<String> implements SpinnerAdapter { // {{{ properties /** The list of items */ private ArrayList<String> mItems; /** The context */ private Context mContext; // }}} // {{{ methods ModuleActivitySpinnerAdapter(Context context, ArrayList<String> items) { super(context, android.R.layout.simple_list_item_1, android.R.id.text1, items); mContext = context; mItems = items; } @Override public Context getContext() { return mContext; } @Override public View getView(int position, View convertView, ViewGroup parent) { // Inflate the layout for the item. if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.module_activity_spinner, null); } String item = mItems.get(position); if (item != null) { TextView tvItem = (TextView) convertView.findViewById(R.id.module_activity_spinner_subtitle); if (tvItem != null) { tvItem.setText(item); } TextView tvTitle = (TextView) convertView.findViewById(R.id.module_activity_spinner_title); if (tvTitle != null) { tvTitle.setText(moduleCourseName); } } return convertView; } // }}} } /** * Helper class to switch between items in the spinner. * @author yjwong */ public class ModuleActivityOnNavigationListener implements ActionBar.OnNavigationListener { // {{{ methods @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { mViewPager.setCurrentItem(itemPosition); return true; } // }}} } /** * Helper class for pager adapter. * @author yjwong */ public class ModuleActivityPagerAdapter extends FragmentStatePagerAdapter { // {{{ properties /** The list of fragments */ private ArrayList<Fragment> mFragmentList = new ArrayList<Fragment>(); // }}} // {{{ methods ModuleActivityPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragmentList) { super(fm); mFragmentList = fragmentList; } @Override public int getCount() { return mFragmentList.size(); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } // }}} } // }}} }