Skip to content
This repository was archived by the owner on Aug 24, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ dependencies {
implementation 'androidx.core:core-splashscreen:1.0.1'
implementation 'androidx.mediarouter:mediarouter:1.8.1'
implementation 'androidx.core:core-location-altitude:1.0.0-alpha03'
implementation 'androidx.work:work-runtime:2.10.2'

androidTestImplementation 'androidx.test:core:1.7.0'
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
Expand Down
15 changes: 0 additions & 15 deletions src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -395,21 +395,6 @@ limitations under the License.
android:icon="@drawable/ic_logo_color_24dp"
android:label="@string/recording_service" />

<service
android:name=".io.file.exporter.ExportService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />

<service
android:name=".io.file.importer.ImportService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />

<service
android:name=".services.TrackDeleteService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE"/>

<!--Necessary for SDK < 33 to (re-)store per app locale information-->
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
Expand Down
15 changes: 3 additions & 12 deletions src/main/java/de/dennisguse/opentracks/AboutActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@
import de.dennisguse.opentracks.ui.util.ViewUtils;
import de.dennisguse.opentracks.util.SystemUtils;

public class AboutActivity extends AbstractActivity {

private AboutBinding viewBinding;
public class AboutActivity extends AbstractActivity<AboutBinding> {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Expand All @@ -31,14 +29,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
}

@NonNull
protected View createRootView() {
viewBinding = AboutBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
}

@Override
protected void onDestroy() {
super.onDestroy();
viewBinding = null;
protected AboutBinding createRootView() {
return AboutBinding.inflate(getLayoutInflater());
}
}
26 changes: 17 additions & 9 deletions src/main/java/de/dennisguse/opentracks/AbstractActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@
import androidx.core.view.ViewCompat;
import androidx.core.view.ViewGroupCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.viewbinding.ViewBinding;

import de.dennisguse.opentracks.services.announcement.TTSManager;
import de.dennisguse.opentracks.settings.PreferencesUtils;

/**
* @author Jimmy Shih
*/
public abstract class AbstractActivity extends AppCompatActivity {
// TODO Make ViewBinding a generic attribute and set to null in onDestroy()
public abstract class AbstractActivity<T extends ViewBinding> extends AppCompatActivity {

protected T viewBinding;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -46,13 +47,14 @@ protected void onCreate(Bundle savedInstanceState) {
// Set volume control stream for text to speech
setVolumeControlStream(TTSManager.AUDIO_STREAM);

View rootView = createRootView();
setContentView(rootView);
viewBinding = createRootView();
setContentView(viewBinding.getRoot());

edge2edgeApplyInsets(rootView);
edge2edgeApplyInsets();
}

private void edge2edgeApplyInsets(View rootView) {
private void edge2edgeApplyInsets() {
View rootView = viewBinding.getRoot();
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout() | WindowInsetsCompat.Type.ime());
view.setPadding(insets.left, insets.top, insets.right, insets.bottom);
Expand All @@ -69,5 +71,11 @@ public boolean onSupportNavigateUp() {
}

@NonNull
protected abstract View createRootView();
protected abstract T createRootView();

@Override
protected void onDestroy() {
super.onDestroy();
viewBinding = null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,21 @@

package de.dennisguse.opentracks;

import android.os.Handler;
import android.view.View;
import android.widget.Toast;

import androidx.viewbinding.ViewBinding;
import androidx.work.Data;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkRequest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;

import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.services.TrackDeleteService;
import de.dennisguse.opentracks.services.TrackDeletionWorker;
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment;
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment.ConfirmDeleteCaller;

Expand All @@ -37,7 +43,7 @@
* @author Jimmy Shih
*/
//TODO Check if this class is still such a good idea; inheritance might limit maintainability
public abstract class AbstractTrackDeleteActivity extends AbstractActivity implements ConfirmDeleteCaller, TrackDeleteService.TrackDeleteResultReceiver.Receiver {
public abstract class AbstractTrackDeleteActivity<T extends ViewBinding> extends AbstractActivity<T> implements ConfirmDeleteCaller {

protected void deleteTracks(Track.Id... trackIds) {
ConfirmDeleteDialogFragment.showDialog(getSupportFragmentManager(), trackIds);
Expand All @@ -55,10 +61,29 @@ public void onConfirmDeleteDone(Track.Id... trackIds) {
Toast.makeText(this, getString(R.string.track_delete_not_recording), Toast.LENGTH_LONG).show();
}

TrackDeleteService.enqueue(this, new TrackDeleteService.TrackDeleteResultReceiver(new Handler(), this), trackIdList);
WorkManager workManager = WorkManager.getInstance(this);
WorkRequest deleteRequest = new OneTimeWorkRequest.Builder(TrackDeletionWorker.class)
.setInputData(new Data.Builder()
.putLongArray(TrackDeletionWorker.TRACKIDS_KEY, Arrays.stream(trackIds).mapToLong(Track.Id::id).toArray())
.build())
.build();

workManager
.getWorkInfoByIdLiveData(deleteRequest.getId())
.observe(this, workInfo -> {
if (workInfo != null) {
if (workInfo.getState().isFinished()) {
onDeleteFinished();
}
}
});

workManager.enqueue(deleteRequest);
}

protected abstract void onDeleteConfirmed();

protected abstract void onDeleteFinished();

protected abstract Track.Id getRecordingTrackId();
}
11 changes: 4 additions & 7 deletions src/main/java/de/dennisguse/opentracks/HelpActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,18 @@
import de.dennisguse.opentracks.databinding.HelpBinding;
import de.dennisguse.opentracks.ui.util.ViewUtils;

public class HelpActivity extends AbstractActivity {

private HelpBinding helpBinding;
public class HelpActivity extends AbstractActivity<HelpBinding> {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSupportActionBar(helpBinding.bottomAppBarLayout.bottomAppBar);
setSupportActionBar(viewBinding.bottomAppBarLayout.bottomAppBar);
ViewUtils.makeClickableLinks(findViewById(android.R.id.content));
}

@NonNull
@Override
protected View createRootView() {
helpBinding = HelpBinding.inflate(getLayoutInflater());
return helpBinding.getRoot();
protected HelpBinding createRootView() {
return HelpBinding.inflate(getLayoutInflater());
}
}
9 changes: 3 additions & 6 deletions src/main/java/de/dennisguse/opentracks/ShowErrorActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,10 @@

import de.dennisguse.opentracks.databinding.ActivityShowErrorBinding;

public class ShowErrorActivity extends AbstractActivity {
public class ShowErrorActivity extends AbstractActivity<ActivityShowErrorBinding> {

public static final String EXTRA_ERROR_TEXT = "error";

private ActivityShowErrorBinding viewBinding;

@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -32,9 +30,8 @@ public void onCreate(final Bundle savedInstanceState) {

@NonNull
@Override
protected View createRootView() {
viewBinding = ActivityShowErrorBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
protected ActivityShowErrorBinding createRootView() {
return ActivityShowErrorBinding.inflate(getLayoutInflater());
}

private String createErrorTitle() {
Expand Down
9 changes: 3 additions & 6 deletions src/main/java/de/dennisguse/opentracks/TrackEditActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
*
* @author Leif Hendrik Wilden
*/
public class TrackEditActivity extends AbstractActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
public class TrackEditActivity extends AbstractActivity<TrackEditBinding> implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {

public static final String EXTRA_TRACK_ID = "track_id";

Expand All @@ -49,8 +49,6 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
private Track track;
private ActivityType activityType;

private TrackEditBinding viewBinding;

@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
Expand Down Expand Up @@ -125,9 +123,8 @@ public void onSaveInstanceState(@NonNull Bundle outState) {

@NonNull
@Override
protected View createRootView() {
viewBinding = TrackEditBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
protected TrackEditBinding createRootView() {
return TrackEditBinding.inflate(getLayoutInflater());
}

private void setActivityTypeIcon(ActivityType activityType) {
Expand Down
25 changes: 10 additions & 15 deletions src/main/java/de/dennisguse/opentracks/TrackListActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,14 @@
*
* @author Leif Hendrik Wilden
*/
public class TrackListActivity extends AbstractTrackDeleteActivity implements ConfirmDeleteDialogFragment.ConfirmDeleteCaller {
public class TrackListActivity extends AbstractTrackDeleteActivity<TrackListBinding> implements ConfirmDeleteDialogFragment.ConfirmDeleteCaller {

private static final String TAG = TrackListActivity.class.getSimpleName();

// The following are set in onCreate
private TrackRecordingServiceConnection recordingStatusConnection;
private TrackListAdapter adapter;

private TrackListBinding viewBinding;

// Preferences
private UnitSystem unitSystem = UnitSystem.defaultUnitSystem();

Expand Down Expand Up @@ -166,6 +164,13 @@ protected void onCreate(Bundle savedInstanceState) {
}
});

viewBinding.trackListSearchView.getEditText().setOnEditorActionListener((v, actionId, event) -> {
searchQuery = viewBinding.trackListSearchView.getEditText().getText().toString();
viewBinding.trackListSearchView.hide();
loadData();
return true;
});

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
adapter = new TrackListAdapter(this, viewBinding.trackList, recordingStatus, unitSystem);
viewBinding.trackList.setLayoutManager(layoutManager);
Expand Down Expand Up @@ -248,24 +253,14 @@ protected void onStop() {
@Override
protected void onDestroy() {
super.onDestroy();
viewBinding = null;
recordingStatusConnection = null;
adapter = null;
}

@NonNull
@Override
protected View createRootView() {
viewBinding = TrackListBinding.inflate(getLayoutInflater());

viewBinding.trackListSearchView.getEditText().setOnEditorActionListener((v, actionId, event) -> {
searchQuery = viewBinding.trackListSearchView.getEditText().getText().toString();
viewBinding.trackListSearchView.hide();
loadData();
return true;
});

return viewBinding.getRoot();
protected TrackListBinding createRootView() {
return TrackListBinding.inflate(getLayoutInflater());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
* @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 AbstractTrackDeleteActivity implements ConfirmDeleteDialogFragment.ConfirmDeleteCaller, TrackDataHubInterface {
public class TrackRecordedActivity extends AbstractTrackDeleteActivity<TrackRecordedBinding> implements ConfirmDeleteDialogFragment.ConfirmDeleteCaller, TrackDataHubInterface {

private static final String TAG = TrackRecordedActivity.class.getSimpleName();

Expand All @@ -68,8 +68,6 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement

private TrackDataHub trackDataHub;

private TrackRecordedBinding viewBinding;

private Track.Id trackId;
private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT;

Expand Down Expand Up @@ -138,9 +136,8 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {

@NonNull
@Override
protected View createRootView() {
viewBinding = TrackRecordedBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
protected TrackRecordedBinding createRootView() {
return TrackRecordedBinding.inflate(getLayoutInflater());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
* @author Leif Hendrik Wilden
* @author Rodrigo Damazio
*/
public class TrackRecordingActivity extends AbstractActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller, TrackDataHubInterface {
public class TrackRecordingActivity extends AbstractActivity<TrackRecordingBinding> implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller, TrackDataHubInterface {

public static final String EXTRA_TRACK_ID = "track_id";

Expand All @@ -66,13 +66,11 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc

private Snackbar snackbar;

// The following are setFrequency in onCreate
// The following are set in onCreate
private ContentProviderUtils contentProviderUtils;
private TrackRecordingServiceConnection trackRecordingServiceConnection;
private TrackDataHub trackDataHub;

private TrackRecordingBinding viewBinding;

private Track.Id trackId;

private RecordingStatus recordingStatus = TrackRecordingService.STATUS_DEFAULT;
Expand Down Expand Up @@ -245,15 +243,13 @@ protected void onStop() {
@Override
protected void onDestroy() {
super.onDestroy();
viewBinding = null;
trackRecordingServiceConnection = null;
}

@NonNull
@Override
protected View createRootView() {
viewBinding = TrackRecordingBinding.inflate(getLayoutInflater());
return viewBinding.getRoot();
protected TrackRecordingBinding createRootView() {
return TrackRecordingBinding.inflate(getLayoutInflater());
}

@Override
Expand Down
Loading
Loading