package de.tum.in.tumcampusapp.activities; import android.app.AlertDialog; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import java.util.List; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.activities.generic.ActivityForLoadingInBackground; import de.tum.in.tumcampusapp.auxiliary.DepartureView; import de.tum.in.tumcampusapp.auxiliary.NetUtils; import de.tum.in.tumcampusapp.managers.RecentsManager; import de.tum.in.tumcampusapp.managers.TransportManager; /** * Activity to show transport departures for a specified station * <p> * NEEDS: EXTRA_STATION set in incoming bundle (station name) */ public class TransportationDetailsActivity extends ActivityForLoadingInBackground<String, List<TransportManager.Departure>> { public static final String EXTRA_STATION = "station"; public static final String EXTRA_STATION_ID = "stationID"; private LinearLayout mViewResults; private RecentsManager recentsManager; private TransportManager transportManager; public TransportationDetailsActivity() { super(R.layout.activity_transportation_detail); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // get all stations from db recentsManager = new RecentsManager(this, RecentsManager.STATIONS); transportManager = new TransportManager(this); mViewResults = (LinearLayout) this.findViewById(R.id.activity_transport_result); Intent intent = getIntent(); if (intent == null) { finish(); return; } String location = intent.getStringExtra(EXTRA_STATION); setTitle(location); String locationID = intent.getStringExtra(EXTRA_STATION_ID); startLoading(location, locationID); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_transport, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_transport_usage) { new AlertDialog.Builder(this) .setTitle(R.string.transport_action_usage) .setMessage(R.string.transport_help_text) .setPositiveButton(android.R.string.ok, null) .create().show(); return true; } return super.onOptionsItemSelected(item); } /** * Load departure times * * @param arg Station name * @return List of departures */ @Override protected List<TransportManager.Departure> onLoadInBackground(String... arg) { final String location = arg[0]; // save clicked station into db recentsManager.replaceIntoDb(location); // Check for internet connectivity if (!NetUtils.isConnected(this)) { showNoInternetLayout(); return null; } // get departures from website final String locationID = arg[1]; List<TransportManager.Departure> departureCursor = TransportManager.getDeparturesFromExternal(this, locationID); if (departureCursor.isEmpty()) { showError(R.string.no_departures_found); } return departureCursor; } /** * Adds a new {@link DepartureView} for each departure entry * * @param result List of departures */ @Override protected void onLoadFinished(List<TransportManager.Departure> result) { showLoadingEnded(); if (result == null) { return; } mViewResults.removeAllViews(); for (TransportManager.Departure d : result) { DepartureView view = new DepartureView(this, true); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DepartureView departureView = (DepartureView) v; String symbol = departureView.getSymbol(); boolean highlight; if (transportManager.isFavorite(symbol)) { transportManager.deleteFavorite(symbol); highlight = false; } else { transportManager.addFavorite(symbol); highlight = true; } // Update the other views with the same symbol for (int i = 0; i < mViewResults.getChildCount(); i++) { DepartureView child = (DepartureView) mViewResults.getChildAt(i); if (child.getSymbol().equals(symbol)) { child.setSymbol(symbol, highlight); } } } }); if (transportManager.isFavorite(d.symbol)) { view.setSymbol(d.symbol, true); } else { view.setSymbol(d.symbol, false); } view.setLine(d.direction); view.setTime(d.countDown); mViewResults.addView(view); } } @Override protected void onDestroy() { super.onDestroy(); for (int i = 0; i < mViewResults.getChildCount(); i++) { View view = mViewResults.getChildAt(i); if (!(view instanceof DepartureView)) { continue; } ((DepartureView) view).removeAllCallbacksAndMessages(); } } }