package org.djd.busntrain.bus; import java.util.ArrayList; import org.djd.busntrain.R; import org.djd.busntrain.bus.BusDirections.Direction; import org.djd.busntrain.bus.BusDirections.Direction.NameKey; import org.djd.busntrain.commons.XmlUtilException; import android.app.ListActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class BusDirectionActivity extends ListActivity { private static final String TAG = BusDirectionActivity.class.getSimpleName(); private static final String SAVE_DIRECTION_INFO_KEY = "SAVE_DIRECTION_INFO"; private final static int[] VIEW_DIRECTION_ID_ARRAY = new int[]{R.id.direction_id}; private BusDirectionActivityBroadcastReceiver receiver; private BusFavoriteEntity busDto; private String selectedRoute; private ArrayList<Direction> directions; @SuppressWarnings("unchecked") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_list_view); receiver = new BusDirectionActivityBroadcastReceiver(); if (null != savedInstanceState) { directions = (ArrayList<Direction>) savedInstanceState.getSerializable(SAVE_DIRECTION_INFO_KEY); busDto = (BusFavoriteEntity) savedInstanceState .getSerializable(BusFavoriteEntity.BUS_FAVORITE_ENTITY_EXTRA_DATA_KEY); displayListItems(); } else { Intent payload = getIntent(); if (null == payload) { throw new IllegalArgumentException("Intent with route data is required."); } busDto = (BusFavoriteEntity) payload .getSerializableExtra(BusFavoriteEntity.BUS_FAVORITE_ENTITY_EXTRA_DATA_KEY); Uri data = payload.getData(); Log.i(TAG, "rt=" + data); selectedRoute = data.toString(); Intent intent = new Intent(this, BusDirectionService.class); intent.setData(data); startService(intent); Toast.makeText(this, R.string.toast_getting_directions, Toast.LENGTH_SHORT).show(); } setTitle(busDto.route + " " + busDto.routeName); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable(SAVE_DIRECTION_INFO_KEY, directions); outState.putSerializable(BusFavoriteEntity.BUS_FAVORITE_ENTITY_EXTRA_DATA_KEY, busDto); Log.i(TAG, "Saving activity state."); } @Override protected void onResume() { super.onResume(); super.registerReceiver(receiver, receiver.intentFilter); } @Override protected void onPause() { super.onPause(); if (null != receiver) { super.unregisterReceiver(receiver); } } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onListItemClick(ListView listView, View v, int position, long id) { super.onListItemClick(listView, v, position, id); Intent intent = new Intent(this, BusStopActivity.class); Direction selectedDirection = (Direction) listView.getItemAtPosition(position); String directionTxt = selectedDirection.getByNameKey(NameKey.DIRECTION); busDto.direction = directionTxt; Uri data = Uri.parse(selectedRoute + "/" + directionTxt); intent.setData(data); intent.putExtra(BusFavoriteEntity.BUS_FAVORITE_ENTITY_EXTRA_DATA_KEY, busDto); startActivity(intent); } /** * TODO run db query in background thread. */ private void displayListItems() { ListAdapter listAdapter = new SimpleAdapter(this, directions, R.layout.direction_list_item_view, Direction.COLUMNS, VIEW_DIRECTION_ID_ARRAY); setListAdapter(listAdapter); } /** * Callback handler receives category list data from database. */ public class BusDirectionActivityBroadcastReceiver extends BroadcastReceiver { public static final String ACTION_RESPONSE = "org.djd.busntrain.bus.BusDirectionActivityBroadcastReceiver"; public static final String XML_DATA_TXT = "XML_DATA_TXT"; public final IntentFilter intentFilter; public BusDirectionActivityBroadcastReceiver() { intentFilter = new IntentFilter(ACTION_RESPONSE); intentFilter.addCategory(Intent.CATEGORY_DEFAULT); } @Override public void onReceive(Context context, Intent intent) { // String result = "Completed Download and Updated Database."; // Toast.makeText(BusDirectionActivity.this, result, // Toast.LENGTH_SHORT).show(); String xmlDataTxt = intent.getStringExtra(XML_DATA_TXT); try { directions = BusDirections.parseValue(xmlDataTxt); } catch (XmlUtilException e) { throw new RuntimeException(e); } displayListItems(); } } }