forked from upstream-mirrors/OpenTracks
Refactored TrackRecordingServiceConnection.
- implemented interfaces directly - moved static methods from TrackRecordingServiceConnectionUtil
This commit is contained in:
@@ -38,7 +38,6 @@ import de.dennisguse.opentracks.fragments.ConfirmDeleteDialogFragment.ConfirmDel
|
|||||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||||
import de.dennisguse.opentracks.util.IntentUtils;
|
import de.dennisguse.opentracks.util.IntentUtils;
|
||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An abstract class for the following common tasks across
|
* An abstract class for the following common tasks across
|
||||||
@@ -200,7 +199,7 @@ public abstract class AbstractListActivity extends AbstractActivity implements C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (stopRecording) {
|
if (stopRecording) {
|
||||||
TrackRecordingServiceConnectionUtils.stopRecording(this, getTrackRecordingServiceConnection(), false);
|
TrackRecordingServiceConnection.stopRecording(this, getTrackRecordingServiceConnection(), false);
|
||||||
}
|
}
|
||||||
Intent intent = IntentUtils.newIntent(this, DeleteActivity.class);
|
Intent intent = IntentUtils.newIntent(this, DeleteActivity.class);
|
||||||
intent.putExtra(DeleteActivity.EXTRA_TRACK_IDS, trackIds);
|
intent.putExtra(DeleteActivity.EXTRA_TRACK_IDS, trackIds);
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import de.dennisguse.opentracks.content.Waypoint;
|
|||||||
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
||||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity to add/edit a marker.
|
* An activity to add/edit a marker.
|
||||||
@@ -91,7 +90,7 @@ public class MarkerEditActivity extends AbstractActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onStart() {
|
protected void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -168,7 +167,7 @@ public class MarkerEditActivity extends AbstractActivity {
|
|||||||
waypointDescription.getText().toString(),
|
waypointDescription.getText().toString(),
|
||||||
null,
|
null,
|
||||||
null);
|
null);
|
||||||
TrackRecordingServiceConnectionUtils.addMarker(this, trackRecordingServiceConnection, waypointCreationRequest);
|
TrackRecordingServiceConnection.addMarker(this, trackRecordingServiceConnection, waypointCreationRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -60,7 +60,6 @@ import de.dennisguse.opentracks.util.ListItemUtils;
|
|||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity to display a list of searchable results.
|
* An activity to display a list of searchable results.
|
||||||
@@ -232,7 +231,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
|
|||||||
super.onStart();
|
super.onStart();
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
|
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
|
||||||
TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ import de.dennisguse.opentracks.util.FileUtils;
|
|||||||
import de.dennisguse.opentracks.util.IntentUtils;
|
import de.dennisguse.opentracks.util.IntentUtils;
|
||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackUtils;
|
import de.dennisguse.opentracks.util.TrackUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -111,7 +110,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
|||||||
if (hasPhoto && photoUri != null) {
|
if (hasPhoto && photoUri != null) {
|
||||||
hasPhoto = false;
|
hasPhoto = false;
|
||||||
WaypointCreationRequest waypointCreationRequest = new WaypointCreationRequest(WaypointType.WAYPOINT, false, null, null, null, null, photoUri.toString());
|
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) {
|
if (markerId != -1L) {
|
||||||
//TODO: Make configurable.
|
//TODO: Make configurable.
|
||||||
FileUtils.updateMediaScanner(TrackDetailActivity.this, photoUri);
|
FileUtils.updateMediaScanner(TrackDetailActivity.this, photoUri);
|
||||||
@@ -168,12 +167,12 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
|||||||
if (recordingTrackPaused) {
|
if (recordingTrackPaused) {
|
||||||
// Paused -> Resume
|
// Paused -> Resume
|
||||||
updateMenuItems(false);
|
updateMenuItems(false);
|
||||||
TrackRecordingServiceConnectionUtils.resumeTrack(trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.resumeTrack(trackRecordingServiceConnection);
|
||||||
trackController.update(true, false);
|
trackController.update(true, false);
|
||||||
} else {
|
} else {
|
||||||
// Recording -> Paused
|
// Recording -> Paused
|
||||||
updateMenuItems(true);
|
updateMenuItems(true);
|
||||||
TrackRecordingServiceConnectionUtils.pauseTrack(trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.pauseTrack(trackRecordingServiceConnection);
|
||||||
trackController.update(true, true);
|
trackController.update(true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,7 +181,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
|||||||
private final OnClickListener stopListener = new OnClickListener() {
|
private final OnClickListener stopListener = new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
TrackRecordingServiceConnectionUtils.stopRecording(TrackDetailActivity.this, trackRecordingServiceConnection, true);
|
TrackRecordingServiceConnection.stopRecording(TrackDetailActivity.this, trackRecordingServiceConnection, true);
|
||||||
updateMenuItems(true);
|
updateMenuItems(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -249,7 +248,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA
|
|||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
|
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
|
||||||
|
|
||||||
TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection);
|
||||||
trackDataHub.start();
|
trackDataHub.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
|||||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller;
|
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller;
|
||||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackUtils;
|
import de.dennisguse.opentracks.util.TrackUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -173,7 +172,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
|
|||||||
@Override
|
@Override
|
||||||
protected void onStart() {
|
protected void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ import de.dennisguse.opentracks.util.ListItemUtils;
|
|||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackUtils;
|
import de.dennisguse.opentracks.util.TrackUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -183,8 +182,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
updateMenuItems(false, false);
|
updateMenuItems(false, false);
|
||||||
TrackRecordingServiceConnectionUtils.stopRecording(
|
TrackRecordingServiceConnection.stopRecording(TrackListActivity.this, trackRecordingServiceConnection, true);
|
||||||
TrackListActivity.this, trackRecordingServiceConnection, true);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -243,12 +241,12 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
|||||||
if (recordingTrackPaused) {
|
if (recordingTrackPaused) {
|
||||||
// Paused -> Resume
|
// Paused -> Resume
|
||||||
updateMenuItems(false, true);
|
updateMenuItems(false, true);
|
||||||
TrackRecordingServiceConnectionUtils.resumeTrack(trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.resumeTrack(trackRecordingServiceConnection);
|
||||||
trackController.update(true, false);
|
trackController.update(true, false);
|
||||||
} else {
|
} else {
|
||||||
// Recording -> Paused
|
// Recording -> Paused
|
||||||
updateMenuItems(false, true);
|
updateMenuItems(false, true);
|
||||||
TrackRecordingServiceConnectionUtils.pauseTrack(trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.pauseTrack(trackRecordingServiceConnection);
|
||||||
trackController.update(true, true);
|
trackController.update(true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -331,7 +329,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
|||||||
|
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||||
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
|
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
|
||||||
TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.startConnection(this, trackRecordingServiceConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -393,7 +391,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||||
boolean isGpsStarted = TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this);
|
boolean isGpsStarted = TrackRecordingServiceConnection.isRecordingServiceRunning(this);
|
||||||
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
|
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
|
||||||
updateMenuItems(isGpsStarted, isRecording);
|
updateMenuItems(isGpsStarted, isRecording);
|
||||||
|
|
||||||
@@ -414,7 +412,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe
|
|||||||
intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
|
intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
} else {
|
} else {
|
||||||
startGps = !TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(this);
|
startGps = !TrackRecordingServiceConnection.isRecordingServiceRunning(this);
|
||||||
|
|
||||||
// Show toast
|
// Show toast
|
||||||
Toast toast = Toast.makeText(this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT);
|
Toast toast = Toast.makeText(this, startGps ? R.string.gps_starting : R.string.gps_stopping, Toast.LENGTH_SHORT);
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ import de.dennisguse.opentracks.util.LocationUtils;
|
|||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.StatsUtils;
|
import de.dennisguse.opentracks.util.StatsUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|
||||||
import de.dennisguse.opentracks.util.UnitConversions;
|
import de.dennisguse.opentracks.util.UnitConversions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,7 +95,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
handlerUpdateUI = new Handler();
|
handlerUpdateUI = new Handler();
|
||||||
trackRecordingServiceConnection = new TrackRecordingServiceConnection(getContext(), null);
|
trackRecordingServiceConnection = new TrackRecordingServiceConnection(getContext(), null);
|
||||||
TrackRecordingServiceConnectionUtils.startConnection(getContext(), trackRecordingServiceConnection);
|
TrackRecordingServiceConnection.startConnection(getContext(), trackRecordingServiceConnection);
|
||||||
|
|
||||||
Spinner activityTypeIcon = getView().findViewById(R.id.stats_activity_type_icon);
|
Spinner activityTypeIcon = getView().findViewById(R.id.stats_activity_type_icon);
|
||||||
activityTypeIcon.setAdapter(TrackIconUtils.getIconSpinnerAdapter(getActivity(), ""));
|
activityTypeIcon.setAdapter(TrackIconUtils.getIconSpinnerAdapter(getActivity(), ""));
|
||||||
|
|||||||
+181
-42
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package de.dennisguse.opentracks.services;
|
package de.dennisguse.opentracks.services;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -24,9 +25,16 @@ import android.os.IBinder;
|
|||||||
import android.os.IBinder.DeathRecipient;
|
import android.os.IBinder.DeathRecipient;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.BuildConfig;
|
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.
|
* Wrapper for the track recording service.
|
||||||
@@ -36,7 +44,7 @@ import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
|||||||
*
|
*
|
||||||
* @author Rodrigo Damazio
|
* @author Rodrigo Damazio
|
||||||
*/
|
*/
|
||||||
public class TrackRecordingServiceConnection {
|
public class TrackRecordingServiceConnection implements ServiceConnection, DeathRecipient {
|
||||||
|
|
||||||
private static final String TAG = TrackRecordingServiceConnection.class.getSimpleName();
|
private static final String TAG = TrackRecordingServiceConnection.class.getSimpleName();
|
||||||
|
|
||||||
@@ -44,32 +52,6 @@ public class TrackRecordingServiceConnection {
|
|||||||
private final Runnable callback;
|
private final Runnable callback;
|
||||||
|
|
||||||
private ITrackRecordingService trackRecordingService;
|
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.
|
* Constructor.
|
||||||
@@ -104,23 +86,59 @@ public class TrackRecordingServiceConnection {
|
|||||||
context.stopService(new Intent(context, TrackRecordingService.class));
|
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).
|
* Unbinds the service (but leave it running).
|
||||||
*/
|
*/
|
||||||
public void unbind() {
|
public void unbind() {
|
||||||
try {
|
try {
|
||||||
context.unbindService(serviceConnection);
|
context.unbindService(this);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
// Means not bound to the service. OK to ignore.
|
// Means not bound to the service. OK to ignore.
|
||||||
}
|
}
|
||||||
setTrackRecordingService(null);
|
setTrackRecordingService(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Gets the track recording service if bound. Returns null otherwise
|
public void onServiceConnected(ComponentName className, IBinder service) {
|
||||||
*/
|
Log.i(TAG, "Connected to the service.");
|
||||||
public ITrackRecordingService getServiceIfBound() {
|
try {
|
||||||
return trackRecordingService;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!startIfNeeded && !TrackRecordingServiceConnectionUtils.isRecordingServiceRunning(context)) {
|
if (!startIfNeeded && !isRecordingServiceRunning(context)) {
|
||||||
Log.d(TAG, "Service is not started. Not binding it.");
|
Log.d(TAG, "Service is not started. Not binding it.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -146,18 +164,139 @@ public class TrackRecordingServiceConnection {
|
|||||||
|
|
||||||
Log.i(TAG, "Binding the service.");
|
Log.i(TAG, "Binding the service.");
|
||||||
int flags = BuildConfig.DEBUG ? Context.BIND_DEBUG_UNBIND : 0;
|
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) {
|
@Deprecated
|
||||||
trackRecordingService = value;
|
public static boolean isRecordingServiceRunning(Context context) {
|
||||||
if (callback != null) {
|
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
callback.run();
|
if (activityManager == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO This approach is deprecated as of API level 26 and should be replaced.
|
||||||
|
List<ActivityManager.RunningServiceInfo> 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-178
@@ -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<RunningServiceInfo> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user