From ceaffa254bdd25f3694ffe6becfb5cd99d04c996 Mon Sep 17 00:00:00 2001 From: cba Date: Thu, 9 Oct 2025 23:03:25 +0200 Subject: [PATCH 1/5] removed dropdown for album info --- .../tempo/ui/fragment/AlbumPageFragment.java | 8 --- .../main/res/layout/fragment_album_page.xml | 61 +++++-------------- 2 files changed, 14 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java index d0b417d7..3d3645ed 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java @@ -212,14 +212,6 @@ public class AlbumPageFragment extends Fragment implements ClickCallback { bind.animToolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp()); Objects.requireNonNull(bind.animToolbar.getOverflowIcon()).setTint(requireContext().getResources().getColor(R.color.titleTextColor, null)); - - bind.albumOtherInfoButton.setOnClickListener(v -> { - if (bind.albumDetailView.getVisibility() == View.GONE) { - bind.albumDetailView.setVisibility(View.VISIBLE); - } else if (bind.albumDetailView.getVisibility() == View.VISIBLE) { - bind.albumDetailView.setVisibility(View.GONE); - } - }); } private void initAlbumInfoTextButton() { diff --git a/app/src/main/res/layout/fragment_album_page.xml b/app/src/main/res/layout/fragment_album_page.xml index 411d5c1c..1be64373 100644 --- a/app/src/main/res/layout/fragment_album_page.xml +++ b/app/src/main/res/layout/fragment_album_page.xml @@ -59,23 +59,6 @@ app:layout_constraintStart_toStartOf="@+id/album_cover_image_view" app:layout_constraintTop_toBottomOf="@+id/album_cover_image_view" /> - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@+id/album_notes_textview" /> Date: Thu, 16 Oct 2025 21:54:53 -0700 Subject: [PATCH 2/5] fix: updated workflow for 32/64 bit apks --- .github/workflows/github_release.yml | 72 ++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/.github/workflows/github_release.yml b/.github/workflows/github_release.yml index d026f23a..b452576c 100644 --- a/.github/workflows/github_release.yml +++ b/.github/workflows/github_release.yml @@ -45,7 +45,7 @@ jobs: bash ./gradlew assembleTempoDebug bash ./gradlew assembleNotquitemyDebug - - name: Sign Tempo Release APKs + - name: Sign All Tempo Release APKs id: sign_tempo_release uses: r0adkll/sign-android-release@v1 with: @@ -54,10 +54,11 @@ jobs: alias: ${{ secrets.KEY_ALIAS_GITHUB }} keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }} keyPassword: ${{ secrets.KEY_PASSWORD_GITHUB }} + apkPath: "**/*.apk" env: BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOL_VERSION }} - - name: Sign NotQuiteMy Release APKs + - name: Sign All NotQuiteMy Release APKs id: sign_notquitemy_release uses: r0adkll/sign-android-release@v1 with: @@ -66,9 +67,38 @@ jobs: alias: ${{ secrets.KEY_ALIAS_GITHUB }} keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }} keyPassword: ${{ secrets.KEY_PASSWORD_GITHUB }} + apkPath: "**/*.apk" env: BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOL_VERSION }} + - name: Rename and Prepare APK Files + run: | + # Copy and rename tempo APKs + for file in app/build/outputs/apk/tempo/release/*.apk; do + if [[ $file == *"arm64-v8a"* ]]; then + cp "$file" "./app-tempo-arm64-v8a-release.apk" + echo "Created: app-tempo-arm64-v8a-release.apk" + elif [[ $file == *"armeabi-v7a"* ]]; then + cp "$file" "./app-tempo-armeabi-v7a-release.apk" + echo "Created: app-tempo-armeabi-v7a-release.apk" + fi + done + + # Copy and rename notquitemy APKs + for file in app/build/outputs/apk/notquitemy/release/*.apk; do + if [[ $file == *"arm64-v8a"* ]]; then + cp "$file" "./app-notquitemy-arm64-v8a-release.apk" + echo "Created: app-notquitemy-arm64-v8a-release.apk" + elif [[ $file == *"armeabi-v7a"* ]]; then + cp "$file" "./app-notquitemy-armeabi-v7a-release.apk" + echo "Created: app-notquitemy-armeabi-v7a-release.apk" + fi + done + + # List the created files for verification + echo "Final APK files:" + ls -la *.apk + - name: Create Release id: create_release uses: actions/create-release@v1 @@ -79,24 +109,44 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} - - name: Upload Release APKs + - name: Upload Tempo 64-bit Release APK uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{steps.sign_tempo_release.outputs.signedReleaseFile}} - asset_name: app-tempo-release.apk + asset_path: ./app-tempo-arm64-v8a-release.apk + asset_name: app-tempo-arm64-v8a-release.apk asset_content_type: application/vnd.android.package-archive - - name: Upload NotQuiteMy Release APK + - name: Upload Tempo 32-bit Release APK uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ${{steps.sign_notquitemy_release.outputs.signedReleaseFile}} - asset_name: app-notquitemy-release.apk + asset_path: ./app-tempo-armeabi-v7a-release.apk + asset_name: app-tempo-armeabi-v7a-release.apk + asset_content_type: application/vnd.android.package-archive + + - name: Upload NotQuiteMy 64-bit Release APK + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./app-notquitemy-arm64-v8a-release.apk + asset_name: app-notquitemy-arm64-v8a-release.apk + asset_content_type: application/vnd.android.package-archive + + - name: Upload NotQuiteMy 32-bit Release APK + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./app-notquitemy-armeabi-v7a-release.apk + asset_name: app-notquitemy-armeabi-v7a-release.apk asset_content_type: application/vnd.android.package-archive - name: Upload Debug APKs as artifacts @@ -113,6 +163,8 @@ jobs: with: name: release-apks path: | - ${{steps.sign_tempo_release.outputs.signedReleaseFile}} - ${{steps.sign_notquitemy_release.outputs.signedReleaseFile}} + ./app-tempo-arm64-v8a-release.apk + ./app-tempo-armeabi-v7a-release.apk + ./app-notquitemy-arm64-v8a-release.apk + ./app-notquitemy-armeabi-v7a-release.apk retention-days: 30 \ No newline at end of file From 079149c1d59cc320f803a56bcf5ed61e732076f0 Mon Sep 17 00:00:00 2001 From: cba Date: Sat, 18 Oct 2025 00:37:06 +0200 Subject: [PATCH 3/5] Revert "removed dropdown for album info" This reverts commit ceaffa254bdd25f3694ffe6becfb5cd99d04c996. --- .../tempo/ui/fragment/AlbumPageFragment.java | 8 +++ .../main/res/layout/fragment_album_page.xml | 61 ++++++++++++++----- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java index 3d3645ed..d0b417d7 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java @@ -212,6 +212,14 @@ public class AlbumPageFragment extends Fragment implements ClickCallback { bind.animToolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp()); Objects.requireNonNull(bind.animToolbar.getOverflowIcon()).setTint(requireContext().getResources().getColor(R.color.titleTextColor, null)); + + bind.albumOtherInfoButton.setOnClickListener(v -> { + if (bind.albumDetailView.getVisibility() == View.GONE) { + bind.albumDetailView.setVisibility(View.VISIBLE); + } else if (bind.albumDetailView.getVisibility() == View.VISIBLE) { + bind.albumDetailView.setVisibility(View.GONE); + } + }); } private void initAlbumInfoTextButton() { diff --git a/app/src/main/res/layout/fragment_album_page.xml b/app/src/main/res/layout/fragment_album_page.xml index 1be64373..411d5c1c 100644 --- a/app/src/main/res/layout/fragment_album_page.xml +++ b/app/src/main/res/layout/fragment_album_page.xml @@ -59,6 +59,23 @@ app:layout_constraintStart_toStartOf="@+id/album_cover_image_view" app:layout_constraintTop_toBottomOf="@+id/album_cover_image_view" /> + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/album_detail_view" /> Date: Sat, 18 Oct 2025 01:00:00 +0200 Subject: [PATCH 4/5] Added setting to make album detail visible --- .../tempo/ui/fragment/AlbumPageFragment.java | 4 ++++ .../java/com/cappielloantonio/tempo/util/Preferences.kt | 6 ++++++ app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/xml/global_preferences.xml | 6 ++++++ 4 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java index d0b417d7..d8fe82cc 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java @@ -220,6 +220,10 @@ public class AlbumPageFragment extends Fragment implements ClickCallback { bind.albumDetailView.setVisibility(View.GONE); } }); + + if(Preferences.showAlbumDetail()){ + bind.albumDetailView.setVisibility(View.VISIBLE); + } } private void initAlbumInfoTextButton() { 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 62a5e276..9baaca1c 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt @@ -76,6 +76,7 @@ object Preferences { private const val EQUALIZER_ENABLED = "equalizer_enabled" private const val EQUALIZER_BAND_LEVELS = "equalizer_band_levels" private const val MINI_SHUFFLE_BUTTON_VISIBILITY = "mini_shuffle_button_visibility" + private const val ALBUM_DETAIL = "album_detail" @JvmStatic fun getServer(): String? { @@ -638,4 +639,9 @@ object Preferences { if (parts.size < bandCount) return ShortArray(bandCount.toInt()) return ShortArray(bandCount.toInt()) { i -> parts[i].toShortOrNull() ?: 0 } } + + @JvmStatic + fun showAlbumDetail(): Boolean { + return App.getInstance().preferences.getBoolean(ALBUM_DETAIL, false) + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b8e025a..3834a4bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -507,4 +507,7 @@ Not supported on this device Equalizer Open the built-in equalizer + + Show album detail + If enabled, show the album details like genre, song count etc. on the album page diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index ad15349d..4610e255 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -110,6 +110,12 @@ android:summary="@string/settings_music_directory_summary" android:key="music_directory_section_visibility" /> + + From c3cce18600901c93981080e5dd9f73ae8585a556 Mon Sep 17 00:00:00 2001 From: eddyizm Date: Sat, 18 Oct 2025 17:16:11 -0700 Subject: [PATCH 5/5] fix: persist album sorting on resume --- .../ui/adapter/AlbumCatalogueAdapter.java | 6 +++ .../ui/fragment/AlbumCatalogueFragment.java | 48 +++++++++++++++---- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java index 69583a40..e2d0563e 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/adapter/AlbumCatalogueAdapter.java @@ -152,6 +152,12 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter albums) { + this.albumsFull = new ArrayList<>(albums); + this.albums = new ArrayList<>(albums); + notifyDataSetChanged(); + } + public void sort(String order) { if (albums == null) return; diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumCatalogueFragment.java index 4061cccd..2b04e7e6 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumCatalogueFragment.java @@ -3,6 +3,7 @@ package com.cappielloantonio.tempo.ui.fragment; import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -35,6 +36,10 @@ import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.Preferences; import com.cappielloantonio.tempo.viewmodel.AlbumCatalogueViewModel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + @OptIn(markerClass = UnstableApi.class) public class AlbumCatalogueFragment extends Fragment implements ClickCallback { private static final String TAG = "AlbumCatalogueFragment"; @@ -45,15 +50,33 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback { private AlbumCatalogueAdapter albumAdapter; private String currentSortOrder; + private List originalAlbums; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); + currentSortOrder = Preferences.getAlbumSortOrder(); initData(); } + @Override + public void onResume() { + super.onResume(); + String latestSort = Preferences.getAlbumSortOrder(); + + if (!latestSort.equals(currentSortOrder)) { + currentSortOrder = latestSort; + } + // Re-apply sort when returning to fragment + if (originalAlbums != null && currentSortOrder != null) { + applySortToAlbums(currentSortOrder); + } else { + Log.d(TAG, "onResume - Cannot re-sort, missing data"); + } + } + @Override public void onDestroy() { super.onDestroy(); @@ -118,8 +141,10 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback { albumAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY); bind.albumCatalogueRecyclerView.setAdapter(albumAdapter); albumCatalogueViewModel.getAlbumList().observe(getViewLifecycleOwner(), albums -> { - albumAdapter.setItems(albums); - applySavedSortOrder(); + originalAlbums = albums; + currentSortOrder = Preferences.getAlbumSortOrder(); + applySortToAlbums(currentSortOrder); + updateSortIndicator(); }); bind.albumCatalogueRecyclerView.setOnTouchListener((v, event) -> { @@ -130,6 +155,16 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback { bind.albumListSortImageView.setOnClickListener(view -> showPopupMenu(view, R.menu.sort_album_popup_menu)); } + private void applySortToAlbums(String sortOrder) { + if (originalAlbums == null) { + return; + } + albumAdapter.setItemsWithoutFilter(originalAlbums); + if (sortOrder != null) { + albumAdapter.sort(sortOrder); + } + } + private void initProgressLoader() { albumCatalogueViewModel.getLoadingStatus().observe(getViewLifecycleOwner(), isLoading -> { if (isLoading) { @@ -142,13 +177,6 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback { }); } - private void applySavedSortOrder() { - String savedSortOrder = Preferences.getAlbumSortOrder(); - currentSortOrder = savedSortOrder; - albumAdapter.sort(savedSortOrder); - updateSortIndicator(); - } - private void updateSortIndicator() { if (bind == null) return; @@ -235,8 +263,8 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback { if (newSortOrder != null) { currentSortOrder = newSortOrder; - albumAdapter.sort(newSortOrder); Preferences.setAlbumSortOrder(newSortOrder); + applySortToAlbums(newSortOrder); updateSortIndicator(); return true; }