package de.tum.in.tumcampusapp.activities; import android.content.Intent; import android.database.Cursor; import android.database.MatrixCursor; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import com.google.common.base.Optional; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.activities.generic.ActivityForSearchingInBackground; import de.tum.in.tumcampusapp.adapters.NoResultsAdapter; import de.tum.in.tumcampusapp.auxiliary.Const; import de.tum.in.tumcampusapp.auxiliary.MVVStationSuggestionProvider; import de.tum.in.tumcampusapp.managers.RecentsManager; import de.tum.in.tumcampusapp.managers.TransportManager; /** * Activity to show transport stations and departures */ public class TransportationActivity extends ActivityForSearchingInBackground<Cursor> implements OnItemClickListener { private ListView listViewResults; private SimpleCursorAdapter adapterStations; private RecentsManager recentsManager; public TransportationActivity() { super(R.layout.activity_transportation, MVVStationSuggestionProvider.AUTHORITY, 3); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // get all stations from db recentsManager = new RecentsManager(this, RecentsManager.STATIONS); listViewResults = (ListView) findViewById(R.id.activity_transport_listview_result); listViewResults.setOnItemClickListener(this); // Initialize stations adapter Cursor stationCursor = recentsManager.getAllFromDb(); adapterStations = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, stationCursor, stationCursor.getColumnNames(), new int[]{android.R.id.text1}, 0); if (adapterStations.getCount() == 0) { openSearch(); } else { listViewResults.setAdapter(adapterStations); listViewResults.requestFocus(); } } /** * Click on station in list */ @Override public void onItemClick(final AdapterView<?> av, View v, int position, long id) { Cursor departureCursor = (Cursor) av.getAdapter().getItem(position); showStation(departureCursor.getString(departureCursor.getColumnIndex(Const.NAME_COLUMN)), departureCursor.getString(departureCursor.getColumnIndex(Const.ID_COLUMN))); } /** * Opens {@link TransportationDetailsActivity} with departure times for the specified station * * @param station Station */ void showStation(String station, String stationID) { Intent intent = new Intent(this, TransportationDetailsActivity.class); intent.putExtra(TransportationDetailsActivity.EXTRA_STATION, station); intent.putExtra(TransportationDetailsActivity.EXTRA_STATION_ID, stationID); startActivity(intent); } /** * Shows all recently used stations * * @return Cursor holding the recents information (name, _id) */ @Override public Optional<Cursor> onSearchInBackground() { return Optional.of(recentsManager.getAllFromDb()); } /** * Searches the Webservice for stations * * @param query the text entered by the user * @return Cursor holding the stations (name, _id) */ @Override public Optional<Cursor> onSearchInBackground(String query) { // Get Information Optional<Cursor> stationCursor = TransportManager.getStationsFromExternal(this, query); if (!stationCursor.isPresent()) { showError(R.string.exception_unknown); } // Drop results if canceled if (asyncTask.isCancelled()) { return Optional.absent(); } return stationCursor; } /** * Shows the stations * * @param possibleStationCursor Cursor with stations (name, _id) */ @Override protected void onSearchFinished(Optional<Cursor> possibleStationCursor) { if (!possibleStationCursor.isPresent()) { return; } Cursor stationCursor = possibleStationCursor.get(); showLoadingEnded(); // mQuery is not null if it was a real search // If there is exactly one station, open results directly if (stationCursor.getCount() == 1 && mQuery != null) { stationCursor.moveToFirst(); showStation(stationCursor.getString(0), stationCursor.getString(1)); return; } else if (stationCursor.getCount() == 0) { // When stationCursor is a MatrixCursor the result comes from querying a station name if (stationCursor instanceof MatrixCursor) { // So show no results found listViewResults.setAdapter(new NoResultsAdapter(this)); listViewResults.requestFocus(); } else { // if the loading came from the user canceling search // and there are no recents to show close activity finish(); } return; } adapterStations.changeCursor(stationCursor); listViewResults.setAdapter(adapterStations); listViewResults.requestFocus(); } }