From 819effb4a90cd793d30d730ae4cb3faf50009d63 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Tue, 17 Mar 2026 21:07:24 +0000 Subject: [PATCH 01/50] Add HTTP upload sender and worker --- .../gpslogger/common/PreferenceHelper.java | 58 ++++++++ .../gpslogger/common/PreferenceNames.java | 9 ++ .../gpslogger/common/events/UploadEvents.java | 2 + .../mendhak/gpslogger/senders/FileSender.java | 1 + .../gpslogger/senders/FileSenderFactory.java | 12 ++ .../senders/http/HttpUploadManager.java | 77 ++++++++++ .../senders/http/HttpUploadWorker.java | 133 ++++++++++++++++++ 7 files changed, 292 insertions(+) create mode 100644 gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java create mode 100644 gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java index 69c4bca4e..928672065 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java @@ -720,6 +720,64 @@ public boolean shouldLogToOpenGTS() { } + @ProfilePreference(name=PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED) + public boolean isHttpUploadAutoSendEnabled() { + return prefs.getBoolean(PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED, false); + } + + @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_URL) + public String getHttpUploadUrl() { + return prefs.getString(PreferenceNames.HTTPUPLOAD_URL, ""); + } + + public void setHttpUploadUrl(String url) { + prefs.edit().putString(PreferenceNames.HTTPUPLOAD_URL, url).apply(); + } + + @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_METHOD) + public String getHttpUploadMethod() { + return prefs.getString(PreferenceNames.HTTPUPLOAD_METHOD, "POST"); + } + + public void setHttpUploadMethod(String method) { + prefs.edit().putString(PreferenceNames.HTTPUPLOAD_METHOD, method).apply(); + } + + @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_HEADERS) + public String getHttpUploadHeaders() { + return prefs.getString(PreferenceNames.HTTPUPLOAD_HEADERS, ""); + } + + public void setHttpUploadHeaders(String headers) { + prefs.edit().putString(PreferenceNames.HTTPUPLOAD_HEADERS, headers).apply(); + } + + @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME) + public String getHttpUploadUsername() { + return prefs.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME, ""); + } + + public void setHttpUploadUsername(String username) { + prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME, username).apply(); + } + + @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD) + public String getHttpUploadPassword() { + return prefs.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD, ""); + } + + public void setHttpUploadPassword(String password) { + prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD, password).apply(); + } + + @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BODY_TYPE) + public String getHttpUploadBodyType() { + return prefs.getString(PreferenceNames.HTTPUPLOAD_BODY_TYPE, "form-data"); + } + + public void setHttpUploadBodyType(String bodyType) { + prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BODY_TYPE, bodyType).apply(); + } @ProfilePreference(name=PreferenceNames.LOG_PASSIVE_LOCATIONS) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java index f955ea069..8e73fc645 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java @@ -50,6 +50,15 @@ public class PreferenceNames { public static final String LOG_TO_URL_BASICAUTH_PASSWORD = "log_customurl_basicauth_password"; public static final String LOG_TO_URL_DISCARD_OFFLINE_LOCATIONS_ENABLED = "log_customurl_discard_offline_locations_enabled"; public static final String AUTOSEND_CUSTOMURL_ENABLED = "autocustomurl_enabled"; + + public static final String AUTOSEND_HTTPUPLOAD_ENABLED = "autohttpupload_enabled"; + public static final String HTTPUPLOAD_URL = "httpupload_url"; + public static final String HTTPUPLOAD_METHOD = "httpupload_method"; + public static final String HTTPUPLOAD_HEADERS = "httpupload_headers"; + public static final String HTTPUPLOAD_BASICAUTH_USERNAME = "httpupload_basicauth_username"; + public static final String HTTPUPLOAD_BASICAUTH_PASSWORD = "httpupload_basicauth_password"; + public static final String HTTPUPLOAD_BODY_TYPE = "httpupload_body_type"; + public static final String LOG_TO_OPENGTS = "log_opengts"; public static final String LOG_PASSIVE_LOCATIONS="log_passive_locations"; public static final String LOG_SATELLITE_LOCATIONS = "log_satellite_locations"; diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java index f5d2e9842..a7bedb203 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java @@ -105,4 +105,6 @@ public static class SFTP extends BaseUploadEvent { public String fingerprint; public String hostKey; } + + public static class HttpUpload extends BaseUploadEvent {} } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java index e96739616..d9d412566 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java @@ -35,6 +35,7 @@ public static class SenderNames { public static final String SFTP = "SFTP_SENDER"; public static final String OPENSTREETMAP = "OSM_SENDER"; public static final String CUSTOMURL = "CUSTOM_URL_SENDER"; + public static final String HTTPUPLOAD = "HTTP_UPLOAD_SENDER"; } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java index 2defe6ba3..955bcc35d 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java @@ -27,6 +27,7 @@ import com.mendhak.gpslogger.senders.email.AutoEmailManager; import com.mendhak.gpslogger.senders.ftp.FtpManager; import com.mendhak.gpslogger.senders.googledrive.GoogleDriveManager; +import com.mendhak.gpslogger.senders.http.HttpUploadManager; import com.mendhak.gpslogger.senders.opengts.OpenGTSManager; import com.mendhak.gpslogger.senders.osm.OpenStreetMapManager; import com.mendhak.gpslogger.senders.owncloud.OwnCloudManager; @@ -80,6 +81,10 @@ public static FileSender getCustomUrlSender(){ return new CustomUrlManager(PreferenceHelper.getInstance()); } + public static FileSender getHttpUploadSender() { + return new HttpUploadManager(PreferenceHelper.getInstance()); + } + public static void autoSendFiles(final String fileToSend) { PreferenceHelper preferenceHelper = PreferenceHelper.getInstance(); @@ -164,6 +169,8 @@ public static FileSender getSenderByName(String senderName) { return getSFTPSender(); case FileSender.SenderNames.CUSTOMURL: return getCustomUrlSender(); + case FileSender.SenderNames.HTTPUPLOAD: + return getHttpUploadSender(); default: return null; @@ -181,6 +188,7 @@ private static List getAllFileSenders(){ senders.add(getOwnCloudSender()); senders.add(getSFTPSender()); senders.add(getCustomUrlSender()); + senders.add(getHttpUploadSender()); return senders; } @@ -224,6 +232,10 @@ private static List getAvailableFileAutoSenders() { senders.add(getCustomUrlSender()); } + if(getHttpUploadSender().isAutoSendAvailable()){ + senders.add(getHttpUploadSender()); + } + return senders; } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java new file mode 100644 index 000000000..0302edf10 --- /dev/null +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java @@ -0,0 +1,77 @@ +package com.mendhak.gpslogger.senders.http; + +import com.mendhak.gpslogger.common.PreferenceHelper; +import com.mendhak.gpslogger.common.Strings; +import com.mendhak.gpslogger.common.Systems; +import com.mendhak.gpslogger.common.events.UploadEvents; +import com.mendhak.gpslogger.common.slf4j.Logs; +import com.mendhak.gpslogger.loggers.Files; +import com.mendhak.gpslogger.senders.FileSender; + +import de.greenrobot.event.EventBus; +import org.slf4j.Logger; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +public class HttpUploadManager extends FileSender { + + private static final Logger LOG = Logs.of(HttpUploadManager.class); + private final PreferenceHelper preferenceHelper; + + public HttpUploadManager(PreferenceHelper preferenceHelper) { + this.preferenceHelper = preferenceHelper; + } + + public void testHttpUpload() { + try { + final File testFile = Files.createTestFile(); + + String tag = String.valueOf(Objects.hashCode(testFile.getAbsolutePath())); + HashMap dataMap = new HashMap() {{ + put("filePath", testFile.getAbsolutePath()); + }}; + Systems.startWorkManagerRequest(HttpUploadWorker.class, dataMap, tag); + + } catch (Exception ex) { + EventBus.getDefault().post(new UploadEvents.HttpUpload().failed()); + LOG.error("Error while testing HTTP upload: " + ex.getMessage()); + } + + LOG.debug("Added background HTTP upload job"); + } + + @Override + public void uploadFile(List files) { + for (File f : files) { + String tag = String.valueOf(Objects.hashCode(f.getAbsolutePath())); + HashMap dataMap = new HashMap<>(); + dataMap.put("filePath", f.getAbsolutePath()); + + Systems.startWorkManagerRequest(HttpUploadWorker.class, dataMap, tag); + } + } + + @Override + public boolean isAvailable() { + return !Strings.isNullOrEmpty(preferenceHelper.getHttpUploadUrl()) && + !Strings.isNullOrEmpty(preferenceHelper.getHttpUploadMethod()); + } + + @Override + public boolean hasUserAllowedAutoSending() { + return preferenceHelper.isHttpUploadAutoSendEnabled(); + } + + @Override + public String getName() { + return SenderNames.HTTPUPLOAD; + } + + @Override + public boolean accept(File dir, String name) { + return true; + } +} diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java new file mode 100644 index 000000000..1a0d23716 --- /dev/null +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java @@ -0,0 +1,133 @@ +package com.mendhak.gpslogger.senders.http; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import com.mendhak.gpslogger.common.AppSettings; +import com.mendhak.gpslogger.common.PreferenceHelper; +import com.mendhak.gpslogger.common.Strings; +import com.mendhak.gpslogger.common.Systems; +import com.mendhak.gpslogger.common.events.UploadEvents; +import com.mendhak.gpslogger.common.network.Networks; +import com.mendhak.gpslogger.common.slf4j.Logs; + +import org.slf4j.Logger; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import javax.net.ssl.X509TrustManager; + +import de.greenrobot.event.EventBus; +import okhttp3.Credentials; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class HttpUploadWorker extends Worker { + + private static final Logger LOG = Logs.of(HttpUploadWorker.class); + + public HttpUploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + + @NonNull + @Override + public Result doWork() { + String filePath = getInputData().getString("filePath"); + if (Strings.isNullOrEmpty(filePath)) { + LOG.error("No file path provided to HttpUploadWorker"); + return Result.failure(); + } + + File fileToUpload = new File(filePath); + PreferenceHelper preferenceHelper = PreferenceHelper.getInstance(); + + String url = preferenceHelper.getHttpUploadUrl(); + String method = preferenceHelper.getHttpUploadMethod(); + String headersString = preferenceHelper.getHttpUploadHeaders(); + String username = preferenceHelper.getHttpUploadUsername(); + String password = preferenceHelper.getHttpUploadPassword(); + String bodyType = preferenceHelper.getHttpUploadBodyType(); + + try { + LOG.info("HTTP Uploading " + fileToUpload.getName() + " to " + url + " using " + method + " (" + bodyType + ")"); + + OkHttpClient.Builder okBuilder = new OkHttpClient.Builder(); + okBuilder.sslSocketFactory(Networks.getSocketFactory(AppSettings.getInstance()), + (X509TrustManager) Networks.getTrustManager(AppSettings.getInstance())); + + Request.Builder requestBuilder = new Request.Builder().url(url); + + // Add custom headers + if (!Strings.isNullOrEmpty(headersString)) { + String[] lines = headersString.split("\n"); + for (String line : lines) { + if (line.contains(":")) { + String[] parts = line.split(":", 2); + requestBuilder.addHeader(parts[0].trim(), parts[1].trim()); + } + } + } + + // Basic Auth + if (!Strings.isNullOrEmpty(username) && !Strings.isNullOrEmpty(password)) { + requestBuilder.addHeader("Authorization", Credentials.basic(username, password)); + } + + RequestBody requestBody; + if ("form-data".equalsIgnoreCase(bodyType)) { + requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("file", fileToUpload.getName(), + RequestBody.create(MediaType.parse("application/octet-stream"), fileToUpload)) + .build(); + } else { + // Binary stream + requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), fileToUpload); + } + + requestBuilder.method(method, requestBody); + + Request request = requestBuilder.build(); + Response response = okBuilder.build().newCall(request).execute(); + + if (response.isSuccessful()) { + LOG.debug("HTTP upload complete with successful response code " + response.code()); + response.close(); + + EventBus.getDefault().post(new UploadEvents.HttpUpload().succeeded()); + Systems.sendFileUploadedBroadcast(getApplicationContext(), new String[]{fileToUpload.getAbsolutePath()}, "httpupload"); + + return Result.success(); + } else { + String errorBody = response.body() != null ? response.body().string() : "Empty response body"; + LOG.error("HTTP upload failed with code " + response.code() + ": " + errorBody); + response.close(); + + if (getRunAttemptCount() < 3) { + return Result.retry(); + } + + EventBus.getDefault().post(new UploadEvents.HttpUpload().failed("Response code " + response.code(), new Throwable(errorBody))); + return Result.failure(); + } + + } catch (Exception e) { + LOG.error("Exception during HTTP upload", e); + if (getRunAttemptCount() < 3) { + return Result.retry(); + } + EventBus.getDefault().post(new UploadEvents.HttpUpload().failed(e.getMessage(), e)); + return Result.failure(); + } + } +} From 14531f12f55107c0a5b03530d7be1f4538aeff8b Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Tue, 17 Mar 2026 21:07:40 +0000 Subject: [PATCH 02/50] Add HTTP upload settings and preferences UI --- .../gpslogger/MainPreferenceActivity.java | 5 + .../settings/HttpUploadSettingsFragment.java | 281 ++++++++++++++++++ .../settings/UploadSettingsFragment.java | 17 ++ gpslogger/src/main/res/values/arrays.xml | 16 +- gpslogger/src/main/res/values/strings.xml | 4 + .../src/main/res/xml/httpuploadsettings.xml | 45 +++ gpslogger/src/main/res/xml/pref_upload.xml | 5 + 7 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java create mode 100644 gpslogger/src/main/res/xml/httpuploadsettings.xml diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java index 4670caec1..a61588149 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java @@ -141,6 +141,10 @@ protected void onCreate(Bundle savedInstanceState) { setTitle(R.string.sftp_setup_title); preferenceFragmentCompat = new SFTPSettingsFragment(); break; + case PREFERENCE_FRAGMENTS.HTTPUPLOAD: + setTitle(R.string.http_upload_setup_title); + preferenceFragmentCompat = new HttpUploadSettingsFragment(); + break; } getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, preferenceFragmentCompat).commit(); @@ -190,6 +194,7 @@ public static class PREFERENCE_FRAGMENTS { public static final String OWNCLOUD = "OwnCloudAuthorizationFragment"; public static final String OSM = "OSMAuthorizationFragment"; public static final String SFTP = "SFTPSettingsFragment"; + public static final String HTTPUPLOAD = "HttpUploadSettingsFragment"; } } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java new file mode 100644 index 000000000..d4063b9e5 --- /dev/null +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java @@ -0,0 +1,281 @@ +package com.mendhak.gpslogger.ui.fragments.settings; + +import android.os.Bundle; +import android.text.InputType; + +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; + +import com.mendhak.gpslogger.R; +import com.mendhak.gpslogger.common.EventBusHook; +import com.mendhak.gpslogger.common.PreferenceHelper; +import com.mendhak.gpslogger.common.PreferenceNames; +import com.mendhak.gpslogger.common.Strings; +import com.mendhak.gpslogger.common.events.UploadEvents; +import com.mendhak.gpslogger.common.slf4j.Logs; +import com.mendhak.gpslogger.senders.PreferenceValidator; +import com.mendhak.gpslogger.senders.http.HttpUploadManager; +import com.mendhak.gpslogger.ui.Dialogs; + +import de.greenrobot.event.EventBus; +import org.slf4j.Logger; + +import eltos.simpledialogfragment.SimpleDialog; +import eltos.simpledialogfragment.form.Input; +import eltos.simpledialogfragment.form.SimpleFormDialog; +import eltos.simpledialogfragment.list.SimpleListDialog; + +public class HttpUploadSettingsFragment extends PreferenceFragmentCompat implements + SimpleDialog.OnDialogResultListener, + PreferenceValidator, + Preference.OnPreferenceClickListener { + + private static final Logger LOG = Logs.of(HttpUploadSettingsFragment.class); + private final PreferenceHelper preferenceHelper = PreferenceHelper.getInstance(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Preference urlPreference = findPreference(PreferenceNames.HTTPUPLOAD_URL); + urlPreference.setSummary(preferenceHelper.getHttpUploadUrl()); + urlPreference.setOnPreferenceClickListener(this); + + Preference bodyTypePreference = findPreference(PreferenceNames.HTTPUPLOAD_BODY_TYPE); + bodyTypePreference.setSummary(getBodyTypeDisplay(preferenceHelper.getHttpUploadBodyType())); + bodyTypePreference.setOnPreferenceClickListener(this); + + Preference methodPreference = findPreference(PreferenceNames.HTTPUPLOAD_METHOD); + methodPreference.setSummary(preferenceHelper.getHttpUploadMethod()); + methodPreference.setOnPreferenceClickListener(this); + + Preference headersPreference = findPreference(PreferenceNames.HTTPUPLOAD_HEADERS); + headersPreference.setSummary(preferenceHelper.getHttpUploadHeaders()); + headersPreference.setOnPreferenceClickListener(this); + + Preference authPreference = findPreference("httpupload_basicauth"); + updateAuthSummary(authPreference); + authPreference.setOnPreferenceClickListener(this); + + findPreference("httpupload_test").setOnPreferenceClickListener(this); + + updateMethodPreferenceState(); + registerEventBus(); + } + + private void updateAuthSummary(Preference authPreference) { + String username = preferenceHelper.getHttpUploadUsername(); + if (!Strings.isNullOrEmpty(username)) { + authPreference.setSummary(username + ":***"); + } else { + authPreference.setSummary(""); + } + } + + private String getBodyTypeDisplay(String bodyType) { + String[] entries = getResources().getStringArray(R.array.http_body_types); + String[] values = getResources().getStringArray(R.array.http_body_type_values); + for (int i = 0; i < values.length; i++) { + if (values[i].equals(bodyType)) { + return entries[i]; + } + } + return entries[0]; + } + + private void updateMethodPreferenceState() { + Preference methodPreference = findPreference(PreferenceNames.HTTPUPLOAD_METHOD); + if ("form-data".equals(preferenceHelper.getHttpUploadBodyType())) { + preferenceHelper.setHttpUploadMethod("POST"); + methodPreference.setSummary("POST"); + methodPreference.setEnabled(false); + } else { + methodPreference.setEnabled(true); + methodPreference.setSummary(preferenceHelper.getHttpUploadMethod()); + } + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.httpuploadsettings, rootKey); + } + + @Override + public void onDestroy() { + unregisterEventBus(); + super.onDestroy(); + } + + private void registerEventBus() { + EventBus.getDefault().register(this); + } + + private void unregisterEventBus() { + try { + EventBus.getDefault().unregister(this); + } catch (Throwable t) { + // Safe to ignore + } + } + + @Override + public boolean isValid() { + HttpUploadManager manager = new HttpUploadManager(preferenceHelper); + return !manager.hasUserAllowedAutoSending() || manager.isAvailable(); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_URL)) { + SimpleFormDialog.build() + .title("URL") + .neg(R.string.cancel) + .pos(R.string.ok) + .fields( + Input.plain(PreferenceNames.HTTPUPLOAD_URL) + .text(preferenceHelper.getHttpUploadUrl()) + .required() + ) + .show(this, PreferenceNames.HTTPUPLOAD_URL); + return true; + } + + if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_METHOD)) { + SimpleListDialog.build() + .title(R.string.customurl_http_method) + .items(getActivity(), R.array.http_methods) + .choiceMode(SimpleListDialog.SINGLE_CHOICE_DIRECT) + .show(this, PreferenceNames.HTTPUPLOAD_METHOD); + return true; + } + + if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_BODY_TYPE)) { + SimpleListDialog.build() + .title(R.string.http_upload_body_type) + .items(getActivity(), R.array.http_body_types) + .choiceMode(SimpleListDialog.SINGLE_CHOICE_DIRECT) + .show(this, PreferenceNames.HTTPUPLOAD_BODY_TYPE); + return true; + } + + if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_HEADERS)) { + SimpleFormDialog.build() + .title(R.string.customurl_http_headers) + .neg(R.string.cancel) + .pos(R.string.ok) + .fields( + Input.plain(PreferenceNames.HTTPUPLOAD_HEADERS) + .text(preferenceHelper.getHttpUploadHeaders()) + .inputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE) + ) + .show(this, PreferenceNames.HTTPUPLOAD_HEADERS); + return true; + } + + if (preference.getKey().equals("httpupload_basicauth")) { + SimpleFormDialog.build() + .title("Basic Authentication") + .neg(R.string.cancel) + .pos(R.string.ok) + .fields( + Input.plain(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME) + .text(preferenceHelper.getHttpUploadUsername()) + .hint(R.string.autoftp_username), + Input.plain(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD) + .text(preferenceHelper.getHttpUploadPassword()) + .hint(R.string.autoftp_password) + .showPasswordToggle() + .inputType(InputType.TYPE_TEXT_VARIATION_PASSWORD) + ) + .show(this, "httpupload_basicauth"); + return true; + } + + if (preference.getKey().equals("httpupload_test")) { + HttpUploadManager manager = new HttpUploadManager(preferenceHelper); + if (!manager.isAvailable()) { + Dialogs.alert(getString(R.string.autoftp_invalid_settings), + getString(R.string.autoftp_invalid_summary), + getActivity()); + return false; + } + + Dialogs.progress((FragmentActivity) getActivity(), "Testing HTTP upload"); + manager.testHttpUpload(); + return true; + } + + return false; + } + + @EventBusHook + public void onEventMainThread(UploadEvents.HttpUpload o) { + LOG.debug("HTTP Upload Event completed, success: " + o.success); + Dialogs.hideProgress(); + if (!o.success) { + Dialogs.showError(getString(R.string.sorry), "HTTP Upload Test Failed", o.message, o.throwable, (FragmentActivity) getActivity()); + } else { + Dialogs.alert(getString(R.string.success), "HTTP Upload Test Succeeded", getActivity()); + } + } + + @Override + public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle extras) { + if (which != BUTTON_POSITIVE) { + return true; + } + + if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_URL)) { + String url = extras.getString(PreferenceNames.HTTPUPLOAD_URL); + preferenceHelper.setHttpUploadUrl(url); + findPreference(PreferenceNames.HTTPUPLOAD_URL).setSummary(url); + return true; + } + + if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_METHOD)) { + String method = extras.getString(SimpleListDialog.SELECTED_SINGLE_LABEL); + preferenceHelper.setHttpUploadMethod(method); + findPreference(PreferenceNames.HTTPUPLOAD_METHOD).setSummary(method); + return true; + } + + if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_BODY_TYPE)) { + String label = extras.getString(SimpleListDialog.SELECTED_SINGLE_LABEL); + String[] entries = getResources().getStringArray(R.array.http_body_types); + String[] values = getResources().getStringArray(R.array.http_body_type_values); + + String value = values[0]; + for (int i = 0; i < entries.length; i++) { + if (entries[i].equals(label)) { + value = values[i]; + break; + } + } + + preferenceHelper.setHttpUploadBodyType(value); + findPreference(PreferenceNames.HTTPUPLOAD_BODY_TYPE).setSummary(getBodyTypeDisplay(value)); + updateMethodPreferenceState(); + return true; + } + + if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_HEADERS)) { + String headers = extras.getString(PreferenceNames.HTTPUPLOAD_HEADERS); + preferenceHelper.setHttpUploadHeaders(headers); + findPreference(PreferenceNames.HTTPUPLOAD_HEADERS).setSummary(headers); + return true; + } + + if (dialogTag.equals("httpupload_basicauth")) { + String username = extras.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME); + String password = extras.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD); + preferenceHelper.setHttpUploadUsername(username); + preferenceHelper.setHttpUploadPassword(password); + updateAuthSummary(findPreference("httpupload_basicauth")); + return true; + } + + return false; + } +} diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java index c98333ad7..f31087473 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java @@ -175,6 +175,23 @@ public void onClick(View view) { } }); + ((SwitchPlusClickPreference)findPreference(PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED)) + .setSwitchClickListener(new SwitchPlusClickPreference.SwitchPlusClickListener() { + + @Override + public void onCheckedChanged(SwitchCompat buttonView, boolean isChecked) { + // No need to do anything, the value gets propagated. + } + + @Override + public void onClick(View view) { + + Intent intent = new Intent(getActivity(), MainPreferenceActivity.class); + intent.putExtra("preference_fragment", MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); + startActivity(intent); + } + }); + ((SwitchPlusClickPreference)findPreference(PreferenceNames.AUTOSEND_DROPBOX_ENABLED)) .setSwitchClickListener(new SwitchPlusClickPreference.SwitchPlusClickListener() { diff --git a/gpslogger/src/main/res/values/arrays.xml b/gpslogger/src/main/res/values/arrays.xml index 144e4a345..1fb8867c0 100644 --- a/gpslogger/src/main/res/values/arrays.xml +++ b/gpslogger/src/main/res/values/arrays.xml @@ -75,5 +75,19 @@ dark + + POST + PUT + + + + Multipart form-data + Binary stream + + + + form-data + binary + - \ No newline at end of file + diff --git a/gpslogger/src/main/res/values/strings.xml b/gpslogger/src/main/res/values/strings.xml index 115489757..c6a85e893 100644 --- a/gpslogger/src/main/res/values/strings.xml +++ b/gpslogger/src/main/res/values/strings.xml @@ -503,4 +503,8 @@ Only log if there is significant motion Only log if significant activity is detected such as walking, biking, driving. Significant motion is determined by your OS. + HTTP Upload + Uploads files to an arbitrary URL using HTTP POST or PUT. + Encoding + diff --git a/gpslogger/src/main/res/xml/httpuploadsettings.xml b/gpslogger/src/main/res/xml/httpuploadsettings.xml new file mode 100644 index 000000000..09a2e4090 --- /dev/null +++ b/gpslogger/src/main/res/xml/httpuploadsettings.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + diff --git a/gpslogger/src/main/res/xml/pref_upload.xml b/gpslogger/src/main/res/xml/pref_upload.xml index 868a8ddad..6f638e980 100644 --- a/gpslogger/src/main/res/xml/pref_upload.xml +++ b/gpslogger/src/main/res/xml/pref_upload.xml @@ -49,6 +49,11 @@ android:title="@string/log_customurl_setup_title" app:icon="@drawable/customurlsender"/> + + Date: Tue, 17 Mar 2026 21:07:46 +0000 Subject: [PATCH 03/50] Wire HTTP upload into main navigation and actions --- .../mendhak/gpslogger/GpsMainActivity.java | 36 ++++++++++++++++++- gpslogger/src/main/res/menu/gps_main.xml | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java index bf0eb0210..0fd01517a 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java @@ -704,7 +704,7 @@ public void setUpToolbar(){ window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } catch(Exception ex){ - //http://stackoverflow.com/questions/26657348/appcompat-v7-v21-0-0-causing-crash-on-samsung-devices-with-android-v4-2-2 + //http://stackoverflow.com/questions/26489079/appcompat-v7-v21-0-0-causing-crash-on-samsung-devices-with-android-v4-2-2 LOG.error("Thanks for this, Samsung", ex); } @@ -846,6 +846,7 @@ public boolean onProfileLongClick(View view, final IProfile iProfile, boolean b) materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.pref_autosend_title, R.string.pref_autosend_summary, R.drawable.autosend, 1003)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.log_customurl_setup_title, null, R.drawable.customurlsender, 1020)); + materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.http_upload_setup_title, null, R.drawable.customurlsender, 1021)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.dropbox_setup_title, null, R.drawable.dropbox, 1005)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.google_drive_setup_title, null, R.drawable.googledrive, 1011)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.sftp_setup_title, null, R.drawable.sftp, 1015)); @@ -905,6 +906,9 @@ public boolean onItemClick(View view, int i, IDrawerItem iDrawerItem) { case 1020: launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.CUSTOMURL); break; + case 1021: + launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); + break; case 9000: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://gpslogger.app"))); break; @@ -1231,6 +1235,7 @@ public boolean onMenuItemClick(MenuItem item) { return true; case R.id.mnuAutoSendNow: forceAutoSendNow(); + return true; case R.id.mnuOwnCloud: uploadToOwnCloud(); return true; @@ -1240,6 +1245,9 @@ public boolean onMenuItemClick(MenuItem item) { case R.id.mnuCustomUrl: uploadToCustomURL(); return true; + case R.id.mnuHttpUpload: + uploadToHttpUpload(); + return true; default: return true; } @@ -1321,6 +1329,15 @@ private void uploadToCustomURL(){ showFileListDialog(FileSenderFactory.getCustomUrlSender()); } + private void uploadToHttpUpload(){ + if(!FileSenderFactory.getHttpUploadSender().isAvailable()){ + launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); + return; + } + + showFileListDialog(FileSenderFactory.getHttpUploadSender()); + } + private void uploadToSFTP(){ if(!FileSenderFactory.getSFTPSender().isAvailable()){ launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.SFTP); @@ -1610,6 +1627,23 @@ public void onEventMainThread(UploadEvents.CustomUrl upload){ } } + @EventBusHook + public void onEventMainThread(UploadEvents.HttpUpload upload){ + LOG.debug("HTTP Upload Event completed, success: " + upload.success); + Dialogs.hideProgress(); + + if(!upload.success){ + LOG.error(getString(R.string.http_upload_setup_title) + + "-" + + getString(R.string.upload_failure)); + + if(userInvokedUpload){ + Dialogs.showError(getString(R.string.sorry), getString(R.string.upload_failure), upload.message, upload.throwable, this); + userInvokedUpload = false; + } + } + } + @EventBusHook public void onEventMainThread(UploadEvents.AutoEmail upload){ LOG.debug("Auto Email Event completed, success: " + upload.success); diff --git a/gpslogger/src/main/res/menu/gps_main.xml b/gpslogger/src/main/res/menu/gps_main.xml index 8f1ecd2e9..ca86506b4 100644 --- a/gpslogger/src/main/res/menu/gps_main.xml +++ b/gpslogger/src/main/res/menu/gps_main.xml @@ -11,6 +11,7 @@ + From 78074b28fddc4624a0bb94213de07e319db5c78d Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Tue, 17 Mar 2026 21:12:53 +0000 Subject: [PATCH 04/50] Add HTTP upload manager unit tests --- .../senders/http/HttpUploadManagerTest.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java diff --git a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java new file mode 100644 index 000000000..c5b5a61ff --- /dev/null +++ b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java @@ -0,0 +1,71 @@ +package com.mendhak.gpslogger.senders.http; + +import androidx.test.filters.SmallTest; + +import com.mendhak.gpslogger.common.PreferenceHelper; +import com.mendhak.gpslogger.senders.FileSender; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@SmallTest +@RunWith(MockitoJUnitRunner.class) +public class HttpUploadManagerTest { + + @Test + public void isAvailable_WhenUrlAndMethodPresent_ReturnsTrue() { + PreferenceHelper pm = mock(PreferenceHelper.class); + when(pm.getHttpUploadUrl()).thenReturn("https://example.com/upload"); + when(pm.getHttpUploadMethod()).thenReturn("POST"); + + HttpUploadManager manager = new HttpUploadManager(pm); + assertThat("URL and method are required", manager.isAvailable(), is(true)); + } + + @Test + public void isAvailable_WhenUrlMissing_ReturnsFalse() { + PreferenceHelper pm = mock(PreferenceHelper.class); + when(pm.getHttpUploadUrl()).thenReturn(""); + when(pm.getHttpUploadMethod()).thenReturn("POST"); + + HttpUploadManager manager = new HttpUploadManager(pm); + assertThat("URL is required", manager.isAvailable(), is(false)); + } + + @Test + public void isAvailable_WhenMethodMissing_ReturnsFalse() { + PreferenceHelper pm = mock(PreferenceHelper.class); + when(pm.getHttpUploadUrl()).thenReturn("https://example.com/upload"); + when(pm.getHttpUploadMethod()).thenReturn(""); + + HttpUploadManager manager = new HttpUploadManager(pm); + assertThat("HTTP method is required", manager.isAvailable(), is(false)); + } + + @Test + public void hasUserAllowedAutoSending_UsesPreferenceFlag() { + PreferenceHelper pm = mock(PreferenceHelper.class); + when(pm.isHttpUploadAutoSendEnabled()).thenReturn(true); + + HttpUploadManager manager = new HttpUploadManager(pm); + assertThat("Autosend preference should drive behavior", manager.hasUserAllowedAutoSending(), is(true)); + } + + @Test + public void getName_ReturnsHttpUploadSenderName() { + HttpUploadManager manager = new HttpUploadManager(mock(PreferenceHelper.class)); + assertThat("Sender name should be HTTP upload", manager.getName(), is(FileSender.SenderNames.HTTPUPLOAD)); + } + + @Test + public void accept_AnyFileName_ReturnsTrue() { + HttpUploadManager manager = new HttpUploadManager(mock(PreferenceHelper.class)); + assertThat("HTTP upload accepts any log file type", manager.accept(null, "anything.txt"), is(true)); + } +} From 6f3fae1a72c1ff113a009ca9628919928faf84b7 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Tue, 17 Mar 2026 21:28:57 +0000 Subject: [PATCH 05/50] Restore SO link --- .../src/main/java/com/mendhak/gpslogger/GpsMainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java index 0fd01517a..25b49221a 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java @@ -704,7 +704,7 @@ public void setUpToolbar(){ window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } catch(Exception ex){ - //http://stackoverflow.com/questions/26489079/appcompat-v7-v21-0-0-causing-crash-on-samsung-devices-with-android-v4-2-2 + //http://stackoverflow.com/questions/26657348/appcompat-v7-v21-0-0-causing-crash-on-samsung-devices-with-android-v4-2-2 LOG.error("Thanks for this, Samsung", ex); } From d8ad089763912aefc0b80440dfc5c02f8d2f7981 Mon Sep 17 00:00:00 2001 From: mendhak Date: Tue, 31 Mar 2026 07:34:56 +0100 Subject: [PATCH 06/50] Test that two trkseg elements are written in the GPX file --- .../mendhak/gpslogger/GpsLoggingService.java | 3 +- .../loggers/gpx/Gpx10WriteHandlerTest.java | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java index 7138ce68e..df98e6ac5 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java @@ -1242,7 +1242,7 @@ private void setAlarmForNextPoint() { * @param loc Location object */ private void writeToFile(Location loc) { - session.setAddNewTrackSegment(false); + //session.setAddNewTrackSegment(false); try { LOG.debug("Calling file writers"); @@ -1258,6 +1258,7 @@ private void writeToFile(Location loc) { Systems.showErrorNotification(this, getString(R.string.could_not_write_to_file)); } + session.setAddNewTrackSegment(false); session.clearDescription(); EventBus.getDefault().post(new ServiceEvents.AnnotationStatus(true)); } diff --git a/gpslogger/src/test/java/com/mendhak/gpslogger/loggers/gpx/Gpx10WriteHandlerTest.java b/gpslogger/src/test/java/com/mendhak/gpslogger/loggers/gpx/Gpx10WriteHandlerTest.java index 11cd76fb4..b688883bb 100644 --- a/gpslogger/src/test/java/com/mendhak/gpslogger/loggers/gpx/Gpx10WriteHandlerTest.java +++ b/gpslogger/src/test/java/com/mendhak/gpslogger/loggers/gpx/Gpx10WriteHandlerTest.java @@ -10,6 +10,9 @@ import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; +import java.io.File; +import java.io.FileWriter; +import java.nio.file.Files; import java.util.Date; import static org.hamcrest.CoreMatchers.is; @@ -136,6 +139,36 @@ public void GetTrackPointXml_NewTrackSegmentPref_NewTrkSegReturned(){ assertThat("Trackpoint XML with a new segment", actual, is(expected)); } + @Test + public void GetTrackPointXml_NewTrackSegmentPref_AdditionalTrkSegAddedIfTrkSegExists() throws Exception{ + + // Here I have to create a temporary file so that I can have a file with an existing TRKPT. + // There's no method that takes the full file contents as an input so there is no way to test that. + File tempFile = File.createTempFile("test",".gpx"); + String existingContent = "" + + "20260331" + + "" + + "88.7111657481467" + + "0.047.2gps71.51.32.0\n" + + "" + + ""; + try(FileWriter writer = new FileWriter(tempFile)){ + writer.write(existingContent); + } + + Gpx10WriteHandler writeHandler = new Gpx10WriteHandler(null, tempFile, null, true); + writeHandler.run(); + + String fileContent = new String(Files.readAllBytes(tempFile.toPath())); + + assertThat("File should contain two track segments", fileContent.split("").length, is(2)); + assertThat("File should contain two track segments", fileContent.split("").length, is(2)); + + + } + @Test public void GetTrackPointXml_WhenHDOPPresent_ThenFormattedInXML(){ From e45320958a794e194d1267107eb44224790369b7 Mon Sep 17 00:00:00 2001 From: mendhak Date: Tue, 31 Mar 2026 18:52:42 +0100 Subject: [PATCH 07/50] v136-rc1 --- gpslogger/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gpslogger/build.gradle b/gpslogger/build.gradle index 01cb6b3a2..e885cd9b7 100644 --- a/gpslogger/build.gradle +++ b/gpslogger/build.gradle @@ -45,8 +45,8 @@ android { targetSdkVersion 35 compileSdk 35 - versionCode 135 - versionName "135" + versionCode 136 + versionName "136-rc1" // Used by AppAuth-Android manifestPlaceholders = [ From 9b6bb9a5e2991077af44bc67e866b4b0c20e4a36 Mon Sep 17 00:00:00 2001 From: "Miguel A. Bouzada" Date: Sat, 6 Dec 2025 04:36:08 +0100 Subject: [PATCH 08/50] Translated using Weblate (Galician) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/gl/ --- fastlane/metadata/android/gl-ES/changelogs/131.txt | 2 +- fastlane/metadata/android/gl-ES/changelogs/135.txt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/gl-ES/changelogs/135.txt diff --git a/fastlane/metadata/android/gl-ES/changelogs/131.txt b/fastlane/metadata/android/gl-ES/changelogs/131.txt index 2e4b42b16..ff9a9a5ed 100644 --- a/fastlane/metadata/android/gl-ES/changelogs/131.txt +++ b/fastlane/metadata/android/gl-ES/changelogs/131.txt @@ -3,4 +3,4 @@ * A difusión envíase cando se completa o envío do ficheiro, útil para automatizar a limpeza de ficheiros * Notificacións de erro e menos fallos se os permisos foron revogados ou falla a escritura de ficheiros * Novo parámetro de URL personalizado, %SPD_KPH -* Aclaración da descrición de envío automático: o cambio dinámico do nome do ficheiro tamén provoca o envío do ficheiro +* Aclaración da descrición de envío automático: o cambio dinámico do nome do ficheiro tamén provoca o envío do ficheiro. diff --git a/fastlane/metadata/android/gl-ES/changelogs/135.txt b/fastlane/metadata/android/gl-ES/changelogs/135.txt new file mode 100644 index 000000000..42a603885 --- /dev/null +++ b/fastlane/metadata/android/gl-ES/changelogs/135.txt @@ -0,0 +1,4 @@ +* Corrección para elementos de rumbo/velocidade nos ficheiros GPX 1.0 e GPX 1.1 +* Actualización ao SDK de Dropbox v7 por mor do cambio de certificado en xaneiro de 2026 +* Retirar as pantallas de preguntas frecuentes da aplicación, reducir a sobrecarga de mantemento +* Verificar o nome do servidor TLS ao empregar o cliente Owncloud/Nextcloud From 9e8c3cb7d140c5952af99dff59a015da9151737a Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Sat, 6 Dec 2025 03:26:41 +0100 Subject: [PATCH 09/50] Translated using Weblate (Japanese) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/ja/ --- fastlane/metadata/android/ja/changelogs/135.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/ja/changelogs/135.txt diff --git a/fastlane/metadata/android/ja/changelogs/135.txt b/fastlane/metadata/android/ja/changelogs/135.txt new file mode 100644 index 000000000..a80c5d6ed --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/135.txt @@ -0,0 +1,4 @@ +* GPX 1.0・GPX 1.1 ファイルの経路/速度の要素を修正 +* 2026年1月の証明書変更に伴い、Dropbox SDKをv7へ更新 +* アプリのFAQ画面を削除して、保守コストを削減 +* Owncloud/Nextcloudクライアント利用時TLSホスト名の精査 From c7ae2eacb583cd3dc790bb0f9a2cf5b4e8f8bb5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20L=C3=A1szl=C3=B3?= Date: Sat, 6 Dec 2025 03:44:28 +0100 Subject: [PATCH 10/50] Translated using Weblate (Hungarian) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/hu/ --- fastlane/metadata/android/hu/changelogs/135.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/hu/changelogs/135.txt diff --git a/fastlane/metadata/android/hu/changelogs/135.txt b/fastlane/metadata/android/hu/changelogs/135.txt new file mode 100644 index 000000000..8234fad6c --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/135.txt @@ -0,0 +1,4 @@ +* Javítás: GPX 1.0 és GPX 1.1 fájlokban útvonal/sebesség elemek +* Frissítés: Dropbox SDK v7-re, 2026 januárjában bekövetkezett tanúsítványváltozás miatt +* GYIK képernyők eltávolítása az alkalmazásból, ezzel csökkentve a karbantartási költségeket +* TLS hostnév ellenőrzése az Owncloud/Nextcloud kliens használatakor From e21511a8e777e5829f51a3fe2150b8b1b1b1469f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mari=C3=A1n=20Hikan=C3=ADk?= Date: Sat, 6 Dec 2025 13:57:53 +0100 Subject: [PATCH 11/50] Translated using Weblate (Slovak) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/sk/ --- fastlane/metadata/android/sk/changelogs/135.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sk/changelogs/135.txt diff --git a/fastlane/metadata/android/sk/changelogs/135.txt b/fastlane/metadata/android/sk/changelogs/135.txt new file mode 100644 index 000000000..2bcd55af2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/135.txt @@ -0,0 +1,4 @@ +* Oprava pre prvky týkajúce sa smeru/rýchlosti v súboroch GPX 1.0 a GPX 1.1 +* Aktualizácia na Dropbox SDK v7 kvôli zmene certifikátu v januári 2026 +* Odstránenie obrazoviek s FAQ z aplikácie, zníženie náročnosti údržby +* Overenie názvu hostiteľa TLS pri používaní klienta Owncloud/Nextcloud From db89c32fd1a217a9e9dccab025aa8ae57ce888be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20L=C3=A1szl=C3=B3?= Date: Thu, 11 Dec 2025 17:19:18 +0100 Subject: [PATCH 12/50] Translated using Weblate (Hungarian) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/hu/ --- gpslogger/src/main/res/values-hu/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpslogger/src/main/res/values-hu/strings.xml b/gpslogger/src/main/res/values-hu/strings.xml index b9e190a3e..6456fc311 100644 --- a/gpslogger/src/main/res/values-hu/strings.xml +++ b/gpslogger/src/main/res/values-hu/strings.xml @@ -387,7 +387,7 @@ Értesítések - Engedélyezze az értesítések megjelenítését, ez segít a rögzítés életben tartásában. ]]> Értesítés elrejtése lezárt képernyőről Kezdő időpont - Passzív helyszíne frissítési intervallum + Passzív helyszín frissítési intervallum Csökkentsd a redundáns passzív helyfrissítéseket a minimális gyűjtési intervallum (másodpercben) módosításával. Wi-Fi-kapcsolatra várás, mielőtt bármilyen hálózati kérést végrehajtana. Minden kérésre vonatkozik, beleértve a küldést és a naplózást is. Csak jelentős mozgás esetén naplózzon From 26d8bffd0df29aa1a912af89cc8790b25d8c6517 Mon Sep 17 00:00:00 2001 From: anton garcias Date: Mon, 15 Dec 2025 10:54:18 +0100 Subject: [PATCH 13/50] Translated using Weblate (Catalan) Currently translated at 9.6% (3 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/ca/ --- fastlane/metadata/android/ca/short_description.txt | 2 +- fastlane/metadata/android/ca/title.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/ca/title.txt diff --git a/fastlane/metadata/android/ca/short_description.txt b/fastlane/metadata/android/ca/short_description.txt index 602246f03..8d4d72fcb 100644 --- a/fastlane/metadata/android/ca/short_description.txt +++ b/fastlane/metadata/android/ca/short_description.txt @@ -1 +1 @@ -Gravador GPS lleuger, eficient amb la bateria, GPX/KML, anotar, compartir,pujar. +Gravador GPS lleuger, eficient amb la bateria, GPX/KML,anotar,compartir, pujar. diff --git a/fastlane/metadata/android/ca/title.txt b/fastlane/metadata/android/ca/title.txt new file mode 100644 index 000000000..03bd8e297 --- /dev/null +++ b/fastlane/metadata/android/ca/title.txt @@ -0,0 +1 @@ +GPSLogger From 641132c0cfedaaa0fd712a3abbd0985ffe987798 Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sat, 27 Dec 2025 20:43:57 +0100 Subject: [PATCH 14/50] Translated using Weblate (German) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/de/ --- gpslogger/src/main/res/values-de/strings.xml | 23 ++++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/gpslogger/src/main/res/values-de/strings.xml b/gpslogger/src/main/res/values-de/strings.xml index 10c03c50c..f7dc26620 100644 --- a/gpslogger/src/main/res/values-de/strings.xml +++ b/gpslogger/src/main/res/values-de/strings.xml @@ -5,7 +5,7 @@ Navigationsmenü schließen GPSLogger GPSLogger - Einstellungen - ok + OK Abbrechen Ausblenden In Datei konnte nicht geschrieben werden @@ -32,7 +32,7 @@ Maximum Entfernung: Datei: - Nur Orte + Nur Standort Mein Standort Teilen über @@ -115,11 +115,10 @@ Leistung Intervalle, Filter und Standortbestimmung Aufzeichnungsintervall - Verwenden Sie 0 für den maximalen Intervall, langsamer ist jedoch besser für die Akkulaufzeit. - Die Konfiguration des Akkuladestands im System kann diese Einstellung außer Kraft setzen, siehe auch Hilfe und FAQ. + 0 für maximale Frequenz verwenden, aber langsamer ist besser für die Akkulaufzeit. Die Systemkonfiguration für den Akku kann diese Einstellung überschreiben, siehe Hilfe und FAQ. Zeit in Sekunden Eingabe in Sekunden (max. 9999) - Seien Sie vorsichtig - Diese Einstellung wird die Akkulaufzeit drastisch verkürzen. Nur für höhere Präzision bei geringer Häufigkeit verwenden. + Seien Sie vorsichtig, dies verkürzt die Akkulaufzeit erheblich. Nur für höhere Präzision bei niedrigen Frequenzen verwenden. GPS zwischen den Positionsbestimmungen eingeschaltet lassen Zeit, bis die Genauigkeit erreicht ist Nach dem Erhalt der ersten Positionsbestimmung so lange warten, bis die eingestellte Genauigkeit erreicht ist. @@ -175,7 +174,7 @@ Windows Live Mail Manuell Dropbox - Um Dropbox-Funktionen nutzen zu können, müssen Sie GPSLogger berechtigen, Dateien in Ihr Konto hochzuladen zu dürfen. + Um Dropbox-Funktionen nutzen zu können, müssen Sie GPSLogger berechtigen, Dateien in Ihr Konto hochzuladen. Sie sind für Dropbox berechtigt. Die Dateien werden nach „Apps\\GPSLogger for Android“ hochgeladen. Sie können bei Bedarf die Verbindung von GPSLogger zu Ihrer Dropbox trennen. Dropbox-Anmeldung fehlgeschlagen, bitte probiere es später noch einmal ownCloud @@ -273,7 +272,7 @@ Länge In eine NMEA-Datei protokollieren Erstellt eine unbearbeitete NMEA-Datei, während man versucht, eine Positionsbestimmung zu erhalten. Diese Datei wächst sehr schnell. Dies funktioniert nur während der Verwendung von GPS. - Benutzername + Kontoname GPS GPS/GNSS-Standorte aufzeichnen Zeichnet Standorte auf, die durch das GPS-Modul des Handys generiert wurden @@ -298,7 +297,7 @@ Ordnername Bei jedem Start nach einem Dateinamen fragen Aufforderung zur Eingabe eines benutzerdefinierten Dateinamens bei jedem Start der Aufzeichnung - Erlauben, dass sich benutzerdefinierte Dateinamen dynamisch ändern + Benutzerdefinierte Dateinamen dynamisch ändern lassen Wenn sich die Werte der benutzerdefinierten Dateinamen ändern, ändert sich auch der aktuelle Dateiname. Beispielsweise wird jede Stunde eine neue Datei erzeugt, wenn der Parameter %HOUR genutzt wird. Häkchen entfernen, um statische Dateinamen zu verwenden. Spenden (App) Bitcoin @@ -314,7 +313,7 @@ Ungenauer Messpunkt verworfen Nur %s m zurückgelegt. Messpunkt verworfen. Nur über WLAN senden - Nur Orte + Nur Standorte Automatischer Bildlauf Neues Profil erstellen Aus URL @@ -327,8 +326,8 @@ Standort - Diese Berechtigung ermöglicht der App das Lesen der aktuellen Standortdaten.]]> Fotos/Medien/Dateien - Diese Berechtigung ermöglicht es, Protokolldateien und Testdateien zu speichern, wie auch das Lesen einer Liste von Dateien, um sie hochladen oder teilen zu können. Diese App greift nicht auf Ihre Fotos oder Medien zu.]]> - Jederzeit zulassen – Erlaube dieser App, Standortaktualisierungen zu empfangen, wenn sie im Hintergrund ausgeführt wird. ]]> - Akkuoptimierung ignorieren – Lassen Sie diese App im Hintergrund laufen, indem Sie die Akkuoptimierung reduzieren. ]]> + Jederzeit zulassen – Erlaubt dieser App, Standortaktualisierungen zu empfangen, wenn sie im Hintergrund ausgeführt wird. ]]> + Akkuoptimierung ignorieren – Erlaubt dieser App, im Hintergrund zu laufen, indem die Akkuoptimierung reduziert wird. ]]>
Falls Sie die Berechtigungen permanent abgelehnt haben, so können Sie diese in den Systemeinstellungen zurücksetzen.]]>
Datenschutzbestimmungen @@ -387,7 +386,7 @@ Benachrichtigung auf dem Sperrbildschirm ausblenden Aufforderung zur Eingabe von Details bei Beginn der Protokollierung Gestartet am - Notifications - Erlaube die Anzeige einer Benachrichtigung, das hilft, den Protokollierungsdienst am Leben zu erhalten. ]]> + Benachrichtigungen - Erlaubt die Anzeige einer Benachrichtigung, dies hilft dabei, den Protokollierungsdienst aufrechtzuerhalten. ]]> Aktualisierungsintervall für passive Standorte Reduziere unnötige passive Standortaktualisierungen, indem du das minimale Erfassungsintervall (in Sekunden) anpasst. Warte auf eine WLAN-Verbindung, bevor du irgendwelche Netzwerk-Anfragen machst. Das gilt für alle Anfragen, auch für das Senden und Protokollieren. From 3fd802d4657103df16e6fe7c54b3acd4c3e53064 Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sat, 27 Dec 2025 21:30:00 +0100 Subject: [PATCH 15/50] Translated using Weblate (German) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/de/ --- gpslogger/src/main/res/values-de/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gpslogger/src/main/res/values-de/strings.xml b/gpslogger/src/main/res/values-de/strings.xml index f7dc26620..6dab19e61 100644 --- a/gpslogger/src/main/res/values-de/strings.xml +++ b/gpslogger/src/main/res/values-de/strings.xml @@ -192,7 +192,7 @@ Hochgeladen. Bitte prüfen Sie Ihre Google-Dokumente auf eine neue Datei. Einzelne E-Mail-Adressen durch Kommata trennen Automatisches Senden erlauben - Ermöglicht das Senden der Dateien an verschiedene Ziele, mit einer bestimmten Frequenz, oder falls sich der Name aufgrund benutzerdefinierter Benennung ändert + Ermöglicht das Senden der Dateien an verschiedene Ziele mit einer bestimmten Frequenz oder wenn sich der Name aufgrund benutzerdefinierter Benennung ändert Zeiteinheit (in Minuten) festlegen, wie häufig Protokolldateien gesendet werden sollen. Wert auf „0“ setzen, um diese Funktion zu deaktivieren. Wie oft\? Als Zip-Datei senden @@ -216,7 +216,7 @@ HTTP-basierte oder Raw-Socket-basierte Kommunikation Serverpfad Optional und nur für HTTP-basierte Kommunikation. Beispielsweise „/gprmc/Data“ - Geräte-Kennung + Gerätekennung Benutzername Passwort Erweiterte Einstellungen @@ -267,7 +267,7 @@ Speichern Datei- und Ordnerinformationen Absolute Zeit bis zur GPS-Positionsbestimmung - Zeit (in Sekunden), nach denen die App die Positionsbestimmung unterbricht, unabhängig von anderen Einstellungen. Dies ist besonders sinnvoll, wenn Sie sich innerhalb von Gebäuden befinden, um zu verhindern, dass der GPS-Empfänger die Batterie entleert. Auf 0 (Null) setzen, um diese Einstellung zu deaktivieren. + Anzahl der Sekunden, nach denen die App die Positionsbestimmung unabhängig von anderen Einstellungen aufgibt. Dies ist besonders nützlich, wenn Sie sich in Gebäuden befinden, um zu verhindern, dass das GPS den Akku entleert. Setzen Sie den Wert auf 0, um keine Zeitüberschreitung festzulegen. Breite Länge In eine NMEA-Datei protokollieren @@ -328,7 +328,7 @@ Fotos/Medien/Dateien - Diese Berechtigung ermöglicht es, Protokolldateien und Testdateien zu speichern, wie auch das Lesen einer Liste von Dateien, um sie hochladen oder teilen zu können. Diese App greift nicht auf Ihre Fotos oder Medien zu.]]> Jederzeit zulassen – Erlaubt dieser App, Standortaktualisierungen zu empfangen, wenn sie im Hintergrund ausgeführt wird. ]]> Akkuoptimierung ignorieren – Erlaubt dieser App, im Hintergrund zu laufen, indem die Akkuoptimierung reduziert wird. ]]> -
Falls Sie die Berechtigungen permanent abgelehnt haben, so können Sie diese in den Systemeinstellungen zurücksetzen.]]>
+
Wenn Sie die Berechtigungen permanent abgelehnt haben, können Sie diese in den Systemeinstellungen zurücksetzen.]]>
Datenschutzbestimmungen Fehlerprotokolldatei an E-Mail anhängen @@ -389,7 +389,7 @@ Benachrichtigungen - Erlaubt die Anzeige einer Benachrichtigung, dies hilft dabei, den Protokollierungsdienst aufrechtzuerhalten. ]]> Aktualisierungsintervall für passive Standorte Reduziere unnötige passive Standortaktualisierungen, indem du das minimale Erfassungsintervall (in Sekunden) anpasst. - Warte auf eine WLAN-Verbindung, bevor du irgendwelche Netzwerk-Anfragen machst. Das gilt für alle Anfragen, auch für das Senden und Protokollieren. + Auf eine WLAN-Verbindung warten, bevor Netzwerk-Anfragen durchgeführt werden. Gilt für alle Anfragen einschließlich Senden und Protokollieren. Nur bei deutlicher Bewegung protokollieren - Nur aufzeichnen, wenn du dich richtig bewegst, wie zum Beispiel beim Laufen, Radfahren oder Autofahren. Was als richtige Bewegung zählt, entscheidet dein Betriebssystem. + Nur protokollieren, wenn bedeutende Aktivitäten wie Gehen, Radfahren oder Autofahren erkannt werden. Bedeutende Bewegungen werden von Ihrem Betriebssystem bestimmt. From 34b951599b1e906788528535ae9a14e7a747c438 Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sat, 27 Dec 2025 22:02:55 +0100 Subject: [PATCH 16/50] Translated using Weblate (German) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/de/ --- gpslogger/src/main/res/values-de/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gpslogger/src/main/res/values-de/strings.xml b/gpslogger/src/main/res/values-de/strings.xml index 6dab19e61..18f873f5d 100644 --- a/gpslogger/src/main/res/values-de/strings.xml +++ b/gpslogger/src/main/res/values-de/strings.xml @@ -42,7 +42,7 @@  Meter Fehler Verbindungsfehler. Bitte prüfen Sie Ihre Telefoneinstellungen. -  Sek. + Sekunde(n)  Minute(n) Std. Kein GPS-Anbieter verfügbar. Bitte überprüfen Sie Ihre Einstellungen für Standortdienste und aktivieren Sie einen Dienst für die Standortbestimmung. @@ -91,7 +91,7 @@ Genauigkeit in Metern Eingabe in Metern (max. 9999) - Aufzeichnungsinformationen + Aufzeichnungsdetails In eine GPX-Datei protokollieren Aufzeichnen von Orten in eine GPX v1.0-Datei GPX 1.1 verwenden @@ -201,7 +201,7 @@ Jetzt automatisch senden Automatisch senden Automatisches Senden: - Automatisches Senden, E-Mail und Hochladen + Automat. Senden, E-Mail, Hochladen E-Mail-, Teilen- und Hochladen-Optionen Starten Beenden @@ -306,7 +306,7 @@ Benachrichtigungs-Schaltflächen ausblenden GPSLogger muss neu gestartet werden, damit diese Einstellung wirksam wird Verwendet den „Mittleren Meeresspiegel“ (MSL) anstelle der WGS84-Höhe (World Geodetic System 1984), indem die Geoidhöhe von der GPS-Höhe abgezogen wird. Gilt nur für Punkte, die mittels GPS-Satelliten und nicht über Netzwerk oder NMEA bestimmt wurden. - „Mittlerer Meeresspiegel“ statt WGS84 verwenden + „Mittleren Meeresspiegel“ statt WGS84 verwenden Höhenversatz abziehen Ein Wert in Metern, der von den festgestellten GPS-Höhen abgezogen wird. Verwenden Sie eine negative Zahl, um einen Wert zur Höhe hinzuzufügen. Gilt nur für GPS-Satellitenpunkte, nicht für Netzwerk oder NMEA. Datei konnte nicht hochgeladen werden @@ -373,7 +373,7 @@ Anstatt den ersten Standort mit der eingestellten Genauigkeit aufzuzeichnen, wird erst nach Ablauf der Wartezeit der Standort mit der höchsten Genauigkeit genutzt. Erhöht die Genauigkeit auf Kosten des Aufzeichnungsintervalls. Benutzen Sie einen einzelnen Ordnernamen (z. B. GPSLogger) oder einen Ordnerpfad (z. B. aaa/bbb/ccc). Die Ordner müssen von dieser App erstellt werden. Wenn Sie einen einzelnen Ordnernamen verwenden, kann dieser nach der Erstellung innerhalb von Google Drive verschoben werden. Ordnerpfade sind langsamer, da jeder Teil des Pfades überprüft und ggf. erstellt werden muss, bevor Dateien hochgeladen werden . - Sendet eine Anfrage an die eingestellte URL wenn ein Standort aufgenommen wurde, in Abhängigkeit vom Aufnahmeintervall. + Sendet eine Anfrage an die benutzerdefinierte URL, sobald ein Standortpunkt erfasst wird. Abhängig vom Aufzeichnungsintervall. Google Drive-Ordner (Diese Funktion aktiviert die CSV-Aufnahme) Sendet Anfragen gruppiert zu der eingestellten URL, eine für jede Zeile in der CSV-Datei. Abhängig vom automatischen Sendeintervall. Offline-Standorte verwerfen @@ -384,11 +384,11 @@ Annmerkungsansicht Geschwindigkeit (in km/h): Benachrichtigung auf dem Sperrbildschirm ausblenden - Aufforderung zur Eingabe von Details bei Beginn der Protokollierung + Bei Beginn der Aufzeichnung nach Details fragen Gestartet am Benachrichtigungen - Erlaubt die Anzeige einer Benachrichtigung, dies hilft dabei, den Protokollierungsdienst aufrechtzuerhalten. ]]> Aktualisierungsintervall für passive Standorte - Reduziere unnötige passive Standortaktualisierungen, indem du das minimale Erfassungsintervall (in Sekunden) anpasst. + Reduzieren Sie redundante passive Standortaktualisierungen, indem Sie das minimale Erfassungsintervall (in Sekunden) anpassen. Auf eine WLAN-Verbindung warten, bevor Netzwerk-Anfragen durchgeführt werden. Gilt für alle Anfragen einschließlich Senden und Protokollieren. Nur bei deutlicher Bewegung protokollieren Nur protokollieren, wenn bedeutende Aktivitäten wie Gehen, Radfahren oder Autofahren erkannt werden. Bedeutende Bewegungen werden von Ihrem Betriebssystem bestimmt. From 41e3a85dd4f6d69b1b221962f53a14a1c0452caa Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sat, 27 Dec 2025 22:13:12 +0100 Subject: [PATCH 17/50] Translated using Weblate (German) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/de/ --- gpslogger/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/res/values-de/strings.xml b/gpslogger/src/main/res/values-de/strings.xml index 18f873f5d..3bed15671 100644 --- a/gpslogger/src/main/res/values-de/strings.xml +++ b/gpslogger/src/main/res/values-de/strings.xml @@ -44,7 +44,7 @@ Verbindungsfehler. Bitte prüfen Sie Ihre Telefoneinstellungen. Sekunde(n)  Minute(n) - Std. + Stunden Kein GPS-Anbieter verfügbar. Bitte überprüfen Sie Ihre Einstellungen für Standortdienste und aktivieren Sie einen Dienst für die Standortbestimmung. Gestartet GPS-Satelliten @@ -117,7 +117,7 @@ Aufzeichnungsintervall 0 für maximale Frequenz verwenden, aber langsamer ist besser für die Akkulaufzeit. Die Systemkonfiguration für den Akku kann diese Einstellung überschreiben, siehe Hilfe und FAQ. Zeit in Sekunden - Eingabe in Sekunden (max. 9999) + Sekunden eingeben (max. 9999) Seien Sie vorsichtig, dies verkürzt die Akkulaufzeit erheblich. Nur für höhere Präzision bei niedrigen Frequenzen verwenden. GPS zwischen den Positionsbestimmungen eingeschaltet lassen Zeit, bis die Genauigkeit erreicht ist From 843e9c7224fc4c87bd5bef827c8841eb645379c3 Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sat, 27 Dec 2025 22:38:43 +0100 Subject: [PATCH 18/50] Translated using Weblate (German) Currently translated at 12.9% (4 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/de/ --- fastlane/metadata/android/de/changelogs/108.txt | 4 ++-- fastlane/metadata/android/de/full_description.txt | 12 ++++++------ fastlane/metadata/android/de/short_description.txt | 2 +- fastlane/metadata/android/de/title.txt | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fastlane/metadata/android/de/changelogs/108.txt b/fastlane/metadata/android/de/changelogs/108.txt index ff78c9f75..a2d3291fa 100644 --- a/fastlane/metadata/android/de/changelogs/108.txt +++ b/fastlane/metadata/android/de/changelogs/108.txt @@ -1,2 +1,2 @@ -GPS-Logger für F-Droid neu verpacken. -Abhängigkeiten für Google Drive, Aktivitätserkennung und Play Services entfernen. +GPSLogger für F-Droid neu verpacken. +Abhängigkeiten für Google Drive, Aktivitätserkennung und Play Services entfernen. diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt index 0db834afa..89b2ccc38 100644 --- a/fastlane/metadata/android/de/full_description.txt +++ b/fastlane/metadata/android/de/full_description.txt @@ -1,6 +1,6 @@ -Eine schnelle, stromsparende App zur Aufzeichnung von GPS-Wegpunkten. Der Zweck dieser App ist es, Ihre GPS-Koordinaten in bestimmten Abständen in einer Datei auf Ihrer SD-Karte zu speichern. Diese App läuft im Hintergrund, so dass Sie bei einem langen Spaziergang, einer Wanderung, einer Flugreise oder einer Fototour oder sogar beim Milchkauf diese so lange Sie möchten laufen lassen können. Sobald Sie wieder an Ihrem Computer sind, können Sie die Dateien verwenden, um Fotos mittels GPS geografisch einzuordnen, auf Reiseportalen hochzuladen, in Google Earth anzusehen oder anderweitig verarbeiten. +Eine schnelle, stromsparende App zur Aufzeichnung von GPS-Wegpunkten. Der Zweck dieser App ist es, Ihre GPS-Koordinaten in bestimmten Abständen in einer Datei auf Ihrer SD-Karte zu speichern. Diese App läuft im Hintergrund, sodass Sie sie bei einem langen Spaziergang, einer Wanderung, einer Flugreise, einer Fototour oder sogar beim Milchkauf so lange wie möglich laufen lassen können. Sobald Sie wieder an Ihrem Computer sind, können Sie die Dateien verwenden, um Fotos mittels GPS geografisch einzuordnen, auf Reiseportalen hochzuladen, in Google Earth anzusehen oder anderweitig zu verarbeiten. -★★★Funktionen: +★★★ Funktionen: • Einstellbare Zeitintervalle • Festlegen von Entfernungsintervallen @@ -15,7 +15,7 @@ Eine schnelle, stromsparende App zur Aufzeichnung von GPS-Wegpunkten. Der Zweck • Dropbox: Hochladen von GPX-, KML- oder ZIP-Dateien -Fehler, Wünsche, Fragen - Diese können Sie an unser Fehlerverfolgungssystem auf github.com/mendhak/gpslogger senden. +Fehler, Wünsche, Fragen können Sie an unser Fehlerverfolgungssystem auf github.com/mendhak/gpslogger senden. ★★★ Hinweise: @@ -23,15 +23,15 @@ GPSLogger ist kein OpenTracks-Ersatz. OpenTracks ist für den kurzen Gebrauch g Eine Datenverbindung wird von dieser Anwendung nur verwendet, wenn Sie das automatische Versenden von E-Mails, OpenStreetMap- oder Dropbox-Funktionen verwenden. -Obwohl die App 0-Sekunden-intervalle zulässt, wird dies nicht empfohlen, da die Aufzeichnung und Protokollierung sehr schnell abläuft; dies könnte zu Instabilitäten/Störungen führen. Verwenden Sie stattdessen 1-3 Sekunden. +Obwohl die App 0-Sekunden-Intervalle zulässt, wird dies nicht empfohlen, da die Aufzeichnung und Protokollierung sehr schnell abläuft; dies könnte zu Instabilitäten oder Störungen führen. Verwenden Sie stattdessen 1-3 Sekunden. -Wenn Sie eine Funktion vermissen, können Sie Ihre Wünsche auf unserer Github-Seite einreichen. +Wenn Sie eine Funktion vermissen, können Sie Ihre Wünsche auf unserer GitHub-Seite einreichen. ★★★ Erläuterung der Berechtigungen: Speicherung - Lesen und Schreiben von Dateien in den GPSLogger-Ordner auf Ihrer SD-Karte -Netzwerkkommunikation - wird beim Hochladen der Dateien (Dropbox, Openstreetmap), beim Versenden von E-Mails oder bei der Autorisierung mit Dropbox, Openstreetmap verwendet +Netzwerkkommunikation - wird beim Hochladen der Dateien (Dropbox, OpenStreetMap), beim Versenden von E-Mails oder bei der Autorisierung mit Dropbox, OpenStreetMap verwendet Ihr Standort - zur Bestimmung Ihres GPS- oder Funkzellen-basierten Standorts diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt index d3bf982d0..d6e732ff8 100644 --- a/fastlane/metadata/android/de/short_description.txt +++ b/fastlane/metadata/android/de/short_description.txt @@ -1 +1 @@ -Eine App zur einfachen Aufzeichnung von GPS-Wegpunkten, batteriesparend, GPX +Ein einfacher GPS-Logger, Akku-sparend, GPX/KML, Hinzufügen von Notizen, Teilen, Hochladen. diff --git a/fastlane/metadata/android/de/title.txt b/fastlane/metadata/android/de/title.txt index 9bda876b7..03bd8e297 100644 --- a/fastlane/metadata/android/de/title.txt +++ b/fastlane/metadata/android/de/title.txt @@ -1 +1 @@ -GPS-Logger +GPSLogger From 593708bc7364a3603198bbe44485525264b348bc Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Sun, 28 Dec 2025 18:05:17 +0100 Subject: [PATCH 19/50] Translated using Weblate (German) Currently translated at 16.1% (5 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/de/ --- fastlane/metadata/android/de/changelogs/135.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/de/changelogs/135.txt diff --git a/fastlane/metadata/android/de/changelogs/135.txt b/fastlane/metadata/android/de/changelogs/135.txt new file mode 100644 index 000000000..a12db5f43 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/135.txt @@ -0,0 +1,4 @@ +* Korrektur für Kurs-/Geschwindigkeitselemente in GPX 1.0- und GPX 1.1-Dateien +* Aktualisierung auf Dropbox SDK v7 aufgrund einer Zertifikatsänderung im Januar 2026 +* Entfernung der FAQ-Bildschirme aus der App, Reduzierung des Wartungsaufwands +* Überprüfung des TLS-Hostnamens bei Verwendung des ownCloud- und Nextcloud-Clients From 639434076b3eb57bd1d3b094c02210918d03d8bc Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Mon, 12 Jan 2026 21:13:04 +0100 Subject: [PATCH 20/50] Translated using Weblate (German) Currently translated at 16.1% (5 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/de/ --- fastlane/metadata/android/de/short_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt index d6e732ff8..cc1fdb581 100644 --- a/fastlane/metadata/android/de/short_description.txt +++ b/fastlane/metadata/android/de/short_description.txt @@ -1 +1 @@ -Ein einfacher GPS-Logger, Akku-sparend, GPX/KML, Hinzufügen von Notizen, Teilen, Hochladen. +Einfacher GPS-Logger, akkusparend, GPX/KML, Notizen hinzufügen, Teilen, Hochladen. From 8ad6c648fc0faad128a5448acfe7df5fe55bb5c6 Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Sun, 25 Jan 2026 04:40:28 +0100 Subject: [PATCH 21/50] Translated using Weblate (Japanese) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/ja/ --- gpslogger/src/main/res/values-ja/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/res/values-ja/strings.xml b/gpslogger/src/main/res/values-ja/strings.xml index 5c0e394f3..975c2ab73 100644 --- a/gpslogger/src/main/res/values-ja/strings.xml +++ b/gpslogger/src/main/res/values-ja/strings.xml @@ -270,7 +270,7 @@ ログを開始する度にカスタムファイル名の入力プロンプトを表示する ファイル名を自動的に変更 現在のファイル名を自動的に変更できます。たとえば %HOUR を使用すると新しいファイルは 1 時間ごとに作成されます。ファイル名を固定するにはオフにします。 - GPSLogger(寄付版) + 寄附(アプリ) ビットコイン コーヒーを買う 利用可能なネットワークがありません @@ -361,7 +361,7 @@ 選択 期間中で最も高精度なものを選択 OpenStreetMap - GDriveフォルダのパス + Google Drive フォルダのパス 単一フォルダ名(例: GPSLogger)、またはフォルダパス(例: aaa/bbb/ccc)を使用します。 フォルダーはこのアプリケーションで作成する必要があります。 OpenGTS SSL From 598f82074769ae4880307c45b7998cc15882cb3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mari=C3=A1n=20Hikan=C3=ADk?= Date: Sun, 25 Jan 2026 12:13:30 +0100 Subject: [PATCH 22/50] Translated using Weblate (Slovak) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/sk/ --- gpslogger/src/main/res/values-sk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpslogger/src/main/res/values-sk/strings.xml b/gpslogger/src/main/res/values-sk/strings.xml index b8f79acd0..4854b1313 100644 --- a/gpslogger/src/main/res/values-sk/strings.xml +++ b/gpslogger/src/main/res/values-sk/strings.xml @@ -359,7 +359,7 @@ polia. Nie všetky preklady sú úplne dokončené! Na aplikovanie nastavení je nutné reštartovať aplikáciu. Formát zobrazenia súradníc Validovať certifikát SSL - Parametre adresy URL + Parametre Pridať certifikát do lokálneho úložiska? Certifikát je platný Skryť notifikáciu v stavovom riadku From 274149041e7e2e1ab275410812f16d70f8fe12be Mon Sep 17 00:00:00 2001 From: Liner Seven Date: Tue, 27 Jan 2026 07:12:51 +0100 Subject: [PATCH 23/50] Translated using Weblate (Japanese) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/ja/ --- fastlane/metadata/android/ja/changelogs/124.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/ja/changelogs/124.txt b/fastlane/metadata/android/ja/changelogs/124.txt index 1dd7755c0..97f500a5a 100644 --- a/fastlane/metadata/android/ja/changelogs/124.txt +++ b/fastlane/metadata/android/ja/changelogs/124.txt @@ -1,3 +1,3 @@ * バグ修正 - 最初の許可ダイアログを解除できないように * バグ修正 - カスタムURLロギング機能と自動送信機能の違いを明確に -* バグ修正 - F-Droidからインストールされた場合、conscryptプロバイダを正しくチェックし、ロードするよう修正 +* バグ修正 - F-Droidからインストールされた場合、Conscryptプロバイダを正しくチェックし、ロードするよう修正 From 05176d75b79d1a9e68b23b708b5373be412b320c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mari=C3=A1n=20Hikan=C3=ADk?= Date: Sat, 31 Jan 2026 22:01:47 +0100 Subject: [PATCH 24/50] Translated using Weblate (Slovak) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/sk/ --- fastlane/metadata/android/sk/changelogs/124.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/sk/changelogs/124.txt b/fastlane/metadata/android/sk/changelogs/124.txt index dff61c557..350754bde 100644 --- a/fastlane/metadata/android/sk/changelogs/124.txt +++ b/fastlane/metadata/android/sk/changelogs/124.txt @@ -1,3 +1,3 @@ * Oprava chyby - počiatočný dialóg týkajúci sa oprávnení nebolo možné odstrániť -* Oprava chyby - ujasnenie rozdielu medzi funkciou automatického zaznamenávanie na používateľskú URL adresu a funkciou pre automatické odosielanie -* Oprava chyby - správna kontrola na načítanie poskytovateľa conscrypt, ak bola vykonaná inštalácia z F-Droid +* Oprava chyby - ujasnenie rozdielu medzi funkciou automatického zaznamenávania na používateľskú URL adresu a funkciou pre automatické odosielanie +* Oprava chyby - správna kontrola a načítanie poskytovateľa conscrypt, ak bola vykonaná inštalácia z F-Droid From c398704905269f198888a97a06ec2ce51af92a9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20L=C3=A1szl=C3=B3?= Date: Tue, 10 Feb 2026 08:41:32 +0100 Subject: [PATCH 25/50] Translated using Weblate (Hungarian) Currently translated at 100.0% (31 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/hu/ --- fastlane/metadata/android/hu/changelogs/124.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/hu/changelogs/124.txt b/fastlane/metadata/android/hu/changelogs/124.txt index c35e978bb..d20e188e5 100644 --- a/fastlane/metadata/android/hu/changelogs/124.txt +++ b/fastlane/metadata/android/hu/changelogs/124.txt @@ -1,3 +1,3 @@ * Hibajavítás – kezdeti engedélyezési párbeszédpanel visszautasíthatatlan -* Hibajavítás – tisztázza a különbséget az egyéni URL-naplózás és az automatikus küldés funkció között +* Hibajavítás – tisztázza a különbséget az egyéni url-naplózás és az automatikus küldés funkció között * Hibajavítás - helyesen ellenőrzi és tölti be a conscrypt szolgáltatót, ha az F-Droidról lett telepítve From bc6d70c48732200d30b588992023ab32882d893e Mon Sep 17 00:00:00 2001 From: Santiago Galvis Duque Date: Tue, 17 Feb 2026 01:12:16 +0100 Subject: [PATCH 26/50] Translated using Weblate (Spanish (Colombia)) Currently translated at 95.1% (371 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/es_CO/ --- gpslogger/src/main/res/values-es-rCO/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/res/values-es-rCO/strings.xml b/gpslogger/src/main/res/values-es-rCO/strings.xml index f47a4f0e0..1834b7dfc 100644 --- a/gpslogger/src/main/res/values-es-rCO/strings.xml +++ b/gpslogger/src/main/res/values-es-rCO/strings.xml @@ -380,4 +380,5 @@ Descartar localizaciones offline Registrar localizaciones a una URL personalizada únicamente cuando haya una conexión de red disponible (no afecta el envío automático) Instalar Conscrypt Provider (SSL/TLS) - \ No newline at end of file + Velocidad (en km/h): + From 6e35bec6164a4546d896028e7cf258025edf26bd Mon Sep 17 00:00:00 2001 From: Cadu R Date: Thu, 19 Feb 2026 13:55:31 +0100 Subject: [PATCH 27/50] Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.9% (386 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/pt_BR/ --- gpslogger/src/main/res/values-pt-rBR/strings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/res/values-pt-rBR/strings.xml b/gpslogger/src/main/res/values-pt-rBR/strings.xml index 1bf959854..d71270e82 100644 --- a/gpslogger/src/main/res/values-pt-rBR/strings.xml +++ b/gpslogger/src/main/res/values-pt-rBR/strings.xml @@ -387,4 +387,5 @@ começou em Ocultar notificação na tela de bloqueio Notificações - Permitir a exibição de uma notificação, o que ajuda a manter o serviço de registro ativo.]]> - \ No newline at end of file + Registre apenas se for detectada atividade significativa, como caminhar, andar de bicicleta ou dirigir. O que é movimento significativo é determinado pelo seu sistema operacional. + From b075fef802eeb11b1bddea4873eb50f3f0fc0913 Mon Sep 17 00:00:00 2001 From: Cadu R Date: Thu, 19 Feb 2026 13:54:17 +0100 Subject: [PATCH 28/50] Translated using Weblate (Portuguese (Brazil)) Currently translated at 29.0% (9 of 31 strings) Translation: GPSLogger/F-Droid Listing (Fastlane) Translate-URL: https://hosted.weblate.org/projects/gpslogger/fastlane/pt_BR/ --- fastlane/metadata/android/pt-BR/changelogs/112.txt | 1 + fastlane/metadata/android/pt-BR/changelogs/113.txt | 1 + fastlane/metadata/android/pt-BR/changelogs/114.txt | 2 ++ 3 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/pt-BR/changelogs/112.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/113.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/114.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/112.txt b/fastlane/metadata/android/pt-BR/changelogs/112.txt new file mode 100644 index 000000000..c107e2834 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/112.txt @@ -0,0 +1 @@ +* Bugfix: Comando da tarefa getstatus não estava enviando um broadcast de status. diff --git a/fastlane/metadata/android/pt-BR/changelogs/113.txt b/fastlane/metadata/android/pt-BR/changelogs/113.txt new file mode 100644 index 000000000..12cb8b272 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/113.txt @@ -0,0 +1 @@ +* Adicionamos uma barra de rolagem à visualização simples para adaptá-la a telas e fontes de tamanho grande. diff --git a/fastlane/metadata/android/pt-BR/changelogs/114.txt b/fastlane/metadata/android/pt-BR/changelogs/114.txt new file mode 100644 index 000000000..84472dede --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/114.txt @@ -0,0 +1,2 @@ +* Adicionada barra de rolagem à visualização simples para adaptá-la a telas e fontes de tamanho grande. +* O teclado deve aparecer automaticamente ao usar a caixa de texto de anotação. From a1e76d6e4289cd52b2ac6fa218d932c20dcbccdc Mon Sep 17 00:00:00 2001 From: Mr-Update Date: Fri, 27 Feb 2026 21:13:59 +0100 Subject: [PATCH 29/50] Translated using Weblate (German) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/de/ --- gpslogger/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpslogger/src/main/res/values-de/strings.xml b/gpslogger/src/main/res/values-de/strings.xml index 3bed15671..d000d28d3 100644 --- a/gpslogger/src/main/res/values-de/strings.xml +++ b/gpslogger/src/main/res/values-de/strings.xml @@ -328,7 +328,7 @@ Fotos/Medien/Dateien - Diese Berechtigung ermöglicht es, Protokolldateien und Testdateien zu speichern, wie auch das Lesen einer Liste von Dateien, um sie hochladen oder teilen zu können. Diese App greift nicht auf Ihre Fotos oder Medien zu.]]> Jederzeit zulassen – Erlaubt dieser App, Standortaktualisierungen zu empfangen, wenn sie im Hintergrund ausgeführt wird. ]]> Akkuoptimierung ignorieren – Erlaubt dieser App, im Hintergrund zu laufen, indem die Akkuoptimierung reduziert wird. ]]> -
Wenn Sie die Berechtigungen permanent abgelehnt haben, können Sie diese in den Systemeinstellungen zurücksetzen.]]>
+
Wenn Sie die Berechtigungen permanent abgelehnt haben, können Sie diese in den Systemeinstellungen zurücksetzen. ]]>
Datenschutzbestimmungen Fehlerprotokolldatei an E-Mail anhängen From 004c070b11504525fb7b698bef63890b2d19bd53 Mon Sep 17 00:00:00 2001 From: clearstripe Date: Sat, 14 Mar 2026 11:40:00 +0100 Subject: [PATCH 30/50] Translated using Weblate (Korean) Currently translated at 93.8% (366 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/ko/ --- gpslogger/src/main/res/values-ko/strings.xml | 52 +++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/res/values-ko/strings.xml b/gpslogger/src/main/res/values-ko/strings.xml index abe8d3858..f41ad7dfa 100644 --- a/gpslogger/src/main/res/values-ko/strings.xml +++ b/gpslogger/src/main/res/values-ko/strings.xml @@ -177,7 +177,7 @@ 전송되었습니다. Google 드라이브의 새로운 문서목록을 확인해 보세요. 콤마는 이메일 주소를 구분합니다 자동 전송 허용 - 다중 서버에 파일 전송하기 + 정의된 주파수에서 다양한 대상에 파일을 전송할 수 있습니다. 또는 사용자 정의 naming로 인해 이름이 변경되는 경우 로그 파일 전송 빈도를 분단위로 설정하세요. 0은 이 기능을 비활성화합니다. 얼마나 자주 합니까? ZIP 파일로 전송하기 @@ -323,4 +323,52 @@  km/h  킬로미터 속도 (in km/h): - \ No newline at end of file + 한 폴더 이름을 만든 경우 작성 후 Google 드라이브의 다른 곳에서 만들 수 있습니다. 폴더 경로가 느려지고 파일을 업로드하기 전에 경로의 지구 부분을 확인해야합니다. + GPSLogger에서 사용자 정의 경로를 사용하려면 GPSLogger가 다음 화면의 모든 파일을 관리 할 수 있도록 허용하십시오. 작업을 다시 시도하십시오. Android 11+ 제한으로 인해 필요합니다. + 첫 번째 정확한 포인트를 로깅하는 대신 정확도 기간 동안 시도하고 최고의 정확도로 포인트를 선택하십시오. 더 이상 가지고 있지만 더 정확한 포인트에 대한 기회를 증가합니다. + 사용 0 최대 주파수에 대 한, 하지만 느린 배터리 수명에 대 한 더 나은. 시스템 레벨 배터리 구성은이 설정을 무시할 수 있으며 도움말 및 FAQ를 참조하십시오. + 이 앱을 재설정하고, 모든 설정을 삭제하고, GPSLogger 파일을 삭제하고,이 앱에 부여 된 권한을 수정합니다. 모든 데이터가 손실됩니다! + 단일 폴더 이름 (예: GPSLogger), 또는 폴더 경로 (예: aaa/bbb/ccc)을 사용하십시오. 폴더는 이 응용 프로그램에 의해 생성해야합니다. + 산책로, 자전거 타기, 운전과 같은 기온이 활성화 된 경우에만 로그 오프합니다. 중요한 모션은 귀하의 OS에 의해 결정됩니다. + Allow all the time - 이 응용 프로그램은 배경에서 실행할 때 위치 업데이트를받을 수 있습니다. ]]> + LocalPoint가 캡처 될 때마다 고객 URL을 요청하십시오. 로깅 간격에 따라 다릅니다. + 성과하기 전에 WiFi 컨퍼런스를 기다리십시오. + Ignore 배터리 최적화 - 배터리 최적화를 줄이기 위해 배경에서 실행할 수 있도록이 응용 프로그램을 허용한다. ]]> + 네트워크 연결 네트워크에서 사용할 수있는 동안 사용자 정의 urly로 로그 위치 (보류에 영향을주지 않음) 서명) + <![CDATA[<b>Notifications</b> - 알림을 표시할 수 있도록, 이것은 로깅 서비스를 살아있게 유지하는 데 도움이됩니다. ]> + 최소 수집 간격을 조정하여 중복 수동 위치 업데이트 감소 (초). + Wheers는 UTC 대신 팀존 오프셋으로 ISO8601 시간을 게시했습니다. + 점 (대상) 대신 십진수 분리기로 쉼표 ()를 사용하십시오. + + (기능을 사용하면 CSV 로깅을 사용) CUST 파일의 대기열에 요청을 요청합니다. CSV 파일의 얼당선을위한 것입니다. 자동 전송 간격에 따라 다릅니다. + Oneinter Android 기기에서 Scls TCS 연결 문제를 해결하는 경우 Conscrypt Provider를 설치하는 데 도움이 될 수 있습니다. (생각하기 링크, APK 설치, 센터 다시 시작 앱) + + 라이트 오르 아트 앱을 설정하는 방법을 더 많이 받아 들여라 + 그다지 모바일 경우에만 로그 오프 + 여러 파일을 선택하기 위해 긴 압박. + 로깅이 시작될 때 자세한 내용은 프롬프트 + Timezone 오프셋으로 시간을 이동 + 내구에서 제일 정확도를 선택하십시오 + 잠금 화면에서 알림 숨기기 + CSV 설정에 로그인 + Google 드라이브 폴더 경 + CRINDENTSPREW 프로젝터 설치 (SSL / TLS) + 수동 임대 업데이트 간격 + CSV 필드 delimiter + 1개월 후 + 시간 상쇄 (2011-12-25T11:27:33+04:00): + 빈 폴더 이름 + 속성 파일 URL + 선택된 파일 삭제 + Discard 오프라인 위치 + 수정 버튼 + 커스텀 URL + 날짜 (2011-12-25): + 내부 저장 + 스토리지 + 새로운 폴더 + 서류철 이름 + URL에서 + 앱 재설정 + 앱 테마 + From ed070354cc611f5bfc26e184f843ebcb61a3981c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Sun, 15 Mar 2026 04:39:45 +0100 Subject: [PATCH 31/50] Translated using Weblate (Tamil) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/ta/ --- gpslogger/src/main/res/values-ta/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gpslogger/src/main/res/values-ta/strings.xml b/gpslogger/src/main/res/values-ta/strings.xml index e3b2879ff..7767cfbbf 100644 --- a/gpslogger/src/main/res/values-ta/strings.xml +++ b/gpslogger/src/main/res/values-ta/strings.xml @@ -135,7 +135,7 @@ பதிவேற்றப்பட்டது. தயவுசெய்து புதியக் கோப்புக்காக உங்கள் Google Docs ஐ சரிபாருங்கள். தானாக அனுப்புவதை அனுமதி அடிக்கடி எவ்வளவு? - ZIP கோப்பை அனுப்பு + zip கோப்பை அனுப்பு இப்பொழுது தானாக அனுப்பு தானாக அனுப்புகிறது தானாக அனுப்பு: @@ -279,8 +279,8 @@ உயர ஆஃப்செட் கழிக்கவும் %s m மட்டுமே பயணம் செய்தது. புள்ளி நிராகரிக்கப்பட்டது. ஆட்டோ ச்க்ரோல் - புகைப்படங்கள், மீடியா, கோப்புகள் - இந்த இசைவு பதிவு கோப்புகள் மற்றும் சோதனை கோப்புகளை சேமிப்பிற்கு எழுத அனுமதிக்கிறது, மேலும் பதிவேற்றம் அல்லது பகிர்வுக்கான கோப்புகளின் பட்டியலிலிருந்து படிக்க அனுமதிக்கிறது. இந்த பயன்பாடு உங்கள் புகைப்படங்கள் அல்லது ஊடகத்தை அணுகாது.]]> - பேட்டரி உகப்பாக்கத்தை புறக்கணிக்கவும் - பேட்டரி உகப்பாக்கத்தைக் குறைப்பதன் மூலம் இந்த பயன்பாட்டை பின்னணியில் இயக்க அனுமதிக்கவும். ]]> + புகைப்படங்கள், மீடியா, கோப்புகள் - இந்த இசைவு பதிவுக் கோப்புகள் மற்றும் சோதனை கோப்புகளைச் சேமிப்பிற்கு எழுத அனுமதிக்கிறது, மேலும் பதிவேற்றம் அல்லது பகிர்வுக்கான கோப்புகளின் பட்டியலிலிருந்து படிக்க அனுமதிக்கிறது. இந்தப் பயன்பாடு உங்கள் புகைப்படங்கள் அல்லது ஊடகத்தை அணுகாது.]]> + பேட்டரி உகப்பாக்கத்தை புறக்கணி - பேட்டரி உகப்பாக்கத்தைக் குறைப்பதன் மூலம் இந்தப் பயன்பாட்டைப் பின்னணியில் இயக்க அனுமதிக்கவும். ]]> Sftp தனியார் விசை கடவுச்சொல் அமைப்பைப் பின்தொடரவும் @@ -331,8 +331,8 @@ முகவரி இலிருந்து பண்புகள் கோப்பு முகவரி - சாதன இருப்பிடம் - இந்த இசைவு செல் கோபுரங்கள் மற்றும் சாதன சி.பி.எச் வன்பொருளிலிருந்து இருப்பிட தரவைப் படிக்க அனுமதிக்கிறது.]]> - எல்லா நேரத்தையும் அனுமதிக்கவும் - பின்னணியில் இயங்கும் போது இருப்பிட புதுப்பிப்புகளைப் பெற இந்த பயன்பாட்டை அனுமதிக்கவும். ]]> + சாதன இருப்பிடம் - இந்த இசைவு செல் கோபுரங்கள் மற்றும் சாதன சி.பி.எச் வன்பொருளிலிருந்து இருப்பிட தரவைப் படிக்க அனுமதிக்கிறது.]]> + எல்லா நேரத்தையும் அனுமதிக்கவும் - பின்னணியில் இயங்கும்போது இருப்பிட புதுப்பிப்புகளைப் பெற இந்தப் பயன்பாட்டை அனுமதிக்கவும். ]]> பொத்தான் நிறம் லோன் முதல் துல்லியமான புள்ளியை பதிவு செய்வதற்கு பதிலாக, துல்லிய காலத்திற்கு முயற்சி செய்து, சிறந்த துல்லியத்துடன் புள்ளியைத் தேர்ந்தெடுக்கவும். அதிக நேரம் எடுக்கும், ஆனால் இன்னும் துல்லியமான புள்ளிகளுக்கான வாய்ப்புகளை அதிகரிக்கிறது. @@ -366,7 +366,7 @@ சி.பி.எச் பிழைத்திருத்தத்திற்கு முழுமையான நேரம் மற்ற அமைப்புகளைப் பொருட்படுத்தாமல், ஒரு பிழைத்திருத்தத்தைப் பெற முயற்சிப்பதை பயன்பாடு விட்டுக்கொடுக்கும் வினாடிகளின் எண்ணிக்கை. சி.பி.எச் பேட்டரியை வடிகட்டுவதைத் தடுக்க நீங்கள் கட்டிடங்களுக்குள் இருக்கும்போது இது மிகவும் பயனுள்ளதாக இருக்கும். காலக்கெடு எதுவும் இல்லை. லாட் -
நீங்கள் நிரந்தரமாக அனுமதிகளை மறுத்திருந்தால் அவற்றை கணினி அமைப்புகளில் மீட்டமைக்கலாம். ]]>
+
நீங்கள் நிரந்தரமாக அனுமதிகளை மறுத்திருந்தால் அவற்றைக் கணினி அமைப்புகளில் மீட்டமைக்கலாம். ]]>
பிழைத்திருத்த பதிவை மின்னஞ்சலுடன் இணைக்கவும் சில கண்டறியும் தகவல்களுடன் ஒரு மின்னஞ்சலுடன் பிழைத்திருத்த பதிவை இணைக்கிறது @@ -388,7 +388,7 @@ தொடங்கியது பூட்டுத் திரையில் இருந்து அறிவிப்பை மறைக்கவும் உள்நுழைவு தொடங்கும் போது விவரங்களுக்கு வரியில் - அறிவிப்புகள் - அறிவிப்பைக் காட்ட அனுமதிக்கவும், இது பதிவு சேவையை உயிரோடு வைத்திருக்க உதவுகிறது. ]]> + அறிவிப்புகள் - அறிவிப்பைக் காட்ட அனுமதிக்கவும், இது பதிவுச் சேவையை உயிரோடு வைத்திருக்க உதவுகிறது. ]]> %SER சாதன சீரியல், %YEAR, %MONTH, %MONTHNAME, %DAY, %DAYNAME, %HOUR, %MIN, %PROFILE, %VER பதிப்பிற்காக செயலற்ற இடங்கள் புதுப்பித்தல் இடைவெளி குறைந்தபட்ச சேகரிப்பு இடைவெளியை (நொடிகளில்) சரிசெய்வதன் மூலம் தேவையற்ற செயலற்ற இருப்பிட புதுப்பிப்புகளைக் குறைக்கவும். From ab9ba0a904b18fe33129d999c8a87e44a5b7503f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Sun, 15 Mar 2026 08:34:30 +0100 Subject: [PATCH 32/50] Translated using Weblate (Tamil) Currently translated at 100.0% (390 of 390 strings) Translation: GPSLogger/Android Translate-URL: https://hosted.weblate.org/projects/gpslogger/android/ta/ --- gpslogger/src/main/res/values-ta/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gpslogger/src/main/res/values-ta/strings.xml b/gpslogger/src/main/res/values-ta/strings.xml index 7767cfbbf..f33e768a5 100644 --- a/gpslogger/src/main/res/values-ta/strings.xml +++ b/gpslogger/src/main/res/values-ta/strings.xml @@ -389,7 +389,7 @@ பூட்டுத் திரையில் இருந்து அறிவிப்பை மறைக்கவும் உள்நுழைவு தொடங்கும் போது விவரங்களுக்கு வரியில் அறிவிப்புகள் - அறிவிப்பைக் காட்ட அனுமதிக்கவும், இது பதிவுச் சேவையை உயிரோடு வைத்திருக்க உதவுகிறது. ]]> - %SER சாதன சீரியல், %YEAR, %MONTH, %MONTHNAME, %DAY, %DAYNAME, %HOUR, %MIN, %PROFILE, %VER பதிப்பிற்காக + சாதன சீரியல் %SER, %YEAR, %MONTH, %MONTHNAME, %DAY, %DAYNAME, %HOUR, %MIN, %PROFILE, பதிப்பிற்காகப் %VER பயன்படுத்தலாம் செயலற்ற இடங்கள் புதுப்பித்தல் இடைவெளி குறைந்தபட்ச சேகரிப்பு இடைவெளியை (நொடிகளில்) சரிசெய்வதன் மூலம் தேவையற்ற செயலற்ற இருப்பிட புதுப்பிப்புகளைக் குறைக்கவும். எந்தவொரு பிணையக் கோரிக்கைகளையும் செய்வதற்கு முன் வைஃபை இணைப்புக்காகக் காத்திருங்கள். அனுப்புதல் மற்றும் உள்நுழைவு உள்ளிட்ட அனைத்து கோரிக்கைகளுக்கும் பொருந்தும். From b2ae8de915933ff241c90d7d99c39e5046e72a36 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Thu, 19 Mar 2026 22:50:51 +0000 Subject: [PATCH 33/50] Add UI and strings for significant motion bypass interval --- gpslogger/src/main/res/values/strings.xml | 12 ++-- .../src/main/res/xml/pref_performance.xml | 63 ++++++++++++------- 2 files changed, 48 insertions(+), 27 deletions(-) diff --git a/gpslogger/src/main/res/values/strings.xml b/gpslogger/src/main/res/values/strings.xml index 115489757..8bea98cb2 100644 --- a/gpslogger/src/main/res/values/strings.xml +++ b/gpslogger/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - + Upload settings @@ -6,7 +6,6 @@ Close navigation drawer - GPSLogger GPSLogger Settings OK @@ -189,7 +188,6 @@ When I press stop - Email Settings Username with your email provider Password with your email provider @@ -209,7 +207,6 @@ Stopped - OpenStreetMap Authorize this app @@ -262,7 +259,7 @@ ownCloud Base URL Folder to use on ownCloud server. Ensure that it exists or upload will fail. Upload a test file to the ownCloud server - + Testing ownCloud upload Upload @@ -432,7 +429,7 @@ Use MSL instead of WGS84 Subtract altitude offset A value in meters to subtract from GPS altitudes. Use a negative number to add a value to the altitude. Only applies to GPS satellite points, not network or NMEA. - Could not upload the file + Could not upload the file Inaccurate point discarded Only %s m traveled. Point discarded. Send on Wi-Fi only @@ -502,5 +499,8 @@ Prompt for details when logging starts Only log if there is significant motion Only log if significant activity is detected such as walking, biking, driving. Significant motion is determined by your OS. + Extended no motion heartbeat interval + During extended periods of no significant motion, ocassionally bypass the check and take a heartbeat log anyway as determined by this interval. A value less than 1 minute disables the interval. + Time in minutes diff --git a/gpslogger/src/main/res/xml/pref_performance.xml b/gpslogger/src/main/res/xml/pref_performance.xml index c8ce30a15..53b22eb61 100644 --- a/gpslogger/src/main/res/xml/pref_performance.xml +++ b/gpslogger/src/main/res/xml/pref_performance.xml @@ -1,21 +1,25 @@ - - + + android:title="@string/pref_performance_title" +> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + - + app:iconSpaceReserved="false" + /> + + - + + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> From ef4ab695dc9e8d6fddb6b653849f70c4806e8baa Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Thu, 19 Mar 2026 22:51:16 +0000 Subject: [PATCH 34/50] Add significant motion bypass interval to preferences logic --- .../gpslogger/common/PreferenceHelper.java | 16 +++++++++++++++- .../gpslogger/common/PreferenceNames.java | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java index 69c4bca4e..05d50ef14 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java @@ -447,7 +447,7 @@ public int getAbsoluteTimeoutForAcquiringPosition() { public void setAbsoluteTimeoutForAcquiringPosition(int absoluteTimeout) { prefs.edit().putString(PreferenceNames.ABSOLUTE_TIMEOUT, String.valueOf(absoluteTimeout)).apply(); } - + /** * Reduce redundant passive location updates by adjusting the minimum collection interval (in seconds). */ @@ -1246,6 +1246,20 @@ public void setShouldLogOnlyIfSignificantMotion(boolean value){ prefs.edit().putBoolean(PreferenceNames.ONLY_LOG_IF_SIGNIFICANT_MOTION, value).apply(); } + @ProfilePreference(name= PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL) + public int getSignificantMotionBypassInterval() { + try{ + return Integer.parseInt(prefs.getString(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL, "0")); + } + catch(Exception e){ + return 0; + } + } + + public void setSignificantMotionBypassInterval(int value){ + prefs.edit().putString(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL, String.valueOf(value)).apply(); + } + @SuppressWarnings("unchecked") public void savePropertiesFromPreferences(File f) throws IOException { diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java index f955ea069..0cd61fbda 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java @@ -148,5 +148,6 @@ public static enum DegreesDisplayFormat { public static final String ANNOTATIONS_BUTTON_SETTINGS = "annotations_buttons"; public static final String ONLY_LOG_IF_SIGNIFICANT_MOTION = "only_log_if_significant_motion"; + public static final String SIGNIFICANT_MOTION_BYPASS_INTERVAL = "significant_motion_bypass_interval"; } From 3369c58cfeb33d57d3f4336d5c87ee25e9109213 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Thu, 19 Mar 2026 22:51:20 +0000 Subject: [PATCH 35/50] Implement settings fragment for significant motion bypass interval --- .../settings/PerformanceSettingsFragment.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java index edc85deab..0353438a0 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java @@ -61,13 +61,16 @@ public void onCreate(Bundle savedInstanceState) { findPreference(PreferenceNames.ABSOLUTE_TIMEOUT).setOnPreferenceClickListener(this); findPreference(PreferenceNames.ABSOLUTE_TIMEOUT).setSummary(String.valueOf(preferenceHelper.getAbsoluteTimeoutForAcquiringPosition()) + getString(R.string.seconds)); - + findPreference(PreferenceNames.PASSIVE_FILTER_INTERVAL).setOnPreferenceClickListener(this); findPreference(PreferenceNames.PASSIVE_FILTER_INTERVAL).setSummary(String.valueOf(preferenceHelper.getPassiveFilterInterval()) + getString(R.string.seconds)); findPreference(PreferenceNames.ALTITUDE_SUBTRACT_OFFSET).setOnPreferenceClickListener(this); findPreference(PreferenceNames.ALTITUDE_SUBTRACT_OFFSET).setSummary(String.valueOf(preferenceHelper.getSubtractAltitudeOffset()) + getString(R.string.meters)); + findPreference(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL).setOnPreferenceClickListener(this); + findPreference(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL).setSummary(String.valueOf(preferenceHelper.getSignificantMotionBypassInterval()) + " " + getString(R.string.minutes)); + SensorManager sensorManager = (SensorManager)AppSettings.getInstance().getSystemService(android.content.Context.SENSOR_SERVICE); Sensor significantMotionSensor = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); SwitchPreferenceCompat significantMotionSwitch = findPreference(PreferenceNames.ONLY_LOG_IF_SIGNIFICANT_MOTION); @@ -198,6 +201,21 @@ public boolean onPreferenceClick(Preference preference) { return true; } + if(preference.getKey().equalsIgnoreCase(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL)){ + SimpleFormDialog.build() + .title(R.string.time_in_minutes_dialog_title) + .msg(R.string.significant_motion_bypass_interval_summary) + .fields( + Input.plain(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL) + .inputType(InputType.TYPE_CLASS_NUMBER) + .required() + .text(String.valueOf(preferenceHelper.getSignificantMotionBypassInterval())) + .max(4) + ) + .show(this, PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL); + return true; + } + return false; } @@ -255,6 +273,13 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex return true; } + if(dialogTag.equalsIgnoreCase(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL)){ + String time = extras.getString(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL); + preferenceHelper.setSignificantMotionBypassInterval(Integer.valueOf(time)); + findPreference(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL).setSummary(String.valueOf(preferenceHelper.getSignificantMotionBypassInterval()) + " " + getString(R.string.minutes)); + return true; + } + return false; } } From 712022cf0962fd80078d7c64278a00a39999a893 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Thu, 19 Mar 2026 22:51:27 +0000 Subject: [PATCH 36/50] Add logic to occasionally bypass significant motion check --- .../com/mendhak/gpslogger/GpsLoggingService.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java index df98e6ac5..114ede136 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java @@ -289,7 +289,7 @@ private void handleIntent(Intent intent) { preferenceHelper.setPassiveFilterInterval(passiveFilterInterval); needToStartGpsManager = true; } - + if(bundle.get(IntentConstants.LOG_ONCE) != null){ boolean logOnceIntent = bundle.getBoolean(IntentConstants.LOG_ONCE); LOG.debug("Intent received - Log Once: " + String.valueOf(logOnceIntent)); @@ -806,8 +806,18 @@ private boolean userHasBeenStillForTooLong() { if(!preferenceHelper.shouldLogOnlyIfSignificantMotion()){ return false; } - return !session.hasDescription() && !session.isSinglePointMode() && + + boolean hasBeenStill = !session.hasDescription() && !session.isSinglePointMode() && (session.getUserStillSinceTimeStamp() > 0 && (System.currentTimeMillis() - session.getUserStillSinceTimeStamp()) > (preferenceHelper.getMinimumLoggingInterval() * 1000)); + + if (hasBeenStill && preferenceHelper.getSignificantMotionBypassInterval() >= 1) { + long bypassIntervalInMillis = preferenceHelper.getSignificantMotionBypassInterval() * 60 * 1000L; + if (System.currentTimeMillis() - session.getLatestTimeStamp() >= bypassIntervalInMillis) { + return false; + } + } + + return hasBeenStill; } private void startAbsoluteTimer() { From 340f36c21895fc8e7d16a6bd174c8a908c6e0241 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Thu, 19 Mar 2026 23:04:57 +0000 Subject: [PATCH 37/50] Fix formatting --- .../src/main/res/xml/pref_performance.xml | 55 +++++++------------ 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/gpslogger/src/main/res/xml/pref_performance.xml b/gpslogger/src/main/res/xml/pref_performance.xml index 53b22eb61..3c8d56ce6 100644 --- a/gpslogger/src/main/res/xml/pref_performance.xml +++ b/gpslogger/src/main/res/xml/pref_performance.xml @@ -1,25 +1,21 @@ - + android:title="@string/pref_performance_title"> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> - + + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> From 9523afe592ccf1b8b2fcf231f3e47df81d2fd240 Mon Sep 17 00:00:00 2001 From: mendhak Date: Wed, 1 Apr 2026 06:46:18 +0100 Subject: [PATCH 38/50] Logging that the bypass interval has passed in debug level --- .../src/main/java/com/mendhak/gpslogger/GpsLoggingService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java index 114ede136..8b7a228c2 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java @@ -813,6 +813,7 @@ private boolean userHasBeenStillForTooLong() { if (hasBeenStill && preferenceHelper.getSignificantMotionBypassInterval() >= 1) { long bypassIntervalInMillis = preferenceHelper.getSignificantMotionBypassInterval() * 60 * 1000L; if (System.currentTimeMillis() - session.getLatestTimeStamp() >= bypassIntervalInMillis) { + LOG.debug("Significant motion bypass interval passed, so let's allow a point to be logged."); return false; } } From c43242d47462dba89e2b66d4ae6a48b668229c2e Mon Sep 17 00:00:00 2001 From: mendhak Date: Wed, 1 Apr 2026 07:01:30 +0100 Subject: [PATCH 39/50] Disable the bypass preference if the significant motion sensor doesn't exist --- .../ui/fragments/settings/PerformanceSettingsFragment.java | 3 +-- gpslogger/src/main/res/xml/pref_performance.xml | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java index 0353438a0..6c1a74dd9 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/PerformanceSettingsFragment.java @@ -77,9 +77,8 @@ public void onCreate(Bundle savedInstanceState) { if(significantMotionSensor == null && significantMotionSwitch != null){ significantMotionSwitch.setChecked(false); significantMotionSwitch.setEnabled(false); + findPreference(PreferenceNames.SIGNIFICANT_MOTION_BYPASS_INTERVAL).setEnabled(false); } - - } @Override diff --git a/gpslogger/src/main/res/xml/pref_performance.xml b/gpslogger/src/main/res/xml/pref_performance.xml index 3c8d56ce6..60c8cd6b6 100644 --- a/gpslogger/src/main/res/xml/pref_performance.xml +++ b/gpslogger/src/main/res/xml/pref_performance.xml @@ -111,6 +111,7 @@ app:iconSpaceReserved="false" /> Date: Wed, 1 Apr 2026 19:37:19 +0100 Subject: [PATCH 40/50] Rename HTTP Upload to HTTP File Upload --- .../mendhak/gpslogger/GpsMainActivity.java | 18 +++--- .../gpslogger/MainPreferenceActivity.java | 6 +- .../gpslogger/common/PreferenceHelper.java | 28 ++++----- .../gpslogger/common/events/UploadEvents.java | 2 +- .../gpslogger/senders/FileSenderFactory.java | 14 ++--- ...anager.java => HttpFileUploadManager.java} | 24 +++---- ...dWorker.java => HttpFileUploadWorker.java} | 42 ++++++------- ...va => HttpFileUploadSettingsFragment.java} | 62 +++++++++---------- gpslogger/src/main/res/menu/gps_main.xml | 2 +- gpslogger/src/main/res/values/strings.xml | 13 ++-- .../src/main/res/xml/httpuploadsettings.xml | 31 ++++++---- gpslogger/src/main/res/xml/pref_upload.xml | 58 +++++++++++------ ...st.java => HttpFileUploadManagerTest.java} | 34 +++++----- 13 files changed, 179 insertions(+), 155 deletions(-) rename gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/{HttpUploadManager.java => HttpFileUploadManager.java} (65%) rename gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/{HttpUploadWorker.java => HttpFileUploadWorker.java} (75%) rename gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/{HttpUploadSettingsFragment.java => HttpFileUploadSettingsFragment.java} (83%) rename gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/{HttpUploadManagerTest.java => HttpFileUploadManagerTest.java} (54%) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java index 25b49221a..8249be121 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java @@ -846,7 +846,7 @@ public boolean onProfileLongClick(View view, final IProfile iProfile, boolean b) materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.pref_autosend_title, R.string.pref_autosend_summary, R.drawable.autosend, 1003)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.log_customurl_setup_title, null, R.drawable.customurlsender, 1020)); - materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.http_upload_setup_title, null, R.drawable.customurlsender, 1021)); + materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.http_file_upload_setup_title, null, R.drawable.customurlsender, 1021)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.dropbox_setup_title, null, R.drawable.dropbox, 1005)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.google_drive_setup_title, null, R.drawable.googledrive, 1011)); materialDrawer.addItem(GpsLoggerDrawerItem.newPrimary(R.string.sftp_setup_title, null, R.drawable.sftp, 1015)); @@ -1245,8 +1245,8 @@ public boolean onMenuItemClick(MenuItem item) { case R.id.mnuCustomUrl: uploadToCustomURL(); return true; - case R.id.mnuHttpUpload: - uploadToHttpUpload(); + case R.id.mnuHttpFileUpload: + uploadToHttpFileUpload(); return true; default: return true; @@ -1329,13 +1329,13 @@ private void uploadToCustomURL(){ showFileListDialog(FileSenderFactory.getCustomUrlSender()); } - private void uploadToHttpUpload(){ - if(!FileSenderFactory.getHttpUploadSender().isAvailable()){ + private void uploadToHttpFileUpload(){ + if(!FileSenderFactory.getHttpFileUploadSender().isAvailable()){ launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); return; } - showFileListDialog(FileSenderFactory.getHttpUploadSender()); + showFileListDialog(FileSenderFactory.getHttpFileUploadSender()); } private void uploadToSFTP(){ @@ -1628,12 +1628,12 @@ public void onEventMainThread(UploadEvents.CustomUrl upload){ } @EventBusHook - public void onEventMainThread(UploadEvents.HttpUpload upload){ - LOG.debug("HTTP Upload Event completed, success: " + upload.success); + public void onEventMainThread(UploadEvents.HttpFileUpload upload){ + LOG.debug("HTTP File Upload Event completed, success: " + upload.success); Dialogs.hideProgress(); if(!upload.success){ - LOG.error(getString(R.string.http_upload_setup_title) + LOG.error(getString(R.string.http_file_upload_setup_title) + "-" + getString(R.string.upload_failure)); diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java index a61588149..7da8d7f2b 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java @@ -142,8 +142,8 @@ protected void onCreate(Bundle savedInstanceState) { preferenceFragmentCompat = new SFTPSettingsFragment(); break; case PREFERENCE_FRAGMENTS.HTTPUPLOAD: - setTitle(R.string.http_upload_setup_title); - preferenceFragmentCompat = new HttpUploadSettingsFragment(); + setTitle(R.string.http_file_upload_setup_title); + preferenceFragmentCompat = new HttpFileUploadSettingsFragment(); break; } @@ -194,7 +194,7 @@ public static class PREFERENCE_FRAGMENTS { public static final String OWNCLOUD = "OwnCloudAuthorizationFragment"; public static final String OSM = "OSMAuthorizationFragment"; public static final String SFTP = "SFTPSettingsFragment"; - public static final String HTTPUPLOAD = "HttpUploadSettingsFragment"; + public static final String HTTPUPLOAD = "HttpFileUploadSettingsFragment"; } } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java index 928672065..c04a816ed 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java @@ -447,7 +447,7 @@ public int getAbsoluteTimeoutForAcquiringPosition() { public void setAbsoluteTimeoutForAcquiringPosition(int absoluteTimeout) { prefs.edit().putString(PreferenceNames.ABSOLUTE_TIMEOUT, String.valueOf(absoluteTimeout)).apply(); } - + /** * Reduce redundant passive location updates by adjusting the minimum collection interval (in seconds). */ @@ -721,61 +721,61 @@ public boolean shouldLogToOpenGTS() { @ProfilePreference(name=PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED) - public boolean isHttpUploadAutoSendEnabled() { + public boolean isHttpFileUploadAutoSendEnabled() { return prefs.getBoolean(PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED, false); } @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_URL) - public String getHttpUploadUrl() { + public String getHttpFileUploadUrl() { return prefs.getString(PreferenceNames.HTTPUPLOAD_URL, ""); } - public void setHttpUploadUrl(String url) { + public void setHttpFileUploadUrl(String url) { prefs.edit().putString(PreferenceNames.HTTPUPLOAD_URL, url).apply(); } @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_METHOD) - public String getHttpUploadMethod() { + public String getHttpFileUploadMethod() { return prefs.getString(PreferenceNames.HTTPUPLOAD_METHOD, "POST"); } - public void setHttpUploadMethod(String method) { + public void setHttpFileUploadMethod(String method) { prefs.edit().putString(PreferenceNames.HTTPUPLOAD_METHOD, method).apply(); } @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_HEADERS) - public String getHttpUploadHeaders() { + public String getHttpFileUploadHeaders() { return prefs.getString(PreferenceNames.HTTPUPLOAD_HEADERS, ""); } - public void setHttpUploadHeaders(String headers) { + public void setHttpFileUploadHeaders(String headers) { prefs.edit().putString(PreferenceNames.HTTPUPLOAD_HEADERS, headers).apply(); } @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME) - public String getHttpUploadUsername() { + public String getHttpFileUploadUsername() { return prefs.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME, ""); } - public void setHttpUploadUsername(String username) { + public void setHttpFileUploadUsername(String username) { prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME, username).apply(); } @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD) - public String getHttpUploadPassword() { + public String getHttpFileUploadPassword() { return prefs.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD, ""); } - public void setHttpUploadPassword(String password) { + public void setHttpFileUploadPassword(String password) { prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD, password).apply(); } @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BODY_TYPE) - public String getHttpUploadBodyType() { + public String getHttpFileUploadBodyType() { return prefs.getString(PreferenceNames.HTTPUPLOAD_BODY_TYPE, "form-data"); } - public void setHttpUploadBodyType(String bodyType) { + public void setHttpFileUploadBodyType(String bodyType) { prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BODY_TYPE, bodyType).apply(); } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java index a7bedb203..138214baf 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/events/UploadEvents.java @@ -106,5 +106,5 @@ public static class SFTP extends BaseUploadEvent { public String hostKey; } - public static class HttpUpload extends BaseUploadEvent {} + public static class HttpFileUpload extends BaseUploadEvent {} } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java index 955bcc35d..4ac103ed2 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java @@ -27,7 +27,7 @@ import com.mendhak.gpslogger.senders.email.AutoEmailManager; import com.mendhak.gpslogger.senders.ftp.FtpManager; import com.mendhak.gpslogger.senders.googledrive.GoogleDriveManager; -import com.mendhak.gpslogger.senders.http.HttpUploadManager; +import com.mendhak.gpslogger.senders.http.HttpFileUploadManager; import com.mendhak.gpslogger.senders.opengts.OpenGTSManager; import com.mendhak.gpslogger.senders.osm.OpenStreetMapManager; import com.mendhak.gpslogger.senders.owncloud.OwnCloudManager; @@ -81,8 +81,8 @@ public static FileSender getCustomUrlSender(){ return new CustomUrlManager(PreferenceHelper.getInstance()); } - public static FileSender getHttpUploadSender() { - return new HttpUploadManager(PreferenceHelper.getInstance()); + public static FileSender getHttpFileUploadSender() { + return new HttpFileUploadManager(PreferenceHelper.getInstance()); } public static void autoSendFiles(final String fileToSend) { @@ -170,7 +170,7 @@ public static FileSender getSenderByName(String senderName) { case FileSender.SenderNames.CUSTOMURL: return getCustomUrlSender(); case FileSender.SenderNames.HTTPUPLOAD: - return getHttpUploadSender(); + return getHttpFileUploadSender(); default: return null; @@ -188,7 +188,7 @@ private static List getAllFileSenders(){ senders.add(getOwnCloudSender()); senders.add(getSFTPSender()); senders.add(getCustomUrlSender()); - senders.add(getHttpUploadSender()); + senders.add(getHttpFileUploadSender()); return senders; } @@ -232,8 +232,8 @@ private static List getAvailableFileAutoSenders() { senders.add(getCustomUrlSender()); } - if(getHttpUploadSender().isAutoSendAvailable()){ - senders.add(getHttpUploadSender()); + if(getHttpFileUploadSender().isAutoSendAvailable()){ + senders.add(getHttpFileUploadSender()); } return senders; diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java similarity index 65% rename from gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java rename to gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java index 0302edf10..b00f25dc5 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadManager.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java @@ -16,16 +16,16 @@ import java.util.List; import java.util.Objects; -public class HttpUploadManager extends FileSender { +public class HttpFileUploadManager extends FileSender { - private static final Logger LOG = Logs.of(HttpUploadManager.class); + private static final Logger LOG = Logs.of(HttpFileUploadManager.class); private final PreferenceHelper preferenceHelper; - public HttpUploadManager(PreferenceHelper preferenceHelper) { + public HttpFileUploadManager(PreferenceHelper preferenceHelper) { this.preferenceHelper = preferenceHelper; } - public void testHttpUpload() { + public void testHttpFileUpload() { try { final File testFile = Files.createTestFile(); @@ -33,14 +33,14 @@ public void testHttpUpload() { HashMap dataMap = new HashMap() {{ put("filePath", testFile.getAbsolutePath()); }}; - Systems.startWorkManagerRequest(HttpUploadWorker.class, dataMap, tag); + Systems.startWorkManagerRequest(HttpFileUploadWorker.class, dataMap, tag); } catch (Exception ex) { - EventBus.getDefault().post(new UploadEvents.HttpUpload().failed()); - LOG.error("Error while testing HTTP upload: " + ex.getMessage()); + EventBus.getDefault().post(new UploadEvents.HttpFileUpload().failed()); + LOG.error("Error while testing HTTP File Upload: " + ex.getMessage()); } - LOG.debug("Added background HTTP upload job"); + LOG.debug("Added background HTTP File Upload job"); } @Override @@ -50,19 +50,19 @@ public void uploadFile(List files) { HashMap dataMap = new HashMap<>(); dataMap.put("filePath", f.getAbsolutePath()); - Systems.startWorkManagerRequest(HttpUploadWorker.class, dataMap, tag); + Systems.startWorkManagerRequest(HttpFileUploadWorker.class, dataMap, tag); } } @Override public boolean isAvailable() { - return !Strings.isNullOrEmpty(preferenceHelper.getHttpUploadUrl()) && - !Strings.isNullOrEmpty(preferenceHelper.getHttpUploadMethod()); + return !Strings.isNullOrEmpty(preferenceHelper.getHttpFileUploadUrl()) && + !Strings.isNullOrEmpty(preferenceHelper.getHttpFileUploadMethod()); } @Override public boolean hasUserAllowedAutoSending() { - return preferenceHelper.isHttpUploadAutoSendEnabled(); + return preferenceHelper.isHttpFileUploadAutoSendEnabled(); } @Override diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java similarity index 75% rename from gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java rename to gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java index 1a0d23716..f0d8affe8 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpUploadWorker.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java @@ -31,11 +31,11 @@ import okhttp3.RequestBody; import okhttp3.Response; -public class HttpUploadWorker extends Worker { +public class HttpFileUploadWorker extends Worker { - private static final Logger LOG = Logs.of(HttpUploadWorker.class); + private static final Logger LOG = Logs.of(HttpFileUploadWorker.class); - public HttpUploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + public HttpFileUploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @@ -44,22 +44,22 @@ public HttpUploadWorker(@NonNull Context context, @NonNull WorkerParameters work public Result doWork() { String filePath = getInputData().getString("filePath"); if (Strings.isNullOrEmpty(filePath)) { - LOG.error("No file path provided to HttpUploadWorker"); + LOG.error("No file path provided to HttpFileUploadWorker"); return Result.failure(); } File fileToUpload = new File(filePath); PreferenceHelper preferenceHelper = PreferenceHelper.getInstance(); - String url = preferenceHelper.getHttpUploadUrl(); - String method = preferenceHelper.getHttpUploadMethod(); - String headersString = preferenceHelper.getHttpUploadHeaders(); - String username = preferenceHelper.getHttpUploadUsername(); - String password = preferenceHelper.getHttpUploadPassword(); - String bodyType = preferenceHelper.getHttpUploadBodyType(); + String url = preferenceHelper.getHttpFileUploadUrl(); + String method = preferenceHelper.getHttpFileUploadMethod(); + String headersString = preferenceHelper.getHttpFileUploadHeaders(); + String username = preferenceHelper.getHttpFileUploadUsername(); + String password = preferenceHelper.getHttpFileUploadPassword(); + String bodyType = preferenceHelper.getHttpFileUploadBodyType(); try { - LOG.info("HTTP Uploading " + fileToUpload.getName() + " to " + url + " using " + method + " (" + bodyType + ")"); + LOG.info("HTTP File Uploading " + fileToUpload.getName() + " to " + url + " using " + method + " (" + bodyType + ")"); OkHttpClient.Builder okBuilder = new OkHttpClient.Builder(); okBuilder.sslSocketFactory(Networks.getSocketFactory(AppSettings.getInstance()), @@ -101,32 +101,32 @@ public Result doWork() { Response response = okBuilder.build().newCall(request).execute(); if (response.isSuccessful()) { - LOG.debug("HTTP upload complete with successful response code " + response.code()); + LOG.debug("HTTP File Upload complete with successful response code " + response.code()); response.close(); - - EventBus.getDefault().post(new UploadEvents.HttpUpload().succeeded()); + + EventBus.getDefault().post(new UploadEvents.HttpFileUpload().succeeded()); Systems.sendFileUploadedBroadcast(getApplicationContext(), new String[]{fileToUpload.getAbsolutePath()}, "httpupload"); - + return Result.success(); } else { String errorBody = response.body() != null ? response.body().string() : "Empty response body"; - LOG.error("HTTP upload failed with code " + response.code() + ": " + errorBody); + LOG.error("HTTP File Upload failed with code " + response.code() + ": " + errorBody); response.close(); - + if (getRunAttemptCount() < 3) { return Result.retry(); } - - EventBus.getDefault().post(new UploadEvents.HttpUpload().failed("Response code " + response.code(), new Throwable(errorBody))); + + EventBus.getDefault().post(new UploadEvents.HttpFileUpload().failed("Response code " + response.code(), new Throwable(errorBody))); return Result.failure(); } } catch (Exception e) { - LOG.error("Exception during HTTP upload", e); + LOG.error("Exception during HTTP File Upload", e); if (getRunAttemptCount() < 3) { return Result.retry(); } - EventBus.getDefault().post(new UploadEvents.HttpUpload().failed(e.getMessage(), e)); + EventBus.getDefault().post(new UploadEvents.HttpFileUpload().failed(e.getMessage(), e)); return Result.failure(); } } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java similarity index 83% rename from gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java rename to gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java index d4063b9e5..62d628cb3 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpUploadSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java @@ -16,7 +16,7 @@ import com.mendhak.gpslogger.common.events.UploadEvents; import com.mendhak.gpslogger.common.slf4j.Logs; import com.mendhak.gpslogger.senders.PreferenceValidator; -import com.mendhak.gpslogger.senders.http.HttpUploadManager; +import com.mendhak.gpslogger.senders.http.HttpFileUploadManager; import com.mendhak.gpslogger.ui.Dialogs; import de.greenrobot.event.EventBus; @@ -27,12 +27,12 @@ import eltos.simpledialogfragment.form.SimpleFormDialog; import eltos.simpledialogfragment.list.SimpleListDialog; -public class HttpUploadSettingsFragment extends PreferenceFragmentCompat implements +public class HttpFileUploadSettingsFragment extends PreferenceFragmentCompat implements SimpleDialog.OnDialogResultListener, PreferenceValidator, Preference.OnPreferenceClickListener { - private static final Logger LOG = Logs.of(HttpUploadSettingsFragment.class); + private static final Logger LOG = Logs.of(HttpFileUploadSettingsFragment.class); private final PreferenceHelper preferenceHelper = PreferenceHelper.getInstance(); @Override @@ -40,19 +40,19 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Preference urlPreference = findPreference(PreferenceNames.HTTPUPLOAD_URL); - urlPreference.setSummary(preferenceHelper.getHttpUploadUrl()); + urlPreference.setSummary(preferenceHelper.getHttpFileUploadUrl()); urlPreference.setOnPreferenceClickListener(this); Preference bodyTypePreference = findPreference(PreferenceNames.HTTPUPLOAD_BODY_TYPE); - bodyTypePreference.setSummary(getBodyTypeDisplay(preferenceHelper.getHttpUploadBodyType())); + bodyTypePreference.setSummary(getBodyTypeDisplay(preferenceHelper.getHttpFileUploadBodyType())); bodyTypePreference.setOnPreferenceClickListener(this); Preference methodPreference = findPreference(PreferenceNames.HTTPUPLOAD_METHOD); - methodPreference.setSummary(preferenceHelper.getHttpUploadMethod()); + methodPreference.setSummary(preferenceHelper.getHttpFileUploadMethod()); methodPreference.setOnPreferenceClickListener(this); Preference headersPreference = findPreference(PreferenceNames.HTTPUPLOAD_HEADERS); - headersPreference.setSummary(preferenceHelper.getHttpUploadHeaders()); + headersPreference.setSummary(preferenceHelper.getHttpFileUploadHeaders()); headersPreference.setOnPreferenceClickListener(this); Preference authPreference = findPreference("httpupload_basicauth"); @@ -66,7 +66,7 @@ public void onCreate(Bundle savedInstanceState) { } private void updateAuthSummary(Preference authPreference) { - String username = preferenceHelper.getHttpUploadUsername(); + String username = preferenceHelper.getHttpFileUploadUsername(); if (!Strings.isNullOrEmpty(username)) { authPreference.setSummary(username + ":***"); } else { @@ -87,13 +87,13 @@ private String getBodyTypeDisplay(String bodyType) { private void updateMethodPreferenceState() { Preference methodPreference = findPreference(PreferenceNames.HTTPUPLOAD_METHOD); - if ("form-data".equals(preferenceHelper.getHttpUploadBodyType())) { - preferenceHelper.setHttpUploadMethod("POST"); + if ("form-data".equals(preferenceHelper.getHttpFileUploadBodyType())) { + preferenceHelper.setHttpFileUploadMethod("POST"); methodPreference.setSummary("POST"); methodPreference.setEnabled(false); } else { methodPreference.setEnabled(true); - methodPreference.setSummary(preferenceHelper.getHttpUploadMethod()); + methodPreference.setSummary(preferenceHelper.getHttpFileUploadMethod()); } } @@ -122,7 +122,7 @@ private void unregisterEventBus() { @Override public boolean isValid() { - HttpUploadManager manager = new HttpUploadManager(preferenceHelper); + HttpFileUploadManager manager = new HttpFileUploadManager(preferenceHelper); return !manager.hasUserAllowedAutoSending() || manager.isAvailable(); } @@ -135,7 +135,7 @@ public boolean onPreferenceClick(Preference preference) { .pos(R.string.ok) .fields( Input.plain(PreferenceNames.HTTPUPLOAD_URL) - .text(preferenceHelper.getHttpUploadUrl()) + .text(preferenceHelper.getHttpFileUploadUrl()) .required() ) .show(this, PreferenceNames.HTTPUPLOAD_URL); @@ -153,7 +153,7 @@ public boolean onPreferenceClick(Preference preference) { if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_BODY_TYPE)) { SimpleListDialog.build() - .title(R.string.http_upload_body_type) + .title(R.string.http_file_upload_body_type) .items(getActivity(), R.array.http_body_types) .choiceMode(SimpleListDialog.SINGLE_CHOICE_DIRECT) .show(this, PreferenceNames.HTTPUPLOAD_BODY_TYPE); @@ -167,7 +167,7 @@ public boolean onPreferenceClick(Preference preference) { .pos(R.string.ok) .fields( Input.plain(PreferenceNames.HTTPUPLOAD_HEADERS) - .text(preferenceHelper.getHttpUploadHeaders()) + .text(preferenceHelper.getHttpFileUploadHeaders()) .inputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE) ) .show(this, PreferenceNames.HTTPUPLOAD_HEADERS); @@ -181,10 +181,10 @@ public boolean onPreferenceClick(Preference preference) { .pos(R.string.ok) .fields( Input.plain(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME) - .text(preferenceHelper.getHttpUploadUsername()) + .text(preferenceHelper.getHttpFileUploadUsername()) .hint(R.string.autoftp_username), Input.plain(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD) - .text(preferenceHelper.getHttpUploadPassword()) + .text(preferenceHelper.getHttpFileUploadPassword()) .hint(R.string.autoftp_password) .showPasswordToggle() .inputType(InputType.TYPE_TEXT_VARIATION_PASSWORD) @@ -194,7 +194,7 @@ public boolean onPreferenceClick(Preference preference) { } if (preference.getKey().equals("httpupload_test")) { - HttpUploadManager manager = new HttpUploadManager(preferenceHelper); + HttpFileUploadManager manager = new HttpFileUploadManager(preferenceHelper); if (!manager.isAvailable()) { Dialogs.alert(getString(R.string.autoftp_invalid_settings), getString(R.string.autoftp_invalid_summary), @@ -202,8 +202,8 @@ public boolean onPreferenceClick(Preference preference) { return false; } - Dialogs.progress((FragmentActivity) getActivity(), "Testing HTTP upload"); - manager.testHttpUpload(); + Dialogs.progress((FragmentActivity) getActivity(), "Testing HTTP File Upload"); + manager.testHttpFileUpload(); return true; } @@ -211,13 +211,13 @@ public boolean onPreferenceClick(Preference preference) { } @EventBusHook - public void onEventMainThread(UploadEvents.HttpUpload o) { - LOG.debug("HTTP Upload Event completed, success: " + o.success); + public void onEventMainThread(UploadEvents.HttpFileUpload o) { + LOG.debug("HTTP File Upload Event completed, success: " + o.success); Dialogs.hideProgress(); if (!o.success) { - Dialogs.showError(getString(R.string.sorry), "HTTP Upload Test Failed", o.message, o.throwable, (FragmentActivity) getActivity()); + Dialogs.showError(getString(R.string.sorry), "HTTP File Upload Test Failed", o.message, o.throwable, (FragmentActivity) getActivity()); } else { - Dialogs.alert(getString(R.string.success), "HTTP Upload Test Succeeded", getActivity()); + Dialogs.alert(getString(R.string.success), "HTTP File Upload Test Succeeded", getActivity()); } } @@ -229,14 +229,14 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_URL)) { String url = extras.getString(PreferenceNames.HTTPUPLOAD_URL); - preferenceHelper.setHttpUploadUrl(url); + preferenceHelper.setHttpFileUploadUrl(url); findPreference(PreferenceNames.HTTPUPLOAD_URL).setSummary(url); return true; } if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_METHOD)) { String method = extras.getString(SimpleListDialog.SELECTED_SINGLE_LABEL); - preferenceHelper.setHttpUploadMethod(method); + preferenceHelper.setHttpFileUploadMethod(method); findPreference(PreferenceNames.HTTPUPLOAD_METHOD).setSummary(method); return true; } @@ -245,7 +245,7 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex String label = extras.getString(SimpleListDialog.SELECTED_SINGLE_LABEL); String[] entries = getResources().getStringArray(R.array.http_body_types); String[] values = getResources().getStringArray(R.array.http_body_type_values); - + String value = values[0]; for (int i = 0; i < entries.length; i++) { if (entries[i].equals(label)) { @@ -254,7 +254,7 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex } } - preferenceHelper.setHttpUploadBodyType(value); + preferenceHelper.setHttpFileUploadBodyType(value); findPreference(PreferenceNames.HTTPUPLOAD_BODY_TYPE).setSummary(getBodyTypeDisplay(value)); updateMethodPreferenceState(); return true; @@ -262,7 +262,7 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_HEADERS)) { String headers = extras.getString(PreferenceNames.HTTPUPLOAD_HEADERS); - preferenceHelper.setHttpUploadHeaders(headers); + preferenceHelper.setHttpFileUploadHeaders(headers); findPreference(PreferenceNames.HTTPUPLOAD_HEADERS).setSummary(headers); return true; } @@ -270,8 +270,8 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex if (dialogTag.equals("httpupload_basicauth")) { String username = extras.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME); String password = extras.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD); - preferenceHelper.setHttpUploadUsername(username); - preferenceHelper.setHttpUploadPassword(password); + preferenceHelper.setHttpFileUploadUsername(username); + preferenceHelper.setHttpFileUploadPassword(password); updateAuthSummary(findPreference("httpupload_basicauth")); return true; } diff --git a/gpslogger/src/main/res/menu/gps_main.xml b/gpslogger/src/main/res/menu/gps_main.xml index ca86506b4..b7bb63b4c 100644 --- a/gpslogger/src/main/res/menu/gps_main.xml +++ b/gpslogger/src/main/res/menu/gps_main.xml @@ -11,7 +11,7 @@ - + diff --git a/gpslogger/src/main/res/values/strings.xml b/gpslogger/src/main/res/values/strings.xml index c6a85e893..25ab86deb 100644 --- a/gpslogger/src/main/res/values/strings.xml +++ b/gpslogger/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - + Upload settings @@ -6,7 +6,6 @@ Close navigation drawer - GPSLogger GPSLogger Settings OK @@ -189,7 +188,6 @@ When I press stop - Email Settings Username with your email provider Password with your email provider @@ -209,7 +207,6 @@ Stopped - OpenStreetMap Authorize this app @@ -262,7 +259,7 @@ ownCloud Base URL Folder to use on ownCloud server. Ensure that it exists or upload will fail. Upload a test file to the ownCloud server - + Testing ownCloud upload Upload @@ -432,7 +429,7 @@ Use MSL instead of WGS84 Subtract altitude offset A value in meters to subtract from GPS altitudes. Use a negative number to add a value to the altitude. Only applies to GPS satellite points, not network or NMEA. - Could not upload the file + Could not upload the file Inaccurate point discarded Only %s m traveled. Point discarded. Send on Wi-Fi only @@ -503,8 +500,8 @@ Only log if there is significant motion Only log if significant activity is detected such as walking, biking, driving. Significant motion is determined by your OS. - HTTP Upload + HTTP File Upload Uploads files to an arbitrary URL using HTTP POST or PUT. - Encoding + Encoding diff --git a/gpslogger/src/main/res/xml/httpuploadsettings.xml b/gpslogger/src/main/res/xml/httpuploadsettings.xml index 09a2e4090..dde57fd79 100644 --- a/gpslogger/src/main/res/xml/httpuploadsettings.xml +++ b/gpslogger/src/main/res/xml/httpuploadsettings.xml @@ -1,45 +1,54 @@ - - + + + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> diff --git a/gpslogger/src/main/res/xml/pref_upload.xml b/gpslogger/src/main/res/xml/pref_upload.xml index 6f638e980..584a37d3b 100644 --- a/gpslogger/src/main/res/xml/pref_upload.xml +++ b/gpslogger/src/main/res/xml/pref_upload.xml @@ -1,14 +1,17 @@ - - + + android:title="@string/pref_autosend_title" +> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + /> + app:iconSpaceReserved="false" + > + app:icon="@drawable/customurlsender" + /> + android:title="@string/http_file_upload_setup_title" + app:icon="@drawable/customurlsender" + /> + app:icon="@drawable/dropbox" + /> + android:icon="@drawable/googledrive" + /> + app:icon="@drawable/sftp" + /> + app:icon="@drawable/opengts" + /> + app:icon="@drawable/openstreetmap" + /> + app:icon="@drawable/email" + /> + app:icon="@drawable/owncloud" + /> + app:icon="@drawable/ftp" + /> diff --git a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java similarity index 54% rename from gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java rename to gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java index c5b5a61ff..1edc85b33 100644 --- a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpUploadManagerTest.java +++ b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java @@ -16,56 +16,56 @@ @SmallTest @RunWith(MockitoJUnitRunner.class) -public class HttpUploadManagerTest { +public class HttpFileUploadManagerTest { @Test public void isAvailable_WhenUrlAndMethodPresent_ReturnsTrue() { PreferenceHelper pm = mock(PreferenceHelper.class); - when(pm.getHttpUploadUrl()).thenReturn("https://example.com/upload"); - when(pm.getHttpUploadMethod()).thenReturn("POST"); + when(pm.getHttpFileUploadUrl()).thenReturn("https://example.com/upload"); + when(pm.getHttpFileUploadMethod()).thenReturn("POST"); - HttpUploadManager manager = new HttpUploadManager(pm); + HttpFileUploadManager manager = new HttpFileUploadManager(pm); assertThat("URL and method are required", manager.isAvailable(), is(true)); } @Test public void isAvailable_WhenUrlMissing_ReturnsFalse() { PreferenceHelper pm = mock(PreferenceHelper.class); - when(pm.getHttpUploadUrl()).thenReturn(""); - when(pm.getHttpUploadMethod()).thenReturn("POST"); + when(pm.getHttpFileUploadUrl()).thenReturn(""); + when(pm.getHttpFileUploadMethod()).thenReturn("POST"); - HttpUploadManager manager = new HttpUploadManager(pm); + HttpFileUploadManager manager = new HttpFileUploadManager(pm); assertThat("URL is required", manager.isAvailable(), is(false)); } @Test public void isAvailable_WhenMethodMissing_ReturnsFalse() { PreferenceHelper pm = mock(PreferenceHelper.class); - when(pm.getHttpUploadUrl()).thenReturn("https://example.com/upload"); - when(pm.getHttpUploadMethod()).thenReturn(""); + when(pm.getHttpFileUploadUrl()).thenReturn("https://example.com/upload"); + when(pm.getHttpFileUploadMethod()).thenReturn(""); - HttpUploadManager manager = new HttpUploadManager(pm); + HttpFileUploadManager manager = new HttpFileUploadManager(pm); assertThat("HTTP method is required", manager.isAvailable(), is(false)); } @Test public void hasUserAllowedAutoSending_UsesPreferenceFlag() { PreferenceHelper pm = mock(PreferenceHelper.class); - when(pm.isHttpUploadAutoSendEnabled()).thenReturn(true); + when(pm.isHttpFileUploadAutoSendEnabled()).thenReturn(true); - HttpUploadManager manager = new HttpUploadManager(pm); + HttpFileUploadManager manager = new HttpFileUploadManager(pm); assertThat("Autosend preference should drive behavior", manager.hasUserAllowedAutoSending(), is(true)); } @Test - public void getName_ReturnsHttpUploadSenderName() { - HttpUploadManager manager = new HttpUploadManager(mock(PreferenceHelper.class)); - assertThat("Sender name should be HTTP upload", manager.getName(), is(FileSender.SenderNames.HTTPUPLOAD)); + public void getName_ReturnsHttpFileUploadSenderName() { + HttpFileUploadManager manager = new HttpFileUploadManager(mock(PreferenceHelper.class)); + assertThat("Sender name should be HTTP File Upload", manager.getName(), is(FileSender.SenderNames.HTTPUPLOAD)); } @Test public void accept_AnyFileName_ReturnsTrue() { - HttpUploadManager manager = new HttpUploadManager(mock(PreferenceHelper.class)); - assertThat("HTTP upload accepts any log file type", manager.accept(null, "anything.txt"), is(true)); + HttpFileUploadManager manager = new HttpFileUploadManager(mock(PreferenceHelper.class)); + assertThat("HTTP File Upload accepts any log file type", manager.accept(null, "anything.txt"), is(true)); } } From acef8042b865274dc4d0210e749d62991d150020 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Wed, 1 Apr 2026 19:38:23 +0100 Subject: [PATCH 41/50] Fix mock --- .../gpslogger/senders/http/HttpFileUploadManagerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java index 1edc85b33..02aaffe16 100644 --- a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java +++ b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java @@ -32,7 +32,6 @@ public void isAvailable_WhenUrlAndMethodPresent_ReturnsTrue() { public void isAvailable_WhenUrlMissing_ReturnsFalse() { PreferenceHelper pm = mock(PreferenceHelper.class); when(pm.getHttpFileUploadUrl()).thenReturn(""); - when(pm.getHttpFileUploadMethod()).thenReturn("POST"); HttpFileUploadManager manager = new HttpFileUploadManager(pm); assertThat("URL is required", manager.isAvailable(), is(false)); From b199eb26b5f8c4c60815eeab283bf36ca296a7c0 Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Wed, 1 Apr 2026 19:45:46 +0100 Subject: [PATCH 42/50] More renames --- .../mendhak/gpslogger/GpsMainActivity.java | 4 +- .../gpslogger/MainPreferenceActivity.java | 4 +- .../gpslogger/common/PreferenceHelper.java | 40 +++++----- .../gpslogger/common/PreferenceNames.java | 14 ++-- .../mendhak/gpslogger/senders/FileSender.java | 2 +- .../gpslogger/senders/FileSenderFactory.java | 2 +- .../senders/http/HttpFileUploadManager.java | 2 +- .../senders/http/HttpFileUploadWorker.java | 2 +- .../HttpFileUploadSettingsFragment.java | 74 +++++++++---------- .../settings/UploadSettingsFragment.java | 4 +- gpslogger/src/main/res/values/strings.xml | 2 +- .../src/main/res/xml/httpuploadsettings.xml | 51 ++++++------- gpslogger/src/main/res/xml/pref_upload.xml | 60 ++++++--------- .../http/HttpFileUploadManagerTest.java | 2 +- 14 files changed, 118 insertions(+), 145 deletions(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java index 8249be121..2f82e32b1 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java @@ -907,7 +907,7 @@ public boolean onItemClick(View view, int i, IDrawerItem iDrawerItem) { launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.CUSTOMURL); break; case 1021: - launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); + launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPFILEUPLOAD); break; case 9000: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://gpslogger.app"))); @@ -1331,7 +1331,7 @@ private void uploadToCustomURL(){ private void uploadToHttpFileUpload(){ if(!FileSenderFactory.getHttpFileUploadSender().isAvailable()){ - launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); + launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPFILEUPLOAD); return; } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java index 7da8d7f2b..8b364bfd9 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/MainPreferenceActivity.java @@ -141,7 +141,7 @@ protected void onCreate(Bundle savedInstanceState) { setTitle(R.string.sftp_setup_title); preferenceFragmentCompat = new SFTPSettingsFragment(); break; - case PREFERENCE_FRAGMENTS.HTTPUPLOAD: + case PREFERENCE_FRAGMENTS.HTTPFILEUPLOAD: setTitle(R.string.http_file_upload_setup_title); preferenceFragmentCompat = new HttpFileUploadSettingsFragment(); break; @@ -194,7 +194,7 @@ public static class PREFERENCE_FRAGMENTS { public static final String OWNCLOUD = "OwnCloudAuthorizationFragment"; public static final String OSM = "OSMAuthorizationFragment"; public static final String SFTP = "SFTPSettingsFragment"; - public static final String HTTPUPLOAD = "HttpFileUploadSettingsFragment"; + public static final String HTTPFILEUPLOAD = "HttpFileUploadSettingsFragment"; } } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java index c04a816ed..35f1eabfe 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceHelper.java @@ -720,63 +720,63 @@ public boolean shouldLogToOpenGTS() { } - @ProfilePreference(name=PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED) + @ProfilePreference(name=PreferenceNames.AUTOSEND_HTTPFILEUPLOAD_ENABLED) public boolean isHttpFileUploadAutoSendEnabled() { - return prefs.getBoolean(PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED, false); + return prefs.getBoolean(PreferenceNames.AUTOSEND_HTTPFILEUPLOAD_ENABLED, false); } - @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_URL) + @ProfilePreference(name=PreferenceNames.HTTPFILEUPLOAD_URL) public String getHttpFileUploadUrl() { - return prefs.getString(PreferenceNames.HTTPUPLOAD_URL, ""); + return prefs.getString(PreferenceNames.HTTPFILEUPLOAD_URL, ""); } public void setHttpFileUploadUrl(String url) { - prefs.edit().putString(PreferenceNames.HTTPUPLOAD_URL, url).apply(); + prefs.edit().putString(PreferenceNames.HTTPFILEUPLOAD_URL, url).apply(); } - @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_METHOD) + @ProfilePreference(name=PreferenceNames.HTTPFILEUPLOAD_METHOD) public String getHttpFileUploadMethod() { - return prefs.getString(PreferenceNames.HTTPUPLOAD_METHOD, "POST"); + return prefs.getString(PreferenceNames.HTTPFILEUPLOAD_METHOD, "POST"); } public void setHttpFileUploadMethod(String method) { - prefs.edit().putString(PreferenceNames.HTTPUPLOAD_METHOD, method).apply(); + prefs.edit().putString(PreferenceNames.HTTPFILEUPLOAD_METHOD, method).apply(); } - @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_HEADERS) + @ProfilePreference(name=PreferenceNames.HTTPFILEUPLOAD_HEADERS) public String getHttpFileUploadHeaders() { - return prefs.getString(PreferenceNames.HTTPUPLOAD_HEADERS, ""); + return prefs.getString(PreferenceNames.HTTPFILEUPLOAD_HEADERS, ""); } public void setHttpFileUploadHeaders(String headers) { - prefs.edit().putString(PreferenceNames.HTTPUPLOAD_HEADERS, headers).apply(); + prefs.edit().putString(PreferenceNames.HTTPFILEUPLOAD_HEADERS, headers).apply(); } - @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME) + @ProfilePreference(name=PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_USERNAME) public String getHttpFileUploadUsername() { - return prefs.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME, ""); + return prefs.getString(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_USERNAME, ""); } public void setHttpFileUploadUsername(String username) { - prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME, username).apply(); + prefs.edit().putString(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_USERNAME, username).apply(); } - @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD) + @ProfilePreference(name=PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_PASSWORD) public String getHttpFileUploadPassword() { - return prefs.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD, ""); + return prefs.getString(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_PASSWORD, ""); } public void setHttpFileUploadPassword(String password) { - prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD, password).apply(); + prefs.edit().putString(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_PASSWORD, password).apply(); } - @ProfilePreference(name=PreferenceNames.HTTPUPLOAD_BODY_TYPE) + @ProfilePreference(name=PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE) public String getHttpFileUploadBodyType() { - return prefs.getString(PreferenceNames.HTTPUPLOAD_BODY_TYPE, "form-data"); + return prefs.getString(PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE, "form-data"); } public void setHttpFileUploadBodyType(String bodyType) { - prefs.edit().putString(PreferenceNames.HTTPUPLOAD_BODY_TYPE, bodyType).apply(); + prefs.edit().putString(PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE, bodyType).apply(); } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java index 8e73fc645..55d87b960 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/common/PreferenceNames.java @@ -51,13 +51,13 @@ public class PreferenceNames { public static final String LOG_TO_URL_DISCARD_OFFLINE_LOCATIONS_ENABLED = "log_customurl_discard_offline_locations_enabled"; public static final String AUTOSEND_CUSTOMURL_ENABLED = "autocustomurl_enabled"; - public static final String AUTOSEND_HTTPUPLOAD_ENABLED = "autohttpupload_enabled"; - public static final String HTTPUPLOAD_URL = "httpupload_url"; - public static final String HTTPUPLOAD_METHOD = "httpupload_method"; - public static final String HTTPUPLOAD_HEADERS = "httpupload_headers"; - public static final String HTTPUPLOAD_BASICAUTH_USERNAME = "httpupload_basicauth_username"; - public static final String HTTPUPLOAD_BASICAUTH_PASSWORD = "httpupload_basicauth_password"; - public static final String HTTPUPLOAD_BODY_TYPE = "httpupload_body_type"; + public static final String AUTOSEND_HTTPFILEUPLOAD_ENABLED = "autohttpfileupload_enabled"; + public static final String HTTPFILEUPLOAD_URL = "httpfileupload_url"; + public static final String HTTPFILEUPLOAD_METHOD = "httpfileupload_method"; + public static final String HTTPFILEUPLOAD_HEADERS = "httpfileupload_headers"; + public static final String HTTPFILEUPLOAD_BASICAUTH_USERNAME = "httpfileupload_basicauth_username"; + public static final String HTTPFILEUPLOAD_BASICAUTH_PASSWORD = "httpfileupload_basicauth_password"; + public static final String HTTPFILEUPLOAD_BODY_TYPE = "httpfileupload_body_type"; public static final String LOG_TO_OPENGTS = "log_opengts"; public static final String LOG_PASSIVE_LOCATIONS="log_passive_locations"; diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java index d9d412566..da296d387 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java @@ -35,7 +35,7 @@ public static class SenderNames { public static final String SFTP = "SFTP_SENDER"; public static final String OPENSTREETMAP = "OSM_SENDER"; public static final String CUSTOMURL = "CUSTOM_URL_SENDER"; - public static final String HTTPUPLOAD = "HTTP_UPLOAD_SENDER"; + public static final String HTTPFILEUPLOAD = "HTTP_UPLOAD_SENDER"; } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java index 4ac103ed2..44ad594d3 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java @@ -169,7 +169,7 @@ public static FileSender getSenderByName(String senderName) { return getSFTPSender(); case FileSender.SenderNames.CUSTOMURL: return getCustomUrlSender(); - case FileSender.SenderNames.HTTPUPLOAD: + case FileSender.SenderNames.HTTPFILEUPLOAD: return getHttpFileUploadSender(); default: return null; diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java index b00f25dc5..8fa57d105 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManager.java @@ -67,7 +67,7 @@ public boolean hasUserAllowedAutoSending() { @Override public String getName() { - return SenderNames.HTTPUPLOAD; + return SenderNames.HTTPFILEUPLOAD; } @Override diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java index f0d8affe8..dbbaf6cfd 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/http/HttpFileUploadWorker.java @@ -105,7 +105,7 @@ public Result doWork() { response.close(); EventBus.getDefault().post(new UploadEvents.HttpFileUpload().succeeded()); - Systems.sendFileUploadedBroadcast(getApplicationContext(), new String[]{fileToUpload.getAbsolutePath()}, "httpupload"); + Systems.sendFileUploadedBroadcast(getApplicationContext(), new String[]{fileToUpload.getAbsolutePath()}, "httpfileupload"); return Result.success(); } else { diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java index 62d628cb3..e922acced 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java @@ -39,27 +39,27 @@ public class HttpFileUploadSettingsFragment extends PreferenceFragmentCompat imp public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Preference urlPreference = findPreference(PreferenceNames.HTTPUPLOAD_URL); + Preference urlPreference = findPreference(PreferenceNames.HTTPFILEUPLOAD_URL); urlPreference.setSummary(preferenceHelper.getHttpFileUploadUrl()); urlPreference.setOnPreferenceClickListener(this); - Preference bodyTypePreference = findPreference(PreferenceNames.HTTPUPLOAD_BODY_TYPE); + Preference bodyTypePreference = findPreference(PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE); bodyTypePreference.setSummary(getBodyTypeDisplay(preferenceHelper.getHttpFileUploadBodyType())); bodyTypePreference.setOnPreferenceClickListener(this); - Preference methodPreference = findPreference(PreferenceNames.HTTPUPLOAD_METHOD); + Preference methodPreference = findPreference(PreferenceNames.HTTPFILEUPLOAD_METHOD); methodPreference.setSummary(preferenceHelper.getHttpFileUploadMethod()); methodPreference.setOnPreferenceClickListener(this); - Preference headersPreference = findPreference(PreferenceNames.HTTPUPLOAD_HEADERS); + Preference headersPreference = findPreference(PreferenceNames.HTTPFILEUPLOAD_HEADERS); headersPreference.setSummary(preferenceHelper.getHttpFileUploadHeaders()); headersPreference.setOnPreferenceClickListener(this); - Preference authPreference = findPreference("httpupload_basicauth"); + Preference authPreference = findPreference("httpfileupload_basicauth"); updateAuthSummary(authPreference); authPreference.setOnPreferenceClickListener(this); - findPreference("httpupload_test").setOnPreferenceClickListener(this); + findPreference("httpfileupload_test").setOnPreferenceClickListener(this); updateMethodPreferenceState(); registerEventBus(); @@ -86,7 +86,7 @@ private String getBodyTypeDisplay(String bodyType) { } private void updateMethodPreferenceState() { - Preference methodPreference = findPreference(PreferenceNames.HTTPUPLOAD_METHOD); + Preference methodPreference = findPreference(PreferenceNames.HTTPFILEUPLOAD_METHOD); if ("form-data".equals(preferenceHelper.getHttpFileUploadBodyType())) { preferenceHelper.setHttpFileUploadMethod("POST"); methodPreference.setSummary("POST"); @@ -99,7 +99,7 @@ private void updateMethodPreferenceState() { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferencesFromResource(R.xml.httpuploadsettings, rootKey); + setPreferencesFromResource(R.xml.httpfileuploadsettings, rootKey); } @Override @@ -128,72 +128,72 @@ public boolean isValid() { @Override public boolean onPreferenceClick(Preference preference) { - if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_URL)) { + if (preference.getKey().equals(PreferenceNames.HTTPFILEUPLOAD_URL)) { SimpleFormDialog.build() .title("URL") .neg(R.string.cancel) .pos(R.string.ok) .fields( - Input.plain(PreferenceNames.HTTPUPLOAD_URL) + Input.plain(PreferenceNames.HTTPFILEUPLOAD_URL) .text(preferenceHelper.getHttpFileUploadUrl()) .required() ) - .show(this, PreferenceNames.HTTPUPLOAD_URL); + .show(this, PreferenceNames.HTTPFILEUPLOAD_URL); return true; } - if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_METHOD)) { + if (preference.getKey().equals(PreferenceNames.HTTPFILEUPLOAD_METHOD)) { SimpleListDialog.build() .title(R.string.customurl_http_method) .items(getActivity(), R.array.http_methods) .choiceMode(SimpleListDialog.SINGLE_CHOICE_DIRECT) - .show(this, PreferenceNames.HTTPUPLOAD_METHOD); + .show(this, PreferenceNames.HTTPFILEUPLOAD_METHOD); return true; } - if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_BODY_TYPE)) { + if (preference.getKey().equals(PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE)) { SimpleListDialog.build() .title(R.string.http_file_upload_body_type) .items(getActivity(), R.array.http_body_types) .choiceMode(SimpleListDialog.SINGLE_CHOICE_DIRECT) - .show(this, PreferenceNames.HTTPUPLOAD_BODY_TYPE); + .show(this, PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE); return true; } - if (preference.getKey().equals(PreferenceNames.HTTPUPLOAD_HEADERS)) { + if (preference.getKey().equals(PreferenceNames.HTTPFILEUPLOAD_HEADERS)) { SimpleFormDialog.build() .title(R.string.customurl_http_headers) .neg(R.string.cancel) .pos(R.string.ok) .fields( - Input.plain(PreferenceNames.HTTPUPLOAD_HEADERS) + Input.plain(PreferenceNames.HTTPFILEUPLOAD_HEADERS) .text(preferenceHelper.getHttpFileUploadHeaders()) .inputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE) ) - .show(this, PreferenceNames.HTTPUPLOAD_HEADERS); + .show(this, PreferenceNames.HTTPFILEUPLOAD_HEADERS); return true; } - if (preference.getKey().equals("httpupload_basicauth")) { + if (preference.getKey().equals("httpfileupload_basicauth")) { SimpleFormDialog.build() .title("Basic Authentication") .neg(R.string.cancel) .pos(R.string.ok) .fields( - Input.plain(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME) + Input.plain(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_USERNAME) .text(preferenceHelper.getHttpFileUploadUsername()) .hint(R.string.autoftp_username), - Input.plain(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD) + Input.plain(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_PASSWORD) .text(preferenceHelper.getHttpFileUploadPassword()) .hint(R.string.autoftp_password) .showPasswordToggle() .inputType(InputType.TYPE_TEXT_VARIATION_PASSWORD) ) - .show(this, "httpupload_basicauth"); + .show(this, "httpfileupload_basicauth"); return true; } - if (preference.getKey().equals("httpupload_test")) { + if (preference.getKey().equals("httpfileupload_test")) { HttpFileUploadManager manager = new HttpFileUploadManager(preferenceHelper); if (!manager.isAvailable()) { Dialogs.alert(getString(R.string.autoftp_invalid_settings), @@ -227,21 +227,21 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex return true; } - if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_URL)) { - String url = extras.getString(PreferenceNames.HTTPUPLOAD_URL); + if (dialogTag.equals(PreferenceNames.HTTPFILEUPLOAD_URL)) { + String url = extras.getString(PreferenceNames.HTTPFILEUPLOAD_URL); preferenceHelper.setHttpFileUploadUrl(url); - findPreference(PreferenceNames.HTTPUPLOAD_URL).setSummary(url); + findPreference(PreferenceNames.HTTPFILEUPLOAD_URL).setSummary(url); return true; } - if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_METHOD)) { + if (dialogTag.equals(PreferenceNames.HTTPFILEUPLOAD_METHOD)) { String method = extras.getString(SimpleListDialog.SELECTED_SINGLE_LABEL); preferenceHelper.setHttpFileUploadMethod(method); - findPreference(PreferenceNames.HTTPUPLOAD_METHOD).setSummary(method); + findPreference(PreferenceNames.HTTPFILEUPLOAD_METHOD).setSummary(method); return true; } - if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_BODY_TYPE)) { + if (dialogTag.equals(PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE)) { String label = extras.getString(SimpleListDialog.SELECTED_SINGLE_LABEL); String[] entries = getResources().getStringArray(R.array.http_body_types); String[] values = getResources().getStringArray(R.array.http_body_type_values); @@ -255,24 +255,24 @@ public boolean onResult(@NonNull String dialogTag, int which, @NonNull Bundle ex } preferenceHelper.setHttpFileUploadBodyType(value); - findPreference(PreferenceNames.HTTPUPLOAD_BODY_TYPE).setSummary(getBodyTypeDisplay(value)); + findPreference(PreferenceNames.HTTPFILEUPLOAD_BODY_TYPE).setSummary(getBodyTypeDisplay(value)); updateMethodPreferenceState(); return true; } - if (dialogTag.equals(PreferenceNames.HTTPUPLOAD_HEADERS)) { - String headers = extras.getString(PreferenceNames.HTTPUPLOAD_HEADERS); + if (dialogTag.equals(PreferenceNames.HTTPFILEUPLOAD_HEADERS)) { + String headers = extras.getString(PreferenceNames.HTTPFILEUPLOAD_HEADERS); preferenceHelper.setHttpFileUploadHeaders(headers); - findPreference(PreferenceNames.HTTPUPLOAD_HEADERS).setSummary(headers); + findPreference(PreferenceNames.HTTPFILEUPLOAD_HEADERS).setSummary(headers); return true; } - if (dialogTag.equals("httpupload_basicauth")) { - String username = extras.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_USERNAME); - String password = extras.getString(PreferenceNames.HTTPUPLOAD_BASICAUTH_PASSWORD); + if (dialogTag.equals("httpfileupload_basicauth")) { + String username = extras.getString(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_USERNAME); + String password = extras.getString(PreferenceNames.HTTPFILEUPLOAD_BASICAUTH_PASSWORD); preferenceHelper.setHttpFileUploadUsername(username); preferenceHelper.setHttpFileUploadPassword(password); - updateAuthSummary(findPreference("httpupload_basicauth")); + updateAuthSummary(findPreference("httpfileupload_basicauth")); return true; } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java index f31087473..f4810d112 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/UploadSettingsFragment.java @@ -175,7 +175,7 @@ public void onClick(View view) { } }); - ((SwitchPlusClickPreference)findPreference(PreferenceNames.AUTOSEND_HTTPUPLOAD_ENABLED)) + ((SwitchPlusClickPreference)findPreference(PreferenceNames.AUTOSEND_HTTPFILEUPLOAD_ENABLED)) .setSwitchClickListener(new SwitchPlusClickPreference.SwitchPlusClickListener() { @Override @@ -187,7 +187,7 @@ public void onCheckedChanged(SwitchCompat buttonView, boolean isChecked) { public void onClick(View view) { Intent intent = new Intent(getActivity(), MainPreferenceActivity.class); - intent.putExtra("preference_fragment", MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPUPLOAD); + intent.putExtra("preference_fragment", MainPreferenceActivity.PREFERENCE_FRAGMENTS.HTTPFILEUPLOAD); startActivity(intent); } }); diff --git a/gpslogger/src/main/res/values/strings.xml b/gpslogger/src/main/res/values/strings.xml index 25ab86deb..ddf1a4d9a 100644 --- a/gpslogger/src/main/res/values/strings.xml +++ b/gpslogger/src/main/res/values/strings.xml @@ -501,7 +501,7 @@ Only log if significant activity is detected such as walking, biking, driving. Significant motion is determined by your OS. HTTP File Upload - Uploads files to an arbitrary URL using HTTP POST or PUT. + Uploads files to an arbitrary URL using HTTP POST or PUT. Encoding diff --git a/gpslogger/src/main/res/xml/httpuploadsettings.xml b/gpslogger/src/main/res/xml/httpuploadsettings.xml index dde57fd79..04ff39684 100644 --- a/gpslogger/src/main/res/xml/httpuploadsettings.xml +++ b/gpslogger/src/main/res/xml/httpuploadsettings.xml @@ -1,54 +1,45 @@ - + + app:iconSpaceReserved="false" /> + android:title="URL" + app:iconSpaceReserved="false" /> + android:key="httpfileupload_body_type" + android:title="@string/http_file_upload_body_type" + app:iconSpaceReserved="false" /> + android:key="httpfileupload_method" + android:title="@string/customurl_http_method" + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + android:title="Test upload" + app:iconSpaceReserved="false" /> diff --git a/gpslogger/src/main/res/xml/pref_upload.xml b/gpslogger/src/main/res/xml/pref_upload.xml index 584a37d3b..6000e8740 100644 --- a/gpslogger/src/main/res/xml/pref_upload.xml +++ b/gpslogger/src/main/res/xml/pref_upload.xml @@ -1,17 +1,14 @@ - + android:title="@string/pref_autosend_title"> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false" /> + android:title="@string/autosend_wifionly_title" + app:iconSpaceReserved="false" /> + app:iconSpaceReserved="false"> + app:icon="@drawable/customurlsender" /> + app:icon="@drawable/customurlsender" /> + app:icon="@drawable/dropbox" /> + android:key="google_drive_enabled" + android:title="@string/google_drive_setup_title" /> + app:icon="@drawable/sftp" /> + app:icon="@drawable/opengts" /> + app:icon="@drawable/openstreetmap" /> + app:icon="@drawable/email" /> + app:icon="@drawable/owncloud" /> + app:icon="@drawable/ftp" /> diff --git a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java index 02aaffe16..2e1fd02e5 100644 --- a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java +++ b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/http/HttpFileUploadManagerTest.java @@ -59,7 +59,7 @@ public void hasUserAllowedAutoSending_UsesPreferenceFlag() { @Test public void getName_ReturnsHttpFileUploadSenderName() { HttpFileUploadManager manager = new HttpFileUploadManager(mock(PreferenceHelper.class)); - assertThat("Sender name should be HTTP File Upload", manager.getName(), is(FileSender.SenderNames.HTTPUPLOAD)); + assertThat("Sender name should be HTTP File Upload", manager.getName(), is(FileSender.SenderNames.HTTPFILEUPLOAD)); } @Test From 6596287f9e71f98b3d70b641b917634679f3e3fe Mon Sep 17 00:00:00 2001 From: Rodgers Ouma Date: Wed, 1 Apr 2026 20:05:16 +0100 Subject: [PATCH 43/50] Add HTTP headers example --- .../main/java/com/mendhak/gpslogger/senders/FileSender.java | 2 +- .../fragments/settings/HttpFileUploadSettingsFragment.java | 3 ++- gpslogger/src/main/res/values/strings.xml | 2 +- .../{httpuploadsettings.xml => httpfileuploadsettings.xml} | 5 ++++- 4 files changed, 8 insertions(+), 4 deletions(-) rename gpslogger/src/main/res/xml/{httpuploadsettings.xml => httpfileuploadsettings.xml} (85%) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java index da296d387..49e4490ce 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSender.java @@ -35,7 +35,7 @@ public static class SenderNames { public static final String SFTP = "SFTP_SENDER"; public static final String OPENSTREETMAP = "OSM_SENDER"; public static final String CUSTOMURL = "CUSTOM_URL_SENDER"; - public static final String HTTPFILEUPLOAD = "HTTP_UPLOAD_SENDER"; + public static final String HTTPFILEUPLOAD = "HTTP_FILE_UPLOAD_SENDER"; } diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java index e922acced..4b5485c4f 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/ui/fragments/settings/HttpFileUploadSettingsFragment.java @@ -162,9 +162,10 @@ public boolean onPreferenceClick(Preference preference) { if (preference.getKey().equals(PreferenceNames.HTTPFILEUPLOAD_HEADERS)) { SimpleFormDialog.build() - .title(R.string.customurl_http_headers) + .title(R.string.http_file_upload_http_headers) .neg(R.string.cancel) .pos(R.string.ok) + .msgHtml("Content-Type: application/json
Authorization: Basic abcdefg
ApiToken: 12345") .fields( Input.plain(PreferenceNames.HTTPFILEUPLOAD_HEADERS) .text(preferenceHelper.getHttpFileUploadHeaders()) diff --git a/gpslogger/src/main/res/values/strings.xml b/gpslogger/src/main/res/values/strings.xml index ddf1a4d9a..14ab0df80 100644 --- a/gpslogger/src/main/res/values/strings.xml +++ b/gpslogger/src/main/res/values/strings.xml @@ -503,5 +503,5 @@ HTTP File Upload Uploads files to an arbitrary URL using HTTP POST or PUT. Encoding - + HTTP Headers diff --git a/gpslogger/src/main/res/xml/httpuploadsettings.xml b/gpslogger/src/main/res/xml/httpfileuploadsettings.xml similarity index 85% rename from gpslogger/src/main/res/xml/httpuploadsettings.xml rename to gpslogger/src/main/res/xml/httpfileuploadsettings.xml index 04ff39684..9617ebf2f 100644 --- a/gpslogger/src/main/res/xml/httpuploadsettings.xml +++ b/gpslogger/src/main/res/xml/httpfileuploadsettings.xml @@ -28,7 +28,10 @@ Date: Thu, 2 Apr 2026 21:01:44 +0100 Subject: [PATCH 44/50] Changelog for v136 --- fastlane/metadata/android/en-US/changelogs/136.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/136.txt diff --git a/fastlane/metadata/android/en-US/changelogs/136.txt b/fastlane/metadata/android/en-US/changelogs/136.txt new file mode 100644 index 000000000..5ba82d437 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/136.txt @@ -0,0 +1,2 @@ +* HTTP File Upload Target, separate from normal Custom URL logger. +* Significant motion heartbeat interval setting for long durations. \ No newline at end of file From 450085a8e506dccd9949751604a7fb2369ade60b Mon Sep 17 00:00:00 2001 From: mendhak Date: Thu, 2 Apr 2026 21:45:54 +0100 Subject: [PATCH 45/50] trkseg bugfix --- fastlane/metadata/android/en-US/changelogs/136.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/en-US/changelogs/136.txt b/fastlane/metadata/android/en-US/changelogs/136.txt index 5ba82d437..4c5ffd396 100644 --- a/fastlane/metadata/android/en-US/changelogs/136.txt +++ b/fastlane/metadata/android/en-US/changelogs/136.txt @@ -1,2 +1,3 @@ -* HTTP File Upload Target, separate from normal Custom URL logger. -* Significant motion heartbeat interval setting for long durations. \ No newline at end of file +* HTTP File Upload Target (separate from normal Custom URL logger). +* Significant motion heartbeat interval setting for long durations. +* Fixed bug where GPX track segments were not being created correctly. \ No newline at end of file From ee995d41799caf7a1d16061eeec92b6326c46a2f Mon Sep 17 00:00:00 2001 From: mendhak Date: Sun, 12 Apr 2026 16:03:30 +0100 Subject: [PATCH 46/50] Bugfix: For the on-every-start filename, don't create a new filename if the logging session is already started. That is, if user has selected new file on every start, and a tasker immediatestart gets sent to an already logging session, then keep the existing file name. Issue #1279 --- .../main/java/com/mendhak/gpslogger/GpsLoggingService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java index 8b7a228c2..4f3ef0e22 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java @@ -435,7 +435,9 @@ protected void startLogging() { showNotification(); setupAutoSendTimers(); setupSignificantMotionSensor(); - resetCurrentFileName(true); + + resetCurrentFileName(Strings.isNullOrEmpty(session.getCurrentFormattedFileName())); + notifyClientsStarted(true); startPassiveManager(); startGpsManager(); From 107b33f131a9af9241a932e0ff7eeb2229aad2bb Mon Sep 17 00:00:00 2001 From: mendhak Date: Mon, 20 Apr 2026 21:59:59 +0100 Subject: [PATCH 47/50] OwnCloud validation improvement check. Issue #1263 --- .../mendhak/gpslogger/senders/owncloud/OwnCloudManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManager.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManager.java index 531351eb3..ddb08997b 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManager.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManager.java @@ -69,8 +69,10 @@ public static boolean validSettings( String username, String password, String directory) { - return !Strings.isNullOrEmpty(servername); - + return !Strings.isNullOrEmpty(servername) + && !Strings.isNullOrEmpty(username) + && !Strings.isNullOrEmpty(password) + && !Strings.isNullOrEmpty(directory); } @Override From 36ae7b21c10e3ead8782f6928f3377a1fb693f7a Mon Sep 17 00:00:00 2001 From: mendhak Date: Mon, 20 Apr 2026 22:13:15 +0100 Subject: [PATCH 48/50] Better check for whether auto senders are available or not. Issue #1263 --- .../main/java/com/mendhak/gpslogger/GpsMainActivity.java | 8 ++++++-- .../com/mendhak/gpslogger/senders/FileSenderFactory.java | 2 +- .../gpslogger/senders/owncloud/OwnCloudManagerTest.java | 8 +++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java index e14bacdcc..5b80d054c 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsMainActivity.java @@ -1258,8 +1258,12 @@ private void forceAutoSendNow() { LOG.debug("User forced an auto send"); if (preferenceHelper.isAutoSendEnabled()) { - Dialogs.progress(this, getString(R.string.autosend_sending)); - EventBus.getDefault().post(new CommandEvents.AutoSend(null)); + if (FileSenderFactory.getAvailableFileAutoSenders().isEmpty()) { + launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.UPLOAD); + } else { + Dialogs.progress(this, getString(R.string.autosend_sending)); + EventBus.getDefault().post(new CommandEvents.AutoSend(null)); + } } else { launchPreferenceScreen(MainPreferenceActivity.PREFERENCE_FRAGMENTS.UPLOAD); diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java index 44ad594d3..da4e59923 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/senders/FileSenderFactory.java @@ -192,7 +192,7 @@ private static List getAllFileSenders(){ return senders; } - private static List getAvailableFileAutoSenders() { + public static List getAvailableFileAutoSenders() { List senders = new ArrayList<>(); diff --git a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManagerTest.java b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManagerTest.java index 11b7e992d..6e5598cf5 100644 --- a/gpslogger/src/test/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManagerTest.java +++ b/gpslogger/src/test/java/com/mendhak/gpslogger/senders/owncloud/OwnCloudManagerTest.java @@ -26,7 +26,10 @@ public void IsAvailable_WithValidValues_IsAvailable(){ assertThat("Server name should not be empty", ocm.isAvailable(), is(false)); when(pm.getOwnCloudBaseUrl()).thenReturn("sadfasdf"); - assertThat("Server name should not be empty", ocm.isAvailable(), is(true)); + when(pm.getOwnCloudDirectory()).thenReturn("/"); + when(pm.getOwnCloudUsername()).thenReturn("example"); + when(pm.getOwnCloudPassword()).thenReturn("example"); + assertThat("Server name, directory, username and password should not be empty", ocm.isAvailable(), is(true)); } @Test @@ -36,6 +39,9 @@ public void IsAutoSendAvailable_WhenUserCheckedPreference_ThenAvailable(){ OwnCloudManager ocm = new OwnCloudManager(pm); when(pm.getOwnCloudBaseUrl()).thenReturn("sadfasdf"); + when(pm.getOwnCloudDirectory()).thenReturn("/"); + when(pm.getOwnCloudUsername()).thenReturn("example"); + when(pm.getOwnCloudPassword()).thenReturn("example"); assertThat("Valid but unchecked - not available", ocm.isAutoSendAvailable(), is(false)); when(pm.isOwnCloudAutoSendEnabled()).thenReturn(true); From 6ba7de6c6fc0eee4be06e68d8b2bf8d49476a395 Mon Sep 17 00:00:00 2001 From: mendhak Date: Sat, 25 Apr 2026 13:32:23 +0100 Subject: [PATCH 49/50] If no loggers are enabled, show an error dialog. issue #1287 --- .../main/java/com/mendhak/gpslogger/GpsLoggingService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java index f1844f3f9..6ce4ed690 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/GpsLoggingService.java @@ -1258,6 +1258,12 @@ private void setAlarmForNextPoint() { private void writeToFile(Location loc) { //session.setAddNewTrackSegment(false); + if(FileLoggerFactory.getFileLoggers(getApplicationContext()).isEmpty()){ + Systems.showErrorNotification(getApplicationContext(), + String.format("%s %s", getString(R.string.summary_loggingto), getString(R.string.summary_loggingto_screen))); + return; + } + try { LOG.debug("Calling file writers"); FileLoggerFactory.write(getApplicationContext(), loc); From 725ff99f7f37948d539feb0db81ef7aedeef2acd Mon Sep 17 00:00:00 2001 From: mendhak Date: Sat, 6 Jun 2026 17:28:32 +0100 Subject: [PATCH 50/50] Add a 1 second delay every 10 requests when sending HTTP requests. --- .../loggers/customurl/CustomUrlWorker.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/gpslogger/src/main/java/com/mendhak/gpslogger/loggers/customurl/CustomUrlWorker.java b/gpslogger/src/main/java/com/mendhak/gpslogger/loggers/customurl/CustomUrlWorker.java index 0fa1a8c52..b8832eebe 100644 --- a/gpslogger/src/main/java/com/mendhak/gpslogger/loggers/customurl/CustomUrlWorker.java +++ b/gpslogger/src/main/java/com/mendhak/gpslogger/loggers/customurl/CustomUrlWorker.java @@ -54,7 +54,8 @@ public Result doWork() { String responseError = null; String responseThrowableMessage = null; - for (CustomUrlRequest urlRequest : urlRequests) { + for (int i = 0; i < urlRequests.length; i++) { + CustomUrlRequest urlRequest = urlRequests[i]; try{ LOG.info("HTTP Request - " + urlRequest.getLogURL()); @@ -89,6 +90,17 @@ public Result doWork() { if (!success) { break; } + + // Throttling: sleep for 1 second every 10 requests to prevent DOS + if ((i + 1) % 10 == 0) { + try { + LOG.debug("Throttling: sleeping for 1s to prevent DOS"); + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } } catch (Exception e) { LOG.error("Exception during Custom URL processing " + e); @@ -98,7 +110,7 @@ public Result doWork() { break; } } - + if(success) { // Notify internal listeners