diff --git a/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java b/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java index 9d034fb5e..53975cf89 100644 --- a/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java @@ -38,7 +38,6 @@ import de.dennisguse.opentracks.fragments.ConfirmDeleteDialogFragment.ConfirmDel import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.PreferencesUtils; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; /** * An abstract class for the following common tasks across @@ -200,7 +199,7 @@ public abstract class AbstractListActivity extends AbstractActivity implements C } } if (stopRecording) { - TrackRecordingServiceConnectionUtils.stopRecording(this, getTrackRecordingServiceConnection(), false); + TrackRecordingServiceConnection.stopRecording(this, getTrackRecordingServiceConnection(), false); } Intent intent = IntentUtils.newIntent(this, DeleteActivity.class); intent.putExtra(DeleteActivity.EXTRA_TRACK_IDS, trackIds); diff --git a/src/main/java/de/dennisguse/opentracks/MarkerEditActivity.java b/src/main/java/de/dennisguse/opentracks/MarkerEditActivity.java index 371f3c4b7..48f1728e8 100644 --- a/src/main/java/de/dennisguse/opentracks/MarkerEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/MarkerEditActivity.java @@ -30,7 +30,6 @@ import de.dennisguse.opentracks.content.Waypoint; import de.dennisguse.opentracks.content.Waypoint.WaypointType; import de.dennisguse.opentracks.content.WaypointCreationRequest; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; /** * An activity to add/edit a marker. @@ -91,7 +90,7 @@ public class MarkerEditActivity extends AbstractActivity { @Override protected void onStart() { super.onStart(); - TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); + TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection); } @Override @@ -168,7 +167,7 @@ public class MarkerEditActivity extends AbstractActivity { waypointDescription.getText().toString(), null, null); - TrackRecordingServiceConnectionUtils.addMarker(this, trackRecordingServiceConnection, waypointCreationRequest); + TrackRecordingServiceConnection.addMarker(this, trackRecordingServiceConnection, waypointCreationRequest); } /** diff --git a/src/main/java/de/dennisguse/opentracks/SearchListActivity.java b/src/main/java/de/dennisguse/opentracks/SearchListActivity.java index 168558e79..0a983505c 100644 --- a/src/main/java/de/dennisguse/opentracks/SearchListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/SearchListActivity.java @@ -60,7 +60,6 @@ import de.dennisguse.opentracks.util.ListItemUtils; import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.TrackIconUtils; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; /** * An activity to display a list of searchable results. @@ -232,7 +231,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa super.onStart(); sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); - TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); + TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java index a8c1d3fcf..973ea3370 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java @@ -58,7 +58,6 @@ import de.dennisguse.opentracks.util.FileUtils; import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.TrackIconUtils; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; import de.dennisguse.opentracks.util.TrackUtils; /** @@ -111,7 +110,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA if (hasPhoto && photoUri != null) { hasPhoto = false; WaypointCreationRequest waypointCreationRequest = new WaypointCreationRequest(WaypointType.WAYPOINT, false, null, null, null, null, photoUri.toString()); - long markerId = TrackRecordingServiceConnectionUtils.addMarker(TrackDetailActivity.this, trackRecordingServiceConnection, waypointCreationRequest); + long markerId = TrackRecordingServiceConnection.addMarker(TrackDetailActivity.this, trackRecordingServiceConnection, waypointCreationRequest); if (markerId != -1L) { //TODO: Make configurable. FileUtils.updateMediaScanner(TrackDetailActivity.this, photoUri); @@ -168,12 +167,12 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA if (recordingTrackPaused) { // Paused -> Resume updateMenuItems(false); - TrackRecordingServiceConnectionUtils.resumeTrack(trackRecordingServiceConnection); + TrackRecordingServiceConnection.resumeTrack(trackRecordingServiceConnection); trackController.update(true, false); } else { // Recording -> Paused updateMenuItems(true); - TrackRecordingServiceConnectionUtils.pauseTrack(trackRecordingServiceConnection); + TrackRecordingServiceConnection.pauseTrack(trackRecordingServiceConnection); trackController.update(true, true); } } @@ -182,7 +181,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA private final OnClickListener stopListener = new OnClickListener() { @Override public void onClick(View v) { - TrackRecordingServiceConnectionUtils.stopRecording(TrackDetailActivity.this, trackRecordingServiceConnection, true); + TrackRecordingServiceConnection.stopRecording(TrackDetailActivity.this, trackRecordingServiceConnection, true); updateMenuItems(true); } }; @@ -249,7 +248,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); - TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); + TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection); trackDataHub.start(); } diff --git a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java index 7c5e28472..0bd2caa2a 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java @@ -34,7 +34,6 @@ import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.util.TrackIconUtils; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; import de.dennisguse.opentracks.util.TrackUtils; /** @@ -173,7 +172,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit @Override protected void onStart() { super.onStart(); - TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); + TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index 8bbe67162..56c1203ca 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -65,7 +65,6 @@ import de.dennisguse.opentracks.util.ListItemUtils; import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.TrackIconUtils; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; import de.dennisguse.opentracks.util.TrackUtils; /** @@ -183,8 +182,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe @Override public void onClick(View v) { updateMenuItems(false, false); - TrackRecordingServiceConnectionUtils.stopRecording( - TrackListActivity.this, trackRecordingServiceConnection, true); + TrackRecordingServiceConnection.stopRecording(TrackListActivity.this, trackRecordingServiceConnection, true); } }; @@ -243,12 +241,12 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe if (recordingTrackPaused) { // Paused -> Resume updateMenuItems(false, true); - TrackRecordingServiceConnectionUtils.resumeTrack(trackRecordingServiceConnection); + TrackRecordingServiceConnection.resumeTrack(trackRecordingServiceConnection); trackController.update(true, false); } else { // Recording -> Paused updateMenuItems(false, true); - TrackRecordingServiceConnectionUtils.pauseTrack(trackRecordingServiceConnection); + TrackRecordingServiceConnection.pauseTrack(trackRecordingServiceConnection); trackController.update(true, true); } } @@ -331,7 +329,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); - TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection); + TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection); } @Override @@ -393,7 +391,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe @Override public boolean onPrepareOptionsMenu(Menu menu) { - boolean isGpsStarted = TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this); + boolean isGpsStarted = TrackRecordingServiceConnection.isRecordingServiceRunning(this); boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; updateMenuItems(isGpsStarted, isRecording); @@ -414,7 +412,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } else { - startGps = !TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this); + startGps = !TrackRecordingServiceConnection.isRecordingServiceRunning(this); // Show toast Toast toast = Toast.makeText(this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT); diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java index 3a4c48196..f1c7da288 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java @@ -49,7 +49,6 @@ import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.StatsUtils; import de.dennisguse.opentracks.util.TrackIconUtils; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; import de.dennisguse.opentracks.util.UnitConversions; /** @@ -96,7 +95,7 @@ public class StatsFragment extends Fragment implements TrackDataListener { super.onActivityCreated(savedInstanceState); handlerUpdateUI = new Handler(); trackRecordingServiceConnection = new TrackRecordingServiceConnection(getContext(), null); - TrackRecordingServiceConnectionUtils.startConnection(getContext(), trackRecordingServiceConnection); + TrackRecordingServiceConnection.startConnection(getContext(), trackRecordingServiceConnection); Spinner activityTypeIcon = getView().findViewById(R.id.stats_activity_type_icon); activityTypeIcon.setAdapter(TrackIconUtils.getIconSpinnerAdapter(getActivity(), "")); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java index 86b76ffca..aa6fdf675 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java @@ -16,6 +16,7 @@ package de.dennisguse.opentracks.services; +import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -24,9 +25,16 @@ import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.RemoteException; import android.util.Log; +import android.widget.Toast; + +import java.util.List; import de.dennisguse.opentracks.BuildConfig; -import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; +import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.TrackEditActivity; +import de.dennisguse.opentracks.content.WaypointCreationRequest; +import de.dennisguse.opentracks.util.IntentUtils; +import de.dennisguse.opentracks.util.PreferencesUtils; /** * Wrapper for the track recording service. @@ -36,7 +44,7 @@ import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils; * * @author Rodrigo Damazio */ -public class TrackRecordingServiceConnection { +public class TrackRecordingServiceConnection implements ServiceConnection, DeathRecipient { private static final String TAG = TrackRecordingServiceConnection.class.getSimpleName(); @@ -44,32 +52,6 @@ public class TrackRecordingServiceConnection { private final Runnable callback; private ITrackRecordingService trackRecordingService; - private final DeathRecipient deathRecipient = new DeathRecipient() { - @Override - public void binderDied() { - Log.d(TAG, "Service died."); - setTrackRecordingService(null); - } - }; - - private final ServiceConnection serviceConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName className, IBinder service) { - Log.i(TAG, "Connected to the service."); - try { - service.linkToDeath(deathRecipient, 0); - } catch (RemoteException e) { - Log.e(TAG, "Failed to bind a death recipient.", e); - } - setTrackRecordingService((ITrackRecordingService) service); - } - - @Override - public void onServiceDisconnected(ComponentName className) { - Log.i(TAG, "Disconnected from the service."); - setTrackRecordingService(null); - } - }; /** * Constructor. @@ -104,23 +86,59 @@ public class TrackRecordingServiceConnection { context.stopService(new Intent(context, TrackRecordingService.class)); } + /** + * Gets the track recording service if bound. Returns null otherwise + */ + public ITrackRecordingService getServiceIfBound() { + return trackRecordingService; + } + + + /** + * Sets the trackRecordingService. + * + * @param value the value + */ + private void setTrackRecordingService(ITrackRecordingService value) { + trackRecordingService = value; + if (callback != null) { + callback.run(); + } + } + /** * Unbinds the service (but leave it running). */ public void unbind() { try { - context.unbindService(serviceConnection); + context.unbindService(this); } catch (IllegalArgumentException e) { // Means not bound to the service. OK to ignore. } setTrackRecordingService(null); } - /** - * Gets the track recording service if bound. Returns null otherwise - */ - public ITrackRecordingService getServiceIfBound() { - return trackRecordingService; + @Override + public void onServiceConnected(ComponentName className, IBinder service) { + Log.i(TAG, "Connected to the service."); + try { + service.linkToDeath(this, 0); + } catch (RemoteException e) { + Log.e(TAG, "Failed to bind a death recipient.", e); + } + setTrackRecordingService((ITrackRecordingService) service); + } + + @Override + public void onServiceDisconnected(ComponentName className) { + Log.i(TAG, "Disconnected from the service."); + setTrackRecordingService(null); + } + + @Override + public void binderDied() { + Log.d(TAG, "Service died."); + setTrackRecordingService(null); } /** @@ -134,7 +152,7 @@ public class TrackRecordingServiceConnection { return; } - if (!startIfNeeded && !TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(context)) { + if (!startIfNeeded && !isRecordingServiceRunning(context)) { Log.d(TAG, "Service is not started. Not binding it."); return; } @@ -146,18 +164,139 @@ public class TrackRecordingServiceConnection { Log.i(TAG, "Binding the service."); int flags = BuildConfig.DEBUG ? Context.BIND_DEBUG_UNBIND : 0; - context.bindService(new Intent(context, TrackRecordingService.class), serviceConnection, flags); + context.bindService(new Intent(context, TrackRecordingService.class), this, flags); } /** - * Sets the trackRecordingService. + * Returns true if the recording service is running. * - * @param value the value + * @param context the current context */ - private void setTrackRecordingService(ITrackRecordingService value) { - trackRecordingService = value; - if (callback != null) { - callback.run(); + @Deprecated + public static boolean isRecordingServiceRunning(Context context) { + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + if (activityManager == null) { + return false; + } + + //TODO This approach is deprecated as of API level 26 and should be replaced. + List services = activityManager.getRunningServices(Integer.MAX_VALUE); + + for (ActivityManager.RunningServiceInfo serviceInfo : services) { + ComponentName componentName = serviceInfo.service; + String serviceName = componentName.getClassName(); + if (TrackRecordingService.class.getName().equals(serviceName)) { + return true; + } + } + return false; + } + + /** + * Resumes the track recording service connection. + * + * @param context the context + * @param trackRecordingServiceConnection the track recording service connection + */ + public static void startConnection(Context context, TrackRecordingServiceConnection trackRecordingServiceConnection) { + trackRecordingServiceConnection.bindIfStarted(); + if (!isRecordingServiceRunning(context)) { + resetRecordingState(context); + } + } + + /** + * Resumes the recording track. + * + * @param trackRecordingServiceConnection the track recording service + */ + public static void resumeTrack(TrackRecordingServiceConnection trackRecordingServiceConnection) { + ITrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound(); + if (service != null) { + service.resumeCurrentTrack(); + } + } + + /** + * Pauses the recording track. + * + * @param trackRecordingServiceConnection the track recording service + * connection + */ + public static void pauseTrack(TrackRecordingServiceConnection trackRecordingServiceConnection) { + ITrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound(); + if (service != null) { + service.pauseCurrentTrack(); + } + } + + /** + * Stops the recording. + * + * @param context the context + * @param trackRecordingServiceConnection the track recording service connection + * @param showEditor true to show the editor + */ + public static void stopRecording(Context context, TrackRecordingServiceConnection trackRecordingServiceConnection, boolean showEditor) { + ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); + if (trackRecordingService == null) { + resetRecordingState(context); + } else { + try { + if (showEditor) { + // Need to remember the recordingTrackId before calling endCurrentTrack() as endCurrentTrack() sets the value to -1L. + long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); + trackRecordingService.endCurrentTrack(); + if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { + Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class) + .putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId) + .putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true); + context.startActivity(intent); + } + } else { + trackRecordingService.endCurrentTrack(); + } + } catch (Exception e) { + //TODO What exception are we catching here? Should be removed... + Log.e(TAG, "Unable to stop recording.", e); + } + } + trackRecordingServiceConnection.unbindAndStop(); + } + + /** + * Adds a marker. + * + * @return the id of the marker or -1L if none could be created. + */ + public static long addMarker(Context context, TrackRecordingServiceConnection trackRecordingServiceConnection, WaypointCreationRequest waypointCreationRequest) { + ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); + if (trackRecordingService == null) { + Log.d(TAG, "Unable to add marker, no track recording service"); + } else { + try { + long markerId = trackRecordingService.insertWaypoint(waypointCreationRequest); + if (markerId != -1L) { + Toast.makeText(context, R.string.marker_add_success, Toast.LENGTH_SHORT).show(); + return markerId; + } + } catch (IllegalStateException e) { + Log.e(TAG, "Unable to add marker.", e); + } + } + + Toast.makeText(context, R.string.marker_add_error, Toast.LENGTH_LONG).show(); + return -1L; + } + + private static void resetRecordingState(Context context) { + long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); + if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { + PreferencesUtils.setLong(context, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); + } + boolean recordingTrackPaused = PreferencesUtils.getBoolean(context, R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT); + if (!recordingTrackPaused) { + PreferencesUtils.setBoolean(context, R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT); } } } diff --git a/src/main/java/de/dennisguse/opentracks/util/TrackRecordingServiceConnectionUtils.java b/src/main/java/de/dennisguse/opentracks/util/TrackRecordingServiceConnectionUtils.java deleted file mode 100644 index 2a01f185b..000000000 --- a/src/main/java/de/dennisguse/opentracks/util/TrackRecordingServiceConnectionUtils.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package de.dennisguse.opentracks.util; - -import android.app.ActivityManager; -import android.app.ActivityManager.RunningServiceInfo; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.util.Log; -import android.widget.Toast; - -import java.util.List; - -import de.dennisguse.opentracks.R; -import de.dennisguse.opentracks.TrackEditActivity; -import de.dennisguse.opentracks.content.WaypointCreationRequest; -import de.dennisguse.opentracks.services.ITrackRecordingService; -import de.dennisguse.opentracks.services.TrackRecordingService; -import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; - -/** - * Utilities for {@link TrackRecordingServiceConnection}. - * - * @author Rodrigo Damazio - */ -public class TrackRecordingServiceConnectionUtils { - - private static final String TAG = TrackRecordingServiceConnectionUtils.class.getSimpleName(); - - private TrackRecordingServiceConnectionUtils() { - } - - /** - * Returns true if the recording service is running. - * - * @param context the current context - */ - public static boolean isRecordingServiceRunning(Context context) { - ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - if (activityManager == null) { - return false; - } - - //TODO This approach is deprecated as of API level 26 and should be replaced. - List services = activityManager.getRunningServices(Integer.MAX_VALUE); - - for (RunningServiceInfo serviceInfo : services) { - ComponentName componentName = serviceInfo.service; - String serviceName = componentName.getClassName(); - if (TrackRecordingService.class.getName().equals(serviceName)) { - return true; - } - } - return false; - } - - /** - * Resumes the recording track. - * - * @param trackRecordingServiceConnection the track recording service - */ - public static void resumeTrack(TrackRecordingServiceConnection trackRecordingServiceConnection) { - ITrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound(); - if (service != null) { - service.resumeCurrentTrack(); - } - } - - /** - * Pauses the recording track. - * - * @param trackRecordingServiceConnection the track recording service - * connection - */ - public static void pauseTrack(TrackRecordingServiceConnection trackRecordingServiceConnection) { - ITrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound(); - if (service != null) { - service.pauseCurrentTrack(); - } - } - - /** - * Stops the recording. - * - * @param context the context - * @param trackRecordingServiceConnection the track recording service - * connection - * @param showEditor true to show the editor - */ - public static void stopRecording(Context context, TrackRecordingServiceConnection trackRecordingServiceConnection, boolean showEditor) { - ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); - if (trackRecordingService == null) { - resetRecordingState(context); - } else { - try { - if (showEditor) { - // Need to remember the recordingTrackId before calling endCurrentTrack() as endCurrentTrack() sets the value to -1L. - long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); - trackRecordingService.endCurrentTrack(); - if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { - Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class) - .putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId) - .putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true); - context.startActivity(intent); - } - } else { - trackRecordingService.endCurrentTrack(); - } - } catch (Exception e) { - //TODO What exception are we catching here? Should be removed... - Log.e(TAG, "Unable to stop recording.", e); - } - } - trackRecordingServiceConnection.unbindAndStop(); - } - - /** - * Resumes the track recording service connection. - * - * @param context the context - * @param trackRecordingServiceConnection the track recording service connection - */ - public static void startConnection(Context context, TrackRecordingServiceConnection trackRecordingServiceConnection) { - trackRecordingServiceConnection.bindIfStarted(); - if (!isRecordingServiceRunning(context)) { - resetRecordingState(context); - } - } - - private static void resetRecordingState(Context context) { - long recordingTrackId = PreferencesUtils.getLong(context, R.string.recording_track_id_key); - if (recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT) { - PreferencesUtils.setLong(context, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); - } - boolean recordingTrackPaused = PreferencesUtils.getBoolean(context, R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT); - if (!recordingTrackPaused) { - PreferencesUtils.setBoolean(context, R.string.recording_track_paused_key, PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT); - } - } - - /** - * Adds a marker. - */ - public static long addMarker(Context context, TrackRecordingServiceConnection trackRecordingServiceConnection, WaypointCreationRequest waypointCreationRequest) { - ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); - if (trackRecordingService == null) { - Log.d(TAG, "Unable to add marker, no track recording service"); - } else { - try { - long markerId = trackRecordingService.insertWaypoint(waypointCreationRequest); - if (markerId != -1L) { - Toast.makeText(context, R.string.marker_add_success, Toast.LENGTH_SHORT).show(); - return markerId; - } - } catch (IllegalStateException e) { - Log.e(TAG, "Unable to add marker.", e); - } - } - - Toast.makeText(context, R.string.marker_add_error, Toast.LENGTH_LONG).show(); - return -1L; - } -}