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