From 56c74a2fa83916915587ae2de1b46a50f2c856ee Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Tue, 6 Mar 2012 22:10:47 +0000 Subject: Improved Bus activity, and U6 route overlay. --- gen/net/cbaines/suma/R.java | 114 +++++++++++---------- res/layout/bus_specific_stop_view.xml | 28 +++++ res/raw/u6.gpx | 36 ++++--- src/net/cbaines/suma/BusActivity.java | 102 +++++++++++++----- src/net/cbaines/suma/BusSpecificStopView.java | 53 +++++----- .../cbaines/suma/BusSpecificTimetableAdapter.java | 41 ++++---- src/net/cbaines/suma/StopLoading.java | 11 ++ 7 files changed, 244 insertions(+), 141 deletions(-) create mode 100644 res/layout/bus_specific_stop_view.xml create mode 100644 src/net/cbaines/suma/StopLoading.java diff --git a/gen/net/cbaines/suma/R.java b/gen/net/cbaines/suma/R.java index 3163564..d65abc0 100644 --- a/gen/net/cbaines/suma/R.java +++ b/gen/net/cbaines/suma/R.java @@ -71,71 +71,75 @@ public final class R { public static final int busRouteActivityID=0x7f0a0013; public static final int busRouteActivityLabel=0x7f0a0012; public static final int busRouteBusStops=0x7f0a0014; - public static final int busStopID=0x7f0a001d; - public static final int busStopListItems=0x7f0a0024; - public static final int busStopLoadBar=0x7f0a0022; - public static final int busStopMessage=0x7f0a0021; - public static final int busStopName=0x7f0a0015; - public static final int busStopTimes=0x7f0a001f; - public static final int busTimeContentLayout=0x7f0a001e; - public static final int centerLoadBar=0x7f0a0020; - public static final int check1=0x7f0a0036; - public static final int childname=0x7f0a0035; - public static final int donateBitcoinAddress=0x7f0a002a; + public static final int busSpecificStopViewID=0x7f0a0016; + public static final int busSpecificStopViewName=0x7f0a0015; + public static final int busSpecificStopViewProgressBar=0x7f0a0017; + public static final int busStopID=0x7f0a0020; + public static final int busStopListItems=0x7f0a0027; + public static final int busStopLoadBar=0x7f0a0025; + public static final int busStopMessage=0x7f0a0024; + public static final int busStopName=0x7f0a0018; + public static final int busStopTimes=0x7f0a0022; + public static final int busTimeContentLayout=0x7f0a0021; + public static final int centerLoadBar=0x7f0a0023; + public static final int check1=0x7f0a0039; + public static final int childname=0x7f0a0038; + public static final int donateBitcoinAddress=0x7f0a002d; public static final int donateButton=0x7f0a0003; - public static final int donateDialogErrorMessage=0x7f0a0029; - public static final int donateDialogMessage=0x7f0a0026; - public static final int donateDialogMessageLayout=0x7f0a0028; - public static final int donateDialogProgress=0x7f0a0027; - public static final int favouriteCheckBox=0x7f0a001c; - public static final int favouriteDialogMessage=0x7f0a0030; - public static final int favouriteListItems=0x7f0a0031; - public static final int findContentLayout=0x7f0a002c; - public static final int findListItems=0x7f0a002e; - public static final int findLoadBar=0x7f0a002d; + public static final int donateDialogErrorMessage=0x7f0a002c; + public static final int donateDialogMessage=0x7f0a0029; + public static final int donateDialogMessageLayout=0x7f0a002b; + public static final int donateDialogProgress=0x7f0a002a; + public static final int favouriteCheckBox=0x7f0a001f; + public static final int favouriteDialogMessage=0x7f0a0033; + public static final int favouriteListItems=0x7f0a0034; + public static final int findContentLayout=0x7f0a002f; + public static final int findListItems=0x7f0a0031; + public static final int findLoadBar=0x7f0a0030; public static final int helpExpandableListView=0x7f0a0002; - public static final int layout_root=0x7f0a0023; - public static final int linearLayout1=0x7f0a0016; - public static final int linearLayout2=0x7f0a0025; - public static final int mapview=0x7f0a002f; - public static final int menu_about=0x7f0a0040; - public static final int menu_favourites=0x7f0a0041; - public static final int menu_find=0x7f0a003c; - public static final int menu_find_my_location=0x7f0a003e; - public static final int menu_next_stop=0x7f0a003b; - public static final int menu_preferences=0x7f0a003d; - public static final int menu_previous_stop=0x7f0a0039; - public static final int menu_refresh_bus=0x7f0a0038; - public static final int menu_refresh_stop=0x7f0a003a; - public static final int menu_view=0x7f0a003f; - public static final int radio_u1=0x7f0a0017; - public static final int radio_u1n=0x7f0a0018; - public static final int radio_u2=0x7f0a0019; - public static final int radio_u6=0x7f0a001a; - public static final int radio_u9=0x7f0a001b; - public static final int searchBar=0x7f0a002b; + public static final int layout_root=0x7f0a0026; + public static final int linearLayout1=0x7f0a0019; + public static final int linearLayout2=0x7f0a0028; + public static final int mapview=0x7f0a0032; + public static final int menu_about=0x7f0a0043; + public static final int menu_favourites=0x7f0a0044; + public static final int menu_find=0x7f0a003f; + public static final int menu_find_my_location=0x7f0a0041; + public static final int menu_next_stop=0x7f0a003e; + public static final int menu_preferences=0x7f0a0040; + public static final int menu_previous_stop=0x7f0a003c; + public static final int menu_refresh_bus=0x7f0a003b; + public static final int menu_refresh_stop=0x7f0a003d; + public static final int menu_view=0x7f0a0042; + public static final int radio_u1=0x7f0a001a; + public static final int radio_u1n=0x7f0a001b; + public static final int radio_u2=0x7f0a001c; + public static final int radio_u6=0x7f0a001d; + public static final int radio_u9=0x7f0a001e; + public static final int searchBar=0x7f0a002e; public static final int textView1=0x7f0a0000; public static final int textView2=0x7f0a0001; - public static final int toastViewLinearLayout=0x7f0a0032; - public static final int toastViewSubMessage=0x7f0a0034; - public static final int toastViewText=0x7f0a0033; - public static final int view_list=0x7f0a0037; + public static final int toastViewLinearLayout=0x7f0a0035; + public static final int toastViewSubMessage=0x7f0a0037; + public static final int toastViewText=0x7f0a0036; + public static final int view_list=0x7f0a003a; } public static final class layout { public static final int about_dialog=0x7f030000; public static final int building_activity=0x7f030001; public static final int bus_activity=0x7f030002; public static final int bus_route_activity=0x7f030003; - public static final int bus_stop_activity=0x7f030004; - public static final int bus_stop_dialog=0x7f030005; - public static final int donate_dialog=0x7f030006; - public static final int find_activity=0x7f030007; - public static final int map_activity=0x7f030008; - public static final int poi_dialog=0x7f030009; - public static final int toast_view=0x7f03000a; - public static final int view_child_row=0x7f03000b; - public static final int view_dialog=0x7f03000c; - public static final int view_group_row=0x7f03000d; + public static final int bus_specific_stop_view=0x7f030004; + public static final int bus_stop_activity=0x7f030005; + public static final int bus_stop_dialog=0x7f030006; + public static final int donate_dialog=0x7f030007; + public static final int find_activity=0x7f030008; + public static final int map_activity=0x7f030009; + public static final int poi_dialog=0x7f03000a; + public static final int toast_view=0x7f03000b; + public static final int view_child_row=0x7f03000c; + public static final int view_dialog=0x7f03000d; + public static final int view_group_row=0x7f03000e; } public static final class menu { public static final int bus_menu=0x7f090000; diff --git a/res/layout/bus_specific_stop_view.xml b/res/layout/bus_specific_stop_view.xml new file mode 100644 index 0000000..e48e2f1 --- /dev/null +++ b/res/layout/bus_specific_stop_view.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/res/raw/u6.gpx b/res/raw/u6.gpx index 5356358..c2680e0 100644 --- a/res/raw/u6.gpx +++ b/res/raw/u6.gpx @@ -311,19 +311,21 @@ - + - + - + + + - + - + - + @@ -557,19 +559,27 @@ - + + + + + + + + + - + - + - + - + - + - + diff --git a/src/net/cbaines/suma/BusActivity.java b/src/net/cbaines/suma/BusActivity.java index f2cf133..834ce2f 100644 --- a/src/net/cbaines/suma/BusActivity.java +++ b/src/net/cbaines/suma/BusActivity.java @@ -2,6 +2,7 @@ package net.cbaines.suma; import java.io.IOException; import java.sql.SQLException; +import java.util.Date; import java.util.HashMap; import java.util.List; @@ -18,6 +19,7 @@ import android.util.Log; import android.view.Gravity; import android.view.Menu; import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.ListView; @@ -57,6 +59,8 @@ public class BusActivity extends ToastHelperActivity implements Preferences { Handler handler; + long timeOfLastRefresh = 0; + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bus_activity); @@ -119,8 +123,8 @@ public class BusActivity extends ToastHelperActivity implements Preferences { if (bus.destinationString != null) { Log.i(TAG, "Bus destination string is " + bus.destinationString); - busDestTextView.setText(getResources().getString(R.string.bus_activity_destination_label) - + bus.destinationString); + busDestTextView + .setText(getResources().getString(R.string.bus_activity_destination_label) + bus.destinationString); busDestTextView.setVisibility(View.VISIBLE); } else { Log.i(TAG, "Bus destination string is null"); @@ -139,26 +143,37 @@ public class BusActivity extends ToastHelperActivity implements Preferences { refreshData = new Runnable() { public void run() { - for (int num = timetableView.getFirstVisiblePosition(); num < timetableView - .getLastVisiblePosition(); num++) { - Stop stop = timetable.get(num); + Log.v(TAG, "Refreshing data " + (System.currentTimeMillis() - timeOfLastRefresh)); + timeOfLastRefresh = System.currentTimeMillis(); + for (int num = timetableView.getFirstVisiblePosition(); num < timetableView.getLastVisiblePosition(); num++) { + final Stop stop = timetable.get(num); - GetTimetableStopTask task = tasks.get(busStops.get(num)); + if (System.currentTimeMillis() - stop.timeOfFetch.getTime() > 20000) { + GetTimetableStopTask task = tasks.get(busStops.get(num)); - if (stop.timeOfFetch == null - || (stop.timeOfFetch.getTime() - System.currentTimeMillis()) > 20000) { - if (task != null) { - if (task.getStatus() == AsyncTask.Status.FINISHED) { - task = null; + if (task != null) { // If there is a taks + if (task.getStatus() == AsyncTask.Status.FINISHED) { // If its finished + task = null; // Delete it } } - if (task == null) { + if (task == null) { // If there is now no task + Log.v(TAG, "Updating " + busStops.get(num)); + + // Remove the old time from the timetable + synchronized (timetable) { + timetable.set(num, new StopLoading(bus, busStops.get(num), null, new Date( + System.currentTimeMillis() - 21000), false)); + displayTimetable(timetable); + } + task = new GetTimetableStopTask(); BusStop[] str = { stop.busStop }; task.execute(str); tasks.put(stop.busStop, task); } + } else { + Log.v(TAG, "Not updating " + busStops.get(num)); } } @@ -192,12 +207,13 @@ public class BusActivity extends ToastHelperActivity implements Preferences { Log.i(TAG, "No Previous timetable"); timetable = new Timetable(); for (int i = 0; i < busStops.size(); i++) { - timetable.add(new Stop(bus, busStops.get(i), null, null, false)); + // Add a loading stop, with a fetch time such that it will be fetched + timetable + .add(new StopLoading(bus, busStops.get(i), null, new Date(System.currentTimeMillis() - 21000), false)); } Log.v(TAG, "Finished adding placeholder stops"); } else { Log.i(TAG, "Displaying previous timetable"); - } displayTimetable(timetable); handler.postDelayed(refreshData, 500); @@ -225,6 +241,46 @@ public class BusActivity extends ToastHelperActivity implements Preferences { super.onPause(); } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + if (item.getItemId() == R.id.menu_refresh_bus) { + if (handler != null) { // BusTimes are enabled + handler.removeCallbacks(refreshData); + for (GetTimetableStopTask task : tasks.values()) { + task.cancel(true); + } + Log.i(TAG, "Stoping refreshing timetable data"); + + for (int num = timetableView.getFirstVisiblePosition(); num < timetableView.getLastVisiblePosition(); num++) { + final Stop stop = timetable.get(num); + + Log.v(TAG, "Updating " + busStops.get(num)); + + // Remove the old time from the timetable + synchronized (timetable) { + timetable.set(num, new StopLoading(bus, busStops.get(num), null, new Date( + System.currentTimeMillis() - 21000), false)); + displayTimetable(timetable); + } + + GetTimetableStopTask task = new GetTimetableStopTask(); + BusStop[] str = { stop.busStop }; + task.execute(str); + tasks.put(stop.busStop, task); + } + + handler.postDelayed(refreshData, 50000); + } else { + // TODO: Toast here... + } + } else { + Log.e(TAG, "No known menu option selected"); + return super.onOptionsItemSelected(item); + } + return true; + } + private class GetTimetableStopTask extends AsyncTask { private String errorMessage; @@ -245,7 +301,7 @@ public class BusActivity extends ToastHelperActivity implements Preferences { Log.i(TAG, "Fetching stop for busStop " + position); stop = DataManager.getStop(instance, bus, busStop); if (stop == null) { - stop = new Stop(bus, busStop, null, null, false); + stop = new Stop(bus, busStop, null, new Date(System.currentTimeMillis()), false); } Log.i(TAG, "Finished fetching stop for busStop " + position); } catch (SQLException e) { @@ -266,16 +322,10 @@ public class BusActivity extends ToastHelperActivity implements Preferences { protected void onPostExecute(Stop stop) { // Log.i(TAG, "Got timetable"); - if (stop == null) { - Log.i(TAG, "Its null"); - busContentMessage.setText(errorMessage); - busContentMessage.setVisibility(View.VISIBLE); - } else { - synchronized (timetable) { - timetable.set(position, stop); - displayTimetable(timetable); - } + synchronized (timetable) { + timetable.set(position, stop); + displayTimetable(timetable); } } @@ -307,9 +357,7 @@ public class BusActivity extends ToastHelperActivity implements Preferences { adapter = new BusSpecificTimetableAdapter(this, visibleTimetable); timetableView.setAdapter(adapter); if (busStop != null) { - Log.i(TAG, - "Moving to position of " + busStop.description + " which is " - + busStops.indexOf(busStop)); + Log.i(TAG, "Moving to position of " + busStop.description + " which is " + busStops.indexOf(busStop)); timetableView.setSelection(busStops.indexOf(busStop)); } } diff --git a/src/net/cbaines/suma/BusSpecificStopView.java b/src/net/cbaines/suma/BusSpecificStopView.java index fdb6f56..92ec8c7 100644 --- a/src/net/cbaines/suma/BusSpecificStopView.java +++ b/src/net/cbaines/suma/BusSpecificStopView.java @@ -28,19 +28,18 @@ import android.content.res.Resources; import android.net.Uri; import android.util.Log; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; -import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.j256.ormlite.android.apptools.OpenHelperManager; import com.j256.ormlite.dao.Dao; -public class BusSpecificStopView extends LinearLayout implements OnClickListener, OnLongClickListener { +public class BusSpecificStopView extends RelativeLayout implements OnClickListener, OnLongClickListener { private static final String TAG = "BusSpecificStopView"; @@ -63,14 +62,12 @@ public class BusSpecificStopView extends LinearLayout implements OnClickListener this.context = context; - this.setOrientation(HORIZONTAL); - location = new TextView(context); location.setTextSize(22f); + location.setGravity(Gravity.LEFT); time = new TextView(context); time.setTextSize(22f); - time.setGravity(Gravity.RIGHT); timeProgress = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall); @@ -80,9 +77,22 @@ public class BusSpecificStopView extends LinearLayout implements OnClickListener setStop(stop); - addView(location, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); - addView(time, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); - addView(timeProgress, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); + RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + relativeParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); + + RelativeLayout.LayoutParams relativeParams2 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.FILL_PARENT); + relativeParams2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + + addView(location, relativeParams); + addView(time, relativeParams2); + + // LinearLayout progressLayout = new LinearLayout(context); + // progressLayout.setOrientation(LinearLayout.VERTICAL); + // progressLayout.addView(timeProgress, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + + addView(timeProgress, relativeParams2); } public void setStop(Stop stop) { @@ -96,14 +106,19 @@ public class BusSpecificStopView extends LinearLayout implements OnClickListener } else { location.setText(stop.busStop.description); // TODO } - if (stop.arivalTime != null) { + + if (stop.arivalTime != null) { // Time available time.setText(stop.getShortTimeToArival()); time.setVisibility(View.VISIBLE); timeProgress.setVisibility(View.GONE); - } else { - time.setVisibility(View.GONE); + } else if (stop instanceof StopLoading) { time.setText(""); + time.setVisibility(View.GONE); timeProgress.setVisibility(View.VISIBLE); + } else { // No time available (yet) and not currently loading + time.setVisibility(View.GONE); + time.setText(""); + timeProgress.setVisibility(View.GONE); } DatabaseHelper helper = OpenHelperManager.getHelper(context, DatabaseHelper.class); @@ -122,19 +137,7 @@ public class BusSpecificStopView extends LinearLayout implements OnClickListener + DateFormat.getTimeInstance(DateFormat.SHORT).format(stop.arivalTime) + " (timetabled)"; } } else { - if (stop.bus.id != null) { - if (stop.live) { - onClickMessage = "Bus " + stop.bus.toString(); - } else { - onClickMessage = "Timetabled bus " + stop.bus.toString(); - } - } else { - if (stop.live) { - onClickMessage = "Unidentified bus (" + stop.bus.getName() + ")"; - } else { - onClickMessage = "Timetabled bus (" + stop.bus.getName() + ")"; - } - } + onClickMessage = stop.busStop.description + " on route, but arival time is not avalible"; } } catch (SQLException e) { e.printStackTrace(); diff --git a/src/net/cbaines/suma/BusSpecificTimetableAdapter.java b/src/net/cbaines/suma/BusSpecificTimetableAdapter.java index 96fe713..7b9a34a 100644 --- a/src/net/cbaines/suma/BusSpecificTimetableAdapter.java +++ b/src/net/cbaines/suma/BusSpecificTimetableAdapter.java @@ -21,16 +21,14 @@ package net.cbaines.suma; import android.view.View; import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; import android.widget.BaseAdapter; public class BusSpecificTimetableAdapter extends BaseAdapter { private final BusActivity context; private Timetable timetable; - private final Animation a; - private boolean[] changed; + // private final Animation a; + // private boolean[] changed; private long timeOfLastForcedUpdate = System.currentTimeMillis(); @@ -39,7 +37,7 @@ public class BusSpecificTimetableAdapter extends BaseAdapter { public BusSpecificTimetableAdapter(BusActivity context, Timetable timetable) { this.context = context; this.timetable = timetable; - this.a = AnimationUtils.loadAnimation(context, R.anim.updated_stop_view); + // this.a = AnimationUtils.loadAnimation(context, R.anim.updated_stop_view); } public View getView(int position, View convertView, ViewGroup parent) { @@ -47,6 +45,7 @@ public class BusSpecificTimetableAdapter extends BaseAdapter { // timetable.get(position)); if (timeOfLastForcedUpdate + 1000 < System.currentTimeMillis()) { + context.handler.removeCallbacks(context.refreshData); context.handler.post(context.refreshData); timeOfLastForcedUpdate = System.currentTimeMillis(); } @@ -59,11 +58,11 @@ public class BusSpecificTimetableAdapter extends BaseAdapter { stopView.setStop(timetable.get(position)); } - if (changed == null || changed[position]) { - // a.reset(); - // stopView.startAnimation(a); - // Log.i(TAG, "Animating it"); - } + // if (changed == null || changed[position]) { + // a.reset(); + // stopView.startAnimation(a); + // Log.i(TAG, "Animating it"); + // } return stopView; } @@ -83,17 +82,17 @@ public class BusSpecificTimetableAdapter extends BaseAdapter { public void updateTimetable(Timetable newTimetable) { // Log.v(TAG, "Old timetable " + timetable); // Log.v(TAG, "Adaptor loading new timetable"); - changed = new boolean[newTimetable.size()]; - for (int i = 0; i < newTimetable.size(); i++) { - if (newTimetable.get(i).arivalTime != null && !timetable.contains(newTimetable.get(i), true)) { - changed[i] = true; - // Log.i(TAG, "Old timetable does not contain: " + - // newTimetable.get(i)); - } else { - // Log.i(TAG, "Old timetable contains: " + newTimetable.get(i)); - changed[i] = false; - } - } + // changed = new boolean[newTimetable.size()]; + // for (int i = 0; i < newTimetable.size(); i++) { + // if (newTimetable.get(i).arivalTime != null && !timetable.contains(newTimetable.get(i), true)) { + // changed[i] = true; + // // Log.i(TAG, "Old timetable does not contain: " + + // // newTimetable.get(i)); + // } else { + // // Log.i(TAG, "Old timetable contains: " + newTimetable.get(i)); + // changed[i] = false; + // } + // } timetable = newTimetable; this.notifyDataSetChanged(); } diff --git a/src/net/cbaines/suma/StopLoading.java b/src/net/cbaines/suma/StopLoading.java new file mode 100644 index 0000000..e8ca8e5 --- /dev/null +++ b/src/net/cbaines/suma/StopLoading.java @@ -0,0 +1,11 @@ +package net.cbaines.suma; + +import java.util.Date; + +public class StopLoading extends Stop { + + public StopLoading(Bus bus, BusStop busStop, Date arivalTime, Date timeOfFetch, boolean live) { + super(bus, busStop, arivalTime, timeOfFetch, live); + } + +} -- cgit v1.2.3