package com.lemoulinstudio.bikefriend; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.Toast; import com.lemoulinstudio.bikefriend.db.BikeStation; import com.lemoulinstudio.bikefriend.preference.BikefriendPreferences_; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.res.StringRes; import org.androidannotations.annotations.sharedpreferences.Pref; @EFragment(R.layout.fragment_favorite) public class FavoriteFragment extends ListFragment implements BikeStationListener { @Pref protected BikefriendPreferences_ preferences; @Bean protected BikeStationProviderRepository bikeStationProviderRepository; @Bean protected FavoriteStationsAdapter adapter; @StringRes(R.string.favorite_list_empty_list_text) protected String emptyListText; @StringRes(R.string.message_network_not_available) protected String messageNetworkNotAvailable; @StringRes(R.string.message_server_not_reachable_format) protected String messageServerNotReachable; @StringRes(R.string.message_parse_error_format) protected String messageDataParseError; @AfterViews protected void setupViews() { setListAdapter(adapter); setEmptyText(emptyListText); } // This is for the UI update every second. private final Handler handler = new Handler(); private final Runnable secondTickRunnable = new Runnable() { @Override public void run() { if (isVisible()) { adapter.refreshData(); if (Utils.isNetworkAvailable(getActivity())) { for (BikeStationProvider bikeStationProvider : adapter.getListedBikeStationProviders()) { bikeStationProvider.notifyStationsAreWatched(); } } // We re-schedule this task for 15 seconds later. handler.postDelayed(this, 15 * 1000); } } }; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.favorite, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_refresh: { if (Utils.isNetworkAvailable(getActivity())) { for (BikeStationProvider bikeStationProvider : adapter.getListedBikeStationProviders()) { bikeStationProvider.updateData(); } } else { Toast.makeText(getActivity(), messageNetworkNotAvailable, Toast.LENGTH_LONG).show(); } return true; } default: { return super.onOptionsItemSelected(item); } } } @Override public void onResume() { super.onResume(); // Registers for receiving updates. bikeStationProviderRepository.registerForBikeStationUpdates(this); // Gets the UI's data refreshed. adapter.refreshData(); // Launches the auto-update task. handler.post(secondTickRunnable); } @Override public void onPause() { super.onPause(); // Unregisters for receiving updates. bikeStationProviderRepository.unregisterForBikeStationUpdates(this); // Stops the auto-update task. handler.removeCallbacks(secondTickRunnable); } @Override public void onListItemClick(ListView listView, View view, int position, long id) { Object item = adapter.getItem(position); if (item instanceof BikeStation) { BikefriendActivity activity = (BikefriendActivity) getActivity(); BikeStation station = (BikeStation) item; activity.showBikeStationOnMap(station); } } @Override public void onServerNotReachable(BikeStationProvider bikeStationProvider) { String placeName = getActivity().getString(bikeStationProvider.getDataSourceEnum().placeNameRes); String message = String.format(messageServerNotReachable, placeName); Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show(); } @Override public void onParseError(BikeStationProvider bikeStationProvider) { String placeName = getActivity().getString(bikeStationProvider.getDataSourceEnum().placeNameRes); String message = String.format(messageDataParseError, placeName); Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show(); } @Override public void onBikeStationUpdated(BikeStationProvider bikeStationProvider) { adapter.refreshData(); } }