package de.tum.in.tumcampusapp.activities; import android.app.SearchManager; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.activities.generic.ActivityForSearching; import de.tum.in.tumcampusapp.adapters.NoResultsAdapter; import de.tum.in.tumcampusapp.adapters.RoomFinderListAdapter; import de.tum.in.tumcampusapp.auxiliary.RoomFinderSuggestionProvider; import de.tum.in.tumcampusapp.managers.RecentsManager; import de.tum.in.tumcampusapp.tumonline.TUMRoomFinderRequest; import de.tum.in.tumcampusapp.tumonline.TUMRoomFinderRequestFetchListener; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; /** * Activity to show a convenience interface for using the MyTUM room finder. */ public class RoomFinderActivity extends ActivityForSearching implements TUMRoomFinderRequestFetchListener, OnItemClickListener { // HTTP client for sending requests to MyTUM roomFinder private TUMRoomFinderRequest roomFinderRequest; private RecentsManager recentsManager; private StickyListHeadersListView list; private RoomFinderListAdapter adapter; public RoomFinderActivity() { super(R.layout.activity_roomfinder, RoomFinderSuggestionProvider.AUTHORITY, 3); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); roomFinderRequest = new TUMRoomFinderRequest(this); list = (StickyListHeadersListView) findViewById(R.id.list); list.setOnItemClickListener(this); recentsManager = new RecentsManager(this, RecentsManager.ROOMS); adapter = new RoomFinderListAdapter(this, getRecents()); Intent intent = getIntent(); if (intent != null && intent.hasExtra(SearchManager.QUERY)) { requestSearch(intent.getStringExtra(SearchManager.QUERY)); return; } if (adapter.getCount() == 0) { openSearch(); } else { list.setAdapter(adapter); } } @Override protected void onStartSearch() { List<Map<String, String>> recents = getRecents(); if (recents.isEmpty()) { finish(); return; } adapter = new RoomFinderListAdapter(this, recents); list.setAdapter(adapter); } @Override public void onStartSearch(String query) { roomFinderRequest.fetchSearchInteractive(this, this, query); } @Override public void onFetch(List<Map<String, String>> result) { if (result.isEmpty()) { list.setAdapter(new NoResultsAdapter(this)); } else { adapter = new RoomFinderListAdapter(this, result); list.setAdapter(adapter); showLoadingEnded(); } } @Override public void onFetchError(String errorReason) { roomFinderRequest.cancelRequest(true); showError(errorReason); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") TreeMap<String, String> room = new TreeMap<>((HashMap<String, String>) list.getAdapter().getItem(position)); openRoomDetails(room); } /** * Opens a {@link RoomFinderDetailsActivity} that displays details (e.g. location on a map) for * a given room. Also adds this room to the recent queries. */ private void openRoomDetails(Map<String, String> room) { // Add to recents StringBuilder val = new StringBuilder(); Bundle b = new Bundle(); for (Map.Entry<String, String> entry : room.entrySet()) { val.append(entry.getKey()).append('=').append(entry.getValue()).append(';'); b.putString(entry.getKey(), entry.getValue()); } recentsManager.replaceIntoDb(val.toString()); // Start detail activity Intent intent = new Intent(this, RoomFinderDetailsActivity.class); intent.putExtra(RoomFinderDetailsActivity.EXTRA_ROOM_INFO, b); startActivity(intent); } @Override public void onNoInternetError() { showNoInternetLayout(); } /** * Reconstruct recents from String */ private List<Map<String, String>> getRecents() { Cursor recentStations = recentsManager.getAllFromDb(); List<Map<String, String>> map = new ArrayList<>(recentStations.getCount()); if (recentStations.moveToFirst()) { do { String[] values = recentStations.getString(0).split(";"); HashMap<String, String> e = new HashMap<>(); for (String entry : values) { if (entry.isEmpty()) { continue; } String[] kv = entry.split("="); e.put(kv[0], kv[1]); } map.add(e); } while (recentStations.moveToNext()); } recentStations.close(); return map; } }