package com.pennapps.labs.pennmobile; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import com.pennapps.labs.pennmobile.adapters.DiningAdapter; import com.pennapps.labs.pennmobile.api.Labs; import com.pennapps.labs.pennmobile.classes.DiningHall; import com.pennapps.labs.pennmobile.classes.Venue; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; public class DiningFragment extends ListFragment { private Labs mLabs; private ListView mListView; private MainActivity mActivity; @Bind(R.id.loadingPanel) RelativeLayout loadingPanel; @Bind(R.id.no_results) TextView no_results; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLabs = MainActivity.getLabsInstance(); mActivity = (MainActivity) getActivity(); mActivity.closeKeyboard(); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); mListView = getListView(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_dining, container, false); ButterKnife.bind(this, v); getDiningHalls(); return v; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items switch (item.getItemId()) { case android.R.id.home: mActivity.onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onListItemClick(ListView l, View v, int position, long id) { mActivity.getActionBarToggle().setDrawerIndicatorEnabled(false); mActivity.getActionBarToggle().syncState(); Fragment fragment = new MenuFragment(); Bundle args = new Bundle(); args.putParcelable("DiningHall", ((DiningAdapter.ViewHolder) v.getTag()).hall); fragment.setArguments(args); FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.dining_fragment, fragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(null) .commitAllowingStateLoss(); } private void getDiningHalls() { mLabs.venues() .flatMap(new Func1<List<Venue>, Observable<Venue>>() { @Override public Observable<Venue> call(List<Venue> venues) { return Observable.from(venues); } }) .flatMap(new Func1<Venue, Observable<DiningHall>>() { @Override public Observable<DiningHall> call(Venue venue) { DiningHall hall = new DiningHall(venue.id, venue.name, venue.isResidential(), venue.getHours(), venue); return Observable.just(hall); } }) .toList() .subscribe(new Action1<List<DiningHall>>() { @Override public void call(final List<DiningHall> diningHalls) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { if (loadingPanel != null) { DiningAdapter adapter = new DiningAdapter(mActivity, diningHalls); mListView.setAdapter(adapter); loadingPanel.setVisibility(View.GONE); } } }); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { if (loadingPanel != null) { loadingPanel.setVisibility(View.GONE); } if (no_results != null) { no_results.setVisibility(View.VISIBLE); } } }); } }); } @Override public void onResume() { super.onResume(); getActivity().setTitle(R.string.dining); mActivity.setNav(R.id.nav_dining); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } }