Public API: enable other applications to start recordings.

Fixes #671.
This commit is contained in:
Dennis Guse
2022-01-23 19:57:17 +01:00
parent 8ae4d75708
commit 838f3dc622
10 changed files with 155 additions and 20 deletions
@@ -0,0 +1,56 @@
package de.dennisguse.opentracks.publicapi;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.settings.PreferencesUtils;
public abstract class AbstractAPIActivity extends AppCompatActivity {
private final String TAG = AbstractAPIActivity.class.getSimpleName();
private final TrackRecordingServiceConnection.Callback serviceConnectedCallback = service -> {
if (!isFinishing() && !isDestroyed()) {
execute(service);
}
if (isPostExecuteStopService()) {
AbstractAPIActivity.this.trackRecordingServiceConnection.unbindAndStop(AbstractAPIActivity.this);
} else {
AbstractAPIActivity.this.trackRecordingServiceConnection.unbind(AbstractAPIActivity.this);
}
finish();
};
private TrackRecordingServiceConnection trackRecordingServiceConnection;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (PreferencesUtils.isPublicAPIenabled()) {
Log.i(TAG, "Received and trying to execute requested action.");
trackRecordingServiceConnection = new TrackRecordingServiceConnection(serviceConnectedCallback);
trackRecordingServiceConnection.startAndBind(this);
} else {
Toast.makeText(this, getString(R.string.settings_public_api_disabled_toast), Toast.LENGTH_LONG).show();
Log.w(TAG, "Public API is disabled; ignoring request.");
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
trackRecordingServiceConnection = null;
}
protected abstract void execute(TrackRecordingService service);
protected abstract boolean isPostExecuteStopService();
}
@@ -0,0 +1,15 @@
package de.dennisguse.opentracks.publicapi;
import de.dennisguse.opentracks.services.TrackRecordingService;
public class StartRecording extends AbstractAPIActivity {
protected void execute(TrackRecordingService service) {
service.startNewTrack();
}
@Override
protected boolean isPostExecuteStopService() {
return false;
}
}
@@ -0,0 +1,15 @@
package de.dennisguse.opentracks.publicapi;
import de.dennisguse.opentracks.services.TrackRecordingService;
public class StopRecording extends AbstractAPIActivity {
protected void execute(TrackRecordingService service) {
service.endCurrentTrack();
}
@Override
protected boolean isPostExecuteStopService() {
return true;
}
}
@@ -282,7 +282,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
showNotification(true);
}
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public void endCurrentTrack() {
if (!isRecording()) {
Log.w(TAG, "Ignore endCurrentTrack. Not recording.");
@@ -28,7 +28,6 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.documentfile.provider.DocumentFile;
import androidx.preference.PreferenceManager;
import java.time.Duration;
@@ -179,6 +178,10 @@ public class PreferencesUtils {
editor.apply();
}
public static boolean isPublicAPIenabled() {
return getBoolean(R.string.publicapi_enabled_key, resources.getBoolean(R.bool.publicapi_enabled_default));
}
public static boolean isMetricUnits() {
final String STATS_UNIT = resources.getString(R.string.stats_units_default);
return STATS_UNIT.equals(getString(R.string.stats_units_key, STATS_UNIT));