diff --git a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java index b3faeea73..95812d7a4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java +++ b/MyTracks/src/com/google/android/apps/mytracks/MyTracks.java @@ -227,7 +227,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, } try { return trackRecordingService.isRecording(); - } catch (Exception e) { // TODO: Emergency fix. + // TODO: We catch Exception, because after eliminating the service process + // all exceptions it may throw are no longer wrapped in a RemoteException. + } catch (Exception e) { Log.e(MyTracksConstants.TAG, "MyTracks: Remote exception.", e); // Fall back to alternative check method. @@ -907,7 +909,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, Log.e(MyTracksConstants.TAG, "Cannot insert waypoint marker?"); return -4; } - } catch (Exception e) { // TODO: Emergency fix. + // TODO: We catch Exception, because after eliminating the service process + // all exceptions it may throw are no longer wrapped in a RemoteException. + } catch (Exception e) { Toast.makeText(this, R.string.error_unable_to_insert_marker, Toast.LENGTH_LONG).show(); Log.e(MyTracksConstants.TAG, "Cannot insert waypoint marker.", e); @@ -947,7 +951,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, Log.e(MyTracksConstants.TAG, "Cannot insert statistics marker?"); return -4; } - } catch (Exception e) { // TODO: Emergency fix. + // TODO: We catch Exception, because after eliminating the service process + // all exceptions it may throw are no longer wrapped in a RemoteException. + } catch (Exception e) { Toast.makeText(this, R.string.error_unable_to_insert_marker, Toast.LENGTH_LONG).show(); Log.e(MyTracksConstants.TAG, "Cannot insert statistics marker?", e); @@ -1015,7 +1021,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, setSelectedTrackId(recordingTrackId); Toast.makeText(this, getString(R.string.status_now_recording), Toast.LENGTH_SHORT).show(); - } catch (Exception e) { // TODO: Emergency fix. + // TODO: We catch Exception, because after eliminating the service process + // all exceptions it may throw are no longer wrapped in a RemoteException. + } catch (Exception e) { Toast.makeText(this, getString(R.string.error_unable_to_start_recording), Toast.LENGTH_SHORT).show(); @@ -1048,7 +1056,9 @@ public class MyTracks extends TabActivity implements OnTouchListener, long currentTrackId = recordingTrackId; try { trackRecordingService.endCurrentTrack(); - } catch (Exception e) { // TODO: Emergency fix. + // TODO: We catch Exception, because after eliminating the service process + // all exceptions it may throw are no longer wrapped in a RemoteException. + } catch (Exception e) { Log.e(MyTracksConstants.TAG, "Unable to stop recording.", e); } Intent intent = new Intent(MyTracks.this, MyTracksDetails.class); diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index 3bffbfe1c..70e3895c2 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -725,8 +725,7 @@ public class TrackRecordingService extends Service implements LocationListener { locationManager = null; notificationManager = null; providerUtils = null; - // TODO: Emergency fix to avoid NPE for buggy activities. - //binder.detachFromService(); + binder.detachFromService(); binder = null; // This should be the last operation. @@ -936,21 +935,33 @@ public class TrackRecordingService extends Service implements LocationListener { @Override public boolean isRecording() { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } return service.isRecording(); } @Override public long getRecordingTrackId() { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } return service.recordingTrackId; } @Override public boolean hasRecorded() { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } return service.providerUtils.getLastTrackId() >= 0; } @Override public long startNewTrack() { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } return service.startNewTrack(); } @@ -963,6 +974,9 @@ public class TrackRecordingService extends Service implements LocationListener { */ @Override public long insertWaypointMarker(Waypoint waypoint) { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } return service.insertWaypointMarker(waypoint); } @@ -975,25 +989,36 @@ public class TrackRecordingService extends Service implements LocationListener { */ @Override public long insertStatisticsMarker(Location location) { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } return service.insertStatisticsMarker(location); } @Override public void endCurrentTrack() { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } service.endCurrentTrack(); } @Override public void deleteAllTracks() { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } if (isRecording()) { - throw new IllegalStateException( - "Cannot delete all tracks while recording!"); + throw new IllegalStateException("Cannot delete all tracks while recording!"); } service.providerUtils.deleteAllTracks(); } @Override public void recordLocation(Location loc) { + if (service == null) { + throw new IllegalStateException("The service has been already detached!"); + } service.onLocationChanged(loc); } }