TrackDataHub does not need to register for status changes of TrackRecordingService.

This is handled by TrackRecordingActivity alone.
Part of #719.
This commit is contained in:
Dennis Guse
2021-04-24 23:07:25 +02:00
parent b416857001
commit 391dfd30e2
6 changed files with 21 additions and 28 deletions
@@ -29,7 +29,7 @@ import de.dennisguse.opentracks.util.IntentUtils;
/** /**
* An abstract class for the following common tasks across * An abstract class for the following common tasks across
* {@link TrackListActivity}, {@link TrackRecordedActivity}, and {@link TrackRecordedActivity}: * {@link TrackListActivity} and {@link TrackRecordedActivity}:
* <p> * <p>
* - share track <br> * - share track <br>
* - delete tracks <br> * - delete tracks <br>
@@ -53,6 +53,7 @@ import de.dennisguse.opentracks.util.IntentUtils;
* @author Leif Hendrik Wilden * @author Leif Hendrik Wilden
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
//TODO Should not use TrackRecordingServiceConnection; only used to determine if there is NO current recording, to enable resume functionality.
public class TrackRecordedActivity extends AbstractListActivity implements ConfirmDeleteDialogFragment.ConfirmDeleteCaller, TrackActivityDataHubInterface, TrackRecordingServiceStatus.Listener { public class TrackRecordedActivity extends AbstractListActivity implements ConfirmDeleteDialogFragment.ConfirmDeleteCaller, TrackActivityDataHubInterface, TrackRecordingServiceStatus.Listener {
private static final String TAG = TrackRecordedActivity.class.getSimpleName(); private static final String TAG = TrackRecordedActivity.class.getSimpleName();
@@ -299,7 +300,7 @@ public class TrackRecordedActivity extends AbstractListActivity implements Confi
} }
} }
public void startPostponedEnterTransitionWith(View viewIcon, View viewName) { public void startPostponedEnterTransitionWith(View viewIcon) {
ViewCompat.setTransitionName(viewIcon, TrackRecordedActivity.VIEW_TRACK_ICON); ViewCompat.setTransitionName(viewIcon, TrackRecordedActivity.VIEW_TRACK_ICON);
startPostponedEnterTransition(); startPostponedEnterTransition();
} }
@@ -87,6 +87,8 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
// A recording track is on. // A recording track is on.
trackDataHub.loadTrack(trackId); trackDataHub.loadTrack(trackId);
trackDataHub.setRecordingTrackId(trackId);
trackController.update(true, false); trackController.update(true, false);
trackController.onResume(true, recordingTrackPaused); trackController.onResume(true, recordingTrackPaused);
} }
@@ -404,17 +406,20 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
public void onTrackRecordingPaused(boolean isPaused) { public void onTrackRecordingPaused(boolean isPaused) {
if (recordingTrackPaused != isPaused) { if (recordingTrackPaused != isPaused) {
trackController.update(true, isPaused); trackController.update(true, isPaused);
trackDataHub.setRecordingTrackPaused(isPaused);
} }
recordingTrackPaused = isPaused; recordingTrackPaused = isPaused;
setLockscreenPolicy(); setLockscreenPolicy();
setScreenOnPolicy(); setScreenOnPolicy();
} }
//TODO Why should this be interesting? This activity is only used for currently recording tracks.
@Override @Override
public void onTrackRecordingId(Track.Id newTrackId) { public void onTrackRecordingId(Track.Id newTrackId) {
if (newTrackId != null && !newTrackId.equals(trackId)) { if (newTrackId != null && !newTrackId.equals(trackId)) {
trackId = newTrackId; trackId = newTrackId;
trackController.update(true, recordingTrackPaused); trackController.update(true, recordingTrackPaused);
trackDataHub.setRecordingTrackId(newTrackId);
} }
} }
} }
@@ -38,9 +38,6 @@ import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns; import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.TrackPointIterator; import de.dennisguse.opentracks.content.provider.TrackPointIterator;
import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.services.TrackRecordingServiceStatus;
/** /**
* Track data hub. * Track data hub.
@@ -50,7 +47,8 @@ import de.dennisguse.opentracks.services.TrackRecordingServiceStatus;
* *
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
public class TrackDataHub implements TrackRecordingServiceStatus.Listener { //TODO register contentobserver only for exact URL (incl. trackId) to not filter here.
public class TrackDataHub {
/** /**
* Target number of track points displayed by the diagrams (recommended). * Target number of track points displayed by the diagrams (recommended).
@@ -75,11 +73,12 @@ public class TrackDataHub implements TrackRecordingServiceStatus.Listener {
private HandlerThread handlerThread; private HandlerThread handlerThread;
private Handler handler; private Handler handler;
private TrackRecordingServiceConnection trackRecordingServiceConnection;
// Preference values
private Track.Id selectedTrackId; private Track.Id selectedTrackId;
@Deprecated
//TODO Is there a better way to handle this? e.g., passing information rather from Activity than from Activity to TrackDataHub
private Track.Id recordingTrackId; private Track.Id recordingTrackId;
@Deprecated
//TODO Is there a better way to handle this? e.g., passing information rather from Activity than from Activity to TrackDataHub
private boolean recordingTrackPaused; private boolean recordingTrackPaused;
// Track points sampling state // Track points sampling state
@@ -92,13 +91,6 @@ public class TrackDataHub implements TrackRecordingServiceStatus.Listener {
private ContentObserver markersTableObserver; private ContentObserver markersTableObserver;
private ContentObserver trackPointsTableObserver; private ContentObserver trackPointsTableObserver;
private final Runnable bindCallback = () -> {
TrackRecordingService service = trackRecordingServiceConnection.getServiceIfBound();
if (service != null) {
service.addListener(TrackDataHub.this);
}
};
public TrackDataHub(Context context) { public TrackDataHub(Context context) {
this(context, new TrackDataManager(), new ContentProviderUtils(context), TARGET_DISPLAYED_TRACKPOINTS); this(context, new TrackDataManager(), new ContentProviderUtils(context), TARGET_DISPLAYED_TRACKPOINTS);
} }
@@ -148,9 +140,6 @@ public class TrackDataHub implements TrackRecordingServiceStatus.Listener {
}; };
contentResolver.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, false, trackPointsTableObserver); contentResolver.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, false, trackPointsTableObserver);
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindCallback);
trackRecordingServiceConnection.bind(context);
handler.post(() -> { handler.post(() -> {
if (started) { if (started) {
loadDataForAll(); loadDataForAll();
@@ -177,8 +166,6 @@ public class TrackDataHub implements TrackRecordingServiceStatus.Listener {
handlerThread = null; handlerThread = null;
} }
handler = null; handler = null;
trackRecordingServiceConnection.unbind(context);
} }
public void loadTrack(final @NonNull Track.Id trackId) { public void loadTrack(final @NonNull Track.Id trackId) {
@@ -425,13 +412,11 @@ public class TrackDataHub implements TrackRecordingServiceStatus.Listener {
lastSeenTrackPointId = null; lastSeenTrackPointId = null;
} }
@Override public void setRecordingTrackId(Track.Id recordingTrackId) {
public void onTrackRecordingPaused(boolean isPaused) { this.recordingTrackId = recordingTrackId;
recordingTrackPaused = isPaused;
} }
@Override public void setRecordingTrackPaused(boolean recordingTrackPaused) {
public void onTrackRecordingId(Track.Id trackId) { this.recordingTrackPaused = recordingTrackPaused;
recordingTrackId = trackId;
} }
} }
@@ -306,6 +306,8 @@ public class ChartFragment extends Fragment implements TrackDataListener {
* Returns true if the selected track is recording. * Returns true if the selected track is recording.
* Needs to be synchronized because trackDataHub can be accessed by multiple threads. * Needs to be synchronized because trackDataHub can be accessed by multiple threads.
*/ */
@Deprecated
//TODO Should not be dynamic but instead set while instantiating, i.e., newFragment().
private synchronized boolean isSelectedTrackRecording() { private synchronized boolean isSelectedTrackRecording() {
return trackDataHub != null && trackDataHub.isSelectedTrackRecording(); return trackDataHub != null && trackDataHub.isSelectedTrackRecording();
} }
@@ -175,7 +175,7 @@ public class StatisticsRecordedFragment extends Fragment {
updateUI(); updateUI();
updateSensorUI(); updateSensorUI();
((TrackRecordedActivity) getActivity()).startPostponedEnterTransitionWith(viewBinding.statsActivityTypeIcon, viewBinding.statsNameValue); ((TrackRecordedActivity) getActivity()).startPostponedEnterTransitionWith(viewBinding.statsActivityTypeIcon);
} }
}); });
} }