package de.ironjan.mensaupb.menus_ui;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.InstanceState;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.Trace;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.sharedpreferences.Pref;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.ironjan.mensaupb.BuildConfig;
import de.ironjan.mensaupb.MensaUpbApplication;
import de.ironjan.mensaupb.R;
import de.ironjan.mensaupb.app_info.About_;
import de.ironjan.mensaupb.monitoring.MonitoringConstants;
import de.ironjan.mensaupb.opening_times.OpeningTimesDialogFragment;
import de.ironjan.mensaupb.prefs.InternalKeyValueStore_;
import de.ironjan.mensaupb.stw.Restaurant;
import de.ironjan.mensaupb.sync.AccountCreator;
@SuppressWarnings("WeakerAccess")
@SuppressLint("Registered")
@EActivity(R.layout.activity_menu_listing)
@OptionsMenu(R.menu.main)
public class Menus extends AppCompatActivity implements ActionBar.OnNavigationListener, MenusNavigationCallback {
public static final String KEY_DAY_OFFSET = "KEY_DAY_OFFSET";
public static final String KEY_DATE = "KEY_DATE";
public static final String KEY_RESTAURANT = "KEY_RESTAURANT";
private final Logger LOGGER = LoggerFactory.getLogger(Menus.class.getSimpleName());
@Extra(value = KEY_DATE)
String dateAsString = null;
@ViewById(R.id.pager)
ViewPager mViewPager;
@ViewById(R.id.pager_title_strip)
PagerTabStrip mPagerTabStrip;
String[] mRestaurantKeys = Restaurant.getKeys();
Integer[] mRestaurantNameIds = Restaurant.getNameStringIds();
@Bean
WeekdayHelper mwWeekdayHelper;
@Bean
AccountCreator mAccountCreator;
@Extra(value = KEY_RESTAURANT)
String restaurant = mRestaurantKeys[0];
@InstanceState
int mLocation = 0;
@InstanceState
int mDayOffset = 0;
@Pref
InternalKeyValueStore_ mInternalKeyValueStore;
@Bean
WeekdayHelper mWeekdayHelper;
private WeekdayPagerAdapter[] adapters;
private WeekdayPagerAdapter mWeekdayPagerAdapter;
@Trace
@AfterViews
@Background
void init() {
mLocation = mInternalKeyValueStore.lastLocation().get();
initPager();
initActionBar();
}
@Trace
@UiThread
void initActionBar() {
final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
int restaurantCount = mRestaurantNameIds.length;
String[] mDisplayedRestaurantNames = new String[restaurantCount];
final Resources resources = getResources();
for (int i = 0; i < restaurantCount; i++) {
mDisplayedRestaurantNames[i] = resources.getString(mRestaurantNameIds[i]);
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(actionBar.getThemedContext(),
android.R.layout.simple_spinner_item, android.R.id.text1,
mDisplayedRestaurantNames);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
actionBar.setListNavigationCallbacks(adapter, this);
actionBar.setSelectedNavigationItem(mLocation);
}
@Trace
@UiThread
void initPager() {
mPagerTabStrip.setTabIndicatorColorResource(R.color.iconBg);
mPagerTabStrip.setDrawFullUnderline(true);
loadPagerAdapter(mLocation);
}
@Background
@Trace
void loadPagerAdapter(int i) {
if (BuildConfig.DEBUG) LOGGER.debug("loadPagerAdapter({})", i);
mWeekdayPagerAdapter =
getPagerAdapter(i);
if (BuildConfig.DEBUG) LOGGER.info("Got adapter: {}", mWeekdayPagerAdapter);
if (mWeekdayPagerAdapter != null) {
switchAdapterTo(mDayOffset);
}
}
@UiThread
void switchAdapterTo(int currentItem) {
LOGGER.warn("switch to {}", currentItem);
mViewPager.setAdapter(mWeekdayPagerAdapter);
mViewPager.setCurrentItem(currentItem);
}
@Trace
WeekdayPagerAdapter getPagerAdapter(int i) {
if (BuildConfig.DEBUG) LOGGER.debug("getPagerAdapter({})", i);
if (adapters == null) {
adapters = new WeekdayPagerAdapter[mRestaurantKeys.length];
}
if (adapters[i] == null) {
createNewAdapter(i);
}
return adapters[i];
}
@Trace
@Background
void createNewAdapter(int i) {
if (BuildConfig.DEBUG) LOGGER.debug("createNewAdapter({})", i);
adapters[i] =
new WeekdayPagerAdapter(this, getSupportFragmentManager(), mRestaurantKeys[i]);
loadPagerAdapter(i);
}
@Override
@Trace
public boolean onNavigationItemSelected(int i, long l) {
mLocation = i;
if (BuildConfig.DEBUG)
LOGGER.debug("onNavigationItemSelected({},{}), location := {}", new Object[]{i, l, mLocation});
mDayOffset = mViewPager.getCurrentItem();
loadPagerAdapter(i);
restaurant = mRestaurantKeys[i];
return true;
}
@Override
public void showMenu(long _id) {
MenuDetails_.intent(this).menuId(_id).start();
}
@Override
protected void onPause() {
super.onPause();
mInternalKeyValueStore.edit().lastLocation().put(mLocation).apply();
}
@OptionsItem(R.id.ab_showtimes)
void showTimes() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
DialogFragment newFragment = OpeningTimesDialogFragment.newInstance(mRestaurantKeys[mLocation]);
newFragment.show(ft, "dialog");
}
@OptionsItem(R.id.ab_refresh)
void refreshClicked() {
Bundle settingsBundle = new Bundle();
settingsBundle.putBoolean(
ContentResolver.SYNC_EXTRAS_MANUAL, true);
settingsBundle.putBoolean(
ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
ContentResolver.requestSync(mAccountCreator.getAccount(), mAccountCreator.getAuthority(), settingsBundle);
}
@OptionsItem(R.id.ab_about)
void aboutClicked() {
About_.intent(this).start();
}
}