package de.lukasniemeier.mensa.ui; import android.app.ActionBar; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewConfiguration; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.Toast; import java.io.IOException; import de.lukasniemeier.mensa.R; import de.lukasniemeier.mensa.WeeklyMenuTask; import de.lukasniemeier.mensa.model.Mensa; import de.lukasniemeier.mensa.model.WeeklyMenu; import de.lukasniemeier.mensa.parser.WeeklyMenuParseException; import de.lukasniemeier.mensa.ui.adapter.NavigationAdapter; import de.lukasniemeier.mensa.utils.DefaultMensaManager; import uk.co.senab.actionbarpulltorefresh.library.DefaultHeaderTransformer; import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher; public class MenuActivity extends BaseActivity implements MenuViewFragment.RefreshViewListener, MenuViewSpecialFragment.RefreshListener { private static final String TAG = MenuActivity.class.getSimpleName(); public static Intent createIntent(Context context, Mensa mensa) { Intent intent = new Intent(context, MenuActivity.class); intent.putExtra(MenuActivity.EXTRA_MENSA_SHORTNAME, mensa.getShortName()); return intent; } private static final String EXTRA_MENSA_SHORTNAME = "EXTRA_MENSA_SHORTNAME"; private static final String STATE_WEEKLY_MENU = "weekly_menu"; private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item"; private Mensa mensa; private WeeklyMenu weeklyMenu; private ViewPager viewPager; private NavigationAdapter viewPagerAdapter; private MenuItem refreshMenuItem; private PullToRefreshAttacher refresher; private View bottomBar; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); String shortName = getIntent().getStringExtra(MenuActivity.EXTRA_MENSA_SHORTNAME); mensa = Mensa.getMensa(shortName); final ActionBar actionBar = getActionBar(); actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); setTitle(mensa.getShortName()); viewPager = (ViewPager) findViewById(R.id.container); viewPagerAdapter = new NavigationAdapter(viewPager, this, actionBar, getSupportFragmentManager()); refresher = PullToRefreshAttacher.get(this); ((DefaultHeaderTransformer)refresher.getHeaderTransformer()).setProgressBarColor( ThemeHelper.getRefreshBarColor(this)); int selectedDateIndex = 0; if (savedInstanceState != null) { if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) { selectedDateIndex = savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM); } if (savedInstanceState.containsKey(STATE_WEEKLY_MENU)) { weeklyMenu = (WeeklyMenu) savedInstanceState.getSerializable(STATE_WEEKLY_MENU); Log.i(TAG, "Restored WeeklyMenu from state."); } } if (weeklyMenu != null && !weeklyMenu.isOutdated()) { Log.i(TAG, "Showing restored WeeklyMenu with index " + selectedDateIndex); viewPagerAdapter.displayMenu(weeklyMenu, selectedDateIndex); } setupBottomBar(); } @Override protected void onResume() { super.onStart(); if (weeklyMenu == null || weeklyMenu.isOutdated()) { refresh(); } } private void setupBottomBar() { bottomBar = findViewById(R.id.menu_bottom_bar); Button cancelButton = (Button) bottomBar.findViewById(R.id.menu_bottom_bar_cancel); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { bottomBar.setVisibility(View.GONE); } }); final String mensaShortName = mensa.getShortName(); Button defaultButton = (Button) bottomBar.findViewById(R.id.menu_bottom_bar_default); defaultButton.setText(String.format(getString(R.string.bottom_bar_make_default), mensaShortName)); defaultButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new DefaultMensaManager(getApplicationContext()).markAsDefault(mensaShortName); bottomBar.setVisibility(View.GONE); Toast.makeText( getApplicationContext(), String.format(getString(R.string.mensa_marked_as_default), mensaShortName), Toast.LENGTH_SHORT).show(); } }); } private void refresh() { Log.i(TAG, "Refresh requested..."); refresher.setRefreshing(true); if (refreshMenuItem != null) { refreshMenuItem.setEnabled(false); } new WeeklyMenuTask(mensa, getApplicationContext(), new WeeklyMenuTask.WeeklyMenuReceiver() { @Override public void onWeeklyMenuSuccess(WeeklyMenu newWeeklyMenu) { refresher.setRefreshComplete(); if (refreshMenuItem != null) { refreshMenuItem.setEnabled(true); } Log.i(TAG, "Refresh succeed)"); weeklyMenu = newWeeklyMenu; viewPagerAdapter.displayMenu(weeklyMenu, 0); checkForDefaultMensa(); } @Override public void onWeeklyMenuError(Exception error) { refresher.setRefreshComplete(); if (refreshMenuItem != null) { refreshMenuItem.setEnabled(true); } Log.i(TAG, "Refresh failed"); String errorMessage = getErrorMessage(error); if (weeklyMenu == null) { viewPagerAdapter.displayError(errorMessage); } else { Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_LONG).show(); } } private String getErrorMessage(Exception error) { String errorMessage; if (error instanceof WeeklyMenuParseException) { errorMessage = getString(R.string.menu_error_description_parse, error.getMessage()); } else if (error instanceof IOException) { errorMessage = getString(R.string.menu_error_description_network, error.getMessage()); } else { errorMessage = getString(R.string.menu_error_description_exception, error.getMessage()); } return errorMessage; } }).execute( "http://www.studentenwerk-potsdam.de/speiseplan.html", mensa.getDetailMenuURL().toString()); } private void checkForDefaultMensa() { final DefaultMensaManager manager = new DefaultMensaManager(getApplicationContext()); if (manager.shouldAskForDefault()) { bottomBar.setVisibility(View.VISIBLE); bottomBar.startAnimation(AnimationUtils.loadAnimation(this, R.anim.bottom_bar_slide_up)); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (weeklyMenu != null) { outState.putSerializable(STATE_WEEKLY_MENU, weeklyMenu); } outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar().getSelectedNavigationIndex()); } private void navigateToMensaActivity() { Intent intent = NavUtils.getParentActivityIntent(this); intent.putExtra(MensaActivity.EXTRA_NO_DEFAULT_REDIRECT, true); NavUtils.navigateUpTo(this, intent); } @Override public void onBackPressed() { navigateToMensaActivity(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); refreshMenuItem = menu.findItem(R.id.action_refresh); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { if (isEnoughSpaceOnActionBar()) { refreshMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } else { refreshMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } return super.onPrepareOptionsMenu(menu); } private boolean isEnoughSpaceOnActionBar() { return ViewConfiguration.get(this).hasPermanentMenuKey() || getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: navigateToMensaActivity(); return true; case R.id.action_refresh: refresh(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void attachRefreshableView(View target) { refresher.addRefreshableView(target, new PullToRefreshAttacher.OnRefreshListener() { @Override public void onRefreshStarted(View view) { refresh(); } }); } @Override public void removeRefreshableView(View target) { refresher.removeRefreshableView(target); } @Override public void onRefreshRequested() { refresh(); } }