package com.jasonrobinson.racer.ui.race;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import com.astuetz.PagerSlidingTabStrip;
import com.jasonrobinson.racer.R;
import com.jasonrobinson.racer.adapter.RaceGridPagerAdapter;
import com.jasonrobinson.racer.adapter.RaceListPagerAdapter;
import com.jasonrobinson.racer.async.RaceAsyncTask;
import com.jasonrobinson.racer.enumeration.RaceOptions;
import com.jasonrobinson.racer.model.Race;
import com.jasonrobinson.racer.model.RaceMode;
import com.jasonrobinson.racer.ui.base.BaseActivity;
import com.jasonrobinson.racer.ui.ladder.LadderActivity;
import com.jasonrobinson.racer.ui.race.RaceListFragment.RacesCallback;
import com.jasonrobinson.racer.ui.web.WebActivity;
import com.jasonrobinson.racer.util.DepthPageTransformer;
import com.metova.slim.annotation.Layout;
import java.util.ArrayList;
import java.util.List;
import butterknife.InjectView;
@Layout(R.layout.races_activity)
public class RacesActivity extends BaseActivity implements RacesCallback {
private static final long FETCH_INTERVAL = 1000 * 60 * 60 * 24; // 24 hours
@InjectView(R.id.tabs)
PagerSlidingTabStrip mTabs;
@InjectView(R.id.pager)
ViewPager mPager;
RaceListPagerAdapter mListAdapter;
RaceGridPagerAdapter mGridAdapter;
RacesTask mRacesTask;
boolean mRefreshing;
RaceMode mRaceMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Toolbar toolbar = new Toolbar(this);
// toolbar.setTitle(R.string.races);
//
// setSupportActionBar(toolbar);
List<RaceListPagerAdapter.RaceListParams> params = new ArrayList<RaceListPagerAdapter.RaceListParams>();
params.add(new RaceListPagerAdapter.RaceListParams(RaceOptions.UNFINISHED, getString(R.string.upcoming)));
params.add(new RaceListPagerAdapter.RaceListParams(RaceOptions.FINISHED, getString(R.string.finished)));
mListAdapter = new RaceListPagerAdapter(getSupportFragmentManager(), params);
mRaceMode = getSettingsManager().getRaceMode();
if (mRaceMode == RaceMode.LIST) {
showList();
} else if (mRaceMode == RaceMode.CALENDAR) {
showGrid();
}
mPager.setPageTransformer(true, new DepthPageTransformer());
mTabs.setViewPager(mPager);
long lastFetch = getSettingsManager().getLastRaceFetch();
long now = System.currentTimeMillis();
if (now - lastFetch >= FETCH_INTERVAL) {
fetchRaces();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mRacesTask != null) {
mRacesTask.cancel(true);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.refresh_menu, menu);
// TODO: Implement calendar view
// getMenuInflater().inflate(R.menu.races_menu, menu);
if (!mRefreshing) {
MenuItem refreshItem = menu.findItem(R.id.menu_refresh);
MenuItemCompat.setActionView(refreshItem, null);
}
if (mRaceMode == RaceMode.LIST) {
menu.removeItem(R.id.menu_list);
} else if (mRaceMode == RaceMode.CALENDAR) {
menu.removeItem(R.id.menu_grid);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
fetchRaces();
break;
case R.id.menu_list:
showList();
break;
case R.id.menu_grid:
showGrid();
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
@Override
public void showUrl(String url) {
Intent intent = new Intent(this, WebActivity.class);
intent.putExtra(WebActivity.EXTRA_URL, url);
startActivity(intent);
}
@Override
public void showLadder(Race race) {
Intent intent = new Intent(this, LadderActivity.class);
intent.putExtra(LadderActivity.EXTRA_ID, race.getRaceId());
startActivity(intent);
}
private void showList() {
mRaceMode = RaceMode.LIST;
mPager.setAdapter(mListAdapter);
mTabs.setVisibility(View.VISIBLE);
setRaceMode(RaceMode.LIST);
}
private void showGrid() {
mPager.setAdapter(mGridAdapter);
mTabs.setVisibility(View.GONE);
setRaceMode(RaceMode.CALENDAR);
}
private void setRaceMode(RaceMode mode) {
mRaceMode = mode;
getSettingsManager().setRaceMode(mRaceMode);
supportInvalidateOptionsMenu();
}
private void fetchRaces() {
if (mRacesTask != null) {
mRacesTask.cancel(true);
}
mRacesTask = new RacesTask();
mRacesTask.execute();
}
private void setRefreshing(boolean refreshing) {
mRefreshing = refreshing;
supportInvalidateOptionsMenu();
}
private class RacesTask extends RaceAsyncTask {
public RacesTask() {
super(false);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
setRefreshing(true);
}
@Override
protected void onPostExecute(List<Race> result) {
super.onPostExecute(result);
setRefreshing(false);
getSettingsManager().updateLastRaceFetch();
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for (Fragment fragment : fragments) {
if (fragment instanceof RaceListFragment && fragment.isVisible()) {
((RaceListFragment) fragment).refresh();
}
}
}
}
}