From 59e2f4a7facdb9641c438c4e13adb3cb66928dcf Mon Sep 17 00:00:00 2001
From: Max <45262957+Sevinfolds@users.noreply.github.com>
Date: Fri, 7 Nov 2025 15:04:56 +0300
Subject: [PATCH 1/7] Update strings.xml
Adding new translation strings
---
app/src/main/res/values-ru/strings.xml | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 35e870d0..e677239d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -270,7 +270,13 @@
Сервер недоступен
Tempus — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный и созданный специально для Android.
О нас
+ Показать детали альбома
+ Если включено, отображать информацию об альбоме, например жанр, количество песен и т. д., на странице альбома.
+ Разрешить добавление дубликатов в плейлист
+ Если включено, дубликаты не будут проверяться при добавлении в плейлист..
Всегда на дисплее
+ Сортировать исполнителей по количеству альбомов
+ Если включено, сортировать исполнителей по количеству альбомов. Если отключено, сортировать по имени.
Формат перекодирования
Если этот параметр включен, Tempus не будет принудительно загружать трек с настройками перекодирования, указанными ниже.
Установите приоритет настроек сервера, используемых для потоковой передачи при загрузке
@@ -319,8 +325,12 @@
Таймер синхронизации
Если этот параметр включен, пользователь будет иметь возможность сохранять свою очередь воспроизведения и загружать состояние при открытии приложения.
Синхронизировать очередь воспроизведения для этого пользователя
+ Показать кнопку Shuffle
+ Если включено, показывать кнопку перемешивания, убрать сердечко в мини-плеере
Показать радио
Если включено, показывать раздел радио. Перезапустите приложение, чтобы оно вступило в силу.
+ Автоматическая загрузка текстов песен
+ Автоматически сохранять тексты песен, когда они доступны, чтобы их можно было просматривать в автономном режиме.
Установите режим усиления воспроизведения
Закругленные углы
Размер углов
@@ -346,6 +356,9 @@
Синхронизировать помеченные альбомы для использования в автономном режиме.
Если этот параметр включен, помеченные треки будут загружены для использования в автономном режиме.
Синхронизировать помеченные треки для использования в автономном режиме.
+ Синхронизировать избранных исполнителей для использования офлайн
+ Присоединяйтесь к обсуждениям в сообществе и оказывайте поддержку
+ Поддержка пользователей
Тема
Данные
Общий
From 6448cc598d64210f3db52856d57409716a523a27 Mon Sep 17 00:00:00 2001
From: eddyizm
Date: Mon, 10 Nov 2025 10:53:16 -0800
Subject: [PATCH 2/7] fix: disallow duplicate songs in queue
---
.../tempo/repository/QueueRepository.java | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/com/cappielloantonio/tempo/repository/QueueRepository.java b/app/src/main/java/com/cappielloantonio/tempo/repository/QueueRepository.java
index afeca995..6b3d6252 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/repository/QueueRepository.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/repository/QueueRepository.java
@@ -121,6 +121,15 @@ public class QueueRepository {
}
}
+ private boolean isMediaInQueue(List queue, Child media) {
+ if (queue == null || media == null) return false;
+
+ return queue.stream().anyMatch(queueItem ->
+ queueItem != null && media.getId() != null &&
+ queueItem.getId().equals(media.getId())
+ );
+ }
+
public void insertAll(List toAdd, boolean reset, int afterIndex) {
try {
List media = new ArrayList<>();
@@ -134,8 +143,14 @@ public class QueueRepository {
media = getMediaThreadSafe.getMedia();
}
- for (int i = 0; i < toAdd.size(); i++) {
- Queue queueItem = new Queue(toAdd.get(i));
+ List filteredToAdd = toAdd;
+ final List finalMedia = media;
+ filteredToAdd = toAdd.stream()
+ .filter(child -> !isMediaInQueue(finalMedia, child))
+ .collect(Collectors.toList());
+
+ for (int i = 0; i < filteredToAdd.size(); i++) {
+ Queue queueItem = new Queue(filteredToAdd.get(i));
media.add(afterIndex + i, queueItem);
}
From 0be309fb223c2823e98008bd20bcc468f1ffc875 Mon Sep 17 00:00:00 2001
From: eddyizm
Date: Tue, 11 Nov 2025 11:12:54 -0800
Subject: [PATCH 3/7] chore: updated pending release notes
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 76ba8bb3..6a78930b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,8 @@
# Changelog
## Pending release..
+* chore: Update strings.xml by @Sevinfolds in https://github.com/eddyizm/tempus/pull/249
+* fix: disallow duplicate songs in queue by @eddyizm in https://github.com/eddyizm/tempus/pull/252
## [4.2.0](https://github.com/eddyizm/tempo/releases/tag/v4.2.0) (2025-11-09)
## What's Changed
From 2c6287405e0ddc02294fc1b9d6c0932d38bc3f2d Mon Sep 17 00:00:00 2001
From: eddyizm
Date: Tue, 11 Nov 2025 12:00:05 -0800
Subject: [PATCH 4/7] fix:github release check
---
app/build.gradle | 2 +-
.../com/cappielloantonio/tempo/github/utils/UpdateUtil.java | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index d883de1b..0bd1e8a1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,7 +11,7 @@ android {
targetSdk 35
versionCode 5
- versionName '4.2.0'
+ versionName '4.2.1'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
javaCompileOptions {
diff --git a/app/src/main/java/com/cappielloantonio/tempo/github/utils/UpdateUtil.java b/app/src/main/java/com/cappielloantonio/tempo/github/utils/UpdateUtil.java
index a6baea99..a4e61fb3 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/github/utils/UpdateUtil.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/github/utils/UpdateUtil.java
@@ -7,10 +7,11 @@ public class UpdateUtil {
public static boolean showUpdateDialog(LatestRelease release) {
if (release.getTagName() == null) return false;
+ String remoteTag = release.getTagName().replaceAll("^\\D+", "");
try {
String[] local = BuildConfig.VERSION_NAME.split("\\.");
- String[] remote = release.getTagName().split("\\.");
+ String[] remote = remoteTag.split("\\.");
for (int i = 0; i < local.length; i++) {
int localPart = Integer.parseInt(local[i]);
From 6124ec66f3405ff9c0a2c72f59e36258f334e973 Mon Sep 17 00:00:00 2001
From: eddyizm
Date: Tue, 11 Nov 2025 18:06:01 -0800
Subject: [PATCH 5/7] feat: added setting to disable github check and
completely disable/hide when using the degoogled version
---
.../tempo/ui/activity/MainActivity.java | 2 +-
.../tempo/ui/dialog/GithubTempoUpdateDialog.java | 2 +-
.../tempo/ui/fragment/SettingsFragment.java | 8 ++++++++
.../com/cappielloantonio/tempo/util/Preferences.kt | 11 +++++++++--
app/src/main/res/values/strings.xml | 3 +++
app/src/main/res/xml/global_preferences.xml | 12 ++++++++++++
6 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java b/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java
index b311a627..156805a2 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/activity/MainActivity.java
@@ -438,7 +438,7 @@ public class MainActivity extends BaseActivity {
}
private void checkTempoUpdate() {
- if (BuildConfig.FLAVOR.equals("tempus") && Preferences.showTempoUpdateDialog()) {
+ if (BuildConfig.FLAVOR.equals("tempus") && Preferences.isGithubUpdateEnabled() && Preferences.showTempusUpdateDialog()) {
mainViewModel.checkTempoUpdate().observe(this, latestRelease -> {
if (latestRelease != null && UpdateUtil.showUpdateDialog(latestRelease)) {
GithubTempoUpdateDialog dialog = new GithubTempoUpdateDialog(latestRelease);
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/GithubTempoUpdateDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/GithubTempoUpdateDialog.java
index 6ee951a0..55e07012 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/GithubTempoUpdateDialog.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/GithubTempoUpdateDialog.java
@@ -55,7 +55,7 @@ public class GithubTempoUpdateDialog extends DialogFragment {
});
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> {
- Preferences.setTempoUpdateReminder();
+ Preferences.setTempusUpdateReminder();
Objects.requireNonNull(getDialog()).dismiss();
});
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 2dd556df..bbbdecc2 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
@@ -29,6 +29,7 @@ import androidx.navigation.NavOptions;
import androidx.navigation.fragment.NavHostFragment;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
@@ -77,6 +78,13 @@ public class SettingsFragment extends PreferenceFragmentCompat {
result -> {}
);
+ if (!BuildConfig.FLAVOR.equals("tempus")) {
+ PreferenceCategory githubUpdateCategory = findPreference("settings_github_update_category_key");
+ if (githubUpdateCategory != null) {
+ getPreferenceScreen().removePreference(githubUpdateCategory);
+ }
+ }
+
directoryPickerLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
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 42ffa524..e404c29c 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt
+++ b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt
@@ -70,6 +70,7 @@ object Preferences {
private const val SONG_RATING_PER_ITEM = "song_rating_per_item"
private const val RATING_PER_ITEM = "rating_per_item"
private const val NEXT_UPDATE_CHECK = "next_update_check"
+ private const val GITHUB_UPDATE_CHECK = "github_update_check"
private const val CONTINUOUS_PLAY = "continuous_play"
private const val LAST_INSTANT_MIX = "last_instant_mix"
private const val ALLOW_PLAYLIST_DUPLICATES = "allow_playlist_duplicates"
@@ -574,15 +575,21 @@ object Preferences {
return App.getInstance().preferences.getBoolean(RATING_PER_ITEM, false)
}
+
@JvmStatic
- fun showTempoUpdateDialog(): Boolean {
+ fun isGithubUpdateEnabled(): Boolean {
+ return App.getInstance().preferences.getBoolean(GITHUB_UPDATE_CHECK, true)
+ }
+
+ @JvmStatic
+ fun showTempusUpdateDialog(): Boolean {
return App.getInstance().preferences.getLong(
NEXT_UPDATE_CHECK, 0
) + 86400000 < System.currentTimeMillis()
}
@JvmStatic
- fun setTempoUpdateReminder() {
+ fun setTempusUpdateReminder() {
App.getInstance().preferences.edit().putLong(NEXT_UPDATE_CHECK, System.currentTimeMillis()).apply()
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 80af298c..25dcec94 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -331,6 +331,9 @@
Follow the development
Github
https://github.com/eddyizm/tempus/discussions
+ Updates
+ Check github for release updates
+ If using the github version, by default app will check for new apk release. Toggle to disable automatic github checks
Join community discussions and support
User support
Scanning: counting %1$d tracks
diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml
index a8caeb8b..fcd65268 100644
--- a/app/src/main/res/xml/global_preferences.xml
+++ b/app/src/main/res/xml/global_preferences.xml
@@ -400,6 +400,18 @@
app:useSimpleSummaryProvider="true" />
+
+
+
+
+
Date: Wed, 12 Nov 2025 09:45:07 -0500
Subject: [PATCH 6/7] Fixed crash when viewing share
---
.../bottomsheetdialog/ShareBottomSheetDialog.java | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ShareBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ShareBottomSheetDialog.java
index 62f38ecd..90612f60 100644
--- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ShareBottomSheetDialog.java
+++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ShareBottomSheetDialog.java
@@ -17,6 +17,7 @@ import androidx.media3.common.util.UnstableApi;
import com.cappielloantonio.tempo.R;
import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.subsonic.models.Share;
+import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.ui.dialog.ShareUpdateDialog;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.UIUtil;
@@ -24,6 +25,8 @@ import com.cappielloantonio.tempo.viewmodel.HomeViewModel;
import com.cappielloantonio.tempo.viewmodel.ShareBottomSheetViewModel;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+import java.util.List;
+
@UnstableApi
public class ShareBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener {
@@ -50,8 +53,15 @@ public class ShareBottomSheetDialog extends BottomSheetDialogFragment implements
private void init(View view) {
ImageView shareCover = view.findViewById(R.id.share_cover_image_view);
+ String coverArtId = null;
+ List entries = shareBottomSheetViewModel.getShare().getEntries();
+
+ if (entries != null && !entries.isEmpty()) {
+ coverArtId = entries.get(0).getCoverArtId();
+ }
+
CustomGlideRequest.Builder
- .from(requireContext(), shareBottomSheetViewModel.getShare().getEntries().get(0).getCoverArtId(), CustomGlideRequest.ResourceType.Unknown)
+ .from(requireContext(), coverArtId, CustomGlideRequest.ResourceType.Unknown)
.build()
.into(shareCover);
From 3c6c240b9d8eb5152f89a209b8d8c54fb3650fbb Mon Sep 17 00:00:00 2001
From: eddyizm
Date: Wed, 12 Nov 2025 21:53:35 -0800
Subject: [PATCH 7/7] chore: more pending release updates
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a78930b..92f724f8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,8 @@
## Pending release..
* chore: Update strings.xml by @Sevinfolds in https://github.com/eddyizm/tempus/pull/249
* fix: disallow duplicate songs in queue by @eddyizm in https://github.com/eddyizm/tempus/pull/252
+* fix: github release check by @eddyizm in https://github.com/eddyizm/tempus/pull/253
+* fix: Fixed crash when viewing share by @drakeerv in https://github.com/eddyizm/tempus/pull/255
## [4.2.0](https://github.com/eddyizm/tempo/releases/tag/v4.2.0) (2025-11-09)
## What's Changed