From 166b28d234e7057204a4130521d0636180846e7a Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 29 Oct 2023 08:46:27 +0100 Subject: [PATCH] Bugfix (Android14): for recording Location/GPS and Nearby Devices/Bluetooth are mandatory due to Android. Fixes #1749. --- .../de/dennisguse/opentracks/TrackListActivity.java | 2 +- .../opentracks/services/TrackRecordingService.java | 11 +++++++++++ .../opentracks/util/PermissionRequester.java | 13 +++++++++---- src/main/res/values/strings.xml | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index 668f6dfd0..33da17e80 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -212,7 +212,7 @@ protected void onCreate(Bundle savedInstanceState) { } private void requestRequiredPermissions() { - PermissionRequester.ALL.requestPermissionsIfNeeded(this, this, null, (requester) -> Toast.makeText(this, R.string.permission_gps_failed, Toast.LENGTH_LONG).show()); + PermissionRequester.ALL.requestPermissionsIfNeeded(this, this, null, (requester) -> Toast.makeText(this, R.string.permission_recording_failed, Toast.LENGTH_LONG).show()); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index e4b6fa4d9..8a1a00bd4 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -26,6 +26,7 @@ import android.os.PowerManager.WakeLock; import android.util.Log; import android.util.Pair; +import android.widget.Toast; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -36,6 +37,7 @@ import java.io.StringWriter; import java.time.Duration; +import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; @@ -45,6 +47,7 @@ import de.dennisguse.opentracks.services.handlers.GpsStatusValue; import de.dennisguse.opentracks.services.handlers.TrackPointCreator; import de.dennisguse.opentracks.settings.PreferencesUtils; +import de.dennisguse.opentracks.util.PermissionRequester; import de.dennisguse.opentracks.util.SystemUtils; public class TrackRecordingService extends Service implements TrackPointCreator.Callback, SharedPreferences.OnSharedPreferenceChangeListener, TrackRecordingManager.IdleObserver { @@ -199,6 +202,14 @@ private void startSensors() { wakeLock = SystemUtils.acquireWakeLock(this, wakeLock); trackPointCreator.start(this, handler); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + if (!PermissionRequester.RECORDING.hasPermission(this)) { + Toast.makeText(this, R.string.permission_recording_failed, Toast.LENGTH_LONG).show(); + return; + } + } + startForeground(TrackRecordingServiceNotificationManager.NOTIFICATION_ID, notificationManager.setGPSonlyStarted(this), ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION + ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE); } else { startForeground(TrackRecordingServiceNotificationManager.NOTIFICATION_ID, notificationManager.setGPSonlyStarted(this)); diff --git a/src/main/java/de/dennisguse/opentracks/util/PermissionRequester.java b/src/main/java/de/dennisguse/opentracks/util/PermissionRequester.java index 7a72b59ad..7975b924a 100644 --- a/src/main/java/de/dennisguse/opentracks/util/PermissionRequester.java +++ b/src/main/java/de/dennisguse/opentracks/util/PermissionRequester.java @@ -89,13 +89,17 @@ private void requestPermission(ActivityResultCaller context, @Nullable Runnable } private static final List ALL_PERMISSIONS; + private static final List RECORDING_PERMISSIONS; static { - ArrayList all = new ArrayList<>(GPS_PERMISSION); - all.addAll(BLUETOOTH_PERMISSIONS); - all.addAll(NOTIFICATION_PERMISSIONS); + ArrayList recording = new ArrayList<>(GPS_PERMISSION); + recording.addAll(BLUETOOTH_PERMISSIONS); - ALL_PERMISSIONS = Collections.unmodifiableList(all); + RECORDING_PERMISSIONS = Collections.unmodifiableList(recording); + + recording.addAll(NOTIFICATION_PERMISSIONS); + + ALL_PERMISSIONS = Collections.unmodifiableList(recording); } public final static PermissionRequester GPS = new PermissionRequester(GPS_PERMISSION); @@ -103,6 +107,7 @@ private void requestPermission(ActivityResultCaller context, @Nullable Runnable public final static PermissionRequester NOTIFICATION = new PermissionRequester(NOTIFICATION_PERMISSIONS); public final static PermissionRequester ALL = new PermissionRequester(ALL_PERMISSIONS); + public final static PermissionRequester RECORDING = new PermissionRequester(RECORDING_PERMISSIONS); public interface RejectedCallback { void rejected(PermissionRequester permissionRequester); diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 153523052..87f05af4f 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -317,6 +317,7 @@ limitations under the License. Recording service OpenTracks requires permission to use GPS. + OpenTracks requires permission to access your location as well as nearby devices. OpenTracks requires permission to use Bluetooth. You manually need to grant OpenTracks access to Nearby Devices in system settings.