From 8d215a7f1c3fa59d7e7ff54c4ed54eb37fc1a9fa Mon Sep 17 00:00:00 2001 From: eddyizm Date: Sun, 25 Jan 2026 11:27:12 -0800 Subject: [PATCH 1/2] feat: add configurable timeout (#386) --- .../subsonic/api/system/SystemClient.java | 6 ++-- .../tempo/ui/fragment/SettingsFragment.java | 28 +++++++++++++++++++ .../tempo/util/Preferences.kt | 15 ++++++++++ app/src/main/res/values/strings.xml | 3 ++ app/src/main/res/xml/global_preferences.xml | 9 ++++++ 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/system/SystemClient.java b/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/system/SystemClient.java index c5227da7..f237b683 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/system/SystemClient.java +++ b/app/src/main/java/com/cappielloantonio/tempo/subsonic/api/system/SystemClient.java @@ -24,13 +24,15 @@ public class SystemClient { public Call ping() { Log.d(TAG, "ping()"); + int timeoutSeconds = Preferences.getNetworkPingTimeout(); Call pingCall = systemService.ping(subsonic.getParams()); if (Preferences.isInUseServerAddressLocal()) { pingCall.timeout() - .timeout(1, TimeUnit.SECONDS); + .timeout(timeoutSeconds, TimeUnit.SECONDS); } else { + int finalTimeout = Math.min(timeoutSeconds * 2, 10); pingCall.timeout() - .timeout(3, TimeUnit.SECONDS); + .timeout(finalTimeout, TimeUnit.SECONDS); } return pingCall; } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SettingsFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SettingsFragment.java index bbbdecc2..aab61593 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/SettingsFragment.java @@ -9,6 +9,8 @@ import android.media.audiofx.AudioEffect; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; +import android.text.InputFilter; +import android.text.InputType; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,6 +29,7 @@ import androidx.media3.common.util.UnstableApi; import androidx.navigation.NavController; import androidx.navigation.NavOptions; import androidx.navigation.fragment.NavHostFragment; +import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; @@ -141,6 +144,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { setStreamingCacheSize(); setAppLanguage(); setVersion(); + setNetorkPingTimeoutBase(); actionLogout(); actionScan(); @@ -261,6 +265,30 @@ public class SettingsFragment extends PreferenceFragmentCompat { } } + private void setNetorkPingTimeoutBase() { + EditTextPreference networkPingTimeoutBase = findPreference("network_ping_timeout_base"); + + if (networkPingTimeoutBase != null) { + networkPingTimeoutBase.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance()); + networkPingTimeoutBase.setOnBindEditTextListener(editText -> { + editText.setInputType(InputType.TYPE_CLASS_NUMBER); + editText.setFilters(new InputFilter[]{ (source, start, end, dest, dstart, dend) -> { + for (int i = start; i < end; i++) { + if (!Character.isDigit(source.charAt(i))) { + return ""; + } + } + return null; + }}); + }); + + networkPingTimeoutBase.setOnPreferenceChangeListener((preference, newValue) -> { + String input = (String) newValue; + return input != null && !input.isEmpty(); + }); + } + } + private void setStreamingCacheSize() { ListPreference streamingCachePreference = findPreference("streaming_cache_size"); diff --git a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt index 14e33e39..485aa587 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt @@ -85,6 +85,8 @@ object Preferences { private const val ARTIST_SORT_BY_ALBUM_COUNT= "artist_sort_by_album_count" private const val SORT_SEARCH_CHRONOLOGICALLY= "sort_search_chronologically" private const val ARTIST_DISPLAY_BIOGRAPHY= "artist_display_biography" + private const val NETWORK_PING_TIMEOUT = "network_ping_timeout_base" + @JvmStatic fun getServer(): String? { @@ -96,6 +98,19 @@ object Preferences { App.getInstance().preferences.edit().putString(SERVER, server).apply() } + @JvmStatic + fun getNetworkPingTimeout(): Int { + val timeoutString = App.getInstance().preferences.getString(NETWORK_PING_TIMEOUT, "2") ?: "2" + return (timeoutString.toIntOrNull() ?: 2).coerceAtLeast(1) + } + + @JvmStatic + fun setNetworkPingTimeout(pingTimeout: String?) { + App.getInstance().preferences.edit().putString(NETWORK_PING_TIMEOUT, pingTimeout).apply() + } + + + @JvmStatic fun getUser(): String? { return App.getInstance().preferences.getString(USER, null) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ff7840c7..4fc8da67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -353,6 +353,9 @@ Set image resolution Language Log out + Server Ping Timeout + Set Local URL timeout. Default 2 seconds. (Remote server will use this value x3 up to 10 seconds max.) + Set base timeout in seconds. Bitrate for downloads Bitrate in mobile Bitrate in Wi-Fi diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index fdf6938a..b992b961 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -17,6 +17,15 @@ android:key="scan_library" android:title="@string/settings_scan_title" /> + + From c1aed1a4c131a52477914f077a338100dc05193c Mon Sep 17 00:00:00 2001 From: eddyizm Date: Sun, 25 Jan 2026 11:34:16 -0800 Subject: [PATCH 2/2] chore: version/changelog/fastlane bumps --- CHANGELOG.md | 9 +++++++++ app/build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/15.txt | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/15.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 4109db03..f13629d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## Pending release +## What's Changed +## [4.9.3](https://github.com/eddyizm/tempo/releases/tag/v4.9.3) (2026-01-25) +* fix: Proper raw stream detection by @jaime-grj in https://github.com/eddyizm/tempus/pull/382 +* chore(i18n): Update Spanish translation by @jaime-grj in https://github.com/eddyizm/tempus/pull/381 +* feat: add configurable timeout by @eddyizm in https://github.com/eddyizm/tempus/pull/386 + + +**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.9.1...v4.9.3 + ## What's Changed ## [4.9.1](https://github.com/eddyizm/tempo/releases/tag/v4.9.1) (2026-01-24) * chore: i18n: Add Romanian translation (including locale_config this time!) by @DevMatei in https://github.com/eddyizm/tempus/pull/357 diff --git a/app/build.gradle b/app/build.gradle index 48dade71..cbd86950 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { minSdkVersion 24 targetSdk 35 - versionCode 14 - versionName '4.9.1' + versionCode 15 + versionName '4.9.3' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' javaCompileOptions { diff --git a/fastlane/metadata/android/en-US/changelogs/15.txt b/fastlane/metadata/android/en-US/changelogs/15.txt new file mode 100644 index 00000000..721a5e6c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/15.txt @@ -0,0 +1,3 @@ +fix: Proper raw stream detection +chore(i18n): Update Spanish translation +feat: add configurable timeout