2012-09-18 17:11:52 +00:00
|
|
|
package com.dougkeen.bart;
|
|
|
|
|
2012-09-25 21:31:06 +00:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileInputStream;
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
|
|
import org.apache.commons.io.IOUtils;
|
|
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
|
|
|
2012-09-18 17:11:52 +00:00
|
|
|
import android.app.Application;
|
2012-09-18 20:47:42 +00:00
|
|
|
import android.media.MediaPlayer;
|
2012-09-25 21:31:06 +00:00
|
|
|
import android.os.Parcel;
|
|
|
|
import android.util.Log;
|
2012-09-18 20:47:42 +00:00
|
|
|
|
2012-09-25 21:31:06 +00:00
|
|
|
import com.dougkeen.bart.model.Constants;
|
2012-09-18 20:47:42 +00:00
|
|
|
import com.dougkeen.bart.model.Departure;
|
2012-09-19 21:12:18 +00:00
|
|
|
import com.dougkeen.util.Observable;
|
2012-09-18 17:11:52 +00:00
|
|
|
|
|
|
|
public class BartRunnerApplication extends Application {
|
2012-09-25 21:31:06 +00:00
|
|
|
private static final int FIVE_MINUTES = 5 * 60 * 1000;
|
|
|
|
|
|
|
|
private static final String CACHE_FILE_NAME = "lastBoardedDeparture";
|
|
|
|
|
2012-09-18 17:11:52 +00:00
|
|
|
private Departure mBoardedDeparture;
|
|
|
|
|
2012-09-19 21:12:18 +00:00
|
|
|
private Observable<Boolean> mAlarmPending = new Observable<Boolean>(false);
|
|
|
|
|
2012-09-18 20:47:42 +00:00
|
|
|
private boolean mPlayAlarmRingtone;
|
|
|
|
|
|
|
|
private boolean mAlarmSounding;
|
|
|
|
|
|
|
|
private MediaPlayer mAlarmMediaPlayer;
|
2012-09-18 17:11:52 +00:00
|
|
|
|
|
|
|
public boolean shouldPlayAlarmRingtone() {
|
2012-09-18 20:47:42 +00:00
|
|
|
return mPlayAlarmRingtone;
|
2012-09-18 17:11:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void setPlayAlarmRingtone(boolean playAlarmRingtone) {
|
2012-09-18 20:47:42 +00:00
|
|
|
this.mPlayAlarmRingtone = playAlarmRingtone;
|
2012-09-18 17:11:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public Departure getBoardedDeparture() {
|
2012-09-25 21:31:06 +00:00
|
|
|
if (mBoardedDeparture == null) {
|
|
|
|
// see if there's a saved one
|
|
|
|
File cachedDepartureFile = new File(getCacheDir(), CACHE_FILE_NAME);
|
|
|
|
if (cachedDepartureFile.exists()) {
|
|
|
|
InputStream inputStream = null;
|
|
|
|
try {
|
|
|
|
inputStream = new FileInputStream(cachedDepartureFile);
|
|
|
|
byte[] byteArray = IOUtils.toByteArray(inputStream);
|
|
|
|
Parcel parcel = Parcel.obtain();
|
|
|
|
parcel.unmarshall(byteArray, 0, byteArray.length);
|
|
|
|
parcel.setDataPosition(0);
|
|
|
|
Departure lastBoardedDeparture = Departure.CREATOR
|
|
|
|
.createFromParcel(parcel);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Check if the cached one is relatively recent. If so,
|
|
|
|
* restore that to the application context
|
|
|
|
*/
|
|
|
|
long now = System.currentTimeMillis();
|
|
|
|
if (lastBoardedDeparture.getEstimatedArrivalTime() >= now
|
|
|
|
- FIVE_MINUTES
|
|
|
|
|| lastBoardedDeparture.getMeanEstimate() >= now
|
|
|
|
- 2 * FIVE_MINUTES) {
|
|
|
|
mBoardedDeparture = lastBoardedDeparture;
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
Log.w(Constants.TAG,
|
|
|
|
"Couldn't read or unmarshal lastBoardedDeparture file",
|
|
|
|
e);
|
|
|
|
try {
|
|
|
|
cachedDepartureFile.delete();
|
|
|
|
} catch (SecurityException anotherException) {
|
|
|
|
Log.w(Constants.TAG,
|
|
|
|
"Couldn't delete lastBoardedDeparture file",
|
|
|
|
anotherException);
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
IOUtils.closeQuietly(inputStream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-09-18 17:11:52 +00:00
|
|
|
return mBoardedDeparture;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setBoardedDeparture(Departure boardedDeparture) {
|
2012-09-25 21:31:06 +00:00
|
|
|
if (!ObjectUtils.equals(boardedDeparture, mBoardedDeparture)
|
|
|
|
|| ObjectUtils.compare(mBoardedDeparture, boardedDeparture) != 0) {
|
|
|
|
this.mBoardedDeparture = boardedDeparture;
|
|
|
|
|
|
|
|
if (mBoardedDeparture != null) {
|
|
|
|
File cachedDepartureFile = new File(getCacheDir(),
|
|
|
|
CACHE_FILE_NAME);
|
|
|
|
FileOutputStream fileOutputStream = null;
|
|
|
|
try {
|
|
|
|
fileOutputStream = new FileOutputStream(cachedDepartureFile);
|
|
|
|
Parcel parcel = Parcel.obtain();
|
|
|
|
mBoardedDeparture.writeToParcel(parcel, 0);
|
|
|
|
fileOutputStream.write(parcel.marshall());
|
|
|
|
} catch (Exception e) {
|
|
|
|
Log.w(Constants.TAG,
|
|
|
|
"Couldn't write last boarded departure cache file",
|
|
|
|
e);
|
|
|
|
} finally {
|
|
|
|
IOUtils.closeQuietly(fileOutputStream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-09-18 17:11:52 +00:00
|
|
|
}
|
2012-09-18 20:47:42 +00:00
|
|
|
|
|
|
|
public boolean isAlarmSounding() {
|
|
|
|
return mAlarmSounding;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setAlarmSounding(boolean alarmSounding) {
|
|
|
|
this.mAlarmSounding = alarmSounding;
|
|
|
|
}
|
|
|
|
|
|
|
|
public MediaPlayer getAlarmMediaPlayer() {
|
|
|
|
return mAlarmMediaPlayer;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setAlarmMediaPlayer(MediaPlayer alarmMediaPlayer) {
|
|
|
|
this.mAlarmMediaPlayer = alarmMediaPlayer;
|
|
|
|
}
|
|
|
|
|
2012-09-19 21:12:18 +00:00
|
|
|
public boolean isAlarmPending() {
|
|
|
|
return mAlarmPending.getValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Observable<Boolean> getAlarmPendingObservable() {
|
|
|
|
return mAlarmPending;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setAlarmPending(boolean alarmPending) {
|
|
|
|
this.mAlarmPending.setValue(alarmPending);
|
|
|
|
}
|
|
|
|
|
2012-09-18 17:11:52 +00:00
|
|
|
}
|