package com.pennapps.labs.pennmobile; import android.graphics.Color; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import com.pennapps.labs.pennmobile.classes.DiningHall; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import butterknife.ButterKnife; public class MenuFragment extends Fragment { TabAdapter pageAdapter; ViewPager pager; private DiningHall mDiningHall; private MainActivity mActivity; class TabAdapter extends FragmentStatePagerAdapter { ArrayList<HashMap<String, ArrayList<String>>> foods; //for each meal: {name of station: arraylist of foods at the station} ArrayList<String> headers; String name; public TabAdapter(FragmentManager fm) { super(fm); foods = new ArrayList<HashMap<String, ArrayList<String>>>(); headers = new ArrayList<>(); } private void addTabs(DiningHall hall) { List<DiningHall.Menu> menus = hall.menus; name = hall.getName(); headers.add("HOURS"); foods.add(new HashMap<String, ArrayList<String>>()); //first menu is empty for dining hall info tab for (DiningHall.Menu menu: menus) { HashMap<String, ArrayList<String>> stations = new HashMap<String, ArrayList<String>>(); headers.add(menu.name); for (DiningHall.DiningStation station : menu.stations) { ArrayList<String> foods = new ArrayList<>(); StringBuilder foodItems = new StringBuilder(); //for design purposes for (int i = 0; i < station.items.size(); i++){ String txt = station.items.get(i).title; foodItems.append(String.valueOf(txt.charAt(0)).toUpperCase()); foodItems.append(txt.substring(1, txt.length())); if (i < station.items.size()-1) { foodItems.append("\n"); } } foods.add(foodItems.toString()); stations.put(StringUtils.capitalize(station.name), foods); } foods.add(stations); } } @Override public Fragment getItem(int position) { Fragment myFragment; if (position==0){ myFragment = new DiningInfoFragment(); Bundle args = new Bundle(); args.putParcelable("DiningHall", mDiningHall); args.putString(getString(R.string.menu_arg_name), name); myFragment.setArguments(args); } else{ myFragment = new MenuTab(); Bundle args = new Bundle(); args.putString(getString(R.string.menu_arg_name), name); args.putStringArrayList(getString(R.string.menu_arg_stations), new ArrayList<String>(foods.get(position).keySet())); HashMap<String, ArrayList<String>> stations = foods.get(position); for (String station : stations.keySet()){ args.putStringArrayList(station, stations.get(station)); } myFragment.setArguments(args); } return myFragment; } @Override public CharSequence getPageTitle(int position) { return headers.get(position); } @Override public int getCount() { return foods.size(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDiningHall = getArguments().getParcelable("DiningHall"); mActivity = (MainActivity) getActivity(); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_menu, container, false); pageAdapter = new TabAdapter(getActivity().getSupportFragmentManager()); pageAdapter.addTabs(mDiningHall); pager = (ViewPager) v.findViewById(R.id.menu_pager); pager.setAdapter(pageAdapter); v.setBackgroundColor(Color.WHITE); ButterKnife.bind(this, v); ((MainActivity) getActivity()).addTabs(pageAdapter, pager, true); return v; } private void setPagerPosition() { String meal = mDiningHall.isOpen() ? mDiningHall.openMeal() : mDiningHall.nextMeal(); for (final DiningHall.Menu menu : mDiningHall.menus) { if (menu.name.equalsIgnoreCase(meal)) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { pager.setCurrentItem(mDiningHall.menus.indexOf(menu) + 1); } }); } } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.dining, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onResume() { super.onResume(); mActivity.getActionBarToggle().setDrawerIndicatorEnabled(false); mActivity.getActionBarToggle().syncState(); mActivity.setTitle(mDiningHall.getName()); setPagerPosition(); } @Override public void onDestroyView() { super.onDestroyView(); getActivity().setTitle(R.string.dining); mActivity.removeTabs(); ButterKnife.unbind(this); } @Override public void onDestroy() { super.onDestroy(); mActivity.removeTabs(); } }