package org.djd.busntrain.bus; import java.util.Date; import org.djd.busntrain.R; import org.djd.busntrain.commons.ApplicationCommons; import org.djd.busntrain.provider.BusRouteContentProvider; import android.app.ListActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.FilterQueryProvider; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.Toast; public class BusRouteActivity extends ListActivity { private static final String TAG = BusRouteActivity.class.getSimpleName(); private static final int[] VIEW_ROUTE_ID_ARRAY = new int[]{R.id.route_id, R.id.route_name_id}; private static final String ROUTE_FILTER_TEMPLATE = BusRouteEntity.Columns.ROUTE_NAME + " like '%%%s%%' or " + BusRouteEntity.Columns.ROUTE_ID + " like '%%%s%%'"; private EditText filterText; private BusRouteActivityBroadcastReceiver receiver; private SimpleCursorAdapter listAdapter; private boolean dateNeedsUpdate; private TextWatcher filterTextWatcher = new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence constraint, int start, int before, int count) { Log.i(TAG, "filter txt=" + constraint); listAdapter.getFilter().filter(constraint); // } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_list_filter_view); filterText = (EditText) findViewById(R.id.search_box); filterText.addTextChangedListener(filterTextWatcher); receiver = new BusRouteActivityBroadcastReceiver(); long lastUpateTime = ApplicationCommons.getBusRouteLastUpdate(this); Log.i(TAG, "last update time=" + new Date(lastUpateTime)); dateNeedsUpdate = ApplicationCommons.isMoreThanOneYearOld(lastUpateTime); if (dateNeedsUpdate) { Intent intent = new Intent(this, BusRouteService.class); startService(intent); Toast.makeText(this, R.string.toast_getting_routes, Toast.LENGTH_SHORT).show(); } else { displayListItems(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @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(); filterText.removeTextChangedListener(filterTextWatcher); } @Override protected void onListItemClick(ListView listView, View v, int position, long id) { super.onListItemClick(listView, v, position, id); Intent intent = new Intent(this, BusDirectionActivity.class); Cursor cursor = (Cursor) listView.getItemAtPosition(position); String route = cursor.getString(cursor.getColumnIndexOrThrow(BusRouteEntity.Columns.ROUTE_ID)); String routeName = cursor.getString(cursor.getColumnIndexOrThrow(BusRouteEntity.Columns.ROUTE_NAME)); Uri data = Uri.parse(route); intent.setData(data); BusFavoriteEntity busDto = new BusFavoriteEntity(); busDto.route = route; busDto.routeName = routeName; intent.putExtra(BusFavoriteEntity.BUS_FAVORITE_ENTITY_EXTRA_DATA_KEY, busDto); startActivity(intent); } private void displayListItems() { Cursor cursor = managedQuery(BusRouteContentProvider.CONTENT_URI, BusRouteEntity.Columns.FULL_PROJECTION, null, null, BusRouteEntity.Columns._ID); listAdapter = new SimpleCursorAdapter(this, R.layout.route_list_item_view, cursor, BusRouteEntity.Columns.LIST_VIEW_PROJECTION, VIEW_ROUTE_ID_ARRAY); listAdapter.setFilterQueryProvider(new FilterQueryProvider() { private CharSequence previous; private Cursor filteredCursor; public Cursor runQuery(CharSequence constraint) { if (constraint.equals(previous)) { Log.d(TAG, "skip requery."); return filteredCursor; } String selection = String.format(ROUTE_FILTER_TEMPLATE, constraint, constraint); Log.d(TAG, "selection=" + selection); filteredCursor = managedQuery(BusRouteContentProvider.CONTENT_URI, BusRouteEntity.Columns.FULL_PROJECTION, selection, null, BusRouteEntity.Columns._ID); previous = constraint; return filteredCursor; } }); setListAdapter(listAdapter); } /** * Callback handler receives category list data from database. */ public class BusRouteActivityBroadcastReceiver extends BroadcastReceiver { public static final String ACTION_RESPONSE = "org.djd.busntrain.bus.BusRouteActivityBroadcastReceiver"; public static final String XML_DATA_TXT = "XML_DATA_TXT"; public final IntentFilter intentFilter; public BusRouteActivityBroadcastReceiver() { 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(BusRouteActivity.this, result, Toast.LENGTH_SHORT).show(); ApplicationCommons.setBusRouteLastUpdate(BusRouteActivity.this); displayListItems(); } } }