diff --git a/src/androidTest/java/de/dennisguse/opentracks/publicapi/PublicApiTest.java b/src/androidTest/java/de/dennisguse/opentracks/publicapi/PublicApiTest.java new file mode 100644 index 000000000..92960d1a4 --- /dev/null +++ b/src/androidTest/java/de/dennisguse/opentracks/publicapi/PublicApiTest.java @@ -0,0 +1,56 @@ +package de.dennisguse.opentracks.publicapi; + +import android.content.Context; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.rule.GrantPermissionRule; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.TestUtil; +import de.dennisguse.opentracks.settings.PreferencesUtils; +import de.dennisguse.opentracks.util.IntentUtils; + +@LargeTest +@RunWith(AndroidJUnit4.class) +public class PublicApiTest { + + @Rule + public GrantPermissionRule mGrantPermissionRule = TestUtil.createGrantPermissionRule(); + + private final Context context = ApplicationProvider.getApplicationContext(); + + @Test + public void StartTest() { + PreferencesUtils.setBoolean(R.string.publicapi_enabled_key, true); + + context.startActivity(IntentUtils.newIntent(context, StartRecording.class)); + } + + @Test + public void StartStopTest() throws InterruptedException { + PreferencesUtils.setBoolean(R.string.publicapi_enabled_key, true); + + context.startActivity(IntentUtils.newIntent(context, StartRecording.class)); + + Thread.sleep(5000); + + context.startActivity(IntentUtils.newIntent(context, StopRecording.class)); + } + + @Test + public void StopAndWait() throws InterruptedException { + PreferencesUtils.setBoolean(R.string.publicapi_enabled_key, true); + + context.startActivity(IntentUtils.newIntent(context, StopRecording.class)); + + Thread.sleep(10000); + + //No ForegroundServiceDidNotStartInTimeException should be happening. + } +} \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index dda4cb355..2bec92c20 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -159,7 +159,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co if (gpsStatusValue.isGpsStarted()) { recordingStatusConnection.stopService(this); } else { - TrackRecordingServiceConnection.execute(this, (service, connection) -> service.tryStartSensors()); + TrackRecordingServiceConnection.executeForeground(this, (service, connection) -> service.tryStartSensors()); } } }); @@ -178,7 +178,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co // Not Recording -> Recording Log.i(TAG, "Starting recording"); updateGpsMenuItem(false, true); - TrackRecordingServiceConnection.execute(this, (service, connection) -> { + TrackRecordingServiceConnection.executeForeground(this, (service, connection) -> { Track.Id trackId = service.startNewTrack(); Intent newIntent = IntentUtils.newIntent(TrackListActivity.this, TrackRecordingActivity.class); diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java index 856a04a53..911675fb5 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java @@ -201,7 +201,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement } if (item.getItemId() == R.id.track_detail_resume_track) { - TrackRecordingServiceConnection.execute(this, (service, connection) -> { + TrackRecordingServiceConnection.executeForeground(this, (service, connection) -> { service.resumeTrack(trackId); Intent newIntent = IntentUtils.newIntent(TrackRecordedActivity.this, TrackRecordingActivity.class) diff --git a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java index ddb916775..7dd6d9d73 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java @@ -136,7 +136,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements } private void resumeTrackAndFinish() { - TrackRecordingServiceConnection.execute(this, (service, connection) -> { + TrackRecordingServiceConnection.executeForeground(this, (service, connection) -> { service.resumeTrack(trackId); Intent newIntent = IntentUtils.newIntent(TrackStoppedActivity.this, TrackRecordingActivity.class) diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java index 8738ac7cd..26505d5ab 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java @@ -42,6 +42,8 @@ public class TrackRecordingServiceConnection { private static final String TAG = TrackRecordingServiceConnection.class.getSimpleName(); + private static final int SERVICE_BIND_FLAG = BuildConfig.DEBUG ? Context.BIND_DEBUG_UNBIND : 0; + private final Callback callback; private TrackRecordingService trackRecordingService; @@ -81,8 +83,19 @@ 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), serviceConnection, SERVICE_BIND_FLAG); + } + + public void bindWithStart(@NonNull Context context) { + if (trackRecordingService != null) { + callback.onConnected(trackRecordingService, this); + return; + } + + Log.i(TAG, "Binding and starting the service (not in foreground)."); + + context.bindService(new Intent(context, TrackRecordingService.class), serviceConnection, Context.BIND_AUTO_CREATE + SERVICE_BIND_FLAG); } /** @@ -135,6 +148,15 @@ public class TrackRecordingServiceConnection { } public static void execute(Context context, Callback callback) { + Callback withUnbind = (service, connection) -> { + callback.onConnected(service, connection); + connection.unbind(context); + }; + new TrackRecordingServiceConnection(withUnbind) + .bindWithStart(context); + } + + public static void executeForeground(Context context, Callback callback) { Callback withUnbind = (service, connection) -> { callback.onConnected(service, connection); connection.unbind(context);