package com.jasonrobinson.racer.ui.race; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ExpandableListView; import com.jasonrobinson.racer.R; import com.jasonrobinson.racer.adapter.RaceAdapter; import com.jasonrobinson.racer.enumeration.RaceOptions; import com.jasonrobinson.racer.model.Race; import com.jasonrobinson.racer.ui.base.BaseExpandableListFragment; import com.jasonrobinson.racer.ui.race.NotificationPickerDialogFragment.OnTimeSelectedListener; import com.jasonrobinson.racer.util.AlarmUtils; import com.metova.slim.annotation.Callback; import com.metova.slim.annotation.Extra; import java.util.List; public class RaceListFragment extends BaseExpandableListFragment implements RaceAdapter.OnRaceActionClickListener { public static final String EXTRA_OPTION = "option"; RaceAdapter mAdapter; @Extra(EXTRA_OPTION) RaceOptions mRaceOption; @Callback RacesCallback mCallback; public static RaceListFragment newInstance(RaceOptions option) { RaceListFragment fragment = new RaceListFragment(); Bundle args = new Bundle(); args.putSerializable(EXTRA_OPTION, option); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setEmptyText(getString(R.string.races_unavailable)); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); registerForContextMenu(getExpandableListView()); } @Override public void onResume() { super.onResume(); refresh(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.race_list_menu, menu); if (mAdapter == null) { menu.removeItem(R.id.menu_expand_all); menu.removeItem(R.id.menu_collapse_all); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.menu_expand_all) { expandAllGroups(); } else if (id == R.id.menu_collapse_all) { collapseAllGroups(); } else { return super.onOptionsItemSelected(item); } return true; } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Race race = mAdapter.getChild(groupPosition, childPosition); mCallback.showLadder(race); return true; } @Override public void onForumPostClicked(Race race) { mCallback.showUrl(race.getUrl()); } @Override public void onAddNotificationClicked(Race race) { showNotificationDialog(race); } @Override public void onRemoveNotificationClicked(Race race) { AlarmUtils.cancelAlarm(getActivity(), race); mAdapter.notifyDataSetChanged(); } private void showNotificationDialog(final Race race) { NotificationPickerDialogFragment fragment = NotificationPickerDialogFragment.newInstance(); fragment.setOnTimeSelectedListener(new OnTimeSelectedListener() { @Override public void onTimeSelected(long millis) { AlarmUtils.addAlarm(getActivity(), race, millis); mAdapter.notifyDataSetChanged(); } @Override public void onCancel() { // no-op } }); fragment.show(getFragmentManager(), null); } private void expandAllGroups() { if (mAdapter != null) { int groupCount = mAdapter.getGroupCount(); for (int i = 0; i < groupCount; i++) { getExpandableListView().expandGroup(i); } } } private void collapseAllGroups() { if (mAdapter != null) { int groupCount = mAdapter.getGroupCount(); for (int i = 0; i < groupCount; i++) { getExpandableListView().collapseGroup(i); } } } private void setData(List<Race> races) { if (races.isEmpty()) { mAdapter = null; } else { mAdapter = new RaceAdapter(getActivity(), races, this); } setListAdapter(mAdapter); setListShown(true); if (mAdapter != null) { getExpandableListView().expandGroup(0, false); } getActivity().supportInvalidateOptionsMenu(); } public void refresh() { List<Race> races = getDatabaseManager().getRaces(mRaceOption); setData(races); } public interface RacesCallback { public void showUrl(String url); public void showLadder(Race race); } }