Moved boarded departure to application scope
Fixed some alert/notification issues
This commit is contained in:
parent
5fe231abbe
commit
ad6541a348
@ -13,6 +13,7 @@
|
|||||||
android:targetSdkVersion="14" />
|
android:targetSdkVersion="14" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
android:name=".BartRunnerApplication"
|
||||||
android:icon="@drawable/icon"
|
android:icon="@drawable/icon"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme" >
|
android:theme="@style/AppTheme" >
|
||||||
@ -64,10 +65,16 @@
|
|||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="BartRunner data provider" />
|
android:label="BartRunner data provider" />
|
||||||
|
|
||||||
<service android:name=".NotificationService" />
|
<service
|
||||||
<service android:name=".EtdService" />
|
android:name=".NotificationService"
|
||||||
|
android:exported="false" />
|
||||||
|
<service
|
||||||
|
android:name=".EtdService"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
<receiver android:name=".AlarmBroadcastReceiver" >
|
<receiver
|
||||||
|
android:name=".AlarmBroadcastReceiver"
|
||||||
|
android:exported="false" >
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.dougkeen.action.ALARM" />
|
<action android:name="com.dougkeen.action.ALARM" />
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<net.simonvt.widget.NumberPicker
|
<net.simonvt.widget.NumberPicker
|
||||||
android:id="@+id/numberPicker"
|
android:id="@+id/numberPicker"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="100dp"
|
android:layout_height="wrap_content"
|
||||||
android:layout_weight="1" >
|
android:layout_weight="1" >
|
||||||
</net.simonvt.widget.NumberPicker>
|
</net.simonvt.widget.NumberPicker>
|
||||||
|
|
||||||
|
@ -38,5 +38,7 @@
|
|||||||
<string name="your_train">Your train</string>
|
<string name="your_train">Your train</string>
|
||||||
<string name="skip_alert">Skip alert</string>
|
<string name="skip_alert">Skip alert</string>
|
||||||
<string name="set_up_departure_alert">Set up departure alert</string>
|
<string name="set_up_departure_alert">Set up departure alert</string>
|
||||||
|
<string name="train_alert_text">Your train is leaving soon!</string>
|
||||||
|
<string name="silence_alarm">Silence alarm</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
@ -10,10 +10,12 @@ public class AlarmBroadcastReceiver extends BroadcastReceiver {
|
|||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
WakeLocker.acquire(context);
|
WakeLocker.acquire(context);
|
||||||
|
|
||||||
Intent targetIntent = new Intent(Intent.ACTION_VIEW, intent.getData());
|
BartRunnerApplication application = (BartRunnerApplication) context
|
||||||
targetIntent.putExtra("boardedDeparture", intent.getExtras()
|
.getApplicationContext();
|
||||||
.getParcelable("departure"));
|
application.setPlayAlarmRingtone(true);
|
||||||
targetIntent.putExtra("soundAlarm", true);
|
|
||||||
|
Intent targetIntent = new Intent(Intent.ACTION_VIEW, application
|
||||||
|
.getBoardedDeparture().getStationPair().getUri());
|
||||||
targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
|
||||||
context.startActivity(targetIntent);
|
context.startActivity(targetIntent);
|
||||||
|
27
src/com/dougkeen/bart/BartRunnerApplication.java
Normal file
27
src/com/dougkeen/bart/BartRunnerApplication.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package com.dougkeen.bart;
|
||||||
|
|
||||||
|
import com.dougkeen.bart.model.Departure;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
|
||||||
|
public class BartRunnerApplication extends Application {
|
||||||
|
private Departure mBoardedDeparture;
|
||||||
|
|
||||||
|
private boolean playAlarmRingtone;
|
||||||
|
|
||||||
|
public boolean shouldPlayAlarmRingtone() {
|
||||||
|
return playAlarmRingtone;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlayAlarmRingtone(boolean playAlarmRingtone) {
|
||||||
|
this.playAlarmRingtone = playAlarmRingtone;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Departure getBoardedDeparture() {
|
||||||
|
return mBoardedDeparture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBoardedDeparture(Departure boardedDeparture) {
|
||||||
|
this.mBoardedDeparture = boardedDeparture;
|
||||||
|
}
|
||||||
|
}
|
@ -66,7 +66,7 @@ public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
|||||||
|
|
||||||
final Departure departure = getItem(position);
|
final Departure departure = getItem(position);
|
||||||
((TextView) view.findViewById(R.id.destinationText)).setText(departure
|
((TextView) view.findViewById(R.id.destinationText)).setText(departure
|
||||||
.getDestination().toString());
|
.getTrainDestination().toString());
|
||||||
|
|
||||||
TimedTextSwitcher textSwitcher = (TimedTextSwitcher) view
|
TimedTextSwitcher textSwitcher = (TimedTextSwitcher) view
|
||||||
.findViewById(R.id.trainLengthText);
|
.findViewById(R.id.trainLengthText);
|
||||||
@ -100,7 +100,7 @@ public class DepartureArrayAdapter extends ArrayAdapter<Departure> {
|
|||||||
ImageView colorBar = (ImageView) view
|
ImageView colorBar = (ImageView) view
|
||||||
.findViewById(R.id.destinationColorBar);
|
.findViewById(R.id.destinationColorBar);
|
||||||
((GradientDrawable) colorBar.getDrawable()).setColor(Color
|
((GradientDrawable) colorBar.getDrawable()).setColor(Color
|
||||||
.parseColor(departure.getDestinationColor()));
|
.parseColor(departure.getTrainDestinationColor()));
|
||||||
CountdownTextView countdownTextView = (CountdownTextView) view
|
CountdownTextView countdownTextView = (CountdownTextView) view
|
||||||
.findViewById(R.id.countdown);
|
.findViewById(R.id.countdown);
|
||||||
countdownTextView.setText(departure.getCountdownText());
|
countdownTextView.setText(departure.getCountdownText());
|
||||||
|
@ -299,7 +299,7 @@ public class EtdService extends Service {
|
|||||||
ScheduleItem trip = mLatestScheduleInfo.getTrips().get(i);
|
ScheduleItem trip = mLatestScheduleInfo.getTrips().get(i);
|
||||||
// Definitely not a match if they have different
|
// Definitely not a match if they have different
|
||||||
// destinations
|
// destinations
|
||||||
if (!departure.getDestination().abbreviation.equals(trip
|
if (!departure.getTrainDestination().abbreviation.equals(trip
|
||||||
.getTrainHeadStation())) {
|
.getTrainHeadStation())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -419,6 +419,9 @@ public class EtdService extends Service {
|
|||||||
|
|
||||||
boolean needsBetterAccuracy = false;
|
boolean needsBetterAccuracy = false;
|
||||||
|
|
||||||
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Keep track of first departure, since we'll request another quick
|
* Keep track of first departure, since we'll request another quick
|
||||||
* refresh if it has departed.
|
* refresh if it has departed.
|
||||||
@ -433,6 +436,9 @@ public class EtdService extends Service {
|
|||||||
firstDeparture = departure;
|
firstDeparture = departure;
|
||||||
}
|
}
|
||||||
mLatestDepartures.add(departure);
|
mLatestDepartures.add(departure);
|
||||||
|
if (departure.equals(boardedDeparture)) {
|
||||||
|
boardedDeparture.mergeEstimate(departure);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -494,6 +500,10 @@ public class EtdService extends Service {
|
|||||||
if (existingDeparture.getUncertaintySeconds() > UNCERTAINTY_THRESHOLD) {
|
if (existingDeparture.getUncertaintySeconds() > UNCERTAINTY_THRESHOLD) {
|
||||||
needsBetterAccuracy = true;
|
needsBetterAccuracy = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (departure.equals(boardedDeparture)) {
|
||||||
|
boardedDeparture.mergeEstimate(departure);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(mLatestDepartures);
|
Collections.sort(mLatestDepartures);
|
||||||
|
@ -3,16 +3,19 @@ package com.dougkeen.bart;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import android.app.AlarmManager;
|
import android.app.AlarmManager;
|
||||||
import android.app.IntentService;
|
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
|
import android.app.Service;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.ServiceConnection;
|
import android.content.ServiceConnection;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.Message;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.support.v4.app.NotificationCompat.Builder;
|
import android.support.v4.app.NotificationCompat.Builder;
|
||||||
@ -23,13 +26,15 @@ import com.dougkeen.bart.model.Constants;
|
|||||||
import com.dougkeen.bart.model.Departure;
|
import com.dougkeen.bart.model.Departure;
|
||||||
import com.dougkeen.bart.model.StationPair;
|
import com.dougkeen.bart.model.StationPair;
|
||||||
|
|
||||||
public class NotificationService extends IntentService implements
|
public class NotificationService extends Service implements EtdServiceListener {
|
||||||
EtdServiceListener {
|
|
||||||
|
|
||||||
private static final int DEPARTURE_NOTIFICATION_ID = 123;
|
private static final int DEPARTURE_NOTIFICATION_ID = 123;
|
||||||
|
|
||||||
|
private volatile Looper mServiceLooper;
|
||||||
|
private volatile ServiceHandler mServiceHandler;
|
||||||
|
|
||||||
private boolean mBound = false;
|
private boolean mBound = false;
|
||||||
private EtdService mEtdService;
|
private EtdService mEtdService;
|
||||||
private Departure mDeparture;
|
|
||||||
private StationPair mStationPair;
|
private StationPair mStationPair;
|
||||||
private NotificationManager mNotificationManager;
|
private NotificationManager mNotificationManager;
|
||||||
private AlarmManager mAlarmManager;
|
private AlarmManager mAlarmManager;
|
||||||
@ -37,9 +42,21 @@ public class NotificationService extends IntentService implements
|
|||||||
private PendingIntent mAlarmPendingIntent;
|
private PendingIntent mAlarmPendingIntent;
|
||||||
private int mAlertLeadTime;
|
private int mAlertLeadTime;
|
||||||
private Handler mHandler;
|
private Handler mHandler;
|
||||||
|
private boolean mHasShutDown = false;
|
||||||
|
|
||||||
public NotificationService() {
|
public NotificationService() {
|
||||||
super("BartRunnerNotificationService");
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class ServiceHandler extends Handler {
|
||||||
|
public ServiceHandler(Looper looper) {
|
||||||
|
super(looper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
onHandleIntent((Intent) msg.obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final ServiceConnection mConnection = new ServiceConnection() {
|
private final ServiceConnection mConnection = new ServiceConnection() {
|
||||||
@ -61,6 +78,13 @@ public class NotificationService extends IntentService implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
|
HandlerThread thread = new HandlerThread(
|
||||||
|
"BartRunnerNotificationService");
|
||||||
|
thread.start();
|
||||||
|
|
||||||
|
mServiceLooper = thread.getLooper();
|
||||||
|
mServiceHandler = new ServiceHandler(mServiceLooper);
|
||||||
|
|
||||||
bindService(new Intent(this, EtdService.class), mConnection,
|
bindService(new Intent(this, EtdService.class), mConnection,
|
||||||
Context.BIND_AUTO_CREATE);
|
Context.BIND_AUTO_CREATE);
|
||||||
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
@ -70,25 +94,46 @@ public class NotificationService extends IntentService implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onStart(Intent intent, int startId) {
|
||||||
if (mBound)
|
Message msg = mServiceHandler.obtainMessage();
|
||||||
unbindService(mConnection);
|
msg.arg1 = startId;
|
||||||
super.onDestroy();
|
msg.obj = intent;
|
||||||
|
mServiceHandler.sendMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onHandleIntent(Intent intent) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
Bundle bundle = intent.getExtras();
|
onStart(intent, startId);
|
||||||
Departure departure = (Departure) bundle.getParcelable("departure");
|
return START_STICKY;
|
||||||
mStationPair = (StationPair) bundle.getParcelable("stationPair");
|
|
||||||
mAlertLeadTime = bundle.getInt("alertLeadTime");
|
|
||||||
|
|
||||||
if (mEtdService != null && mDeparture != null
|
|
||||||
&& !mDeparture.equals(departure)) {
|
|
||||||
mEtdService.unregisterListener(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mDeparture = departure;
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
shutDown(true);
|
||||||
|
if (mBound)
|
||||||
|
unbindService(mConnection);
|
||||||
|
mServiceLooper.quit();
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onHandleIntent(Intent intent) {
|
||||||
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
|
if (boardedDeparture == null) {
|
||||||
|
// Nothing to notify about
|
||||||
|
shutDown(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bundle bundle = intent.getExtras();
|
||||||
|
StationPair oldStationPair = mStationPair;
|
||||||
|
mStationPair = boardedDeparture.getStationPair();
|
||||||
|
mAlertLeadTime = bundle.getInt("alertLeadTime");
|
||||||
|
|
||||||
|
if (mEtdService != null && mStationPair != null
|
||||||
|
&& !mStationPair.equals(oldStationPair)) {
|
||||||
|
mEtdService.unregisterListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
if (getStationPair() != null && mEtdService != null) {
|
if (getStationPair() != null && mEtdService != null) {
|
||||||
mEtdService.registerListener(this);
|
mEtdService.registerListener(this);
|
||||||
@ -98,7 +143,6 @@ public class NotificationService extends IntentService implements
|
|||||||
|
|
||||||
Intent targetIntent = new Intent(Intent.ACTION_VIEW,
|
Intent targetIntent = new Intent(Intent.ACTION_VIEW,
|
||||||
mStationPair.getUri());
|
mStationPair.getUri());
|
||||||
targetIntent.putExtra("boardedDeparture", mDeparture);
|
|
||||||
targetIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
targetIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
mNotificationIntent = PendingIntent.getActivity(this, 0, targetIntent,
|
mNotificationIntent = PendingIntent.getActivity(this, 0, targetIntent,
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
@ -111,7 +155,9 @@ public class NotificationService extends IntentService implements
|
|||||||
private void refreshAlarmPendingIntent() {
|
private void refreshAlarmPendingIntent() {
|
||||||
final Intent alarmIntent = new Intent(Constants.ACTION_ALARM,
|
final Intent alarmIntent = new Intent(Constants.ACTION_ALARM,
|
||||||
getStationPair().getUri());
|
getStationPair().getUri());
|
||||||
alarmIntent.putExtra("departure", mDeparture);
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
|
alarmIntent.putExtra("departure", boardedDeparture);
|
||||||
mAlarmPendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent,
|
mAlarmPendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent,
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
}
|
}
|
||||||
@ -137,7 +183,9 @@ public class NotificationService extends IntentService implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private long getAlertClockTime() {
|
private long getAlertClockTime() {
|
||||||
return mDeparture.getMeanEstimate() - mAlertLeadTime * 60 * 1000;
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
|
return boardedDeparture.getMeanEstimate() - mAlertLeadTime * 60 * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cancelAlarm() {
|
private void cancelAlarm() {
|
||||||
@ -146,15 +194,17 @@ public class NotificationService extends IntentService implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onETDChanged(List<Departure> departures) {
|
public void onETDChanged(List<Departure> departures) {
|
||||||
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
for (Departure departure : departures) {
|
for (Departure departure : departures) {
|
||||||
if (departure.equals(mDeparture)
|
if (departure.equals(boardedDeparture)
|
||||||
&& (mDeparture.getMeanSecondsLeft() != departure
|
&& (boardedDeparture.getMeanSecondsLeft() != departure
|
||||||
.getMeanSecondsLeft() || mDeparture
|
.getMeanSecondsLeft() || boardedDeparture
|
||||||
.getUncertaintySeconds() != departure
|
.getUncertaintySeconds() != departure
|
||||||
.getUncertaintySeconds())) {
|
.getUncertaintySeconds())) {
|
||||||
long initialAlertClockTime = getAlertClockTime();
|
long initialAlertClockTime = getAlertClockTime();
|
||||||
|
|
||||||
mDeparture.mergeEstimate(departure);
|
boardedDeparture.mergeEstimate(departure);
|
||||||
|
|
||||||
final long now = System.currentTimeMillis();
|
final long now = System.currentTimeMillis();
|
||||||
if (initialAlertClockTime > now
|
if (initialAlertClockTime > now
|
||||||
@ -194,8 +244,11 @@ public class NotificationService extends IntentService implements
|
|||||||
private long mNextScheduledCheckClockTime = 0;
|
private long mNextScheduledCheckClockTime = 0;
|
||||||
|
|
||||||
private void pollDepartureStatus() {
|
private void pollDepartureStatus() {
|
||||||
if (mDeparture.hasDeparted()) {
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
shutDown();
|
.getBoardedDeparture();
|
||||||
|
|
||||||
|
if (boardedDeparture.hasDeparted()) {
|
||||||
|
shutDown(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateNotification();
|
updateNotification();
|
||||||
@ -214,34 +267,52 @@ public class NotificationService extends IntentService implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void shutDown() {
|
private void shutDown(boolean isBeingDestroyed) {
|
||||||
|
if (!mHasShutDown) {
|
||||||
|
mHasShutDown = true;
|
||||||
mEtdService.unregisterListener(this);
|
mEtdService.unregisterListener(this);
|
||||||
mNotificationManager.cancel(DEPARTURE_NOTIFICATION_ID);
|
mNotificationManager.cancel(DEPARTURE_NOTIFICATION_ID);
|
||||||
cancelAlarm();
|
cancelAlarm();
|
||||||
|
if (!isBeingDestroyed)
|
||||||
stopSelf();
|
stopSelf();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateNotification() {
|
private void updateNotification() {
|
||||||
Builder notificationBuilder = new NotificationCompat.Builder(this);
|
if (mHasShutDown) {
|
||||||
notificationBuilder.setOngoing(true);
|
mNotificationManager.cancel(DEPARTURE_NOTIFICATION_ID);
|
||||||
notificationBuilder.setSmallIcon(R.drawable.icon);
|
return;
|
||||||
final int minutes = mDeparture.getMeanSecondsLeft() / 60;
|
}
|
||||||
final String minutesText = (minutes == 0) ? "Less than one minute"
|
|
||||||
: (minutes + " minute" + ((minutes != 1) ? "s" : ""));
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
notificationBuilder.setContentTitle(mStationPair.getDestination().name);
|
.getBoardedDeparture();
|
||||||
notificationBuilder.setContentText(minutesText + " until departure");
|
final int halfMinutes = (boardedDeparture.getMeanSecondsLeft() + 15) / 30;
|
||||||
notificationBuilder.setContentIntent(mNotificationIntent);
|
float minutes = halfMinutes / 2f;
|
||||||
|
final String minutesText = (minutes < 1) ? "Less than one minute"
|
||||||
|
: (String.format("~%.1f minute", minutes) + ((minutes != 1.0) ? "s"
|
||||||
|
: ""));
|
||||||
|
|
||||||
|
Builder notificationBuilder = new NotificationCompat.Builder(this)
|
||||||
|
.setOngoing(true)
|
||||||
|
.setSmallIcon(R.drawable.icon)
|
||||||
|
.setContentTitle(
|
||||||
|
mStationPair.getOrigin().shortName + " to "
|
||||||
|
+ mStationPair.getDestination().shortName)
|
||||||
|
.setContentText(minutesText + " until departure")
|
||||||
|
.setContentIntent(mNotificationIntent);
|
||||||
mNotificationManager.notify(DEPARTURE_NOTIFICATION_ID,
|
mNotificationManager.notify(DEPARTURE_NOTIFICATION_ID,
|
||||||
notificationBuilder.getNotification());
|
notificationBuilder.getNotification());
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getPollIntervalMillis() {
|
private int getPollIntervalMillis() {
|
||||||
final int secondsToAlarm = mDeparture.getMeanSecondsLeft()
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
|
final int secondsToAlarm = boardedDeparture.getMeanSecondsLeft()
|
||||||
- mAlertLeadTime * 60;
|
- mAlertLeadTime * 60;
|
||||||
|
|
||||||
if (secondsToAlarm < -20) {
|
if (secondsToAlarm < -20) {
|
||||||
/* Alarm should have already gone off by now */
|
/* Alarm should have already gone off by now */
|
||||||
shutDown();
|
shutDown(false);
|
||||||
return 10000000; // Arbitrarily large number
|
return 10000000; // Arbitrarily large number
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,4 +326,10 @@ public class NotificationService extends IntentService implements
|
|||||||
return 10 * 1000;
|
return 10 * 1000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
// Doesn't support binding
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,19 +12,13 @@ import android.support.v4.app.DialogFragment;
|
|||||||
import android.support.v4.app.FragmentActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
|
|
||||||
import com.WazaBe.HoloEverywhere.AlertDialog;
|
import com.WazaBe.HoloEverywhere.AlertDialog;
|
||||||
import com.dougkeen.bart.model.Departure;
|
|
||||||
import com.dougkeen.bart.model.StationPair;
|
|
||||||
|
|
||||||
public class TrainAlertDialogFragment extends DialogFragment {
|
public class TrainAlertDialogFragment extends DialogFragment {
|
||||||
|
|
||||||
private static final String KEY_LAST_ALERT_LEAD_TIME = "lastAlertLeadTime";
|
private static final String KEY_LAST_ALERT_LEAD_TIME = "lastAlertLeadTime";
|
||||||
private Departure mDeparture;
|
|
||||||
private StationPair mStationPair;
|
|
||||||
|
|
||||||
public TrainAlertDialogFragment(Departure departure, StationPair stationPair) {
|
public TrainAlertDialogFragment() {
|
||||||
super();
|
super();
|
||||||
this.mDeparture = departure;
|
|
||||||
this.mStationPair = stationPair;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,7 +32,11 @@ public class TrainAlertDialogFragment extends DialogFragment {
|
|||||||
NumberPicker numberPicker = (NumberPicker) getDialog().findViewById(
|
NumberPicker numberPicker = (NumberPicker) getDialog().findViewById(
|
||||||
R.id.numberPicker);
|
R.id.numberPicker);
|
||||||
|
|
||||||
final int maxValue = mDeparture.getMeanSecondsLeft() / 60;
|
BartRunnerApplication application = (BartRunnerApplication) getActivity()
|
||||||
|
.getApplication();
|
||||||
|
|
||||||
|
final int maxValue = application.getBoardedDeparture()
|
||||||
|
.getMeanSecondsLeft() / 60;
|
||||||
|
|
||||||
String[] displayedValues = new String[maxValue];
|
String[] displayedValues = new String[maxValue];
|
||||||
for (int i = 1; i <= maxValue; i++) {
|
for (int i = 1; i <= maxValue; i++) {
|
||||||
@ -84,10 +82,9 @@ public class TrainAlertDialogFragment extends DialogFragment {
|
|||||||
alertLeadTime);
|
alertLeadTime);
|
||||||
editor.commit();
|
editor.commit();
|
||||||
|
|
||||||
Intent intent = new Intent(getActivity(),
|
Intent intent = new Intent(getActivity()
|
||||||
|
.getApplicationContext(),
|
||||||
NotificationService.class);
|
NotificationService.class);
|
||||||
intent.putExtra("departure", mDeparture);
|
|
||||||
intent.putExtra("stationPair", mStationPair);
|
|
||||||
intent.putExtra("alertLeadTime", alertLeadTime);
|
intent.putExtra("alertLeadTime", alertLeadTime);
|
||||||
getActivity().startService(intent);
|
getActivity().startService(intent);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package com.dougkeen.bart;
|
package com.dougkeen.bart;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.AlertDialog.Builder;
|
import android.app.AlertDialog.Builder;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@ -15,7 +13,6 @@ import android.database.Cursor;
|
|||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.GradientDrawable;
|
import android.graphics.drawable.GradientDrawable;
|
||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
import android.media.Ringtone;
|
|
||||||
import android.media.RingtoneManager;
|
import android.media.RingtoneManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -64,7 +61,6 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
private Station mDestination;
|
private Station mDestination;
|
||||||
|
|
||||||
private Departure mSelectedDeparture;
|
private Departure mSelectedDeparture;
|
||||||
private Departure mBoardedDeparture;
|
|
||||||
|
|
||||||
private DepartureArrayAdapter mDeparturesAdapter;
|
private DepartureArrayAdapter mDeparturesAdapter;
|
||||||
|
|
||||||
@ -132,6 +128,7 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
if (mBound && mEtdService != null)
|
if (mBound && mEtdService != null)
|
||||||
mEtdService
|
mEtdService
|
||||||
.registerListener(ViewDeparturesActivity.this);
|
.registerListener(ViewDeparturesActivity.this);
|
||||||
|
refreshBoardedDeparture();
|
||||||
|
|
||||||
getSupportLoaderManager().destroyLoader(LOADER_ID);
|
getSupportLoaderManager().destroyLoader(LOADER_ID);
|
||||||
}
|
}
|
||||||
@ -151,12 +148,6 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
mDeparturesAdapter = new DepartureArrayAdapter(this,
|
mDeparturesAdapter = new DepartureArrayAdapter(this,
|
||||||
R.layout.departure_listing);
|
R.layout.departure_listing);
|
||||||
|
|
||||||
if (intent.getExtras() != null
|
|
||||||
&& intent.getExtras().containsKey("boardedDeparture")) {
|
|
||||||
mBoardedDeparture = (Departure) intent.getExtras().getParcelable(
|
|
||||||
"boardedDeparture");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
if (savedInstanceState.containsKey("departures")) {
|
if (savedInstanceState.containsKey("departures")) {
|
||||||
for (Parcelable departure : savedInstanceState
|
for (Parcelable departure : savedInstanceState
|
||||||
@ -165,10 +156,6 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
}
|
}
|
||||||
mDeparturesAdapter.notifyDataSetChanged();
|
mDeparturesAdapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
if (savedInstanceState.containsKey("boardedDeparture")) {
|
|
||||||
mBoardedDeparture = (Departure) savedInstanceState
|
|
||||||
.getParcelable("boardedDeparture");
|
|
||||||
}
|
|
||||||
if (savedInstanceState.containsKey("selectedDeparture")) {
|
if (savedInstanceState.containsKey("selectedDeparture")) {
|
||||||
mSelectedDeparture = (Departure) savedInstanceState
|
mSelectedDeparture = (Departure) savedInstanceState
|
||||||
.getParcelable("selectedDeparture");
|
.getParcelable("selectedDeparture");
|
||||||
@ -201,7 +188,8 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
getSupportActionBar().setHomeButtonEnabled(true);
|
getSupportActionBar().setHomeButtonEnabled(true);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
if (intent.getBooleanExtra("soundAlarm", false)) {
|
if (((BartRunnerApplication) getApplication())
|
||||||
|
.shouldPlayAlarmRingtone()) {
|
||||||
soundTheAlarm();
|
soundTheAlarm();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,10 +218,12 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
}
|
}
|
||||||
}, 20000);
|
}, 20000);
|
||||||
|
|
||||||
|
((BartRunnerApplication) getApplication()).setPlayAlarmRingtone(false);
|
||||||
|
|
||||||
Builder builder = new AlertDialog.Builder(this);
|
Builder builder = new AlertDialog.Builder(this);
|
||||||
builder.setMessage("Your train is leaving soon!")
|
builder.setMessage(R.string.train_alert_text)
|
||||||
.setCancelable(false)
|
.setCancelable(false)
|
||||||
.setNeutralButton("Silence alarm",
|
.setNeutralButton(R.string.silence_alarm,
|
||||||
new DialogInterface.OnClickListener() {
|
new DialogInterface.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog,
|
public void onClick(DialogInterface dialog,
|
||||||
@ -316,17 +306,23 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
@Override
|
@Override
|
||||||
protected void onSaveInstanceState(Bundle outState) {
|
protected void onSaveInstanceState(Bundle outState) {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
Departure[] departures = new Departure[mDeparturesAdapter.getCount()];
|
if (mOrigin != null || mDestination != null) {
|
||||||
|
/*
|
||||||
|
* If origin or destination are null, this thing was never
|
||||||
|
* initialized in the first place, so there's really nothing to save
|
||||||
|
*/
|
||||||
|
Departure[] departures = new Departure[mDeparturesAdapter
|
||||||
|
.getCount()];
|
||||||
for (int i = mDeparturesAdapter.getCount() - 1; i >= 0; i--) {
|
for (int i = mDeparturesAdapter.getCount() - 1; i >= 0; i--) {
|
||||||
departures[i] = mDeparturesAdapter.getItem(i);
|
departures[i] = mDeparturesAdapter.getItem(i);
|
||||||
}
|
}
|
||||||
outState.putParcelableArray("departures", departures);
|
outState.putParcelableArray("departures", departures);
|
||||||
outState.putParcelable("boardedDeparture", mBoardedDeparture);
|
|
||||||
outState.putParcelable("selectedDeparture", mSelectedDeparture);
|
outState.putParcelable("selectedDeparture", mSelectedDeparture);
|
||||||
outState.putBoolean("hasActionMode", mActionMode != null);
|
outState.putBoolean("hasActionMode", mActionMode != null);
|
||||||
outState.putString("origin", mOrigin.abbreviation);
|
outState.putString("origin", mOrigin.abbreviation);
|
||||||
outState.putString("destination", mDestination.abbreviation);
|
outState.putString("destination", mDestination.abbreviation);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStart() {
|
protected void onStart() {
|
||||||
@ -383,28 +379,33 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refreshBoardedDeparture() {
|
private void refreshBoardedDeparture() {
|
||||||
if (mBoardedDeparture == null)
|
final Departure boardedDeparture = ((BartRunnerApplication) getApplication())
|
||||||
|
.getBoardedDeparture();
|
||||||
|
if (boardedDeparture == null
|
||||||
|
|| boardedDeparture.getStationPair() == null
|
||||||
|
|| !boardedDeparture.getStationPair().equals(getStationPair())) {
|
||||||
|
findViewById(R.id.yourTrainSection).setVisibility(View.GONE);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final Departure departure = mBoardedDeparture;
|
|
||||||
findViewById(R.id.yourTrainSection).setVisibility(View.VISIBLE);
|
findViewById(R.id.yourTrainSection).setVisibility(View.VISIBLE);
|
||||||
((TextView) findViewById(R.id.yourTrainDestinationText))
|
((TextView) findViewById(R.id.yourTrainDestinationText))
|
||||||
.setText(departure.getDestination().toString());
|
.setText(boardedDeparture.getTrainDestination().toString());
|
||||||
|
|
||||||
((TextView) findViewById(R.id.yourTrainTrainLengthText))
|
((TextView) findViewById(R.id.yourTrainTrainLengthText))
|
||||||
.setText(departure.getTrainLengthText());
|
.setText(boardedDeparture.getTrainLengthText());
|
||||||
|
|
||||||
ImageView colorBar = (ImageView) findViewById(R.id.yourTrainDestinationColorBar);
|
ImageView colorBar = (ImageView) findViewById(R.id.yourTrainDestinationColorBar);
|
||||||
((GradientDrawable) colorBar.getDrawable()).setColor(Color
|
((GradientDrawable) colorBar.getDrawable()).setColor(Color
|
||||||
.parseColor(departure.getDestinationColor()));
|
.parseColor(boardedDeparture.getTrainDestinationColor()));
|
||||||
if (departure.isBikeAllowed()) {
|
if (boardedDeparture.isBikeAllowed()) {
|
||||||
((ImageView) findViewById(R.id.yourTrainBikeIcon))
|
((ImageView) findViewById(R.id.yourTrainBikeIcon))
|
||||||
.setVisibility(View.VISIBLE);
|
.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
((ImageView) findViewById(R.id.yourTrainBikeIcon))
|
((ImageView) findViewById(R.id.yourTrainBikeIcon))
|
||||||
.setVisibility(View.INVISIBLE);
|
.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
if (departure.getRequiresTransfer()) {
|
if (boardedDeparture.getRequiresTransfer()) {
|
||||||
((ImageView) findViewById(R.id.yourTrainXferIcon))
|
((ImageView) findViewById(R.id.yourTrainXferIcon))
|
||||||
.setVisibility(View.VISIBLE);
|
.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
@ -414,26 +415,27 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
CountdownTextView departureCountdown = (CountdownTextView) findViewById(R.id.yourTrainDepartureCountdown);
|
CountdownTextView departureCountdown = (CountdownTextView) findViewById(R.id.yourTrainDepartureCountdown);
|
||||||
CountdownTextView arrivalCountdown = (CountdownTextView) findViewById(R.id.yourTrainArrivalCountdown);
|
CountdownTextView arrivalCountdown = (CountdownTextView) findViewById(R.id.yourTrainArrivalCountdown);
|
||||||
|
|
||||||
departureCountdown.setText("Leaves in " + departure.getCountdownText()
|
departureCountdown.setText("Leaves in "
|
||||||
+ " " + departure.getUncertaintyText());
|
+ boardedDeparture.getCountdownText() + " "
|
||||||
|
+ boardedDeparture.getUncertaintyText());
|
||||||
departureCountdown.setTextProvider(new TextProvider() {
|
departureCountdown.setTextProvider(new TextProvider() {
|
||||||
@Override
|
@Override
|
||||||
public String getText(long tickNumber) {
|
public String getText(long tickNumber) {
|
||||||
if (departure.hasDeparted()) {
|
if (boardedDeparture.hasDeparted()) {
|
||||||
return "Departed";
|
return "Departed";
|
||||||
} else {
|
} else {
|
||||||
return "Leaves in " + departure.getCountdownText() + " "
|
return "Leaves in " + boardedDeparture.getCountdownText()
|
||||||
+ departure.getUncertaintyText();
|
+ " " + boardedDeparture.getUncertaintyText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
arrivalCountdown.setText(departure
|
arrivalCountdown.setText(boardedDeparture
|
||||||
.getEstimatedArrivalMinutesLeftText(this));
|
.getEstimatedArrivalMinutesLeftText(this));
|
||||||
arrivalCountdown.setTextProvider(new TextProvider() {
|
arrivalCountdown.setTextProvider(new TextProvider() {
|
||||||
@Override
|
@Override
|
||||||
public String getText(long tickNumber) {
|
public String getText(long tickNumber) {
|
||||||
return departure
|
return boardedDeparture
|
||||||
.getEstimatedArrivalMinutesLeftText(ViewDeparturesActivity.this);
|
.getEstimatedArrivalMinutesLeftText(ViewDeparturesActivity.this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -441,7 +443,7 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
|
|
||||||
private void startDepartureActionMode() {
|
private void startDepartureActionMode() {
|
||||||
mActionMode = startActionMode(new DepartureActionMode());
|
mActionMode = startActionMode(new DepartureActionMode());
|
||||||
mActionMode.setTitle(mSelectedDeparture.getDestinationName());
|
mActionMode.setTitle(mSelectedDeparture.getTrainDestinationName());
|
||||||
mActionMode.setSubtitle(mSelectedDeparture.getTrainLengthText());
|
mActionMode.setSubtitle(mSelectedDeparture.getTrainLengthText());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,14 +463,19 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
@Override
|
@Override
|
||||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||||
if (item.getItemId() == R.id.boardTrain) {
|
if (item.getItemId() == R.id.boardTrain) {
|
||||||
mBoardedDeparture = mSelectedDeparture;
|
final BartRunnerApplication application = (BartRunnerApplication) getApplication();
|
||||||
|
mSelectedDeparture.setPassengerDestination(mDestination);
|
||||||
|
application.setBoardedDeparture(mSelectedDeparture);
|
||||||
refreshBoardedDeparture();
|
refreshBoardedDeparture();
|
||||||
|
|
||||||
|
// Stop the notification service
|
||||||
|
/*stopService(new Intent(getApplicationContext(),
|
||||||
|
NotificationService.class));*/
|
||||||
|
|
||||||
// Don't prompt for alert if train is about to leave
|
// Don't prompt for alert if train is about to leave
|
||||||
if (mBoardedDeparture.getMeanSecondsLeft() / 60 > 1) {
|
if (mSelectedDeparture.getMeanSecondsLeft() / 60 > 1) {
|
||||||
new TrainAlertDialogFragment(mBoardedDeparture,
|
new TrainAlertDialogFragment().show(
|
||||||
getStationPair()).show(getSupportFragmentManager(),
|
getSupportFragmentManager(), "dialog");
|
||||||
"dialog");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mode.finish();
|
mode.finish();
|
||||||
@ -531,15 +538,8 @@ public class ViewDeparturesActivity extends SherlockFragmentActivity implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mBoardedDeparture != null) {
|
|
||||||
for (Departure departure : departures) {
|
|
||||||
if (departure.equals(mBoardedDeparture)) {
|
|
||||||
mBoardedDeparture.mergeEstimate(departure);
|
|
||||||
refreshBoardedDeparture();
|
refreshBoardedDeparture();
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getListAdapter().notifyDataSetChanged();
|
getListAdapter().notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
String platform, String direction, boolean bikeAllowed,
|
String platform, String direction, boolean bikeAllowed,
|
||||||
String trainLength, int minutes) {
|
String trainLength, int minutes) {
|
||||||
super();
|
super();
|
||||||
this.destination = Station.getByAbbreviation(destinationAbbr);
|
this.trainDestination = Station.getByAbbreviation(destinationAbbr);
|
||||||
this.destinationColor = destinationColor;
|
this.destinationColor = destinationColor;
|
||||||
this.platform = platform;
|
this.platform = platform;
|
||||||
this.direction = direction;
|
this.direction = direction;
|
||||||
@ -34,7 +34,8 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Station origin;
|
private Station origin;
|
||||||
private Station destination;
|
private Station trainDestination;
|
||||||
|
private Station passengerDestination;
|
||||||
private Line line;
|
private Line line;
|
||||||
private String destinationColor;
|
private String destinationColor;
|
||||||
private String platform;
|
private String platform;
|
||||||
@ -63,26 +64,42 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Station getDestination() {
|
public Station getTrainDestination() {
|
||||||
return destination;
|
return trainDestination;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestination(Station destination) {
|
public void setTrainDestination(Station destination) {
|
||||||
this.destination = destination;
|
this.trainDestination = destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDestinationName() {
|
public String getTrainDestinationName() {
|
||||||
if (destination != null)
|
if (trainDestination != null)
|
||||||
return destination.name;
|
return trainDestination.name;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDestinationAbbreviation() {
|
public String getTrainDestinationAbbreviation() {
|
||||||
if (destination != null)
|
if (trainDestination != null)
|
||||||
return destination.abbreviation;
|
return trainDestination.abbreviation;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Station getPassengerDestination() {
|
||||||
|
return passengerDestination;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassengerDestination(Station passengerDestination) {
|
||||||
|
this.passengerDestination = passengerDestination;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StationPair getStationPair() {
|
||||||
|
if (passengerDestination != null) {
|
||||||
|
return new StationPair(origin, passengerDestination);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Line getLine() {
|
public Line getLine() {
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
@ -91,11 +108,11 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
this.line = line;
|
this.line = line;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDestinationColor() {
|
public String getTrainDestinationColor() {
|
||||||
return destinationColor;
|
return destinationColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDestinationColor(String destinationColor) {
|
public void setTrainDestinationColor(String destinationColor) {
|
||||||
this.destinationColor = destinationColor;
|
this.destinationColor = destinationColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,8 +364,9 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + (bikeAllowed ? 1231 : 1237);
|
result = prime * result + (bikeAllowed ? 1231 : 1237);
|
||||||
result = prime * result
|
result = prime
|
||||||
+ ((destination == null) ? 0 : destination.hashCode());
|
* result
|
||||||
|
+ ((trainDestination == null) ? 0 : trainDestination.hashCode());
|
||||||
result = prime
|
result = prime
|
||||||
* result
|
* result
|
||||||
+ ((destinationColor == null) ? 0 : destinationColor.hashCode());
|
+ ((destinationColor == null) ? 0 : destinationColor.hashCode());
|
||||||
@ -377,7 +395,7 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
Departure other = (Departure) obj;
|
Departure other = (Departure) obj;
|
||||||
if (bikeAllowed != other.bikeAllowed)
|
if (bikeAllowed != other.bikeAllowed)
|
||||||
return false;
|
return false;
|
||||||
if (destination != other.destination)
|
if (trainDestination != other.trainDestination)
|
||||||
return false;
|
return false;
|
||||||
if (destinationColor == null) {
|
if (destinationColor == null) {
|
||||||
if (other.destinationColor != null)
|
if (other.destinationColor != null)
|
||||||
@ -446,7 +464,7 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
java.text.DateFormat format = SimpleDateFormat.getTimeInstance();
|
java.text.DateFormat format = SimpleDateFormat.getTimeInstance();
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append(destination);
|
builder.append(trainDestination);
|
||||||
if (requiresTransfer) {
|
if (requiresTransfer) {
|
||||||
builder.append(" (w/ xfer)");
|
builder.append(" (w/ xfer)");
|
||||||
}
|
}
|
||||||
@ -463,7 +481,9 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
dest.writeString(origin.abbreviation);
|
dest.writeString(origin.abbreviation);
|
||||||
dest.writeString(destination.abbreviation);
|
dest.writeString(trainDestination.abbreviation);
|
||||||
|
dest.writeString(passengerDestination == null ? null
|
||||||
|
: passengerDestination.abbreviation);
|
||||||
dest.writeString(destinationColor);
|
dest.writeString(destinationColor);
|
||||||
dest.writeString(platform);
|
dest.writeString(platform);
|
||||||
dest.writeString(direction);
|
dest.writeString(direction);
|
||||||
@ -482,7 +502,8 @@ public class Departure implements Parcelable, Comparable<Departure> {
|
|||||||
|
|
||||||
private void readFromParcel(Parcel in) {
|
private void readFromParcel(Parcel in) {
|
||||||
origin = Station.getByAbbreviation(in.readString());
|
origin = Station.getByAbbreviation(in.readString());
|
||||||
destination = Station.getByAbbreviation(in.readString());
|
trainDestination = Station.getByAbbreviation(in.readString());
|
||||||
|
passengerDestination = Station.getByAbbreviation(in.readString());
|
||||||
destinationColor = in.readString();
|
destinationColor = in.readString();
|
||||||
platform = in.readString();
|
platform = in.readString();
|
||||||
direction = in.readString();
|
direction = in.readString();
|
||||||
|
@ -83,7 +83,7 @@ public class RealTimeDepartures {
|
|||||||
|
|
||||||
private void addDepartureIfApplicable(Departure departure) {
|
private void addDepartureIfApplicable(Departure departure) {
|
||||||
Station destination = Station.getByAbbreviation(departure
|
Station destination = Station.getByAbbreviation(departure
|
||||||
.getDestinationAbbreviation());
|
.getTrainDestinationAbbreviation());
|
||||||
if (departure.getLine() == null)
|
if (departure.getLine() == null)
|
||||||
return;
|
return;
|
||||||
for (Route route : routes) {
|
for (Route route : routes) {
|
||||||
@ -118,7 +118,7 @@ public class RealTimeDepartures {
|
|||||||
Departure departure = iterator.next();
|
Departure departure = iterator.next();
|
||||||
if (departure.getRequiresTransfer()
|
if (departure.getRequiresTransfer()
|
||||||
&& (!departure.isTransferScheduled() || departure
|
&& (!departure.isTransferScheduled() || departure
|
||||||
.getDestination().isBetween(getOrigin(),
|
.getTrainDestination().isBetween(getOrigin(),
|
||||||
getDestination(), departure.getLine()))) {
|
getDestination(), departure.getLine()))) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
|
@ -7,55 +7,68 @@ import java.util.List;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
public enum Station {
|
public enum Station {
|
||||||
_12TH("12th", "12th St./Oakland City Center", false, false, "bayf", "bayf"),
|
_12TH("12th", "12th St./Oakland City Center", "12th St Oak", false, false,
|
||||||
_16TH("16th", "16th St. Mission", false, false),
|
"bayf", "bayf"),
|
||||||
_19TH("19th", "19th St./Oakland", false, false, "bayf", "bayf"),
|
_16TH("16th", "16th St. Mission", "16th St", false, false),
|
||||||
_24TH("24th", "24th St. Mission", false, false),
|
_19TH("19th", "19th St./Oakland", "19th St Oak", false, false, "bayf",
|
||||||
ASHB("ashb", "Ashby", false, false, "mcar", "mcar"),
|
"bayf"),
|
||||||
BALB("balb", "Balboa Park", false, false),
|
_24TH("24th", "24th St. Mission", "24th St", false, false),
|
||||||
BAYF("bayf", "Bay Fair", true, false, "mcar", "mcar"),
|
ASHB("ashb", "Ashby", "Ashby", false, false, "mcar", "mcar"),
|
||||||
CAST("cast", "Castro Valley", false, false, "bayf", "bayf"),
|
BALB("balb", "Balboa Park", "Balboa", false, false),
|
||||||
CIVC("civc", "Civic Center", false, false),
|
BAYF("bayf", "Bay Fair", "Bay Fair", true, false, "mcar", "mcar"),
|
||||||
COLS("cols", "Coliseum/Oakland Airport", true, false, "mcar", "mcar"),
|
CAST("cast", "Castro Valley", "Castro Vly", false, false, "bayf", "bayf"),
|
||||||
COLM("colm", "Colma", false, false, "balb", "balb"),
|
CIVC("civc", "Civic Center", "Civic Ctr", false, false),
|
||||||
CONC("conc", "Concord", false, false, "mcar", "mcar"),
|
COLS("cols", "Coliseum/Oakland Airport", "Coliseum/OAK", true, false,
|
||||||
DALY("daly", "Daly City", false, false),
|
"mcar", "mcar"),
|
||||||
DBRK("dbrk", "Downtown Berkeley", false, false, "mcar", "mcar"),
|
COLM("colm", "Colma", "Colma", false, false, "balb", "balb"),
|
||||||
DUBL("dubl", "Dublin/Pleasanton", false, true, "bayf", "bayf", true, 719999),
|
CONC("conc", "Concord", "Concord", false, false, "mcar", "mcar"),
|
||||||
DELN("deln", "El Cerrito del Norte", false, false, "mcar", "mcar"),
|
DALY("daly", "Daly City", "Daly City", false, false),
|
||||||
PLZA("plza", "El Cerrito Plaza", false, false, "mcar", "mcar"),
|
DBRK("dbrk", "Downtown Berkeley", "Dtwn Berk", false, false, "mcar",
|
||||||
EMBR("embr", "Embarcadero", false, false),
|
"mcar"),
|
||||||
FRMT("frmt", "Fremont", true, true, "bayf", "bayf", true, 299999),
|
DUBL("dubl", "Dublin/Pleasanton", "Dbln/Plsntn", false, true, "bayf",
|
||||||
FTVL("ftvl", "Fruitvale", true, false, "mcar", "mcar"),
|
"bayf", true, 719999),
|
||||||
GLEN("glen", "Glen Park", false, false),
|
DELN("deln", "El Cerrito del Norte", "El Cer/Norte", false, false, "mcar",
|
||||||
HAYW("hayw", "Hayward", true, false, "bayf", "bayf"),
|
"mcar"),
|
||||||
LAFY("lafy", "Lafayette", false, false, "mcar", "mcar"),
|
PLZA("plza", "El Cerrito Plaza", "El Cer/Plz", false, false, "mcar", "mcar"),
|
||||||
LAKE("lake", "Lake Merritt", true, false, "mcar", "mcar"),
|
EMBR("embr", "Embarcadero", "Embarcdro", false, false),
|
||||||
MCAR("mcar", "MacArthur", false, false, "bayf", "bayf"),
|
FRMT("frmt", "Fremont", "Fremont", true, true, "bayf", "bayf", true, 299999),
|
||||||
MLBR("mlbr", "Millbrae", false, true, "balb", "balb", true, 719999),
|
FTVL("ftvl", "Fruitvale", "Fruitvale", true, false, "mcar", "mcar"),
|
||||||
MONT("mont", "Montgomery St.", false, false),
|
GLEN("glen", "Glen Park", "Glen Park", false, false),
|
||||||
NBRK("nbrk", "North Berkeley", false, false, "mcar", "mcar"),
|
HAYW("hayw", "Hayward", "Hayward", true, false, "bayf", "bayf"),
|
||||||
NCON("ncon", "North Concord/Martinez", false, false, "mcar", "mcar"),
|
LAFY("lafy", "Lafayette", "Lafayette", false, false, "mcar", "mcar"),
|
||||||
ORIN("orin", "Orinda", false, false, "mcar", "mcar"),
|
LAKE("lake", "Lake Merritt", "Lk Merritt", true, false, "mcar", "mcar"),
|
||||||
PITT("pitt", "Pittsburg/Bay Point", false, true, "mcar", "mcar", true,
|
MCAR("mcar", "MacArthur", "MacArthur", false, false, "bayf", "bayf"),
|
||||||
|
MLBR("mlbr", "Millbrae", "Millbrae", false, true, "balb", "balb", true,
|
||||||
719999),
|
719999),
|
||||||
PHIL("phil", "Pleasant Hill", false, false, "mcar", "mcar"),
|
MONT("mont", "Montgomery St.", "Montgomery", false, false),
|
||||||
POWL("powl", "Powell St.", false, false),
|
NBRK("nbrk", "North Berkeley", "N Berkeley", false, false, "mcar", "mcar"),
|
||||||
RICH("rich", "Richmond", false, true, "mcar", "mcar", true, 299999),
|
NCON("ncon", "North Concord/Martinez", "N Conc/Mrtnz", false, false,
|
||||||
ROCK("rock", "Rockridge", false, false, "mcar", "mcar"),
|
"mcar", "mcar"),
|
||||||
SBRN("sbrn", "San Bruno", false, false, "balb", "balb"),
|
ORIN("orin", "Orinda", "Orinda", false, false, "mcar", "mcar"),
|
||||||
SANL("sanl", "San Leandro", true, false, "mcar", "mcar"),
|
PITT("pitt", "Pittsburg/Bay Point", "Pitt/Bay Pt", false, true, "mcar",
|
||||||
SFIA("sfia", "SFO Airport", false, false, "balb", "balb", true, 719999),
|
"mcar", true, 719999),
|
||||||
SHAY("shay", "South Hayward", true, false, "bayf", "bayf"),
|
PHIL("phil", "Pleasant Hill", "Plsnt Hill", false, false, "mcar", "mcar"),
|
||||||
SSAN("ssan", "South San Francisco", false, false, "balb", "balb"),
|
POWL("powl", "Powell St.", "Powell", false, false),
|
||||||
UCTY("ucty", "Union City", true, false, "bayf", "bayf"),
|
RICH("rich", "Richmond", "Richmond", false, true, "mcar", "mcar", true,
|
||||||
WCRK("wcrk", "Walnut Creek", false, false, "mcar", "mcar"),
|
299999),
|
||||||
WDUB("wdub", "West Dublin/Pleasanton", false, false, "bayf", "bayf"),
|
ROCK("rock", "Rockridge", "Rockridge", false, false, "mcar", "mcar"),
|
||||||
WOAK("woak", "West Oakland", false, false),
|
SBRN("sbrn", "San Bruno", "San Bruno", false, false, "balb", "balb"),
|
||||||
SPCL("spcl", "Special", false, false);
|
SANL("sanl", "San Leandro", "San Leandro", true, false, "mcar", "mcar"),
|
||||||
|
SFIA("sfia", "SFO Airport", "SFO", false, false, "balb", "balb", true,
|
||||||
|
719999),
|
||||||
|
SHAY("shay", "South Hayward", "S Hayward", true, false, "bayf", "bayf"),
|
||||||
|
SSAN("ssan", "South San Francisco", "S San Fran", false, false, "balb",
|
||||||
|
"balb"),
|
||||||
|
UCTY("ucty", "Union City", "Union City", true, false, "bayf", "bayf"),
|
||||||
|
WCRK("wcrk", "Walnut Creek", "Walnut Crk", false, false, "mcar", "mcar"),
|
||||||
|
WDUB("wdub", "West Dublin/Pleasanton", "W Dbln/Plsntn", false, false,
|
||||||
|
"bayf", "bayf"),
|
||||||
|
WOAK("woak", "West Oakland", "W Oakland", false, false),
|
||||||
|
SPCL("spcl", "Special", "Special", false, false);
|
||||||
|
|
||||||
public final String abbreviation;
|
public final String abbreviation;
|
||||||
public final String name;
|
public final String name;
|
||||||
|
public final String shortName;
|
||||||
public final boolean transferFriendly;
|
public final boolean transferFriendly;
|
||||||
public final boolean invertDirection;
|
public final boolean invertDirection;
|
||||||
protected final String inboundTransferStation;
|
protected final String inboundTransferStation;
|
||||||
@ -66,32 +79,34 @@ public enum Station {
|
|||||||
|
|
||||||
public final static int DEFAULT_DEPARTURE_EQUALITY_TOLERANCE = 119999;
|
public final static int DEFAULT_DEPARTURE_EQUALITY_TOLERANCE = 119999;
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
private Station(String abbreviation, String name, String shortName,
|
||||||
boolean endOfLine) {
|
boolean invertDirection, boolean endOfLine) {
|
||||||
this(abbreviation, name, invertDirection, endOfLine, null, null, false,
|
this(abbreviation, name, shortName, invertDirection, endOfLine, null,
|
||||||
DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
|
||||||
boolean endOfLine, String transferStation) {
|
|
||||||
this(abbreviation, name, invertDirection, endOfLine, transferStation,
|
|
||||||
null, false, DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
|
null, false, DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
private Station(String abbreviation, String name, String shortName,
|
||||||
boolean endOfLine, String inboundTransferStation,
|
boolean invertDirection, boolean endOfLine, String transferStation) {
|
||||||
String outboundTransferStation) {
|
this(abbreviation, name, shortName, invertDirection, endOfLine,
|
||||||
this(abbreviation, name, invertDirection, endOfLine,
|
transferStation, null, false,
|
||||||
|
DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Station(String abbreviation, String name, String shortName,
|
||||||
|
boolean invertDirection, boolean endOfLine,
|
||||||
|
String inboundTransferStation, String outboundTransferStation) {
|
||||||
|
this(abbreviation, name, shortName, invertDirection, endOfLine,
|
||||||
inboundTransferStation, outboundTransferStation, false,
|
inboundTransferStation, outboundTransferStation, false,
|
||||||
DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
|
DEFAULT_DEPARTURE_EQUALITY_TOLERANCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Station(String abbreviation, String name, boolean invertDirection,
|
private Station(String abbreviation, String name, String shortName,
|
||||||
boolean endOfLine, String inboundTransferStation,
|
boolean invertDirection, boolean endOfLine,
|
||||||
String outboundTransferStation, boolean longStationLinger,
|
String inboundTransferStation, String outboundTransferStation,
|
||||||
int departureEqualityTolerance) {
|
boolean longStationLinger, int departureEqualityTolerance) {
|
||||||
this.abbreviation = abbreviation;
|
this.abbreviation = abbreviation;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
this.shortName = shortName;
|
||||||
this.invertDirection = invertDirection;
|
this.invertDirection = invertDirection;
|
||||||
this.inboundTransferStation = inboundTransferStation;
|
this.inboundTransferStation = inboundTransferStation;
|
||||||
this.transferFriendly = outboundTransferStation != null;
|
this.transferFriendly = outboundTransferStation != null;
|
||||||
|
@ -57,7 +57,7 @@ public class EtdContentHandler extends DefaultHandler {
|
|||||||
}
|
}
|
||||||
if (localName.equals("estimate")) {
|
if (localName.equals("estimate")) {
|
||||||
currentDeparture = new Departure();
|
currentDeparture = new Departure();
|
||||||
currentDeparture.setDestination(Station
|
currentDeparture.setTrainDestination(Station
|
||||||
.getByAbbreviation(currentDestination));
|
.getByAbbreviation(currentDestination));
|
||||||
currentDeparture.setOrigin(realTimeDepartures.getOrigin());
|
currentDeparture.setOrigin(realTimeDepartures.getOrigin());
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ public class EtdContentHandler extends DefaultHandler {
|
|||||||
if (currentValue.equalsIgnoreCase("WHITE")) {
|
if (currentValue.equalsIgnoreCase("WHITE")) {
|
||||||
for (Line line : Line.values()) {
|
for (Line line : Line.values()) {
|
||||||
if (line.stations.indexOf(currentDeparture
|
if (line.stations.indexOf(currentDeparture
|
||||||
.getDestination()) >= 0
|
.getTrainDestination()) >= 0
|
||||||
&& line.stations.indexOf(realTimeDepartures
|
&& line.stations.indexOf(realTimeDepartures
|
||||||
.getDestination()) >= 0) {
|
.getDestination()) >= 0) {
|
||||||
currentDeparture.setLine(line);
|
currentDeparture.setLine(line);
|
||||||
@ -104,7 +104,7 @@ public class EtdContentHandler extends DefaultHandler {
|
|||||||
+ "'");
|
+ "'");
|
||||||
}
|
}
|
||||||
} else if (localName.equals("hexcolor")) {
|
} else if (localName.equals("hexcolor")) {
|
||||||
currentDeparture.setDestinationColor("#ff"
|
currentDeparture.setTrainDestinationColor("#ff"
|
||||||
+ currentValue.substring(1));
|
+ currentValue.substring(1));
|
||||||
} else if (localName.equals("bikeflag")) {
|
} else if (localName.equals("bikeflag")) {
|
||||||
currentDeparture.setBikeAllowed(currentValue.equalsIgnoreCase("1"));
|
currentDeparture.setBikeAllowed(currentValue.equalsIgnoreCase("1"));
|
||||||
|
Loading…
Reference in New Issue
Block a user