package com.jasonrobinson.racer.ui.ladder; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.view.Menu; import android.view.WindowManager; import com.jasonrobinson.racer.R; import com.jasonrobinson.racer.adapter.ClassSpinnerAdapter; import com.jasonrobinson.racer.enumeration.PoeClass; import com.jasonrobinson.racer.model.Race; import com.jasonrobinson.racer.ui.base.BaseActivity; import com.jasonrobinson.racer.ui.ladder.RaceTimeFragment.RaceTimeCallback; import com.metova.slim.annotation.Extra; import com.metova.slim.annotation.Layout; import java.util.Timer; import java.util.TimerTask; @Layout(R.layout.ladder_activity) public class LadderActivity extends BaseActivity implements RaceTimeCallback { private static final long DISABLE_REFRESH_EXTENSION = 1000 * 60 * 5; // 5 minutes public static final String EXTRA_ID = "com.jasonrobinson.racer.id"; RaceTimeFragment mRaceTimeFragment; LadderFragment mLadderFragment; private Timer mDisableRefreshTimer; private ClassSpinnerAdapter mNavAdapter; @Extra(EXTRA_ID) private String mId; private Race mRace; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRaceTimeFragment = (RaceTimeFragment) getSupportFragmentManager().findFragmentById(R.id.raceTime_fragment); mLadderFragment = (LadderFragment) getSupportFragmentManager().findFragmentById(R.id.ladder_fragment); mRace = getDatabaseManager().getRace(mId); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(false); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); mNavAdapter = new ClassSpinnerAdapter(actionBar.getThemedContext(), PoeClass.values(), true); actionBar.setListNavigationCallbacks(mNavAdapter, new ActionBar.OnNavigationListener() { @Override public boolean onNavigationItemSelected(int position, long id) { PoeClass poeClass = mNavAdapter.getItem(position); mLadderFragment.fetchLadder(mId, poeClass); getAnalyticsManager().trackEvent("Ladder", "Filter", poeClass == null ? "All" : poeClass.toString()); return true; } }); mRaceTimeFragment.setData(mRace); } @Override protected void onResume() { super.onResume(); setAutoRefreshEnabled(getSettingsManager().isAutoRefreshEnabled()); keepScreenOn(getSettingsManager().isKeepScreenOn()); } @Override protected void onDestroy() { super.onDestroy(); cancelDisableRefreshTimer(); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.ladder_menu, menu); return true; } @Override public void onRaceFinished() { cancelDisableRefreshTimer(); if (isDelayedRaceFinished()) { onDelayedRaceFinished(); } else { mDisableRefreshTimer = new Timer(); mDisableRefreshTimer.schedule(new DisableRefreshTimerTask(), getTimeUntilDelayedFinish()); } } private void onDelayedRaceFinished() { setAutoRefreshEnabled(false); setRefreshEnabled(false); } private void cancelDisableRefreshTimer() { if (mDisableRefreshTimer != null) { mDisableRefreshTimer.cancel(); mDisableRefreshTimer.purge(); } } private long getTimeUntilDelayedFinish() { return (mRace.getEndAt().getTime() + DISABLE_REFRESH_EXTENSION) - System.currentTimeMillis(); } private boolean isDelayedRaceFinished() { return getTimeUntilDelayedFinish() < 0; } private void setAutoRefreshEnabled(final boolean enabled) { runOnUiThread(new Runnable() { @Override public void run() { if (mLadderFragment != null) { if (isDelayedRaceFinished()) { mLadderFragment.setAutoRefreshEnabled(false); } else { mLadderFragment.setAutoRefreshEnabled(enabled); } } } }); } private void setRefreshEnabled(final boolean enabled) { runOnUiThread(new Runnable() { @Override public void run() { if (mLadderFragment != null) { mLadderFragment.setRefreshEnabled(enabled); } } }); } private void keepScreenOn(final boolean keepScreenOn) { runOnUiThread(new Runnable() { @Override public void run() { int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; if (keepScreenOn) { getWindow().addFlags(flag); } else { getWindow().clearFlags(flag); } } }); } private class DisableRefreshTimerTask extends TimerTask { @Override public void run() { onDelayedRaceFinished(); } } }