Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
322 commits
Select commit Hold shift + click to select a range
f76ebce
Use better default position on windows before window managment loads.
Komodo5197 Mar 24, 2026
12a5d81
use controller pattern for managing sort and filter overrides
Chaphasilor Mar 29, 2026
2d9d914
fix wrong ref in nowplayingbar, delete unused widget
Chaphasilor Mar 29, 2026
975c781
Merge remote-tracking branch 'origin/redesign' into redesign-homescreen
Chaphasilor Mar 29, 2026
b5707e1
Attempt to unify use of an actual sort controller in all music screen…
Komodo5197 Mar 29, 2026
2a1b98b
add new quick actions and section preset types
Chaphasilor Apr 3, 2026
977e0b1
add new section presets, misc improvements
Chaphasilor Apr 5, 2026
497c2d1
add providers for getting user and server info
Chaphasilor Apr 12, 2026
b6c02e4
add fallback text for coverless items with grid text disabled
Chaphasilor Apr 14, 2026
a0b6c92
initial implementation of new image size preset approach
Chaphasilor Apr 19, 2026
e101b2e
Fix grid layout and grid size setting.
Komodo5197 May 6, 2026
f912840
Reduce some font weights.
Komodo5197 May 6, 2026
33497a8
Improve music screen header tracking of sync processing status.
Komodo5197 May 6, 2026
639333e
Improve responsiveness to system insets. Improve behavior on very na…
Komodo5197 May 8, 2026
968d843
Clean up music screen arguments a bit. Fix sort and filter menu stac…
Komodo5197 May 9, 2026
8a95a56
Show active filters in filter row.
Komodo5197 May 9, 2026
d771de4
Allow dragging home screen sections on desktop. Make home section he…
Komodo5197 May 10, 2026
12c8dbc
Fix clipping in section header swipe backgrounds. Swap offline icon.…
Komodo5197 May 11, 2026
1e1a5d4
Separate config variables in home screen section editor. Get more co…
Komodo5197 May 12, 2026
9ac8153
Add initial code for home section right click menu. Change behavior …
Komodo5197 May 13, 2026
342972e
Get home section right click menu functioning properly, including pla…
Komodo5197 May 13, 2026
d243619
Clean up and enforce usage of sort config resolving. Allow direct di…
Komodo5197 May 13, 2026
87b4cc4
V1 of refactor to pass around more generic and robust playable items …
Komodo5197 May 16, 2026
6e6c764
V2 of playable refactor. Focus on switching over playables, with all…
Komodo5197 May 17, 2026
c871c60
Add some localizations.
Komodo5197 May 17, 2026
2910516
More localizations.
Komodo5197 May 17, 2026
27bd9f4
Rearrange music screen providers. Break out jellyfin collection chil…
Komodo5197 May 19, 2026
62a724d
Add download button for collection downloads - does not include actua…
Komodo5197 May 20, 2026
2077c60
Add artist/genre playables. Add content type selector for artists/ge…
Komodo5197 May 21, 2026
fea0f4b
Hide sections with invalid offline sorts. Add all library selector t…
Komodo5197 May 21, 2026
8a78cc3
Merge branch 'redesign' of https://github.com/jmshrv/finamp into rede…
Komodo5197 May 23, 2026
e471b02
Merge fixes.
Komodo5197 May 23, 2026
3fbfaeb
Make all default home sections presets. Add some special downloads t…
Komodo5197 May 23, 2026
d6506c9
Reducer source passing in playables. Allow long press to pass throug…
Komodo5197 May 26, 2026
fddd1c3
Fix default playlist screen sort order.
Komodo5197 May 26, 2026
ad168b3
Flutter 3.44 upgrade automatic migrations
Chaphasilor May 26, 2026
593907a
fix non-Material ListTile on colored widget warnings
Chaphasilor May 26, 2026
2992ce3
disable swipe gesture for home screen section headers
Chaphasilor May 26, 2026
eda3407
use condensed header for section menu, only show artwork when meaningful
Chaphasilor May 26, 2026
19142f7
update codgen
Chaphasilor May 26, 2026
3e083d0
Simplyfy enum name localization functions. Rework home section stora…
Komodo5197 May 27, 2026
75959d3
Merge branch 'redesign-homescreen' of https://github.com/jmshrv/finam…
Komodo5197 May 27, 2026
6a4504e
Update codegen. Merge fixes.
Komodo5197 May 27, 2026
d57b766
hide genre filter chip on genre show-all screens.
Komodo5197 May 27, 2026
81191f0
Genre screen bugfixes.
Komodo5197 May 27, 2026
b1c403a
Break up home settings file.
Komodo5197 May 27, 2026
f22f769
Fix play item quickaction with genre.
Komodo5197 May 27, 2026
51b3fb1
Add infrastructure for delayed PlayableSlice resolving, and implement…
Komodo5197 May 29, 2026
386221e
add home_widget
call-me-maple May 11, 2026
92358c3
add circluar widget
call-me-maple May 27, 2026
59ea698
seperate PlayerAction class
call-me-maple May 28, 2026
27d9ac1
add RectangularWidget
call-me-maple May 28, 2026
385d79b
seperate out reused compostables
call-me-maple May 28, 2026
f07fff4
rename PlayerAction to MediaControls
call-me-maple May 28, 2026
facb216
add repeat mode control
call-me-maple May 28, 2026
1041235
add now playing info
call-me-maple May 28, 2026
a073ce5
remove unused imports
call-me-maple May 29, 2026
b901494
remove un-used box
call-me-maple May 29, 2026
65e4aa9
add static widget preview
call-me-maple May 29, 2026
82eabc7
fix bug with favorite
call-me-maple May 29, 2026
cc1712e
restructure home_screen_widget.dart
call-me-maple May 29, 2026
975e530
add fallback menu for restorable queue without base item, fix render …
Chaphasilor May 30, 2026
8393e9a
use ToggleableListTile for library picker in drawer
Chaphasilor May 30, 2026
f578c6a
Merge branch 'UnicornsOnLSD:redesign' into redesign
call-me-maple May 31, 2026
bd9b22a
add contentDescription strings
call-me-maple May 31, 2026
ab617d0
finish contentDescriptions
call-me-maple May 31, 2026
84b3399
Switch to paging genres.
Komodo5197 May 31, 2026
f8d8a79
Merge remote-tracking branch 'upstream/redesign-homescreen' into rede…
Komodo5197 May 31, 2026
210a371
remove MediaItem listner
call-me-maple Jun 1, 2026
e5e6336
Translated using Weblate (French)
Mar 17, 2026
e00d86b
Translated using Weblate (Korean)
libhwang50 Mar 17, 2026
a92c981
Translated using Weblate (Greek)
bladestech Mar 18, 2026
cbb7044
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Mar 20, 2026
af55a11
Translated using Weblate (Arabic)
Mar 21, 2026
e906fe3
Translated using Weblate (Czech)
Mar 23, 2026
921a41f
Translated using Weblate (Spanish)
Mar 30, 2026
b415ea8
Translated using Weblate (Dutch)
catman-hugo Apr 13, 2026
161cb45
Translated using Weblate (French)
Mickael81 Apr 15, 2026
784c89c
Translated using Weblate (Portuguese)
Am-Monteiro Apr 14, 2026
0d751bc
Translated using Weblate (Italian)
antoniocariaa Apr 15, 2026
0d7920e
Translated using Weblate (Czech)
Apr 14, 2026
952302b
Translated using Weblate (Danish)
Williamjensen17 Apr 16, 2026
1c3165c
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Apr 16, 2026
f3256f0
Translated using Weblate (Hebrew)
snil4 Apr 19, 2026
519ca03
Translated using Weblate (Indonesian)
arifpedia Apr 19, 2026
0f7dae6
Translated using Weblate (Danish)
Williamjensen17 Apr 20, 2026
5c8a089
Translated using Weblate (Finnish)
bsfreq Apr 20, 2026
6294970
Translated using Weblate (Dutch)
Apr 24, 2026
6e73d62
Translated using Weblate (Catalan)
blacx0 Apr 24, 2026
b6c352e
Translated using Weblate (Catalan)
MarcSerraPeralta Apr 25, 2026
2e4d8b5
Translated using Weblate (Spanish)
Apr 28, 2026
e2e7ad0
Translated using Weblate (Japanese)
tkymmm Apr 30, 2026
47435f6
Translated using Weblate (Dutch)
May 14, 2026
6716c9b
Translated using Weblate (Portuguese)
SantosSi May 16, 2026
49c2025
Translated using Weblate (Portuguese)
Am-Monteiro May 17, 2026
8b9aca2
Translated using Weblate (French)
Nausi-llon May 18, 2026
6658718
Translated using Weblate (Japanese)
tkymmm May 25, 2026
68417de
Translated using Weblate (Japanese)
tkymmm May 25, 2026
6e312f6
Translated using Weblate (Portuguese)
Am-Monteiro May 25, 2026
69084e7
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 May 26, 2026
e5d86ef
Translated using Weblate (French)
Mickael81 May 25, 2026
8ef5249
Translated using Weblate (Czech)
May 26, 2026
c26edb6
Translated using Weblate (Danish)
Williamjensen17 May 28, 2026
5b18a60
Translated using Weblate (Swedish)
May 29, 2026
34169e7
Translated using Weblate (Swedish)
jackssrt May 29, 2026
93810d1
Translated using Weblate (Japanese)
Loco-CTO Jun 1, 2026
170b287
Translated using Weblate (Japanese)
tkymmm Jun 2, 2026
ffc3fc4
match main player's icons
call-me-maple Jun 2, 2026
6bed25d
update preview image
call-me-maple Jun 2, 2026
ee85a39
queue restore menu improvements, review fixes
Chaphasilor Jun 2, 2026
06df35a
Merge remote-tracking branch 'origin/redesign' into redesign-homescreen
Chaphasilor Jun 2, 2026
032f5e1
code gen & formatting
Chaphasilor Jun 2, 2026
3e52208
finish up carplay helper merge into home screen PR (fix build)
Chaphasilor Jun 2, 2026
e14a20d
fix Jellyfin collections not being selectable as a home screen section
Chaphasilor Jun 2, 2026
4c2873a
handle collections more gracefully, add info about ignored "show text…
Chaphasilor Jun 2, 2026
4662cab
remove playback order subscription
call-me-maple Jun 2, 2026
09ecc5e
restructure _updatePlaybackState
call-me-maple Jun 2, 2026
efc07b2
Translated using Weblate (Portuguese)
Am-Monteiro Jun 2, 2026
48fae3b
Translated using Weblate (Czech)
Jun 2, 2026
5ad1915
pause listners when no widgets installed
call-me-maple Jun 3, 2026
3ffb191
Tweak library selector UI. Add warning ofr offline sortBy fallback.
Komodo5197 Jun 4, 2026
85fcc94
run splash screen script (should fix build)
Chaphasilor Jun 4, 2026
0ada48d
Translated using Weblate (French)
Mickael81 Jun 3, 2026
6078513
add (Jellyfin) collection menu, collection queue sources
Chaphasilor Jun 4, 2026
94bb488
Add MPRIS volume control. Ignore premiereDate if year is one.
Komodo5197 Jun 5, 2026
1ae7be0
Refresh user info with home tab.
Komodo5197 Jun 5, 2026
209ae13
Added translation using Weblate (Filipino)
cookieflips Jun 7, 2026
a2e5e6a
Add all playlists special download on home screen.
Komodo5197 Jun 7, 2026
1c81942
fix favorite filter not applying to genres
Chaphasilor Jun 7, 2026
66e849f
add missing genre favorite filters in more places
Chaphasilor Jun 7, 2026
ac2ae8e
Add better error state display on music screen + home screen.
Komodo5197 Jun 7, 2026
0b70376
Merge remote-tracking branch 'upstream/redesign-homescreen' into rede…
Komodo5197 Jun 7, 2026
eddb6bb
add independent home screen tile size
Chaphasilor Jun 7, 2026
3b765d6
allow changing the quick action type in-place via the home screen set…
Chaphasilor Jun 7, 2026
87710eb
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 8, 2026
29d3d62
Translated using Weblate (Filipino)
cookieflips Jun 8, 2026
751cf56
Translated using Weblate (Japanese)
tkymmm Jun 8, 2026
af55e34
Translated using Weblate (Finnish)
bsfreq Jun 8, 2026
7e00300
Translated using Weblate (Catalan)
MarcSerraPeralta Jun 8, 2026
5a0e544
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 8, 2026
8af864c
Translated using Weblate (Japanese)
xu3u04u48 Jun 8, 2026
ef2f84b
Switch primary menu to drawer. Make drawer wider if screen is large …
Komodo5197 Jun 9, 2026
3d10801
better quick action text alignment for multi-line, add settings reset…
Chaphasilor Jun 9, 2026
b2d9d7c
grid sizing improvements (scales, labels, default sizes)
Chaphasilor Jun 9, 2026
0fcca01
update default home screen config roughly based on survey results
Chaphasilor Jun 9, 2026
7d41af4
slightly increase drawer scrim
Chaphasilor Jun 9, 2026
7c746de
re-disable size slider detents on desktop, make column count exactnes…
Chaphasilor Jun 10, 2026
1b9f9fb
embed sort&filter menu directly into home screen section editor menu
Chaphasilor Jun 10, 2026
3076904
Reuse link handling code for android intents. Add some additional li…
Komodo5197 Jun 11, 2026
6597161
remove apply button for remove-only embedded sort&filter menu, run co…
Chaphasilor Jun 11, 2026
08c8e8f
Switch url to surprisemix
Komodo5197 Jun 11, 2026
d555088
Clean up some TODOs.
Komodo5197 Jun 12, 2026
308dbda
update grid size presets
Chaphasilor Jun 13, 2026
a36e6f9
update sort order icons (and character filter)
Chaphasilor Jun 13, 2026
a648d13
only toggle sort order on icon tap, tapping the label opens the menu
Chaphasilor Jun 13, 2026
a30b00e
avoid rebuild when editing text in section editor, add button padding…
Chaphasilor Jun 13, 2026
8d12e8b
explain sync states in drawer
Chaphasilor Jun 13, 2026
e086339
remove forceText argument
Chaphasilor Jun 13, 2026
2946134
move isFavorite parameter check into dedicated method
Chaphasilor Jun 13, 2026
fb26dc4
move genre filter into artist genre info row
Chaphasilor Jun 13, 2026
c3ad8ee
Merge pull request #1141 from UnicornsOnLSD/redesign-homescreen
Chaphasilor Jun 13, 2026
c3b39d8
Merge pull request #1559 from weblate/weblate-finamp-finamp
Chaphasilor Jun 13, 2026
f7f9653
Update translation files
weblate Jun 13, 2026
66bffd0
fix home screen grid tile translation token
Chaphasilor Jun 13, 2026
8a1ab23
Address some comments on home screen PR. Improve followup queue item…
Komodo5197 Jun 13, 2026
f852d22
bump version to 0.9.24, documentation updates
Chaphasilor Jun 13, 2026
58217a8
Prevent display of playback buttons for unavailable home sections. H…
Komodo5197 Jun 14, 2026
24d0db3
hide non-genre filters for artist genre filter info
Chaphasilor Jun 14, 2026
bc8da5b
Merge pull request #1645 from weblate/weblate-finamp-finamp
Chaphasilor Jun 14, 2026
684172e
Translated using Weblate (Portuguese)
Am-Monteiro Jun 14, 2026
4ed23e4
Translated using Weblate (German)
lukaslindnermusic Jun 13, 2026
663d0b6
Translated using Weblate (Hebrew)
snil4 Jun 14, 2026
73ccb0b
Translated using Weblate (Chinese (Traditional Han script))
felix920506 Jun 13, 2026
accc60d
Translated using Weblate (Turkish)
ios7jbpro Jun 13, 2026
6d19796
Translated using Weblate (Finnish)
bsfreq Jun 13, 2026
de81ca5
fix render error in home screen queue tile on failed request
Chaphasilor Jun 14, 2026
76631d6
fix render error in queue list tile on failed request
Chaphasilor Jun 14, 2026
f218cb3
improve genre filter display on artist info, show other genres behind…
Chaphasilor Jun 14, 2026
f390f4f
Merge pull request #1647 from weblate/weblate-finamp-finamp
Chaphasilor Jun 14, 2026
53ee77d
Translated using Weblate (Tamil)
TamilNeram Jun 14, 2026
730b670
Translated using Weblate (Portuguese)
Am-Monteiro Jun 14, 2026
8314780
Merge pull request #1648 from weblate/weblate-finamp-finamp
Chaphasilor Jun 14, 2026
c40e548
Translated using Weblate (English)
jackssrt Jun 15, 2026
8078248
Translated using Weblate (Swedish)
jackssrt Jun 15, 2026
e4a886e
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 15, 2026
304560f
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 15, 2026
b4212ef
Translated using Weblate (French)
Jun 15, 2026
fc32a51
Translated using Weblate (French)
jackssrt Jun 15, 2026
20fb2aa
Translated using Weblate (Czech)
Jun 15, 2026
4833abc
Translated using Weblate (Finnish)
bsfreq Jun 16, 2026
bb731a3
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 16, 2026
0cbae76
Translated using Weblate (French)
jackssrt Jun 16, 2026
85bd696
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 16, 2026
f7e881f
Update iOS localisations
UnicornsOnLSD Jun 16, 2026
d51b567
Merge pull request #1650 from weblate/weblate-finamp-finamp
UnicornsOnLSD Jun 16, 2026
ece5ffd
move integration tests to run after tag release artifact upload
Chaphasilor Jun 17, 2026
93ed870
pin flutter to 3.41.9 to avoid startup issues on Flutter 3.44
Chaphasilor Jun 18, 2026
13b4c61
fix incorrectly using album images for tracks in Instant Mixes (or si…
Chaphasilor Jun 28, 2026
29efa37
Fix empty Genres tab on Jellyfin 10.10/10.11 (#1653)
kontell Jun 29, 2026
b394dc4
allow right-clicking sort & filter row to open menu
Chaphasilor Jul 1, 2026
0c5c936
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 17, 2026
4d7423e
Translated using Weblate (French)
jackssrt Jun 16, 2026
2cba5ea
Translated using Weblate (French)
Mickael81 Jun 16, 2026
1408528
Translated using Weblate (Swedish)
jackssrt Jun 16, 2026
baf5aea
Translated using Weblate (Finnish)
bsfreq Jun 16, 2026
75f3071
Translated using Weblate (French)
xu3u04u48 Jun 17, 2026
13bb87d
Translated using Weblate (Chinese (Simplified Han script))
snowdropQwQ Jun 19, 2026
fc7a699
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 19, 2026
4198b37
Translated using Weblate (Chinese (Simplified Han script))
snowdropQwQ Jun 19, 2026
9bef57e
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 19, 2026
0da6753
Translated using Weblate (French)
Essetekip Jun 20, 2026
d7be9ee
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 21, 2026
6615b40
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 21, 2026
b50a192
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 21, 2026
30046ac
Translated using Weblate (Chinese (Traditional Han script))
xu3u04u48 Jun 21, 2026
618d6d9
Translated using Weblate (Finnish)
bsfreq Jun 21, 2026
ce69e06
Translated using Weblate (Polish)
Jun 22, 2026
1ab1064
Translated using Weblate (Italian)
Jun 24, 2026
54c0eca
Translated using Weblate (Indonesian)
arifpedia Jun 26, 2026
2bd4b33
Translated using Weblate (Korean)
Jun 29, 2026
810357d
Translated using Weblate (Catalan)
MarcSerraPeralta Jun 30, 2026
eb87ca3
Translated using Weblate (Korean)
Jun 29, 2026
25b9653
Translated using Weblate (Spanish)
Jul 1, 2026
e9d8100
Translated using Weblate (Spanish)
Jul 1, 2026
bcee89b
Translated using Weblate (Catalan)
MarcSerraPeralta Jul 1, 2026
5c4346f
Update isFavorite filter comment with behavior for 10.10 and 12.0
Chaphasilor Jul 2, 2026
b2e05d0
Merge pull request #1670 from kontell/fix/genres-isfavorite-500
Chaphasilor Jul 2, 2026
0fe6dc9
Merge pull request #1654 from weblate/weblate-finamp-finamp
Chaphasilor Jul 2, 2026
031e837
add home_widget
call-me-maple May 11, 2026
c639e7e
add circluar widget
call-me-maple May 27, 2026
286b9eb
seperate PlayerAction class
call-me-maple May 28, 2026
cb0b91e
add RectangularWidget
call-me-maple May 28, 2026
b9e2d97
seperate out reused compostables
call-me-maple May 28, 2026
8d42334
rename PlayerAction to MediaControls
call-me-maple May 28, 2026
098706a
add repeat mode control
call-me-maple May 28, 2026
f1a1cc0
add now playing info
call-me-maple May 28, 2026
1a49fa1
remove unused imports
call-me-maple May 29, 2026
6edbf56
remove un-used box
call-me-maple May 29, 2026
a33d769
add static widget preview
call-me-maple May 29, 2026
369528f
fix bug with favorite
call-me-maple May 29, 2026
2e74b13
restructure home_screen_widget.dart
call-me-maple May 29, 2026
060b749
add contentDescription strings
call-me-maple May 31, 2026
0209322
finish contentDescriptions
call-me-maple May 31, 2026
caf3c51
remove MediaItem listner
call-me-maple Jun 1, 2026
9f8b0fb
match main player's icons
call-me-maple Jun 2, 2026
be0e5f6
update preview image
call-me-maple Jun 2, 2026
3d936db
remove playback order subscription
call-me-maple Jun 2, 2026
7550556
restructure _updatePlaybackState
call-me-maple Jun 2, 2026
dcc3a70
pause listners when no widgets installed
call-me-maple Jun 3, 2026
df57640
Merge remote-tracking branch 'refs/remotes/origin/redesign' into rede…
call-me-maple Jul 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 30 additions & 29 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -225,19 +225,20 @@ jobs:
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build libgtk-3-dev libmpv-dev

- name: Determine Flutter stable version
uses: subosito/flutter-action@v2
id: flutter-version
with:
architecture: 'x64'
channel: 'stable'
dry-run: true
# - name: Determine Flutter stable version
# uses: subosito/flutter-action@v2
# id: flutter-version
# with:
# architecture: 'x64'
# channel: 'stable'
# dry-run: true
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
# Prebuilt ARM linux builds are not provided, so build flutter from source
channel: master
flutter-version: "${{ steps.flutter-version.outputs.VERSION }}"
# flutter-version: "${{ steps.flutter-version.outputs.VERSION }}"
flutter-version: "3.41.9"
cache: false
pub-cache: true
# Include arch as linux aarch64 include isar overriding
Expand Down Expand Up @@ -308,6 +309,14 @@ jobs:
path: ${{ env.SHA_NAME }}
compression-level: 0 # no compression

- name: Upload release archive
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
uses: alexellis/upload-assets@0.4.1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
asset_paths: '["./${{ env.TAR_NAME }}", "./${{ env.SHA_NAME }}"]'

- name: Run Integration Tests
if: *integration_if
run: |
Expand All @@ -320,14 +329,6 @@ jobs:
fi
exit $exitcode

- name: Upload release archive
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
uses: alexellis/upload-assets@0.4.1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
asset_paths: '["./${{ env.TAR_NAME }}", "./${{ env.SHA_NAME }}"]'

build-windows:
name: Build for Windows
runs-on: windows-latest
Expand Down Expand Up @@ -394,19 +395,6 @@ jobs:
path: ./${{ env.BASE_NAME }}.msix
compression-level: 0 # no compression

- name: Run Integration Tests
if: *integration_if
shell: bash
run: |
set +e
flutter test integration_test/test_cases.dart -d windows
exitcode=$?
if [[ $exitcode == 79 ]]; then
echo "Potential native crash - attempting to display"
timeout 2m flutter run -d windows
fi
exit $exitcode

- name: Prepare release archive
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
run: |
Expand All @@ -422,6 +410,19 @@ jobs:
# upload zip archive here, uploading the raw directory fails
asset_paths: '["./${{ env.BASE_NAME }}.msix", "./${{ env.BASE_NAME }}.zip"]'

- name: Run Integration Tests
if: *integration_if
shell: bash
run: |
set +e
flutter test integration_test/test_cases.dart -d windows
exitcode=$?
if [[ $exitcode == 79 ]]; then
echo "Potential native crash - attempting to display"
timeout 2m flutter run -d windows
fi
exit $exitcode

# build-macos:
# name: Build for macOS
# runs-on: macos-latest
Expand Down
27 changes: 21 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ The project includes a `flake.nix` file that can help you install Flutter and Ru
use `nix develop`, which allows rustup for Discord RPC dependency. Also, there's `nix develop .#fenix` which stubs rustup with [fenix](https://github.com/nix-community/fenix/), but it is a hack.

To get the application running on NixOS once you are in the development shell:

- `flutter build linux` - generates the build files in `./build/linux/x64/release/bundle` where the `lib` folder will have all the dynamic libraries.
- `cd ./build/linux/x64/release/bundle/lib` - flutter cannot find the dynamic libraries by default. Probably works only with this CWD because the fallback is CWD.
- `../finamp` - start the application.
Expand All @@ -33,8 +34,8 @@ Note that code generation fails since 21baadbaf6852d34d7d12725a293c359c05cf20b d

```diff
diff --git a/lib/builders/finamp_settings_builder.dart b/lib/builders/finamp_settings_builder.dart
--- a/lib/builders/finamp_settings_builder.dart (revision 66736f47c5d084463591dd74189c46123f4144ff)
+++ b/lib/builders/finamp_settings_builder.dart (date 1768146068892)
--- a/lib/builders/finamp_settings_builder.dart (revision 66736f47c5d084463591dd74189c46123f4144ff)
+++ b/lib/builders/finamp_settings_builder.dart (date 1768146068892)
@@ -129,13 +129,6 @@
}

Expand Down Expand Up @@ -67,7 +68,14 @@ This also means that you can keep using your regular install of Finamp (from the
If you try to install a release build you built yourself (with your signing key) on top of a release build you downloaded from the Play Store or GitHub, Android will prevent you from doing so and show a generic error message. The only solution here is to uninstall the existing version, and then install your build. Note that this will delete any logins, settings and downloads that you had configured.
This generally shouldn't be needed, since debug builds works fine for daily usage, even though they are a bit less performant.

### Developing on Windows

With recent Flutter updates, there have been some issue with caches not being closed when trying to build *on* Windows (no matter which platform).
If you run into this (something about "unclosed caches"), then check if your pub.dev cache is on the same drive (e.g. `C:`, `D:`) as your Finamp directory (the one you cloned via Git). If they aren't on the same drive, you'll have to move either your Finamp directory, or your pub.dev package cache. For the latter, simply clear the old cache via `flutter pub cache clean`, and then point the cache to a new location (<https://dart.dev/tools/pub/environment-variables>).
This should fix the issue.

### Developing on an Android Device without Android Studio on linux (not recommended)

1. You need the following packages
*you may need to find out the equivalents for your distro, these are for Arch*
`android-sdk android-sdk-build-tools android-sdk-cmdline-tools-latest android-platform android-sdk-platform-tools`
Expand All @@ -79,8 +87,8 @@ This generally shouldn't be needed, since debug builds works fine for daily usag
6. Find your device
`flutter devices`
7. Run on device
`flutter run -d <device>` eg. for google pixel phones `flutter run -d pixel`
8. Go back to develop on linux
`flutter run -d <device>` eg. for google pixel phones `flutter run -d pixel`
8. Go back to develop on linux
`flutter run -d linux`

### Code Generation (The Arcane Arts)
Expand Down Expand Up @@ -149,7 +157,9 @@ As mentioned above, Finamp uses Hive for most data storage needs. If you're doin
When creating new types, note that you'll also have to register an adapter in `main.dart`. After code generation, there should be a class called `[YourType]Adapter`, which you can initialize in `setupHive`.

## Project Structure

Here is a short description on the paths you'll most likely come across

```
lib/ -- the codebase also known as src in other projects
components/ -- Contains elements used by screens
Expand All @@ -159,13 +169,14 @@ lib/ -- the codebase also known as src in other p
screens/ -- All the "pages", "screens", "views" what ever you want to call them
services/ -- Things that run in the background, kinda like backend
```

## Developing

*Remember to format your changes before pushing (ideally in a **separate commit**), by running `flutter gen-l10n` or the "Generate Localizations" command in VS Code*

### Extending the Jellyfin API

1. Figure out the endpoint you need. You can use https://api.jellyfin.org for this, for example
1. Figure out the endpoint you need. You can use <https://api.jellyfin.org> for this, for example
2. Create a new matching endpoint in `jellyfin_api.dart`. Just copy-paste the needed annotations from other similar endpoints.
3. Run code-generation (`dart run build_runner build --delete-conflicting-outputs`) to generate actual code based on the endpoint annotations
4. Create a new method for interacting with the endpoint in `jellyfin_api_helper.dart`. Again, just copy-paste what you need.
Expand All @@ -180,7 +191,7 @@ lib/ -- the codebase also known as src in other p
5. Now duplicate the code for the new setting in the appropriate settings screen file, and update the settings property it references to match your newly added setting
6. Now add new translation strings in `app_en.arb` at the bottom, then generate the new localizations via `flutter gen-l10n` (see "Adding i18n strings")
7. Use the new translation tokens in your new settings' code, replacing the old translation tokens
8. Format everything via `dart format . `
8. Format everything via `dart format .`

### Adding i18n strings

Expand Down Expand Up @@ -216,7 +227,9 @@ But since **making one request for each track that is queued up is simply not fe
Notably, since we already have the full `BaseItemDto`s and additional metadata for each track, we could simply build client-side automatic transcoding. This would be needed anyway for considering network connectivity and such, so we're not losing much here.

Should the API for this improve in the future, for example by allowing us to submit the supported codecs and bitrate limits to an endpoint like [`/Sessions/Capabilities/Full`](https://api.jellyfin.org/#tag/Session/operation/PostFullCapabilities) (that part is already possible) and then getting the corresponding `PlaySessionId`s and transcode URLs via the regular `BaseItemDto`, then we could think about doing this the proper way. But until then we'll most likely handle the ID generation and transcoding settings client-side.

### Android Debug Build stuck in 'assembleDebug'

1. `cd android`
2. `./gradlew clean`
3. `cd ..`
Expand All @@ -238,6 +251,7 @@ Note: CarPlay can only be tested on the simulator with the included entitlements
If Finamp doesn't appear in the CarPlay display after enabling it, the most common cause is corruption in the Xcode project file from repeated `pod install` runs. This can break entitlement embedding for simulator builds.

**Fix:**

```bash
# Restore project file to committed state
git checkout -- ios/Runner.xcodeproj/project.pbxproj
Expand All @@ -252,6 +266,7 @@ flutter build ios --simulator
Then restart the simulator and re-enable CarPlay via **I/O > External Displays > CarPlay**.

### Add dbus message

1. Open `lib/services/dbus_manager.dart`
2. Add another `else if (call.interface == 'com.unicornsonlsd.Finamp' && call.name == 'YOUR FUNCTION NAME')`
3. Profit
Expand Down
16 changes: 16 additions & 0 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
id("org.jetbrains.kotlin.plugin.compose") version "2.2.10"
}

def localProperties = new Properties()
Expand All @@ -18,10 +19,24 @@ if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

configurations.all {
resolutionStrategy {
force "androidx.glance:glance-appwidget:1.1.1"
}
}

android {
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion

buildFeatures {
compose true
}

composeOptions {
kotlinCompilerExtensionVersion = "1.5.15"
}

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
Expand Down Expand Up @@ -97,4 +112,5 @@ dependencies {
implementation 'androidx.mediarouter:mediarouter:1.8.1'
implementation "androidx.core:core-splashscreen:1.2.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2"
implementation "androidx.glance:glance-appwidget:1.1.1"
}
40 changes: 39 additions & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,22 @@

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MUSIC_PLAYER" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.APP_MUSIC" />
</intent-filter>
<intent-filter>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="es.antonborri.home_widget.action.LAUNCH" />
</intent-filter>
</activity>
<provider
android:name=".MediaItemContentProvider"
Expand Down Expand Up @@ -91,6 +97,38 @@
<!-- <meta-data
android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc" /> -->

<receiver
android:name=".widget.receiver.CircularWidgetReceiver"
android:label="@string/circular_widget_label"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/circular_widget_config" />
</receiver>

<receiver
android:name=".widget.receiver.RectangularWidgetReceiver"
android:label="@string/rectangular_widget_label"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/rectangular_widget_config" />
</receiver>

<!-- Used for Background Work -->
<receiver android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver" android:exported="true">
<intent-filter>
<action android:name="es.antonborri.home_widget.action.BACKGROUND" />
</intent-filter>
</receiver>

<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.unicornsonlsd.finamp

import android.app.UiModeManager
import android.content.Intent
import android.content.Intent.CATEGORY_APP_MUSIC
import android.os.Bundle
import android.provider.Settings
import android.system.ErrnoException
Expand All @@ -19,12 +20,15 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
import android.os.Build
import android.provider.MediaStore.INTENT_ACTION_MUSIC_PLAYER
import androidx.core.net.toUri


class MainActivity : AudioServiceActivity() {
companion object {
private const val DOWNLOADS_SERVICE_CHANNEL = "com.unicornsonlsd.finamp/downloads_service"
private const val DOWNLOADS_SERVICE_CHANNEL_LOG_TAG = "DownloadsServiceChannel"
private const val INTENT_CHANNEL_LOG_TAG = "intentChannel"

private const val OUTPUT_SWITCHER_CHANNEL = "com.unicornsonlsd.finamp/output_switcher"
private const val OUTPUT_SWITCHER_CHANNEL_LOG_TAG = "OutputSwitcherChannel"
Expand All @@ -36,11 +40,24 @@ class MainActivity : AudioServiceActivity() {
private lateinit var mediaRouter: MediaRouter

override fun onCreate(savedInstanceState: Bundle?) {
updateIntent(intent)
super.onCreate(savedInstanceState)

mediaRouter = MediaRouter.getInstance(this)
}

override fun onNewIntent(intent: Intent) {
updateIntent(intent)
super.onNewIntent(intent)
}

private fun updateIntent(intent: Intent){
if((intent.action==INTENT_ACTION_MUSIC_PLAYER || intent.action==CATEGORY_APP_MUSIC)
&&intent.data==null){
intent.data = "finamp://play/surprisemix".toUri()
}
}

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(
Expand Down
Loading