package de.lukasniemeier.mensa.ui.adapter;
import android.app.ActionBar;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import de.lukasniemeier.mensa.R;
import de.lukasniemeier.mensa.model.WeeklyMenu;
import de.lukasniemeier.mensa.ui.MenuViewEmptyFragment;
import de.lukasniemeier.mensa.ui.MenuViewErrorFragment;
import de.lukasniemeier.mensa.ui.MenuViewFragment;
import de.lukasniemeier.mensa.utils.SerializableTime;
import de.lukasniemeier.mensa.utils.Utils;
/**
* Created on 26.11.13.
*/
public class NavigationAdapterMenuState extends NavigationAdapterState implements
ActionBar.OnNavigationListener {
private WeeklyMenu weeklyMenu;
private Map<Integer, Fragment> navigationMap;
private int selectedDateIndex;
public NavigationAdapterMenuState(NavigationAdapter stateContext, Context context,
WeeklyMenu menu, int initialDateIndex) {
super(stateContext, context);
refresh(menu, initialDateIndex);
}
private void refresh(WeeklyMenu menu, int initialDateIndex) {
this.weeklyMenu = menu;
this.navigationMap = new HashMap<Integer, Fragment>();
this.selectedDateIndex = initialDateIndex;
initializeNavigation();
}
private void initializeNavigation() {
SerializableTime today = Utils.today();
int index = 0;
List<String> labels = new ArrayList<String>();
if (!weeklyMenu.hasMenu(today)) {
navigationMap.put(index++, MenuViewEmptyFragment.create());
labels.add(context.getString(R.string.today));
// Since there is no 'today' we preselect tomorrow
if (!weeklyMenu.getMenus().isEmpty()) {
selectedDateIndex++;
}
}
SortedSet<SerializableTime> dates = new TreeSet<SerializableTime>(weeklyMenu.getMenus().keySet());
for (SerializableTime date : dates) {
navigationMap.put(index++, MenuViewFragment.create(weeklyMenu.getMenu(date)));
labels.add(Utils.formatDate(context, date));
}
ActionBar actionBar = stateContext.getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(
new ArrayAdapter<String>(
actionBar.getThemedContext(),
android.R.layout.simple_list_item_1,
android.R.id.text1,
labels),
this);
stateContext.getPager().setOnPageChangeListener(pageSelectionListener);
}
public int getSelectedPage() {
return selectedDateIndex;
}
@Override
public int displayMenu(WeeklyMenu menu, int initialMenuIndex) {
refresh(menu, initialMenuIndex);
return getSelectedPage();
}
@Override
public void displayError(String errorMessage) {
stateContext.getPager().setOnPageChangeListener(null);
super.displayError(errorMessage);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = navigationMap.get(position);
if (fragment == null) {
fragment = MenuViewErrorFragment.create(context.getString(R.string.missing_menu));
}
return fragment;
}
@Override
public int getItemPosition(Object object) {
Fragment fragment = (Fragment) object;
for (int i = 0; i < getCount(); i++) {
if (fragment.equals(getItem(i))) {
return i;
}
}
// At this point we don't know this object... must be dead.
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
return navigationMap.keySet().size();
}
@Override
public boolean onNavigationItemSelected(int position, long l) {
selectedDateIndex = position;
stateContext.getPager().setCurrentItem(position, false);
return true;
}
private ViewPager.OnPageChangeListener pageSelectionListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (stateContext.getActionBar().getSelectedNavigationIndex() != position) {
stateContext.getActionBar().setSelectedNavigationItem(position);
}
for (int i = 0; i < getCount(); i++) {
Fragment hiddenFragment = getItem(i);
if (hiddenFragment instanceof OnPageChangeListener) {
((OnPageChangeListener)hiddenFragment).onPageChange(i == position);
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
}