package edu.illinois.geoalarm; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.database.SQLException; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.TextView; /** * This Activity displays the bus schedule to the user. This schedule is static, and stored * in the local SQLite database * @author deflume1 * */ public class Timetable extends Activity { private Spinner timetableLineSpinner; private Spinner timetableStopSpinner; private LinearLayout timetableLinearLayout; private GeoAlarmDB database; private String selectedLine; private String selectedStop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.timetable); timetableLineSpinner = (Spinner)findViewById(R.id.timetableLineSpinner); timetableStopSpinner = (Spinner)findViewById(R.id.timetableStopSpinner); timetableLinearLayout = (LinearLayout)findViewById(R.id.timetableLinearLayout); setLineSpinnerEventListeners(); setStopSpinnerEventListeners(); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { loadDatabase(); populateLineSpinner(); super.onResume(); } @Override public void onPause() { database.close(); database = null; super.onPause(); } /** * This function tries to load the existing SQLite DB */ public void loadDatabase() { database = new GeoAlarmDB(this.getApplicationContext()); // Check the custom SQLite helper functions that load existing DB try { database.createDataBase(); } catch (IOException e) { throw new Error("Unable to create/find database"); } // Open the SQLite database try { database.openDataBase(); } catch (SQLException sql) { throw new Error("Unable to execute sql in: " + sql.toString()); } } /** * This method populates the timetableLineSpinner with data from the database */ public void populateLineSpinner() { ArrayList<String> linesList = database.getBusLines(); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.getBaseContext(), android.R.layout.simple_spinner_item, linesList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); timetableLineSpinner.setAdapter(adapter); } /** * This method populates the timetableStopSpinner with data from the database */ public void populateStopSpinner() { List<String> locationList = database.getLineStops(selectedLine); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.getBaseContext(), android.R.layout.simple_spinner_item, locationList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); timetableStopSpinner.setAdapter(adapter); } /** * This method sets the click event listener for the lineSpinner selection action. * When a line is selected, we retrieve the selected line, then we populate the stop * Spinner with the appropriate stops. */ public void setLineSpinnerEventListeners() { /* Set a new event listener for the Spinner item selection */ timetableLineSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { /* Implement the onItemSelected method to handle item selections */ public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { int selectionPosition = timetableLineSpinner.getSelectedItemPosition(); if(selectionPosition != Spinner.INVALID_POSITION) { selectedLine = timetableLineSpinner.getSelectedItem().toString(); populateStopSpinner(); } } /* We do nothing here. May want to change behavior so the last selected item behavior is used */ public void onNothingSelected(AdapterView<?> parentView) { // do nothing } }); } /** * This method sets the event listener for the timetableStopSpinner */ public void setStopSpinnerEventListeners() { timetableStopSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { /* Implement the onItemSelected method to handle item selections */ public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { if(timetableStopSpinner.getSelectedItemPosition() != Spinner.INVALID_POSITION) { selectedStop = timetableStopSpinner.getSelectedItem().toString(); populateScrollView(); } } /* We do nothing here. May want to change behavior so the last selected item behavior is used */ public void onNothingSelected(AdapterView<?> parentView) { // do nothing } }); } /** * This method populates the LinearLayout contained in the ScrollView * with the stop times corresponding to the selected line and stops */ public void populateScrollView() { ArrayList<String> stopTimes = database.getStoptimes(selectedStop, selectedLine); timetableLinearLayout.removeAllViews(); for(String stopTime : stopTimes) { TextView newView = new TextView(this); newView.setText(stopTime); newView.setTextSize(30); timetableLinearLayout.addView(newView); } } }