diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java index 9231b972d..dda1691c8 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java @@ -3,7 +3,6 @@ package de.dennisguse.opentracks; import android.Manifest; import android.app.AlertDialog; import android.content.Intent; -import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Build; import android.os.Bundle; @@ -21,6 +20,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; +import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayoutMediator; import java.util.List; @@ -36,6 +36,7 @@ import de.dennisguse.opentracks.fragments.StatisticsRecordingFragment; import de.dennisguse.opentracks.services.RecordingStatus; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; +import de.dennisguse.opentracks.services.handlers.GpsStatusValue; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.SettingsActivity; import de.dennisguse.opentracks.ui.intervals.IntervalsFragment; @@ -63,6 +64,8 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc private static final String CURRENT_TAB_TAG_KEY = "current_tab_tag_key"; + private Snackbar snackbar; + // The following are setFrequency in onCreate private ContentProviderUtils contentProviderUtils; private TrackRecordingServiceConnection trackRecordingServiceConnection; @@ -76,45 +79,41 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT; - private final TrackRecordingServiceConnection.Callback bindChangedCallback = new TrackRecordingServiceConnection.Callback() { - @Override - public void onConnected(TrackRecordingService service) { + private final TrackRecordingServiceConnection.Callback bindChangedCallback = service -> { + service.getRecordingStatusObservable() + .observe(TrackRecordingActivity.this, this::onRecordingStatusChanged); - service.getRecordingStatusObservable() - .observe(TrackRecordingActivity.this, status -> onRecordingStatusChanged(status)); + service.getGpsStatusObservable() + .observe(TrackRecordingActivity.this, this::onGpsStatusChanged); - if (!service.isRecording()) { - if (trackId == null) { - // trackId isn't initialized -> leads a new recording. - trackId = service.startNewTrack(); - } else { - // trackId is initialized -> resumes the track. - service.resumeTrack(trackId); - } - - // A recording track is on. - trackDataHub.loadTrack(trackId); - trackDataHub.setRecordingStatus(recordingStatus); + if (!service.isRecording()) { + if (trackId == null) { + // trackId isn't initialized -> leads a new recording. + trackId = service.startNewTrack(); + } else { + // trackId is initialized -> resumes the track. + service.resumeTrack(trackId); } + + // A recording track is on. + trackDataHub.loadTrack(trackId); + trackDataHub.setRecordingStatus(recordingStatus); } }; - private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (PreferencesUtils.isKey(R.string.stats_show_on_lockscreen_while_recording_key, key)) { - setLockscreenPolicy(); - } - if (PreferencesUtils.isKey(R.string.stats_keep_screen_on_while_recording_key, key)) { - setScreenOnPolicy(); - } - if (PreferencesUtils.isKey(R.string.stats_fullscreen_while_recording_key, key)) { - setFullscreenPolicy(); - } - if (key == null) return; - - runOnUiThread(TrackRecordingActivity.this::invalidateOptionsMenu); //TODO Should not be necessary + private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { + if (PreferencesUtils.isKey(R.string.stats_show_on_lockscreen_while_recording_key, key)) { + setLockscreenPolicy(); } + if (PreferencesUtils.isKey(R.string.stats_keep_screen_on_while_recording_key, key)) { + setScreenOnPolicy(); + } + if (PreferencesUtils.isKey(R.string.stats_fullscreen_while_recording_key, key)) { + setFullscreenPolicy(); + } + if (key == null) return; + + runOnUiThread(TrackRecordingActivity.this::invalidateOptionsMenu); //TODO Should not be necessary }; private MenuItem insertMarkerMenuItem; @@ -425,4 +424,20 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}; locationPermissionRequest.launch(permissions); } -} + + private void onGpsStatusChanged(GpsStatusValue gpsStatusValue) { + if (gpsStatusValue.isGpsStarted() && snackbar != null && snackbar.isShown()) { + snackbar.dismiss(); + return; + } + if (gpsStatusValue != GpsStatusValue.GPS_DISABLED) { + return; + } + snackbar = Snackbar + .make(viewBinding.trackRecordingCoordinatorLayout, + getString(R.string.gps_recording_status, getString(gpsStatusValue.message), getString(R.string.gps_recording_without_signal)), + Snackbar.LENGTH_INDEFINITE) + .setAction(getString(R.string.generic_dismiss), v -> {}); + snackbar.show(); + } +} \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java index 55c1514cc..e3c0846f8 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java @@ -20,7 +20,6 @@ import java.util.List; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.adapters.StatisticsAdapter; import de.dennisguse.opentracks.data.models.Track; -import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.databinding.StatisticsRecordingBinding; import de.dennisguse.opentracks.services.RecordingData; import de.dennisguse.opentracks.services.TrackRecordingService; @@ -45,8 +44,9 @@ public class StatisticsRecordingFragment extends Fragment { } private TrackRecordingServiceConnection trackRecordingServiceConnection; + private RecordingData recordingData = TrackRecordingService.NOT_RECORDING; - private TrackPoint latestTrackPoint; + private Layout layout; private StatisticsRecordingBinding viewBinding; @@ -76,8 +76,10 @@ public class StatisticsRecordingFragment extends Fragment { } }; - private final TrackRecordingServiceConnection.Callback bindChangedCallback = service -> service.getRecordingDataObservable() - .observe(StatisticsRecordingFragment.this, this::onRecordingDataChanged); + private final TrackRecordingServiceConnection.Callback bindChangedCallback = service -> { + service.getRecordingDataObservable() + .observe(StatisticsRecordingFragment.this, this::onRecordingDataChanged); + }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -168,11 +170,6 @@ public class StatisticsRecordingFragment extends Fragment { sharedPreferenceChangeListener.onSharedPreferenceChanged(null, getString(R.string.stats_rate_key)); } - latestTrackPoint = recordingData.getLatestTrackPoint(); - if (latestTrackPoint != null && latestTrackPoint.hasLocation() && !latestTrackPoint.isRecent()) { - latestTrackPoint = null; - } - updateUI(); } } diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java b/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java index 995cc988e..c554d4288 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java @@ -56,7 +56,7 @@ class GpsStatus { public void stop() { stopped = true; - sendStatus(gpsStatus, GpsStatusValue.GPS_NONE); + sendStatus(gpsStatus, GpsStatusValue.GPS_DISABLED); } } diff --git a/src/main/res/layout-land/track_recording.xml b/src/main/res/layout-land/track_recording.xml index aa46e0a6e..0cbac4ea0 100644 --- a/src/main/res/layout-land/track_recording.xml +++ b/src/main/res/layout-land/track_recording.xml @@ -1,5 +1,7 @@ - @@ -17,22 +19,29 @@ android:layout_width="wrap_content" android:layout_height="match_parent" /> - - - + android:layout_height="match_parent" + android:orientation="vertical"> - + - + + + + + + + \ No newline at end of file diff --git a/src/main/res/layout/statistics_recording.xml b/src/main/res/layout/statistics_recording.xml index 5f41433db..85c2299cf 100644 --- a/src/main/res/layout/statistics_recording.xml +++ b/src/main/res/layout/statistics_recording.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" style="@style/StatsScrollView" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="match_parent"> - + \ No newline at end of file diff --git a/src/main/res/layout/track_recording.xml b/src/main/res/layout/track_recording.xml index d43d458ee..972ac2f78 100644 --- a/src/main/res/layout/track_recording.xml +++ b/src/main/res/layout/track_recording.xml @@ -1,5 +1,7 @@ - @@ -11,15 +13,23 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - + android:layout_weight="1"> + + + + + \ No newline at end of file diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index abc8e9fee..76afd8739 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -42,4 +42,5 @@ limitations under the License. #3F0000 #272727 + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index c7be296bc..5fb9c923b 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -244,12 +244,15 @@ limitations under the License. To Today Yesterday + Dismiss Starting GPS Waiting for a better GPS signal Waiting for GPS signal GPS disabled GPS fixed and ready + %1$s: %2$s + OpenTracks is recording without GPS data. Arrow Marker diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index 76414cff5..332d617db 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -333,4 +333,29 @@ limitations under the License. true true + + + + + + + + + + diff --git a/src/main/res/values/themes_custom.xml b/src/main/res/values/themes_custom.xml index 91640fb5e..be7535e47 100644 --- a/src/main/res/values/themes_custom.xml +++ b/src/main/res/values/themes_custom.xml @@ -23,6 +23,12 @@ limitations under the License. @drawable/activated_background true + + + @style/MaterialSnackbarTheme + @style/MaterialSnackbarTextButtonTheme + @style/MaterialSnackbarTextViewTheme +