Compare commits

...

609 Commits

Author SHA1 Message Date
Nite
1f9de0be7e Merge branch 'feature/cache-fix' into 'develop'
Fixed cache space cleanup

Closes #1284

See merge request ultrasonic/ultrasonic!1206
2025-04-14 16:47:12 +00:00
Nite
550c486077 Fixed cache space cleanup 2025-04-14 16:47:11 +00:00
Nite
006c554456 Merge branch 'feature/bunch-of-fixes' into 'develop'
Fixed DI to make the widget work

See merge request ultrasonic/ultrasonic!1204
2025-04-11 17:48:08 +00:00
Nite
6443881193 Fixed DI to make the widget work 2025-04-11 17:48:08 +00:00
Nite
a98693bbdb Merge branch 'feature/dependency-update' into 'develop'
Updated libraries to latest version

See merge request ultrasonic/ultrasonic!1202
2025-04-11 08:07:16 +00:00
Nite
03e555eb27
Updated libraries to latest version 2025-04-11 09:58:16 +02:00
Nite
ef73d89491 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1196
2025-04-08 16:05:55 +00:00
josé m
4ad789d20b
Translated using Weblate (Galician)
Currently translated at 100.0% (425 of 425 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2025-04-04 15:47:10 +02:00
Nite
7c163c237a Merge branch 'feature/min-sdk-26' into 'develop'
Updated Min SDK to 26

Closes #1319

See merge request ultrasonic/ultrasonic!1195
2025-04-04 12:55:13 +00:00
Nite
38432a3cdc Updated Min SDK to 26 2025-04-04 12:55:13 +00:00
Nite
53aee22794 Merge branch 'renovate/jackson-monorepo' into 'develop'
Update dependency com.fasterxml.jackson.module:jackson-module-kotlin to v2.18.3

See merge request ultrasonic/ultrasonic!1183
2025-04-04 10:11:01 +00:00
Nite
9880f15017 Merge branch 'renovate/major-koin' into 'develop'
Update koin to v4 (major)

See merge request ultrasonic/ultrasonic!1194
2025-04-04 09:36:19 +00:00
Renovate Bot
0fc836cf83 Update koin to v4 (major) 2025-04-04 09:36:19 +00:00
Nite
6eb20d1c0b Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.13

See merge request ultrasonic/ultrasonic!1186
2025-04-04 09:16:51 +00:00
Renovate Bot
1f9c9505d7 Update dependency gradle to v8.13 2025-04-04 09:16:50 +00:00
Nite
2487d24371 Merge branch 'renovate/apachecodecs' into 'develop'
Update dependency commons-codec:commons-codec to v1.18.0

See merge request ultrasonic/ultrasonic!1185
2025-04-04 08:48:20 +00:00
Nite
c27b3759b1 Merge branch 'renovate/junit5-monorepo' into 'develop'
Update dependency org.junit.vintage:junit-vintage-engine to v5.12.1

See merge request ultrasonic/ultrasonic!1188
2025-04-04 08:45:58 +00:00
Nite
481f4e0347 Merge branch 'renovate/mockitokotlin' into 'develop'
Update dependency org.mockito.kotlin:mockito-kotlin to v5.4.0

See merge request ultrasonic/ultrasonic!1189
2025-04-04 08:31:59 +00:00
Renovate Bot
a9b47f5aef Update dependency org.mockito.kotlin:mockito-kotlin to v5.4.0 2025-04-04 08:31:59 +00:00
Renovate Bot
b53bb38631 Update dependency org.junit.vintage:junit-vintage-engine to v5.12.1 2025-04-04 08:31:27 +00:00
Renovate Bot
a2a42e06b0 Update dependency commons-codec:commons-codec to v1.18.0 2025-04-04 08:31:24 +00:00
Nite
adf5b95243 Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.16.1

See merge request ultrasonic/ultrasonic!1190
2025-04-04 08:18:46 +00:00
Nite
3d82b3935d Merge branch 'renovate/robolectric' into 'develop'
Update dependency org.robolectric:robolectric to v4.14.1

See merge request ultrasonic/ultrasonic!1191
2025-04-04 08:14:40 +00:00
Nite
7ee66e51e8 Merge branch 'renovate/kotlinx-coroutines-monorepo' into 'develop'
Update kotlinx-coroutines monorepo to v1.10.1

See merge request ultrasonic/ultrasonic!1192
2025-04-04 08:00:49 +00:00
Nite
b126cd594a Merge branch 'renovate/retrofit-monorepo' into 'develop'
Update retrofit monorepo to v2.11.0

See merge request ultrasonic/ultrasonic!1193
2025-04-04 07:52:58 +00:00
Renovate Bot
31f654ee2f Update retrofit monorepo to v2.11.0 2025-04-03 19:31:45 +00:00
Renovate Bot
42c8edc6e7 Update kotlinx-coroutines monorepo to v1.10.1 2025-04-03 19:31:41 +00:00
Renovate Bot
8f7c7c33ff Update dependency org.robolectric:robolectric to v4.14.1 2025-04-03 18:31:59 +00:00
Renovate Bot
c105c0d02d Update dependency org.mockito:mockito-core to v5.16.1 2025-04-03 18:31:51 +00:00
Nite
e74fb3795a Merge branch 'renovate/rxjava' into 'develop'
Update dependency io.reactivex.rxjava3:rxjava to v3.1.10

See merge request ultrasonic/ultrasonic!1182
2025-04-03 17:50:54 +00:00
Nite
80923ca8ac Merge branch 'renovate/detekt' into 'develop'
Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.8

See merge request ultrasonic/ultrasonic!1179
2025-04-03 17:44:18 +00:00
Nite
f2fa530047 Merge branch 'renovate/koin' into 'develop'
Update koin to v3.5.6

See merge request ultrasonic/ultrasonic!1172
2025-04-03 17:36:58 +00:00
Óscar García Amor
4cb6ab031b
Fixes translations linting 2025-04-03 09:25:00 +02:00
Óscar García Amor
2d224e5f84
Merge remote-tracking branch 'weblate/develop' into develop 2025-04-03 09:08:13 +02:00
Adolfo Jayme Barrientos
5a653bebb2
Translated using Weblate (Portuguese)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-04-03 09:06:40 +02:00
ssantos
5566cb05ab
Translated using Weblate (Portuguese)
Currently translated at 97.8% (413 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-04-03 09:02:00 +02:00
Adolfo Jayme Barrientos
7ee7aa23be
Translated using Weblate (Japanese)
Currently translated at 98.8% (417 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/ja/
2025-04-03 08:58:30 +02:00
Adolfo Jayme Barrientos
5a2ae50c74
Translated using Weblate (Galician)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2025-04-03 08:58:30 +02:00
Adolfo Jayme Barrientos
62d7e6bb6d
Translated using Weblate (Norwegian Bokmål)
Currently translated at 83.1% (351 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2025-04-03 08:58:30 +02:00
Adolfo Jayme Barrientos
5266fc0b0f
Translated using Weblate (Spanish)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2025-04-03 08:58:30 +02:00
Adolfo Jayme Barrientos
612925bc7d
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 68.0% (287 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hant/
2025-04-03 08:58:30 +02:00
Adolfo Jayme Barrientos
81499a1b37
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.8% (417 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hans/
2025-04-03 08:58:30 +02:00
Adolfo Jayme Barrientos
27fc8462d1
Translated using Weblate (Russian)
Currently translated at 82.2% (347 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/ru/
2025-04-03 08:58:28 +02:00
Adolfo Jayme Barrientos
f3e205a452
Translated using Weblate (Portuguese)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-04-03 08:58:04 +02:00
Adolfo Jayme Barrientos
84374f8c13
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt_BR/
2025-04-03 08:58:04 +02:00
Adolfo Jayme Barrientos
5e8bf249f8
Translated using Weblate (Polish)
Currently translated at 98.8% (417 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pl/
2025-04-03 08:58:04 +02:00
Adolfo Jayme Barrientos
3913e676b7
Translated using Weblate (Dutch)
Currently translated at 95.0% (401 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nl/
2025-04-03 08:58:02 +02:00
Adolfo Jayme Barrientos
a70ee39403
Translated using Weblate (Italian)
Currently translated at 63.0% (266 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/it/
2025-04-03 08:57:21 +02:00
Adolfo Jayme Barrientos
05bd9f0d2c
Translated using Weblate (Hungarian)
Currently translated at 77.9% (329 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/hu/
2025-04-03 08:57:21 +02:00
Adolfo Jayme Barrientos
4d9388f8fe
Translated using Weblate (French)
Currently translated at 96.4% (407 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/fr/
2025-04-03 08:57:21 +02:00
Adolfo Jayme Barrientos
8acd7da959
Translated using Weblate (German)
Currently translated at 99.0% (418 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/de/
2025-04-03 08:57:21 +02:00
Adolfo Jayme Barrientos
c909848ed5
Translated using Weblate (Czech)
Currently translated at 75.5% (319 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/cs/
2025-04-03 08:57:18 +02:00
Adolfo Jayme Barrientos
e5c8e874e3
Translated using Weblate (English)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/en/
2025-04-03 08:56:27 +02:00
Paulo Schopf
9d5caed73d
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt_BR/
2025-04-03 08:56:27 +02:00
Walton Henry (WaltonH)
292086e9d6
Translated using Weblate (Hungarian)
Currently translated at 77.9% (329 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/hu/
2025-04-03 08:56:20 +02:00
josé m
5639fcfb8b
Translated using Weblate (Galician)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2025-04-03 08:54:39 +02:00
Paulo Schopf
ce39da4b79
Translated using Weblate (Portuguese)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-04-03 08:54:39 +02:00
ssantos
4e89672d15
Translated using Weblate (Portuguese)
Currently translated at 99.5% (420 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-04-03 08:54:39 +02:00
ssantos
6725ef5a2c
Translated using Weblate (Portuguese)
Currently translated at 97.8% (413 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-04-03 08:54:39 +02:00
Renovate Bot
680cc90871 Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.8 2025-04-02 20:31:32 +00:00
Nite
c19dc125a9 Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v12.1.1

See merge request ultrasonic/ultrasonic!1166
2025-04-02 19:32:20 +00:00
Renovate Bot
be8fa3c0d1 Update dependency com.fasterxml.jackson.module:jackson-module-kotlin to v2.18.3 2025-04-02 19:31:22 +00:00
Renovate Bot
312a97d664 Update dependency io.reactivex.rxjava3:rxjava to v3.1.10 2025-04-02 19:31:16 +00:00
Renovate Bot
fca954102a Update dependency org.jlleitschuh.gradle:ktlint-gradle to v12.1.1 2025-04-02 19:25:01 +00:00
Nite
9e078b4879 Merge branch 'feature/unified-rating' into 'develop'
Updated rating to be able to use the 5 star and heart rating together

Closes #440, #1231, and #1250

See merge request ultrasonic/ultrasonic!1133
2025-04-02 19:02:33 +00:00
Nite
46e85c27a2 Updated rating to be able to use the 5 star and heart rating together 2025-04-02 19:02:30 +00:00
Adolfo Jayme Barrientos
1124cef382
Translated using Weblate (Japanese)
Currently translated at 98.8% (417 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/ja/
2025-03-22 18:44:12 +01:00
Adolfo Jayme Barrientos
01ebf6e1aa
Translated using Weblate (Galician)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
b65050ae85
Translated using Weblate (Norwegian Bokmål)
Currently translated at 83.1% (351 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
ddec1d7bdc
Translated using Weblate (Spanish)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
888d34aeb9
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 68.0% (287 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hant/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
0fb3d8aeca
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.8% (417 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hans/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
c56913733f
Translated using Weblate (Russian)
Currently translated at 82.2% (347 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/ru/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
76c61e1866
Translated using Weblate (Portuguese)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2025-03-22 18:44:11 +01:00
Adolfo Jayme Barrientos
810bb9ddd1
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt_BR/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
68a2123293
Translated using Weblate (Polish)
Currently translated at 98.8% (417 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pl/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
4221b18e09
Translated using Weblate (Dutch)
Currently translated at 95.0% (401 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nl/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
e7ed066eed
Translated using Weblate (Italian)
Currently translated at 63.0% (266 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/it/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
1301f7e116
Translated using Weblate (Hungarian)
Currently translated at 77.9% (329 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/hu/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
63b064b021
Translated using Weblate (French)
Currently translated at 96.4% (407 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/fr/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
a9be77aa75
Translated using Weblate (German)
Currently translated at 99.0% (418 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/de/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
fc7dcc9f77
Translated using Weblate (Czech)
Currently translated at 75.5% (319 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/cs/
2025-03-22 18:44:10 +01:00
Adolfo Jayme Barrientos
48461f82a8
Translated using Weblate (English)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/en/
2025-03-22 18:44:09 +01:00
Paulo Schopf
81ea86fd01
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt_BR/
2024-10-31 15:24:51 +01:00
Walton Henry (WaltonH)
8803f4444e
Translated using Weblate (Hungarian)
Currently translated at 77.9% (329 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/hu/
2024-04-23 21:07:11 +02:00
Renovate Bot
38a97b2b91 Update koin to v3.5.6 2024-04-12 07:32:05 +00:00
josé m
6e7bcc4362
Translated using Weblate (Galician)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2024-02-20 19:02:07 +01:00
Paulo Schopf
c12224e811
Translated using Weblate (Portuguese)
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2024-01-09 13:06:11 +01:00
ssantos
b8ef3cd177
Translated using Weblate (Portuguese)
Currently translated at 99.5% (420 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2024-01-07 17:06:12 +00:00
ssantos
2de773e5de
Translated using Weblate (Portuguese)
Currently translated at 97.8% (413 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2023-12-19 17:09:57 +00:00
birdbird
fe5b63ad1f Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1165
2023-12-06 10:52:51 +00:00
Paulo Schopf
4aff5857fd
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (422 of 422 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt_BR/
2023-12-05 22:06:55 +00:00
birdbird
a0d26cb3e7 Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.2.0

See merge request ultrasonic/ultrasonic!1153
2023-12-04 16:40:18 +00:00
tzugen
639ef03bce
Adapt to media 1.2.0 2023-12-04 17:33:18 +01:00
Renovate Bot
b855e4bbe7
Update media3 to v1.2.0 2023-12-04 17:32:37 +01:00
birdbird
b83e349f5c Merge branch 'refactor2' into 'develop'
Update copyright in recently edited files

See merge request ultrasonic/ultrasonic!1164
2023-12-04 15:19:09 +00:00
birdbird
abad0438e3 Update copyright in recently edited files 2023-12-04 15:19:09 +00:00
birdbird
30f02c7eac Merge branch 'room2' into 'develop'
Adapt to room changes

See merge request ultrasonic/ultrasonic!1163
2023-12-04 10:01:42 +00:00
tzugen
64f1c3e172
Adapt to room changes 2023-12-04 10:49:35 +01:00
birdbird
f7f1f40668 Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.8.0

See merge request ultrasonic/ultrasonic!1161
2023-12-03 19:45:41 +00:00
birdbird
6519945c7b Merge branch 'renovate/major-ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v12

See merge request ultrasonic/ultrasonic!1162
2023-12-03 19:45:20 +00:00
Renovate Bot
94979aeaab Update dependency org.jlleitschuh.gradle:ktlint-gradle to v12 2023-12-03 19:45:20 +00:00
Renovate Bot
37e43b73a7 Update dependency org.mockito:mockito-core to v5.8.0 2023-12-03 14:31:46 +00:00
birdbird
2cf2cf31c4 Merge branch 'exep' into 'develop'
Avoid two exceptions

See merge request ultrasonic/ultrasonic!1159
2023-12-03 14:12:11 +00:00
birdbird
9736ae451a Avoid two exceptions 2023-12-03 14:12:10 +00:00
birdbird
26331c1a07 Merge branch 'renovate/ksp' into 'develop'
Update dependency com.google.devtools.ksp to v1.9.21-1.0.15

See merge request ultrasonic/ultrasonic!1146
2023-12-03 14:06:06 +00:00
birdbird
35ffe9ef10 Merge branch 'renovate/room' into 'develop'
Update room to v2.6.1

See merge request ultrasonic/ultrasonic!1157
2023-12-03 14:06:01 +00:00
birdbird
976400d0e1 Merge branch 'renovate/mockitokotlin' into 'develop'
Update dependency org.mockito.kotlin:mockito-kotlin to v5.2.1

See merge request ultrasonic/ultrasonic!1160
2023-12-03 14:05:41 +00:00
Renovate Bot
d2ef76a2c5 Update dependency org.mockito.kotlin:mockito-kotlin to v5.2.1 2023-12-03 10:32:00 +00:00
Renovate Bot
c0926b1e13 Update room to v2.6.1 2023-12-03 10:31:56 +00:00
Renovate Bot
bf5d41ab30 Update dependency com.google.devtools.ksp to v1.9.21-1.0.15 2023-12-03 10:31:52 +00:00
birdbird
e2716a5965 Merge branch 'renovate/junit5-monorepo' into 'develop'
Update dependency org.junit.vintage:junit-vintage-engine to v5.10.1

See merge request ultrasonic/ultrasonic!1149
2023-12-03 09:31:41 +00:00
birdbird
8351f1dc0a Merge branch 'renovate/gradleplugin' into 'develop'
Update dependency com.android.tools.build:gradle to v8.2.0

See merge request ultrasonic/ultrasonic!1150
2023-12-03 09:31:40 +00:00
birdbird
90997d5f4c Merge branch 'renovate/activity' into 'develop'
Update dependency androidx.activity:activity-ktx to v1.8.1

See merge request ultrasonic/ultrasonic!1151
2023-12-03 09:31:31 +00:00
birdbird
747f071f2f Merge branch 'renovate/jackson' into 'develop'
Update dependency com.fasterxml.jackson.module:jackson-module-kotlin to v2.16.0

See merge request ultrasonic/ultrasonic!1152
2023-12-03 09:31:20 +00:00
birdbird
9e76308cf2 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1158
2023-12-03 09:30:45 +00:00
josé m
c452030fe1
Translated using Weblate (Galician)
Currently translated at 27.9% (119 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2023-12-03 10:30:03 +01:00
birdbird
dbbeac6084 Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.5

See merge request ultrasonic/ultrasonic!1156
2023-12-03 09:29:52 +00:00
birdbird
d56ec198a1 Merge branch 'renovate/detekt' into 'develop'
Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.4

See merge request ultrasonic/ultrasonic!1155
2023-12-03 09:29:47 +00:00
birdbird
13238dfdc0 Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v1.9.21

See merge request ultrasonic/ultrasonic!1154
2023-12-03 09:29:40 +00:00
Renovate Bot
8063814bdc Update dependency com.android.tools.build:gradle to v8.2.0 2023-11-30 18:32:19 +00:00
Renovate Bot
3d8abdc65b Update dependency gradle to v8.5 2023-11-29 14:33:08 +00:00
Renovate Bot
4832876e54 Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.4 2023-11-26 12:31:21 +00:00
Renovate Bot
a0b0409930 Update kotlin monorepo to v1.9.21 2023-11-23 12:31:20 +00:00
Renovate Bot
8e6e9d4e8e Update dependency com.fasterxml.jackson.module:jackson-module-kotlin to v2.16.0 2023-11-16 01:31:37 +00:00
Renovate Bot
ee6d03db35 Update dependency androidx.activity:activity-ktx to v1.8.1 2023-11-15 18:31:49 +00:00
Renovate Bot
364270d338 Update dependency org.junit.vintage:junit-vintage-engine to v5.10.1 2023-11-05 17:31:25 +00:00
birdbird
a4dc06fa8a Merge branch 'renovate/detekt' into 'develop'
Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.3

See merge request ultrasonic/ultrasonic!1145
2023-11-03 10:35:44 +00:00
birdbird
5c94d995d4 Merge branch 'renovate/robolectric' into 'develop'
Update dependency org.robolectric:robolectric to v4.11.1

See merge request ultrasonic/ultrasonic!1143
2023-11-03 10:35:41 +00:00
birdbird
366da1c30c Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v1.9.20

See merge request ultrasonic/ultrasonic!1144
2023-11-03 10:35:40 +00:00
birdbird
e893510e79 Merge branch 'renovate/navigation' into 'develop'
Update navigation to v2.7.5

See merge request ultrasonic/ultrasonic!1147
2023-11-03 10:35:34 +00:00
birdbird
67b359999e Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.7.0

See merge request ultrasonic/ultrasonic!1148
2023-11-03 10:35:29 +00:00
Renovate Bot
01569647f7 Update dependency org.mockito:mockito-core to v5.7.0 2023-11-02 20:31:40 +00:00
Renovate Bot
3ee20113ae Update navigation to v2.7.5 2023-11-01 17:31:36 +00:00
Renovate Bot
6edff7e053 Update dependency org.robolectric:robolectric to v4.11.1 2023-10-31 19:35:46 +00:00
Renovate Bot
70cc124818 Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.3 2023-10-31 16:31:16 +00:00
Renovate Bot
98bf943a86 Update kotlin monorepo to v1.9.20 2023-10-30 20:31:18 +00:00
birdbird
58944bb0fd Merge branch 'renovate/room' into 'develop'
Update room to v2.6.0

See merge request ultrasonic/ultrasonic!1138
2023-10-27 14:21:50 +00:00
Renovate Bot
397e1b6ecc Update room to v2.6.0 2023-10-27 14:21:50 +00:00
birdbird
71336b3c9f Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1139
2023-10-27 14:01:51 +00:00
Óscar García Amor
cd47bcf082
Translated using Weblate (Spanish)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-10-27 11:12:57 +00:00
birdbird
4fb5d2a437 Merge branch 'wifiPerf' into 'develop'
Address wifi deprecation

See merge request ultrasonic/ultrasonic!1142
2023-10-27 11:12:46 +00:00
tzugen
e8bf5a38b7
Address wifi deprecation 2023-10-27 13:06:27 +02:00
birdbird
ddfaf520e5 Merge branch 'wifiPerf' into 'develop'
Add a ClearJukebox method

See merge request ultrasonic/ultrasonic!1141
2023-10-27 11:00:01 +00:00
tzugen
4d1c7464b9
Add a ClearJukebox method 2023-10-27 12:32:22 +02:00
birdbird
42c6eac97f Merge branch 'renovate/okhttp-monorepo' into 'develop'
Update okhttp monorepo to v4.12.0

See merge request ultrasonic/ultrasonic!1140
2023-10-20 09:23:43 +00:00
Renovate Bot
2ae0a27588 Update okhttp monorepo to v4.12.0 2023-10-19 23:31:28 +00:00
birdbird
f2e8c0c331 Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.6.1

See merge request ultrasonic/ultrasonic!1131
2023-10-18 11:57:24 +00:00
birdbird
7ce522fd15 Merge branch 'renovate/jackson' into 'develop'
Update dependency com.fasterxml.jackson.module:jackson-module-kotlin to v2.15.3

See merge request ultrasonic/ultrasonic!1132
2023-10-18 11:57:10 +00:00
birdbird
170c61ef84 Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.6.0

See merge request ultrasonic/ultrasonic!1129
2023-10-18 11:56:51 +00:00
birdbird
87fdf94e61 Merge branch 'renovate/colorpicker' into 'develop'
Update dependency com.github.skydoves:colorpickerview to v2.3.0

See merge request ultrasonic/ultrasonic!1125
2023-10-18 11:56:00 +00:00
birdbird
fffe245df5 Merge branch 'renovate/materialdesign' into 'develop'
Update dependency com.google.android.material:material to v1.10.0

See merge request ultrasonic/ultrasonic!1128
2023-10-18 11:55:19 +00:00
birdbird
95194bed3e Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.4

See merge request ultrasonic/ultrasonic!1127
2023-10-18 11:53:45 +00:00
birdbird
a9467e2fd8 Merge branch 'renovate/navigation' into 'develop'
Update navigation to v2.7.4

See merge request ultrasonic/ultrasonic!1126
2023-10-18 11:51:49 +00:00
birdbird
4b99fdb788 Merge branch 'master' into 'develop'
Merge back from master

See merge request ultrasonic/ultrasonic!1137
2023-10-18 11:51:16 +00:00
birdbird
727e53e096 Merge branch '480' into 'master'
Release 4.8.0

See merge request ultrasonic/ultrasonic!1124
2023-10-18 10:56:51 +00:00
tzugen
69fc9b955a
RC 4.8.0 2023-10-18 12:48:32 +02:00
tzugen
601d0ccdaa
Merge remote-tracking branch 'origin/develop' into 480 2023-10-18 12:44:01 +02:00
birdbird
b19b1fb65a Merge branch 'coroutineLegacy' into 'develop'
Migrate remaining Java Code and modernize it

See merge request ultrasonic/ultrasonic!1136
2023-10-18 10:19:12 +00:00
birdbird
442f622b35 Migrate remaining Java Code and modernize it 2023-10-18 10:19:10 +00:00
birdbird
de523a6451 Merge branch 'refactorScopes' into 'develop'
Refactor Koin, Scopes & Lifecycles

See merge request ultrasonic/ultrasonic!1130
2023-10-14 19:09:26 +00:00
birdbird
17260878ac Refactor Koin, Scopes & Lifecycles 2023-10-14 19:09:26 +00:00
Renovate Bot
c6d26cdd67 Update dependency com.fasterxml.jackson.module:jackson-module-kotlin to v2.15.3 2023-10-13 02:31:21 +00:00
Renovate Bot
458fe5c36e Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.6.1 2023-10-10 15:31:32 +00:00
Renovate Bot
f388aaf4d8 Update dependency org.mockito:mockito-core to v5.6.0 2023-10-06 15:31:34 +00:00
Renovate Bot
6ddff58afb Update dependency com.google.android.material:material to v1.10.0 2023-10-05 18:31:28 +00:00
Renovate Bot
1e176f995a Update dependency gradle to v8.4 2023-10-04 21:32:34 +00:00
Renovate Bot
22c61258cc Update navigation to v2.7.4 2023-10-04 17:31:13 +00:00
Renovate Bot
288a1ad1c2 Update dependency com.github.skydoves:colorpickerview to v2.3.0 2023-10-02 12:31:29 +00:00
birdbird
823465d6fd Merge branch 'enhancement/star-outline' into 'develop'
Created outline for rating star images

Closes #885

See merge request ultrasonic/ultrasonic!1120
2023-10-01 16:56:39 +00:00
tzugen
0786b634e5
Merge remote-tracking branch 'origin/enhancement/star-outline' into 4.8.0 2023-10-01 18:49:19 +02:00
tzugen
7f4f944d79
Merge remote-tracking branch 'origin/develop' into 4.8.0 2023-09-30 14:12:59 +02:00
birdbird
264c84d540 Merge branch 'renovate/gradleplugin' into 'develop'
Update dependency com.android.tools.build:gradle to v8.1.2

See merge request ultrasonic/ultrasonic!1121
2023-09-30 08:47:21 +00:00
Renovate Bot
e48c823de0 Update dependency com.android.tools.build:gradle to v8.1.2 2023-09-30 08:31:34 +00:00
birdbird
79f503beb3 Merge branch 'renovate/koin' into 'develop'
Update koin to v3.5.0

See merge request ultrasonic/ultrasonic!1118
2023-09-30 08:07:10 +00:00
birdbird
34da90ad26 Merge branch 'renovate/ksp' into 'develop'
Update dependency com.google.devtools.ksp to v1.9.10-1.0.13

See merge request ultrasonic/ultrasonic!1113
2023-09-30 08:03:49 +00:00
birdbird
566f780621 Merge branch 'renovate/viewmodelktx' into 'develop'
Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.6.2

See merge request ultrasonic/ultrasonic!1114
2023-09-30 08:03:33 +00:00
birdbird
c76bce5e94 Merge branch 'renovate/rxjava' into 'develop'
Update dependency io.reactivex.rxjava3:rxjava to v3.1.8

See merge request ultrasonic/ultrasonic!1122
2023-09-30 08:03:09 +00:00
birdbird
27f0ee3a03 Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.6.0

See merge request ultrasonic/ultrasonic!1119
2023-09-30 08:03:01 +00:00
birdbird
a1c21da7a6 Merge branch 'renovate/androidxcore' into 'develop'
Update dependency androidx.core:core-ktx to v1.12.0

See merge request ultrasonic/ultrasonic!1117
2023-09-30 08:02:58 +00:00
birdbird
401ea0fcf1 Merge branch 'renovate/androidsupport' into 'develop'
Update dependency androidx.annotation:annotation to v1.7.0

See merge request ultrasonic/ultrasonic!1116
2023-09-30 08:02:55 +00:00
birdbird
c062345f5e Merge branch 'renovate/navigation' into 'develop'
Update navigation to v2.7.3

See merge request ultrasonic/ultrasonic!1115
2023-09-30 08:02:47 +00:00
birdbird
516cc94772 Merge branch 'mergeBack' into 'develop'
Merge master to dev

See merge request ultrasonic/ultrasonic!1123
2023-09-30 08:01:57 +00:00
birdbird
104df418cc Merge master to dev 2023-09-30 08:01:56 +00:00
Renovate Bot
5755363f2e Update dependency io.reactivex.rxjava3:rxjava to v3.1.8 2023-09-29 09:31:24 +00:00
Nite
5167f9e45e
Created outline for rating star images 2023-09-25 17:38:22 +02:00
Renovate Bot
7a24be4b98 Update navigation to v2.7.3 2023-09-20 17:31:48 +00:00
Renovate Bot
f9bafa93da Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.6.0 2023-09-18 20:31:51 +00:00
Renovate Bot
8c7e8a8ae0 Update koin to v3.5.0 2023-09-13 08:31:46 +00:00
Renovate Bot
76f16cc9f1 Update dependency androidx.core:core-ktx to v1.12.0 2023-09-06 18:31:57 +00:00
Renovate Bot
907c94096b Update dependency androidx.annotation:annotation to v1.7.0 2023-09-06 18:31:55 +00:00
Renovate Bot
f6ad5be3e0 Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.6.2 2023-09-06 17:31:37 +00:00
Renovate Bot
db0f3b21e1 Update dependency com.google.devtools.ksp to v1.9.10-1.0.13 2023-08-24 09:31:42 +00:00
birdbird
709dff1a81 Merge branch 'back' into 'develop'
Sync master and develop

See merge request ultrasonic/ultrasonic!1112
2023-08-24 06:32:44 +00:00
birdbird
d2ed058d31 Sync master and develop 2023-08-24 06:32:43 +00:00
birdbird
7ad16ad92c Merge branch 'renovate/navigation' into 'develop'
Update navigation to v2.7.1

See merge request ultrasonic/ultrasonic!1110
2023-08-24 06:27:42 +00:00
Renovate Bot
8ab3b2634d Update navigation to v2.7.1 2023-08-23 17:08:15 +00:00
birdbird
3349da6809 Merge branch 'renovate/rxjava' into 'develop'
Update dependency io.reactivex.rxjava3:rxjava to v3.1.7

See merge request ultrasonic/ultrasonic!1109
2023-08-23 15:03:37 +00:00
Renovate Bot
e581776e43 Update dependency io.reactivex.rxjava3:rxjava to v3.1.7 2023-08-23 12:31:51 +00:00
birdbird
f292dc667e Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v1.9.10

See merge request ultrasonic/ultrasonic!1108
2023-08-23 11:02:43 +00:00
birdbird
7b8d1dec9b Merge branch '471' into 'master'
Release canditate 4.7.1

See merge request ultrasonic/ultrasonic!1107
2023-08-23 11:00:30 +00:00
Renovate Bot
2d943edd61 Update kotlin monorepo to v1.9.10 2023-08-23 10:31:43 +00:00
birdbird
86464ba137 Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.5.0

See merge request ultrasonic/ultrasonic!1104
2023-08-23 09:47:51 +00:00
tzugen
f2b47a257d
Release 4.7.1 2023-08-23 11:47:21 +02:00
birdbird
09e87ce8a0
Disable a lint 2023-08-23 11:47:21 +02:00
birdbird
490461f840 Merge branch 'renovate/ksp' into 'develop'
Update dependency com.google.devtools.ksp to v1.9.0-1.0.13

See merge request ultrasonic/ultrasonic!1093
2023-08-23 09:45:59 +00:00
Renovate Bot
fb123d926d Update dependency com.google.devtools.ksp to v1.9.0-1.0.13 2023-08-23 09:45:59 +00:00
Alex Katlein
d2a98a3022
Utilize CarConnection to determine whether to set repeat mode to ALL 2023-08-23 10:57:26 +02:00
Renovate Bot
896c946a5a Update dependency org.mockito:mockito-core to v5.5.0 2023-08-22 13:31:52 +00:00
birdbird
560b593fcb Merge branch 'renovate/mockitokotlin' into 'develop'
Update dependency org.mockito.kotlin:mockito-kotlin to v5.1.0

See merge request ultrasonic/ultrasonic!1099
2023-08-22 12:46:00 +00:00
birdbird
fe9bce334a Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.3

See merge request ultrasonic/ultrasonic!1101
2023-08-22 12:45:47 +00:00
birdbird
6af4d31aa3 Merge branch 'renovate/gradleplugin' into 'develop'
Update dependency com.android.tools.build:gradle to v8.1.1

See merge request ultrasonic/ultrasonic!1102
2023-08-22 12:45:20 +00:00
birdbird
0ec2bb4fce Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.1.1

See merge request ultrasonic/ultrasonic!1100
2023-08-22 12:45:03 +00:00
birdbird
7f1dc14a4f Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.5.1

See merge request ultrasonic/ultrasonic!1096
2023-08-22 12:44:45 +00:00
birdbird
8b2843410f Merge branch 'disableALint' into 'develop'
Disable a lint

See merge request ultrasonic/ultrasonic!1105
2023-08-22 10:08:53 +00:00
birdbird
deef540ddc Disable a lint 2023-08-22 10:08:53 +00:00
Renovate Bot
cd101aef2a Update dependency com.android.tools.build:gradle to v8.1.1 2023-08-22 09:31:49 +00:00
birdbird
72bf0085b4 Merge branch 'fix/1263-no-repeat-all-outside-Auto' into 'develop'
Utilize CarConnection to determine whether to set repeat mode to ALL

Closes #1263

See merge request ultrasonic/ultrasonic!1098
2023-08-22 08:49:04 +00:00
birdbird
bfb7c85eac Merge branch 'master' into 'develop'
Merge back from release

See merge request ultrasonic/ultrasonic!1103
2023-08-22 08:14:06 +00:00
birdbird
0a3717f448 Merge back from release 2023-08-22 08:14:06 +00:00
Renovate Bot
fa3ca57a4e Update dependency gradle to v8.3 2023-08-17 07:32:56 +00:00
Renovate Bot
002a3250e4 Update media3 to v1.1.1 2023-08-16 12:32:00 +00:00
Renovate Bot
ab10d39f75 Update dependency org.mockito.kotlin:mockito-kotlin to v5.1.0 2023-08-09 20:31:51 +00:00
Alex Katlein
82f6758649
Utilize CarConnection to determine whether to set repeat mode to ALL 2023-08-09 21:17:41 +02:00
Renovate Bot
979fb116e8 Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.5.1 2023-08-07 19:31:40 +00:00
birdbird
ae97ded344 Merge branch 'kotlin' into 'develop'
Migrate more files to Kotlin

See merge request ultrasonic/ultrasonic!1094
2023-08-05 15:10:25 +00:00
birdbird
71d45c89fb Migrate more files to Kotlin 2023-08-05 15:10:25 +00:00
birdbird
76a5705b2b Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1095
2023-08-05 14:34:06 +00:00
birdbird
6b000bc90f
Translated using Weblate (German)
Currently translated at 99.3% (426 of 429 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/de/
2023-08-04 14:03:57 +02:00
birdbird
b87203bfe4 Merge branch '470' into 'master'
4.7.0 Release canditate

See merge request ultrasonic/ultrasonic!1091
2023-08-03 16:31:12 +00:00
tzugen
818cb96eb5
Release 4.7.0 2023-08-03 18:25:02 +02:00
tzugen
e9fdbd924b
Don't skip around when doing "Play Next" while music is playing 2023-08-03 14:28:22 +02:00
Alex Katlein
a0b9e738a5
Using android.R.color.transparent instead of empty drawable for the placeholder
- For some reason Android Auto displays a square with a white fill color where the empty space should be
- Got rid of empty drawable
2023-08-02 19:43:55 +02:00
birdbird
0dcdd94149 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1092
2023-08-02 08:29:01 +00:00
gallegonovato
410e4d9d96
Translated using Weblate (Spanish)
Currently translated at 100.0% (429 of 429 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-08-01 19:07:35 +02:00
birdbird
68567731ad Merge branch 'renovate/gradleplugin' into 'develop'
Update dependency com.android.tools.build:gradle to v8.1.0

See merge request ultrasonic/ultrasonic!1083
2023-07-31 14:37:48 +00:00
birdbird
75ecfce1df Merge branch 'toast' into 'develop'
Add a toast when adding tracks to the playlist, allow pinning when offline

See merge request ultrasonic/ultrasonic!1089
2023-07-31 14:37:33 +00:00
tzugen
ddf8ce7029
Migrate from KAPT to KSP 2023-07-31 14:47:35 +02:00
Renovate Bot
f99fb1c92a
Update dependency com.android.tools.build:gradle to v8.1.0 2023-07-31 14:46:58 +02:00
tzugen
7fcb58963c
Show Pin button also when offline 2023-07-31 12:47:49 +02:00
tzugen
f89b2da30d
More more functions to InsertionMode pattern,
show a Toast when adding tracks to the playlist.
2023-07-31 12:40:37 +02:00
tzugen
691bfbe594
Merge remote-tracking branch 'origin/master' into mergeBack 2023-07-31 11:32:10 +02:00
birdbird
7061b7a324 Merge branch 'renovate/kotlinxcoroutines' into 'develop'
Update kotlinxCoroutines to v1.7.3

See merge request ultrasonic/ultrasonic!1082
2023-07-31 09:14:45 +00:00
birdbird
6bc520d551 Merge branch 'renovate/preferences' into 'develop'
Update dependency androidx.preference:preference to v1.2.1

See merge request ultrasonic/ultrasonic!1084
2023-07-31 09:14:34 +00:00
birdbird
ff20c671a2 Merge branch 'renovate/koin' into 'develop'
Update koin to v3.4.3

See merge request ultrasonic/ultrasonic!1086
2023-07-31 09:14:23 +00:00
birdbird
37935a5f86 Merge branch '463' into 'master'
Release candidate 4.6.3

See merge request ultrasonic/ultrasonic!1081
2023-07-30 14:02:12 +00:00
Renovate Bot
1f6df202b9 Update koin to v3.4.3 2023-07-28 08:31:49 +00:00
Renovate Bot
06496ddf37 Update dependency androidx.preference:preference to v1.2.1 2023-07-26 17:31:46 +00:00
Renovate Bot
509e33ac20 Update kotlinxCoroutines to v1.7.3 2023-07-25 16:31:46 +00:00
tzugen
6bc09854ac
Fix wrong thread in throttled observers 2023-07-25 12:11:26 +02:00
tzugen
fc637166bb
Fix inject 2023-07-24 23:20:44 +02:00
birdbird
6eb7c9d25c Merge branch 'modernize' into 'develop'
Modernize code after media3 1.1.0 update

See merge request ultrasonic/ultrasonic!1077
2023-07-24 21:08:01 +00:00
birdbird
0492b0fa6f Modernize code after media3 1.1.0 update 2023-07-24 21:08:01 +00:00
birdbird
acbaae9f14 Merge branch 'feature/android-auto-shuffle-repeat' into 'develop'
Added custom buttons for shuffling the current queue and setting repeat mode

Closes #883

See merge request ultrasonic/ultrasonic!1075
2023-07-24 19:20:21 +00:00
Alex Katlein
77c1329be5 Added custom buttons for shuffling the current queue and setting repeat mode 2023-07-24 19:20:21 +00:00
birdbird
aefdadbbd5 Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.2.1

See merge request ultrasonic/ultrasonic!1076
2023-07-24 19:20:05 +00:00
birdbird
29a1527d24 Merge branch 'renovate/junit5-monorepo' into 'develop'
Update dependency org.junit.vintage:junit-vintage-engine to v5.10.0

See merge request ultrasonic/ultrasonic!1079
2023-07-24 19:19:51 +00:00
tzugen
18fd8f64c6
Release 4.6.3
Features:
- Search is accessible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut

Bug fixes:
- Fix a few crashes
- Avoid triggering a bug in Supysonic
- Readd the "Star" button to the Now Playing screen
- Fix a rare crash when shuffling playlists with duplicate entries
- Fix a crash when choosing "Play next" on an empty playlist.
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active
2023-07-24 21:16:26 +02:00
birdbird
4f55a2a4a5
Fix an exception when removeIncompleteTracksFromPlaylist() could be called on the wrong thread. 2023-07-24 21:09:39 +02:00
birdbird
1fa5f4c2f8
Fix unpin 2023-07-24 21:07:19 +02:00
birdbird
2a9bf9dd29 Merge branch 'fixException' into 'develop'
Fix an exception when removeIncompleteTracksFromPlaylist() could be called on the wrong thread.

See merge request ultrasonic/ultrasonic!1078
2023-07-24 18:57:29 +00:00
birdbird
a04517de90 Fix an exception when removeIncompleteTracksFromPlaylist() could be called on the wrong thread. 2023-07-24 18:57:29 +00:00
birdbird
21e4293adb Merge branch 'root' into 'develop'
Avoid rare NPE

See merge request ultrasonic/ultrasonic!1073

(cherry picked from commit 7209779b64820572910059fdd24342bb73734b54)

ecee57e1 Avoid rare NPE
2023-07-24 18:55:27 +00:00
birdbird
358af365d2 Merge branch 'fixUnpin' into 'develop'
Fix unpin

Closes #1259

See merge request ultrasonic/ultrasonic!1074
2023-07-24 18:38:09 +00:00
birdbird
62ba16eedd Fix unpin 2023-07-24 18:38:08 +00:00
Renovate Bot
e7825fc90c Update dependency org.junit.vintage:junit-vintage-engine to v5.10.0 2023-07-23 13:31:45 +00:00
Renovate Bot
1fba65ed3a Update dependency gradle to v8.2.1 2023-07-10 12:32:41 +00:00
birdbird
7209779b64 Merge branch 'root' into 'develop'
Avoid rare NPE

See merge request ultrasonic/ultrasonic!1073
2023-07-06 20:49:29 +00:00
tzugen
ecee57e166
Avoid rare NPE 2023-07-06 18:05:16 +02:00
birdbird
288f72b972 Merge branch 'renovate/koin' into 'develop'
Update koin to v3.4.2

See merge request ultrasonic/ultrasonic!923
2023-07-06 15:46:47 +00:00
Renovate Bot
6be96ee8c9 [ROBOTEST] Update koin to v3.4.2 2023-07-06 15:46:47 +00:00
birdbird
65dd30eaa8 Merge branch 'supy' into 'develop'
Fix a bug introduced in 725d9281

See merge request ultrasonic/ultrasonic!1072
2023-07-06 15:42:15 +00:00
tzugen
698360b77a
Release 4.6.2
Features:
- Search is accessible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut

Bug fixes:
- Avoid triggering a bug in Supysonic
- Readd the "Star" button to the Now Playing screen
- Fix a rare crash when shuffling playlists with duplicate entries
- Fix a crash when choosing "Play next" on an empty playlist.
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active
2023-07-06 17:36:37 +02:00
tzugen
b57b799feb
Fix a bug introduced in 725d9281 2023-07-06 17:33:48 +02:00
tzugen
2436537609
Fix a bug introduced in 725d9281 2023-07-06 17:26:33 +02:00
birdbird
96ac6fcac7 Merge branch 'fix/android-auto-nested-directories' into 'develop'
Properly handling nested directory structures in Android Auto

Closes #1256

See merge request ultrasonic/ultrasonic!1067
2023-07-06 15:11:02 +00:00
Alex Katlein
9fa80d206b Properly handling nested directory structures in Android Auto 2023-07-06 15:11:02 +00:00
birdbird
8990b4d622 Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.1.0

See merge request ultrasonic/ultrasonic!1070
2023-07-06 15:06:49 +00:00
Renovate Bot
211af57e8b Update media3 to v1.1.0 2023-07-06 15:06:49 +00:00
birdbird
9fd2a91f15 Merge branch 'renovate/kotlinxcoroutines' into 'develop'
Update kotlinxCoroutines to v1.7.2

See merge request ultrasonic/ultrasonic!1066
2023-07-06 14:32:40 +00:00
birdbird
c85e2ef3f4 Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.2

See merge request ultrasonic/ultrasonic!1068
2023-07-06 14:32:33 +00:00
birdbird
8ab840023a Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.5.0

See merge request ultrasonic/ultrasonic!1069
2023-07-06 14:32:28 +00:00
Renovate Bot
db278afe4a Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.5.0 2023-07-03 22:32:22 +00:00
Renovate Bot
d08711eb0c Update dependency gradle to v8.2 2023-06-30 18:33:00 +00:00
Renovate Bot
500ffa8009 Update kotlinxCoroutines to v1.7.2 2023-06-29 13:31:51 +00:00
birdbird
7124939467 [ROBOTEST] Update .gitlab-ci.yml file 2023-06-29 13:09:51 +00:00
tzugen
4a21db2f73
Release 4.6.1
Features:
- Search is accessible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut

Bug fixes:
- Readd the "Star" button to the Now Playing screen
- Fix a rare crash when shuffling playlists with duplicate entries
- Fix a crash when choosing "Play next" on an empty playlist.
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active
- Upgrade material to 1.9.0
2023-06-28 20:05:37 +02:00
birdbird
fe555c076d Merge branch '461' into 'master'
4.6.1 Release canditate

See merge request ultrasonic/ultrasonic!1065
2023-06-27 10:21:53 +00:00
tzugen
b40b0048da
4.6.1 Release canditate 2023-06-27 12:11:53 +02:00
birdbird
e08acc27a7 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1063
2023-06-27 09:12:47 +00:00
Óscar García Amor
c032d32e02
Translated using Weblate (Galician)
Currently translated at 13.3% (57 of 428 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2023-06-27 10:23:03 +02:00
Óscar García Amor
f202febb4d
Translated using Weblate (Spanish)
Currently translated at 100.0% (428 of 428 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-06-27 10:23:03 +02:00
Óscar García Amor
69b83fe538
Translated using Weblate (Spanish)
Currently translated at 100.0% (428 of 428 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-06-27 10:23:03 +02:00
birdbird
c42439ef69 Merge branch 'shuffleCrash2' into 'develop'
Prevent a media3 crash

See merge request ultrasonic/ultrasonic!1064
2023-06-27 08:22:57 +00:00
birdbird
d420f70225 Prevent a media3 crash 2023-06-27 08:22:57 +00:00
birdbird
843cf8eb28 Merge branch 'stableIds' into 'develop'
Don't assume Stable ids for playlist

See merge request ultrasonic/ultrasonic!1062
2023-06-26 17:10:06 +00:00
birdbird
9b9e552b95 Don't assume Stable ids for playlist 2023-06-26 17:10:05 +00:00
birdbird
c3c241466c Merge branch 'hideSearch' into 'develop'
Hide search in now playing screen

Closes #1254 and #1255

See merge request ultrasonic/ultrasonic!1061
2023-06-26 16:33:11 +00:00
birdbird
e8c56b1a06 Hide search in now playing screen 2023-06-26 16:33:11 +00:00
birdbird
aa3f44cdb0 Merge branch 'mas' into 'develop'
Sync master to develop

See merge request ultrasonic/ultrasonic!1060
2023-06-23 10:44:34 +00:00
tzugen
f28fb5dbf3
Merge remote-tracking branch 'origin/master' into mas 2023-06-23 12:43:07 +02:00
birdbird
45f4ad5ab0 Merge branch 'renovate/room' into 'develop'
Update room to v2.5.2

See merge request ultrasonic/ultrasonic!1058
2023-06-23 09:55:33 +00:00
birdbird
8d241c17c8 Merge branch 'renovate/apachecodecs' into 'develop'
Update dependency commons-codec:commons-codec to v1.16.0

See merge request ultrasonic/ultrasonic!1057
2023-06-23 09:54:40 +00:00
birdbird
cc17b28be7 Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.4.2

See merge request ultrasonic/ultrasonic!1056
2023-06-23 09:54:20 +00:00
birdbird
e391746625 Add some more devices for robotest 2023-06-23 09:52:13 +00:00
Renovate Bot
ae306e6eb3 Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.4.2 2023-06-22 20:31:51 +00:00
Renovate Bot
11a30a15d9 Update room to v2.5.2 2023-06-21 21:31:42 +00:00
Renovate Bot
dc4e85b21d Update dependency commons-codec:commons-codec to v1.16.0 2023-06-21 18:31:46 +00:00
birdbird
3da9097c6b [ROBO] Correct apk path 2023-06-20 10:13:36 +00:00
birdbird
24fb2e4f43 [ROBO] Use higher privileged key, specify project 2023-06-20 09:29:00 +00:00
birdbird
8469a099b0 [ROBO] test 2023-06-20 08:44:38 +00:00
birdbird
ea2048babf Enable [ROBO] annotation to manually trigger a robo test 2023-06-20 08:43:44 +00:00
birdbird
f3152c5e4d allow failure for now for the robotest 2023-06-20 06:48:06 +00:00
birdbird
8b7fd123b7 Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.4.0

See merge request ultrasonic/ultrasonic!1053
2023-06-18 15:10:05 +00:00
birdbird
c5fb4e25a3 Merge branch 'develop' into 'master'
Fixup 4.6.0

See merge request ultrasonic/ultrasonic!1055
2023-06-18 14:04:26 +00:00
birdbird
162ae4dfac Fixup 4.6.0 2023-06-18 14:04:26 +00:00
birdbird
df3dc4221f Don't run sign step when merging dev into master 2023-06-18 13:55:16 +00:00
birdbird
ecfa17762c Update .gitlab-ci.yml file 2023-06-18 13:45:20 +00:00
birdbird
1df8b0bb41 Merge branch 'cleartext' into 'develop'
Reallow cleartext communication

See merge request ultrasonic/ultrasonic!1054
2023-06-18 13:42:57 +00:00
birdbird
fbec7610f3 [SkipCI] Rename step 2023-06-18 13:00:37 +00:00
birdbird
e6441f1344 CI: Try to merge two steps to remove code duplication 2023-06-18 12:58:17 +00:00
birdbird
9a2a959972 Add RoboTest when releasing 2023-06-18 12:44:27 +00:00
tzugen
f931c906c0
Reallow cleartext communication 2023-06-18 14:11:57 +02:00
Renovate Bot
ed1191937b Update dependency org.mockito:mockito-core to v5.4.0 2023-06-18 10:31:42 +00:00
birdbird
1d17274e00 Merge branch 'develop' into 'master'
Release 4.6.0

See merge request ultrasonic/ultrasonic!1052
2023-06-16 18:02:50 +00:00
birdbird
e86bdca3eb Release 4.6.0 2023-06-16 16:17:09 +00:00
birdbird
ffdc43b6bf Correct release note 4.6.0 2023-06-16 16:16:14 +00:00
birdbird
5c173f39f1 Merge branch 'master' into 'develop'
Master

See merge request ultrasonic/ultrasonic!1051
2023-06-16 16:15:14 +00:00
birdbird
7e8467f852 Add release note for 4.6.0 2023-06-16 16:13:00 +00:00
birdbird
ae7a200144 Merge branch 'fixAppend' into 'develop'
Fix EndlessScrolling in genre listings

Closes #1223

See merge request ultrasonic/ultrasonic!1050
2023-06-14 14:26:14 +00:00
birdbird
623564c28d Fix EndlessScrolling in genre listings 2023-06-14 14:26:14 +00:00
birdbird
971ed705fa Merge branch 'search' into 'develop'
Move search button in to main Topbar menu

Closes #1247

See merge request ultrasonic/ultrasonic!1048
2023-06-14 12:07:13 +00:00
birdbird
725d9281bf Move search button in to main Topbar menu 2023-06-14 12:07:13 +00:00
birdbird
8b9dc294c1 Merge branch 'enable-user-cert-authorities' into 'develop'
Enable User-installed certificate authorities

Closes #1249

See merge request ultrasonic/ultrasonic!1049
2023-06-14 11:56:29 +00:00
Enrico
429c7d2473 Enable User-installed certificate authorities 2023-06-14 11:56:29 +00:00
birdbird
ab50be3784 Merge branch 'highlightColor2' into 'develop'
Make track view transparent by default

See merge request ultrasonic/ultrasonic!1046
2023-06-09 11:36:57 +00:00
birdbird
83fae89763 Make track view transparent by default 2023-06-09 11:36:56 +00:00
birdbird
1f68a59af9 Merge branch 'highlightColor' into 'develop'
Fix highlight color

See merge request ultrasonic/ultrasonic!1045
2023-06-09 09:05:16 +00:00
birdbird
e1be29a6a8 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1043
2023-06-09 08:12:54 +00:00
gallegonovato
ab16c45e54
Translated using Weblate (Spanish)
Currently translated at 100.0% (428 of 428 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-06-09 09:57:52 +02:00
birdbird
024b2e8edb Merge branch 'shuffle' into 'develop'
Small fixes for shuffle

Closes #1244 and #1248

See merge request ultrasonic/ultrasonic!1044
2023-06-09 07:57:40 +00:00
birdbird
c04f90a6ac Small fixes for shuffle 2023-06-09 07:57:34 +00:00
tzugen
240e7fd8fb
Fix highlight color 2023-06-09 09:56:42 +02:00
birdbird
3de3844e75 Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v1.8.22

See merge request ultrasonic/ultrasonic!1042
2023-06-07 21:24:51 +00:00
Renovate Bot
01c8092cac Update kotlin monorepo to v1.8.22 2023-06-07 19:31:38 +00:00
birdbird
a9494626bb Merge branch 'ImprovePlaylistView' into 'develop'
Improve current playing song visibility

See merge request ultrasonic/ultrasonic!1037
2023-06-06 19:20:11 +00:00
tzugen
ec852b0e74
Use elevation 2023-06-06 21:12:44 +02:00
birdbird
1fe13e84ce Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.4.0

See merge request ultrasonic/ultrasonic!1040
2023-06-06 15:30:48 +00:00
Renovate Bot
d8cb11808c Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.4.0 2023-06-06 14:31:51 +00:00
birdbird
35334c93cc Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1039
2023-06-06 09:42:20 +00:00
aorinngoDo
a98f50412f
Translated using Weblate (Japanese)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/ja/
2023-06-06 11:24:22 +02:00
Batman
b0e8ddfa66
Translated using Weblate (Polish)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pl/
2023-06-06 11:24:22 +02:00
Maxence G
c18f07362f
Translated using Weblate (French)
Currently translated at 97.6% (416 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/fr/
2023-06-06 11:24:22 +02:00
birdbird
26e9fcd40f Merge branch 'AddShortcutCapability' into 'develop'
Start implementing "Play Random Songs" as a shortcut

See merge request ultrasonic/ultrasonic!950
2023-06-06 09:24:15 +00:00
Maxmystere
b2498367b1 Start implementing "Play Random Songs" as a shortcut 2023-06-06 09:24:15 +00:00
birdbird
f68eee5233 Merge branch 'material190' into 'develop'
Upgrade material to 1.9.0

See merge request ultrasonic/ultrasonic!1009
2023-06-06 09:21:12 +00:00
tzugen
fd22c0f8b5
Add little dropdown icon to server selector header to show interactivity. 2023-06-06 10:52:00 +02:00
tzugen
bfe24e5dfd
Modernize backhandling to support predictive back handling 2023-06-06 10:51:33 +02:00
Maxence G
63296829a8
Lint 2023-06-04 23:00:09 +02:00
Maxence G
dc9b261c48
Improve current playing song visibility
Disable scroll animation because not visible and causing bugs on first interaction
2023-06-04 22:51:44 +02:00
tzugen
bfec814b43
Upgrade material to 1.9.0 2023-06-04 13:21:22 +02:00
birdbird
03d06896e9 Update Default.md 2023-06-04 07:08:22 +00:00
birdbird
5a4989186e Merge branch 'fixButtons' into 'develop'
Hide tiny scrollbars on buttons on Android 13

See merge request ultrasonic/ultrasonic!1036
2023-06-03 09:55:17 +00:00
birdbird
eb380b9af9 Merge branch 'r8' into 'develop'
Reenable R8

See merge request ultrasonic/ultrasonic!1026
2023-06-03 09:52:15 +00:00
birdbird
01124c8ecf Update Release.md 2023-06-03 09:37:00 +00:00
tzugen
365067f1a0
Merge branch '450' into 4502 2023-06-03 11:31:38 +02:00
birdbird
6a97636c7a [SkipCI] Template 2023-06-03 09:21:51 +00:00
tzugen
eb3aa0d202
Release 4.5.0 2023-06-03 11:11:53 +02:00
birdbird
53ea17d2b9 [SkipCI] Move template 2023-06-03 09:02:34 +00:00
birdbird
a1e339f850 [skipCI] Update Release.md 2023-06-03 08:59:40 +00:00
birdbird
4809317c63 Add release template -SkipCI 2023-06-03 08:58:47 +00:00
birdbird
c5c0497716 Merge branch 'renovate/major-mockitokotlin' into 'develop'
Update dependency org.mockito.kotlin:mockito-kotlin to v5

See merge request ultrasonic/ultrasonic!1034
2023-06-02 06:38:28 +00:00
Renovate Bot
79ac73020b Update dependency org.mockito.kotlin:mockito-kotlin to v5 2023-06-01 21:31:52 +00:00
birdbird
d9dfef4016 Merge branch 'playAll' into 'develop'
Fix playing all tracks when the selection has no id

See merge request ultrasonic/ultrasonic!1033
2023-06-01 21:29:26 +00:00
tzugen
3bd3607220
Remove unused fragment param 2023-06-01 23:21:43 +02:00
tzugen
e35a33edde
Use App context when toasting from background tasks,
use App context to resolve error messages
2023-06-01 23:16:17 +02:00
tzugen
c1013f6b80
Fix play all in Track collection random view 2023-06-01 23:16:17 +02:00
birdbird
21a27c691d Merge branch 'renovate/detekt' into 'develop'
Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.0

See merge request ultrasonic/ultrasonic!1029
2023-06-01 08:48:58 +00:00
Renovate Bot
25f3ff0bd3 Update dependency io.gitlab.arturbosch.detekt:detekt-gradle-plugin to v1.23.0 2023-06-01 08:48:58 +00:00
birdbird
4feb84bd83 Merge branch 'gradle' into 'develop'
Apply assistant changes to gradle file

See merge request ultrasonic/ultrasonic!1032
2023-06-01 08:39:14 +00:00
tzugen
4c049671db
Apply assistant changes to gradle file 2023-06-01 10:31:36 +02:00
birdbird
3a1251dd2a Merge branch 'renovate/gradleplugin' into 'develop'
Update dependency com.android.tools.build:gradle to v8.0.2

See merge request ultrasonic/ultrasonic!1030
2023-06-01 08:01:00 +00:00
birdbird
8dd7758bc6 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1027
2023-06-01 07:59:17 +00:00
gallegonovato
296308cebf
Translated using Weblate (Spanish)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-05-29 10:11:15 +02:00
Newson Parker
45ca0966fd
Translated using Weblate (Chinese (Traditional))
Currently translated at 69.0% (294 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hant/
2023-05-29 10:11:15 +02:00
Newson Parker
77d3f8c11b
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hans/
2023-05-29 10:11:15 +02:00
birdbird
7a453dbd30 Correct transition reason 2023-05-29 08:11:09 +00:00
Renovate Bot
0a6a12c70a Update dependency com.android.tools.build:gradle to v8.0.2 2023-05-24 19:31:38 +00:00
Óscar García Amor
448fdb70b0 Merge branch 'newid' into 'develop'
Changes applicationId for GitLab builds

See merge request ultrasonic/ultrasonic!1028
2023-05-23 11:02:19 +00:00
Óscar García Amor
5e4ec56ae7
Changes applicationId for GitLab builds 2023-05-23 12:54:54 +02:00
birdbird
8c42700676 Merge branch 'thread' into 'develop'
Ensure correct thread when accepting a rating

See merge request ultrasonic/ultrasonic!1025
2023-05-21 13:08:19 +00:00
tzugen
22fda501f4
Ensure correct thread when accepting a rating 2023-05-21 15:00:41 +02:00
tzugen
556d3bb90d
Reenable R8 2023-05-21 15:00:04 +02:00
birdbird
0f18b20fa3 Merge branch 'cur' into 'develop'
Merge 4.4.1 to dev

See merge request ultrasonic/ultrasonic!1024
2023-05-21 12:18:11 +00:00
birdbird
a8961e8e96 Merge 4.4.1 to dev 2023-05-21 12:18:11 +00:00
birdbird
291528a309 Merge branch 'selectQuality' into 'develop'
Add setting to control the max bitrate when pinning

Closes #894

See merge request ultrasonic/ultrasonic!1022
2023-05-20 19:38:21 +00:00
birdbird
2a7cdbeded Merge branch 'fixStars' into 'develop'
Fix StarRating when setting a rating through AutoMediaController

See merge request ultrasonic/ultrasonic!1023
2023-05-20 19:37:27 +00:00
birdbird
c09739cea4 Fix StarRating when setting a rating through AutoMediaController 2023-05-20 19:37:27 +00:00
tzugen
315271390f
Add setting to control the max bitrate when pinning 2023-05-20 21:28:28 +02:00
birdbird
2df8d049d0 Merge branch 'Binder' into 'develop'
Refactor rating controls in Session

Closes #1235

See merge request ultrasonic/ultrasonic!1020
2023-05-20 14:32:27 +00:00
birdbird
0643b1bd1c Refactor rating controls in Session 2023-05-20 14:32:27 +00:00
birdbird
2b1291ae51 Merge branch 'userdata' into 'develop'
Add hasFragileUserData=true

See merge request ultrasonic/ultrasonic!1021
2023-05-20 13:38:13 +00:00
birdbird
5ec0d8a96b Add hasFragileUserData=true 2023-05-20 13:38:12 +00:00
birdbird
71168983b6 Merge branch 'cast' into 'develop'
Use the JukeboxPlayer as a Player instead of an Controller

See merge request ultrasonic/ultrasonic!1019
2023-05-19 21:37:31 +00:00
birdbird
bdcb1a505b Use the JukeboxPlayer as a Player instead of an Controller 2023-05-19 21:37:31 +00:00
birdbird
94f29d270c Merge branch '441' into 'master'
Release 4.4.1

See merge request ultrasonic/ultrasonic!1018
2023-05-18 20:28:13 +00:00
birdbird
98a61954a3 Release 4.4.1 2023-05-18 20:28:13 +00:00
birdbird
238d91c167 Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.0.2

See merge request ultrasonic/ultrasonic!1013
2023-05-18 13:45:04 +00:00
birdbird
376748b298 Merge branch 'detekt' into 'develop'
Use default locations for Detekt config and baseline.

See merge request ultrasonic/ultrasonic!1017
2023-05-18 10:54:16 +00:00
birdbird
13091948ea Use default locations for Detekt config and baseline. 2023-05-18 10:54:16 +00:00
birdbird
0cfd8e8240 Merge branch 'prefs' into 'develop'
Modernize Activity launching to set custom cache location

See merge request ultrasonic/ultrasonic!1015
2023-05-18 10:32:17 +00:00
birdbird
7a17936855 Modernize Activity launching to set custom cache location 2023-05-18 10:32:17 +00:00
birdbird
1d7328c03e Merge branch 'kotlim' into 'develop'
Apply suggested Kotlin Gradle updates

See merge request ultrasonic/ultrasonic!1016
2023-05-18 10:29:10 +00:00
birdbird
76da209c6d Merge branch 'renovate/robolectric' into 'develop'
Update dependency org.robolectric:robolectric to v4.10.3

See merge request ultrasonic/ultrasonic!1014
2023-05-18 10:26:19 +00:00
tzugen
ddd9c29d7a
Apply suggested Kotlin Gradle updates 2023-05-18 12:22:40 +02:00
Renovate Bot
fe696943a4 Update dependency org.robolectric:robolectric to v4.10.3 2023-05-17 21:32:36 +00:00
Renovate Bot
a5bfc08264 Update media3 to v1.0.2 2023-05-17 17:31:43 +00:00
birdbird
4c2c7252c3 Merge branch 'showLoading' into 'develop'
Add loading indicator to playlist view

See merge request ultrasonic/ultrasonic!1011
2023-05-16 18:54:13 +00:00
tzugen
b5dd0fdca2
Add loading indicator to playlist view 2023-05-16 20:39:17 +02:00
birdbird
a7ee33c7c0 Merge branch 'id3' into 'develop'
Clarify the naming around the ID3 settings and methods,

See merge request ultrasonic/ultrasonic!1010
2023-05-16 18:09:04 +00:00
birdbird
7b56017844 Clarify the naming around the ID3 settings and methods, 2023-05-16 18:09:03 +00:00
birdbird
0fb345dd24 Merge branch 'revertMaterial' into 'develop'
Revert Material to 1.8.0

See merge request ultrasonic/ultrasonic!1008
2023-05-16 15:58:21 +00:00
tzugen
4faf2db11f
Revert Material to 1.8.0 2023-05-16 17:56:14 +02:00
birdbird
c118bd70f9 Update README.md 2023-05-16 15:47:03 +00:00
birdbird
b0e850d17e Merge branch 'playlistSorting' into 'develop'
Don't sort playlists even when Sort by Disc is activated

Closes #1229

See merge request ultrasonic/ultrasonic!1007
2023-05-16 10:42:25 +00:00
tzugen
a97c6e15e9
Don't sort playlists even when Sort by Disc is activated 2023-05-16 09:59:20 +02:00
birdbird
d084a35316 Merge branch 'blue' into 'develop'
Fix missing bluetooth permissions

Closes #791

See merge request ultrasonic/ultrasonic!1006
2023-05-16 07:37:37 +00:00
birdbird
e8bfa5dc04 Fix missing bluetooth permissions 2023-05-16 07:37:36 +00:00
birdbird
e729e3b063 Merge branch 'renovate/kotlinxcoroutines' into 'develop'
Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-android to v1.7.1

See merge request ultrasonic/ultrasonic!1003
2023-05-15 08:20:16 +00:00
Renovate Bot
8337f4a7e4 Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-android to v1.7.1 2023-05-15 08:20:16 +00:00
birdbird
0ae32c3cfc Merge branch 'renovate/okhttp' into 'develop'
Update okhttp to v4.11.0

See merge request ultrasonic/ultrasonic!976
2023-05-15 08:08:44 +00:00
birdbird
49f3bd27ed Merge branch 'renovate/materialdesign' into 'develop'
Update dependency com.google.android.material:material to v1.9.0

See merge request ultrasonic/ultrasonic!990
2023-05-15 08:03:28 +00:00
birdbird
1acfa917c9 Merge branch 'renovate/androidxcore' into 'develop'
Update dependency androidx.core:core-ktx to v1.10.1

See merge request ultrasonic/ultrasonic!1001
2023-05-15 08:03:14 +00:00
birdbird
9786cf2abf Merge branch '440' into 'master'
Release 4.4.0

See merge request ultrasonic/ultrasonic!1005
2023-05-15 07:15:56 +00:00
birdbird
537d65affc Release 4.4.0 2023-05-15 07:15:56 +00:00
birdbird
5ab2ec08f0 Merge branch 'fixCI' into 'develop'
Use fixed version of the CI image

See merge request ultrasonic/ultrasonic!1002
2023-05-14 14:28:06 +00:00
birdbird
e21477a5ee Use fixed version of the CI image 2023-05-14 14:28:05 +00:00
Renovate Bot
5daeddcc63 Update okhttp to v4.11.0 2023-05-11 05:32:21 +00:00
Renovate Bot
70d02f4493 Update dependency com.google.android.material:material to v1.9.0 2023-05-11 05:32:15 +00:00
Renovate Bot
58de991d64 Update dependency androidx.core:core-ktx to v1.10.1 2023-05-10 17:32:09 +00:00
birdbird
90ffa32246 Merge branch 'FixIDNull' into 'develop'
Fix the warning 'ID must not be null'

See merge request ultrasonic/ultrasonic!999
2023-05-09 10:08:13 +00:00
birdbird
3d94de9e46 Merge branch 'mergeback' into 'develop'
Mergeback

See merge request ultrasonic/ultrasonic!1000
2023-05-09 10:05:18 +00:00
birdbird
50aa2d0a2d Mergeback 2023-05-09 10:05:18 +00:00
tzugen
0e2171b872
Fix the warning 'ID must not be null' 2023-05-09 11:48:10 +02:00
birdbird
2c3f43f139 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!997
2023-05-09 09:34:35 +00:00
birdbird
fd8afe0231 Merge branch 'RefactorContextActions' into 'develop'
Use Coroutines for triggering the download or playback of music through the context menus

See merge request ultrasonic/ultrasonic!998
2023-05-09 09:34:15 +00:00
birdbird
cd982814cf Use Coroutines for triggering the download or playback of music through the context menus 2023-05-09 09:34:15 +00:00
gallegonovato
338fb618b9
Translated using Weblate (Spanish)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-05-08 17:52:45 +02:00
birdbird
842cb36ecb Merge branch 'RevertJackson' into 'develop'
Revert Jackson to 2.13.5 for compatibility with older APIs

See merge request ultrasonic/ultrasonic!993
2023-05-07 15:24:16 +00:00
birdbird
e06b8bc22e Merge branch 'FixExceptions' into 'develop'
Fix a bunch of Exceptions collected through Play Store reporting

See merge request ultrasonic/ultrasonic!994
2023-05-07 15:23:57 +00:00
birdbird
82fb45bd55 Fix a bunch of Exceptions collected through Play Store reporting 2023-05-07 15:23:57 +00:00
birdbird
3a39902c4c Merge branch '434-master' into 'master'
Release 4.3.4

See merge request ultrasonic/ultrasonic!995
2023-05-07 15:23:38 +00:00
birdbird
88364b15d6 Release 4.3.4 2023-05-07 15:23:38 +00:00
tzugen
751b946092
Revert Jackson to 2.13.5 for compatibility with older APIs 2023-05-07 12:57:15 +02:00
birdbird
39085f68b1 Merge branch 'renovate/kotlinxguava' into 'develop'
Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-guava to v1.7.0

See merge request ultrasonic/ultrasonic!992
2023-05-07 10:51:05 +00:00
Renovate Bot
1beb67c497 Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-guava to v1.7.0 2023-05-07 10:32:39 +00:00
birdbird
2ba001894a Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!985
2023-05-07 10:21:22 +00:00
Kaiyang Wu
0650ce0bba
Translated using Weblate (Chinese (Traditional))
Currently translated at 54.2% (231 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hant/
2023-05-07 11:56:24 +02:00
Kaiyang Wu
218f144848
Translated using Weblate (Chinese (Traditional))
Currently translated at 53.0% (226 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hant/
2023-05-07 11:56:24 +02:00
Kaiyang Wu
83c9c188e9
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hans/
2023-05-07 11:56:24 +02:00
birdbird
a4e8a7f94d Merge branch 'renovate/mockito-monorepo' into 'develop'
Update dependency org.mockito:mockito-core to v5.3.1

See merge request ultrasonic/ultrasonic!956
2023-05-07 09:56:19 +00:00
Renovate Bot
4f5d503ceb Update dependency org.mockito:mockito-core to v5.3.1 2023-05-07 09:56:19 +00:00
birdbird
381e2e4b86 Merge branch 'renovate/kotlinxcoroutines' into 'develop'
Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-android to v1.7.0

See merge request ultrasonic/ultrasonic!991
2023-05-07 09:49:19 +00:00
birdbird
2a90fe4aab Merge branch 'master' into 'develop'
Merge changes from master back to dev. (4.3.3 release)

See merge request ultrasonic/ultrasonic!989
2023-05-07 09:47:24 +00:00
birdbird
f37301e738 Merge changes from master back to dev. (4.3.3 release) 2023-05-07 09:47:24 +00:00
tzugen
4e9cea87a8
Hide tiny scrollbars on buttons on Android 13 2023-05-07 11:39:33 +02:00
birdbird
fca5ffaa0c Merge branch 'correctDefaults' into 'develop'
Correctly enable Artists pictures by default (was enabled in Settings mit not in Code)

See merge request ultrasonic/ultrasonic!988
2023-05-07 09:33:54 +00:00
Renovate Bot
a0314a865c Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-android to v1.7.0 2023-05-07 09:32:30 +00:00
birdbird
5da9a2819c Merge branch 'ratingManager' into 'develop'
Introduce a RatingManager that takes care of receiving and passing ratings...

See merge request ultrasonic/ultrasonic!981
2023-05-07 09:27:24 +00:00
birdbird
2a02c94c8f Introduce a RatingManager that takes care of receiving and passing ratings... 2023-05-07 09:27:24 +00:00
tzugen
96073125ca
Correctly enable Artists pictures by default (was enabled in Settings mit not in Code) 2023-05-07 11:19:01 +02:00
birdbird
58bd663ac0 Merge branch 'renovate/junit5-monorepo' into 'develop'
Update dependency org.junit.vintage:junit-vintage-engine to v5.9.3

See merge request ultrasonic/ultrasonic!983
2023-05-07 09:16:04 +00:00
birdbird
e689193df1 Merge branch 'renovate/robolectric' into 'develop'
Update dependency org.robolectric:robolectric to v4.10.2

See merge request ultrasonic/ultrasonic!987
2023-05-07 09:15:26 +00:00
birdbird
1aa388d48f Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v1.8.21

See merge request ultrasonic/ultrasonic!980
2023-05-07 09:15:13 +00:00
birdbird
8f84020cfa Merge branch 'renovate/kluent' into 'develop'
Update kluent to v1.73

See merge request ultrasonic/ultrasonic!984
2023-05-07 09:14:39 +00:00
birdbird
db88ff8431 Merge branch 'renovate/ktlintgradle' into 'develop'
Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.3.2

See merge request ultrasonic/ultrasonic!982
2023-05-07 09:14:12 +00:00
birdbird
2d1642170a Merge branch 'renovate/gradleplugin' into 'develop'
Update dependency com.android.tools.build:gradle to v8.0.1

See merge request ultrasonic/ultrasonic!986
2023-05-07 09:14:03 +00:00
Renovate Bot
0cb7952943 Update dependency org.robolectric:robolectric to v4.10.2 2023-05-04 19:32:12 +00:00
Renovate Bot
d750c84606 Update dependency com.android.tools.build:gradle to v8.0.1 2023-05-01 16:32:12 +00:00
Renovate Bot
7abca537c9 Update kluent to v1.73 2023-04-29 14:32:22 +00:00
Renovate Bot
ca2c5483c0 Update dependency org.junit.vintage:junit-vintage-engine to v5.9.3 2023-04-26 07:32:20 +00:00
Renovate Bot
7b414a3a23 Update dependency org.jlleitschuh.gradle:ktlint-gradle to v11.3.2 2023-04-25 14:32:15 +00:00
Renovate Bot
10767d2d5b Update kotlin monorepo to v1.8.21 2023-04-25 05:32:25 +00:00
Óscar García Amor
404c7c05d5
Merge branch 'flamingo' 2023-04-24 15:54:48 +02:00
birdbird
0b2c8eccfe Merge branch '433' into 'master'
433

See merge request ultrasonic/ultrasonic!979
2023-04-24 11:37:53 +00:00
birdbird
4882037098 433 2023-04-24 11:37:53 +00:00
birdbird
138db03667 Merge branch 'fixContext' into 'develop'
Fix missing context

See merge request ultrasonic/ultrasonic!977
2023-04-23 10:12:42 +00:00
tzugen
f59e039c49
Fix missing context 2023-04-23 11:55:08 +02:00
birdbird
e0679f99cf Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.1.1

See merge request ultrasonic/ultrasonic!974
2023-04-22 10:25:18 +00:00
birdbird
ffb78b166b Merge branch 'rmJitpack' into 'develop'
Remove Jitpack repo (was from custom media3 build)

See merge request ultrasonic/ultrasonic!975
2023-04-22 09:51:43 +00:00
tzugen
5fcbf59e0e
Remove Jitpack repo (was from custom media3 build) 2023-04-22 11:25:31 +02:00
Renovate Bot
e62b8972e7 Update dependency gradle to v8.1.1 2023-04-21 13:34:02 +00:00
birdbird
322457910c Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.0.1

See merge request ultrasonic/ultrasonic!971
2023-04-20 12:05:48 +00:00
Renovate Bot
e9b602890a Update media3 to v1.0.1 2023-04-20 11:34:31 +00:00
birdbird
08d3618eb3 Merge branch 'fixShuffle' into 'develop'
Fix shuffle

Closes #876 and #877

See merge request ultrasonic/ultrasonic!966
2023-04-20 11:25:25 +00:00
birdbird
4f59c4d3ad Fix shuffle 2023-04-20 11:25:25 +00:00
birdbird
9ca5a9257d Merge branch 'gradle8' into 'develop'
Update Gradle plugin to v8

See merge request ultrasonic/ultrasonic!973
2023-04-20 11:24:28 +00:00
birdbird
6694d6f60b Update Gradle plugin to v8 2023-04-20 11:24:28 +00:00
birdbird
df7ff21cc9 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!972
2023-04-20 07:30:35 +00:00
Eryk Michalak
732d44cb73
Translated using Weblate (Polish)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pl/
2023-04-20 08:37:09 +02:00
birdbird
76eb89f5eb Merge branch 'flamingo' into 'develop'
Sets compileJava target to 17 to work with Flamingo

See merge request ultrasonic/ultrasonic!969
2023-04-20 06:37:03 +00:00
birdbird
185762e164 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!968
2023-04-19 09:24:36 +00:00
Óscar García Amor
33e4913761
Sets compileJava target to 17 to work with Flamingo 2023-04-18 14:34:05 +02:00
Kaiyang Wu
aede9be97c
Translated using Weblate (Chinese (Traditional))
Currently translated at 49.7% (212 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hant/
2023-04-17 21:49:30 +02:00
Kaiyang Wu
97556a36e5
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hans/
2023-04-17 21:49:30 +02:00
birdbird
fb970ffb80 Merge branch 'renovate/gradle-8.x' into 'develop'
Update dependency gradle to v8.1

See merge request ultrasonic/ultrasonic!957
2023-04-17 15:57:52 +00:00
birdbird
6de6cda7a4 Merge branch 'renovate/robolectric' into 'develop'
Update dependency org.robolectric:robolectric to v4.10

See merge request ultrasonic/ultrasonic!955
2023-04-17 15:56:50 +00:00
birdbird
5eed5c70b5 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!967
2023-04-17 15:56:28 +00:00
Óscar García Amor
6e1078a256
Translated using Weblate (Galician)
Currently translated at 6.3% (27 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/gl/
2023-04-16 12:49:02 +02:00
Óscar García Amor
c6c58262af Merge branch 'galician' into 'develop'
Adds galician to supported languages list

See merge request ultrasonic/ultrasonic!965
2023-04-15 10:24:03 +00:00
Óscar García Amor
2df89f4d81
Adds galician to supported languages list 2023-04-15 12:15:37 +02:00
Óscar García Amor
e83026f29a Merge branch 'norwegian' into 'develop'
Adds norwegian to supported languages list

See merge request ultrasonic/ultrasonic!964
2023-04-15 10:13:49 +00:00
Óscar García Amor
233e4f7a67
Adds norwegian to supported languages list 2023-04-15 12:05:56 +02:00
Óscar García Amor
dba12d147f Merge branch 'big-in-japan' into 'develop'
Adds japanese to supported languages list

See merge request ultrasonic/ultrasonic!963
2023-04-15 10:02:35 +00:00
Óscar García Amor
ccdd994756
Adds japanese to supported languages list 2023-04-15 11:53:13 +02:00
Óscar García Amor
dfcac45669 Merge branch 'changelog' into 'develop'
Translates changelog to spanish

See merge request ultrasonic/ultrasonic!962
2023-04-15 09:14:04 +00:00
Óscar García Amor
f72fc1885c Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!961
2023-04-15 09:04:43 +00:00
Óscar García Amor
db40d95215
Translates changelog to spanish 2023-04-15 11:02:09 +02:00
aorinngoDo
c2f4b58088
Translated using Weblate (Japanese)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/ja/
2023-04-14 17:52:47 +02:00
birdbird
82d2596c66 Merge branch '432' into 'develop'
Release 4.3.2

See merge request ultrasonic/ultrasonic!960
2023-04-14 12:06:09 +00:00
oiu
ccd7f5881d
Release 4.3.2 2023-04-14 14:03:44 +02:00
birdbird
c7edfbcae6 Merge branch 'StrictMode' into 'develop'
Fix a bunch of StrictMode warnings by executing methods on the right threads

See merge request ultrasonic/ultrasonic!958
2023-04-14 08:01:54 +00:00
tzugen
b1839c9562
Fix a bunch of StrictMode warnings by executing methods on the right threads 2023-04-13 16:20:45 +02:00
Renovate Bot
dbef8307ea Update dependency gradle to v8.1 2023-04-12 12:34:09 +00:00
Renovate Bot
ee52070925 Update dependency org.robolectric:robolectric to v4.10 2023-04-11 16:32:18 +00:00
Óscar García Amor
a406b8d211 Merge branch 'changelog' into 'develop'
Translate changelog to spanish

See merge request ultrasonic/ultrasonic!954
2023-04-11 15:04:07 +00:00
Óscar García Amor
367c1508b5
Translate changelog to spanish 2023-04-11 16:52:06 +02:00
Óscar García Amor
e5fce6a832 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!953
2023-04-11 14:32:06 +00:00
Weblate
6b5c96ea74 Translations update from Hosted Weblate 2023-04-11 14:32:06 +00:00
Óscar García Amor
d2faad60ca
Adds missing newline EOF 2023-04-11 16:06:48 +02:00
birdbird
2d7c26f13d Merge branch 'Changelog' into 'develop'
Format changelog correctly

See merge request ultrasonic/ultrasonic!952
2023-04-11 13:43:15 +00:00
tzugen
116e5aa4cf
Format changelog correctly 2023-04-11 15:33:59 +02:00
birdbird
3e8f45a073 Merge branch 'release431' into 'develop'
Release 4.3.1

See merge request ultrasonic/ultrasonic!951
2023-04-11 06:15:27 +00:00
birdbird
8090d4e039 Release 4.3.1 2023-04-11 06:15:27 +00:00
birdbird
9ca29cd11b Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!947
2023-04-10 11:28:22 +00:00
Mahoo Huang
76af2ffcc1
Translated using Weblate (Chinese (Simplified))
Currently translated at 96.7% (412 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/zh_Hans/
2023-04-10 13:26:31 +02:00
birdbird
82d554a900 Merge branch 'fixExceptions' into 'develop'
Fix two exceptions

See merge request ultrasonic/ultrasonic!949
2023-04-10 11:26:28 +00:00
birdbird
c70fcd7447 Fix two exceptions 2023-04-10 11:26:27 +00:00
birdbird
297f71a8c8 Merge branch 'SearchFix' into 'develop'
Search fix

See merge request ultrasonic/ultrasonic!948
2023-04-10 11:08:04 +00:00
birdbird
8c00388dc7 Search fix 2023-04-10 11:08:04 +00:00
birdbird
d92203ada6 Merge branch 'renovate/room' into 'develop'
Update room to v2.5.1

See merge request ultrasonic/ultrasonic!938
2023-04-06 10:07:03 +00:00
birdbird
f8d24a943d Merge branch 'renovate/androidxcore' into 'develop'
Update dependency androidx.core:core-ktx to v1.10.0

See merge request ultrasonic/ultrasonic!946
2023-04-06 10:06:53 +00:00
Renovate Bot
a1e84183d6 Update dependency androidx.core:core-ktx to v1.10.0 2023-04-05 17:32:19 +00:00
Óscar García Amor
2b339ccc7d
Bump version to 4.3.0 2023-04-04 15:58:24 +02:00
birdbird
893ae7fb1e Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!945
2023-04-03 07:26:31 +00:00
Tim Schneeberger
a828b19cce
Translated using Weblate (German)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/de/
2023-04-01 22:40:07 +02:00
birdbird
13f296b5ed Merge branch 'fixSomeStrictMode' into 'develop'
Fix some strict mode

See merge request ultrasonic/ultrasonic!944
2023-04-01 12:06:34 +00:00
birdbird
aa2c460529 Fix some strict mode 2023-04-01 12:06:34 +00:00
Renovate Bot
61b3b671a5 Update room to v2.5.1 2023-03-31 13:40:39 +00:00
birdbird
76d2fcdcc3 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!941
2023-03-31 13:10:30 +00:00
gallegonovato
2fe8e5f229
Translated using Weblate (Spanish)
Currently translated at 100.0% (426 of 426 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-03-31 14:36:35 +02:00
birdbird
4dcd495c96 Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v1.8.20

See merge request ultrasonic/ultrasonic!943
2023-03-31 12:36:30 +00:00
birdbird
6fe9f730e3 Merge branch 'renovate/viewmodelktx' into 'develop'
Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.6.1

See merge request ultrasonic/ultrasonic!937
2023-03-31 12:35:58 +00:00
birdbird
cb781cb76d Merge branch 'dumpConfig' into 'develop'
Dump settings to log when file logging is enabled

Closes #891

See merge request ultrasonic/ultrasonic!934
2023-03-31 12:35:07 +00:00
Renovate Bot
037519a5d3 Update kotlin monorepo to v1.8.20 2023-03-30 10:33:53 +00:00
birdbird
586b4f16e7 Merge branch 'autoFix' into 'develop'
Implement Auto requestMetadata.searchQuery

Closes #827

See merge request ultrasonic/ultrasonic!926
2023-03-24 19:13:19 +00:00
birdbird
1f9afd92b6 Implement Auto requestMetadata.searchQuery 2023-03-24 19:13:18 +00:00
birdbird
64d6605c2a Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!940
2023-03-24 17:28:20 +00:00
Allan Nordhøy
e2593406fa
Translated using Weblate (Norwegian Bokmål)
Currently translated at 85.6% (363 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2023-03-23 22:00:18 +01:00
birdbird
8647ea20f7 Merge branch 'ci-rename' into 'develop'
Rename CI steps for clarity

See merge request ultrasonic/ultrasonic!939
2023-03-23 07:50:27 +00:00
birdbird
eddb5947d3 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!936
2023-03-23 07:42:14 +00:00
Renovate Bot
9ac48946f5 Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.6.1 2023-03-23 07:32:39 +00:00
birdbird
32e907905e Rename CI steps for clarity 2023-03-23 07:23:20 +00:00
Allan Nordhøy
7e9dfb0c72
Translated using Weblate (Norwegian Bokmål)
Currently translated at 66.5% (282 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2023-03-23 08:02:02 +01:00
Allan Nordhøy
4c9e0aaf87
Translated using Weblate (Norwegian Bokmål)
Currently translated at 65.5% (278 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2023-03-23 08:02:02 +01:00
gallegonovato
d0b3371958
Translated using Weblate (Spanish)
Currently translated at 100.0% (424 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/es/
2023-03-23 08:02:02 +01:00
Allan Nordhøy
b406ec8d07
Translated using Weblate (English)
Currently translated at 100.0% (424 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/en/
2023-03-23 08:02:02 +01:00
birdbird
2255816a1b Use our new registry url 2023-03-23 07:01:57 +00:00
birdbird
70f7d20fea Remove assembleDebug step, it's not needed 2023-03-23 06:56:26 +00:00
birdbird
5a9ca9f565 Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.0.0

See merge request ultrasonic/ultrasonic!935
2023-03-22 12:57:29 +00:00
Renovate Bot
db97b03224 Update media3 to v1.0.0 2023-03-22 10:32:43 +00:00
tzugen
2ebb333a6e
Dump settings to log when file logging is enabled 2023-03-21 18:41:28 +01:00
birdbird
c72c6354e3 Merge branch 'weblate' into 'develop'
Migrates translations to Weblate

See merge request ultrasonic/ultrasonic!932
2023-03-21 11:14:57 +00:00
birdbird
7a70c4565c Merge branch 'npeFix' into 'develop'
Add logging for potential NPE

See merge request ultrasonic/ultrasonic!933
2023-03-21 09:04:55 +00:00
tzugen
be55eb514c
Add logging for potential NPE 2023-03-21 09:55:11 +01:00
Óscar García Amor
0a81df23e7
Migrates translations to Weblate 2023-03-21 08:46:06 +01:00
birdbird
46ad240306 Merge branch 'improveCI2' into 'develop'
Skip cache in sign step

See merge request ultrasonic/ultrasonic!931
2023-03-20 09:12:49 +00:00
birdbird
d3151d934a Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!929
2023-03-20 09:12:26 +00:00
birdbird
0ad68f1f11 Skip cache in sign step 2023-03-20 09:09:45 +00:00
Allan Nordhøy
724c7856d9
Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.5% (66 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2023-03-20 09:37:24 +01:00
ssantos
36db1f7799
Translated using Weblate (Portuguese)
Currently translated at 99.7% (423 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2023-03-20 09:37:24 +01:00
J. Lavoie
b4613c3b38
Translated using Weblate (Italian)
Currently translated at 65.5% (278 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/it/
2023-03-20 09:37:24 +01:00
J. Lavoie
6ed8504d32
Translated using Weblate (French)
Currently translated at 99.7% (423 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/fr/
2023-03-20 09:37:24 +01:00
J. Lavoie
9c2ac56435
Translated using Weblate (German)
Currently translated at 96.2% (408 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/de/
2023-03-20 09:37:24 +01:00
birdbird
61e25e3c26 Merge branch 'improveCI' into 'develop'
Improve CI

See merge request ultrasonic/ultrasonic!930
2023-03-20 08:37:20 +00:00
birdbird
9c2eece929 Improve CI 2023-03-20 08:37:19 +00:00
birdbird
145bcec047 Reenable all CI steps 2023-03-19 11:17:16 +00:00
birdbird
efd840e5fe Enable Gitlab CI for MR 2023-03-19 11:08:43 +00:00
birdbird
d9ff239b03 Print Project ID 2023-03-19 10:57:54 +00:00
birdbird
6f808c4ebc Disable circleCI 2023-03-19 10:54:05 +00:00
birdbird
a43d2351ae Update .gitlab-ci.yml file 2023-03-19 09:32:30 +00:00
birdbird
839633c2f0 Cleanup 2023-03-19 09:25:06 +00:00
birdbird
f6b43fd2fd New try with only-pulling cache 2023-03-19 09:19:13 +00:00
birdbird
735e3225f8 Update .gitlab-ci.yml file 2023-03-19 09:17:00 +00:00
birdbird
386bfd884c Update .gitlab-ci.yml file 2023-03-19 09:14:23 +00:00
birdbird
03ff59c0b8 Update .gitlab-ci.yml file 2023-03-19 09:07:35 +00:00
birdbird
28f06c0b09 Update .gitlab-ci.yml file 2023-03-19 09:01:18 +00:00
birdbird
2933e0d801 Update .gitlab-ci.yml file 2023-03-19 08:56:28 +00:00
birdbird
318d362b77 Update .gitlab-ci.yml file 2023-03-19 08:53:17 +00:00
birdbird
1b1914e7ad Update .gitlab-ci.yml file 2023-03-19 08:46:48 +00:00
birdbird
ae853d8d4a Update .gitlab-ci.yml file 2023-03-19 08:35:14 +00:00
birdbird
f840149275 Update .gitlab-ci.yml file 2023-03-19 08:30:55 +00:00
birdbird
990479e37d Debug cache content 2023-03-19 08:29:53 +00:00
birdbird
5e7837b4b9 Debug cache content 2023-03-19 08:28:11 +00:00
birdbird
a53b2bc2c0 Try to use smaller image for Gitlab runner 2023-03-19 08:08:36 +00:00
birdbird
c0536353eb Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!928
2023-03-18 10:58:28 +00:00
Allan Nordhøy
e9b288cb6e
Translated using Weblate (Norwegian Bokmål)
Currently translated at 8.2% (35 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/nb_NO/
2023-03-17 00:39:31 +01:00
birdbird
9a4f1bfc60 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!927
2023-03-15 12:59:38 +00:00
ssantos
924ad71855
Translated using Weblate (Portuguese)
Currently translated at 99.7% (423 of 424 strings)

Translation: Ultrasonic/app
Translate-URL: https://hosted.weblate.org/projects/ultrasonic/app/pt/
2023-03-14 22:38:07 +01:00
323 changed files with 9702 additions and 7704 deletions

View File

@ -1,224 +0,0 @@
version: 2.1
parameters:
memory-config:
type: string
default: "-Xmx3200m -Xms256m -XX:MaxMetaspaceSize=1g"
memory-config-debug:
type: string
default: "-Xmx3200m -Xms256m -XX:MaxMetaspaceSize=1g -verbose:gc -Xlog:gc*"
jobs:
Done in GitLab CI:
docker:
- image: busybox:stable
steps:
- run:
name: Done in GitLab CI
command: echo This build will be done in GitLab CI
Check Style:
docker:
- image: cimg/android:2023.02.1
working_directory: ~/ultrasonic
environment:
JVM_OPTS: << pipeline.parameters.memory-config >>
JAVA_TOOL_OPTIONS: << pipeline.parameters.memory-config >>
GRADLE_OPTS: << pipeline.parameters.memory-config >>
steps:
- checkout
- restore_cache:
keys:
- ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- ultrasonic-{{ .Branch }}
- ultrasonic
- run:
name: Check Style
command: ./gradlew -Pqc ktlintCheck
- save_cache:
paths:
- ~/.gradle
key: ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
Static Analysis:
docker:
- image: cimg/android:2023.02.1
working_directory: ~/ultrasonic
environment:
JVM_OPTS: << pipeline.parameters.memory-config >>
JAVA_TOOL_OPTIONS: << pipeline.parameters.memory-config >>
GRADLE_OPTS: << pipeline.parameters.memory-config >>
steps:
- checkout
- restore_cache:
keys:
- ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- ultrasonic-{{ .Branch }}
- ultrasonic
- run:
name: Check Style
command: ./gradlew -Pqc detekt
- save_cache:
paths:
- ~/.gradle
key: ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
Lint:
docker:
- image: cimg/android:2023.02.1
working_directory: ~/ultrasonic
environment:
JVM_OPTS: << pipeline.parameters.memory-config >>
JAVA_TOOL_OPTIONS: << pipeline.parameters.memory-config >>
GRADLE_OPTS: << pipeline.parameters.memory-config >>
steps:
- checkout
- restore_cache:
keys:
- ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- ultrasonic-{{ .Branch }}
- ultrasonic
- run:
name: Lint
command: ./gradlew :ultrasonic:lintRelease
- save_cache:
paths:
- ~/.gradle
key: ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
Unit Tests:
docker:
- image: cimg/android:2023.02.1
working_directory: ~/ultrasonic
environment:
JVM_OPTS: << pipeline.parameters.memory-config >>
JAVA_TOOL_OPTIONS: << pipeline.parameters.memory-config >>
GRADLE_OPTS: << pipeline.parameters.memory-config >>
steps:
- checkout
- restore_cache:
keys:
- ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- ultrasonic-{{ .Branch }}
- ultrasonic
- run:
name: Check Style
command: ./gradlew ciTest testDebugUnitTest
- save_cache:
paths:
- ~/.gradle
key: ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
Assemble Debug:
docker:
- image: cimg/android:2023.02.1
working_directory: ~/ultrasonic
environment:
JVM_OPTS: << pipeline.parameters.memory-config >>
JAVA_TOOL_OPTIONS: << pipeline.parameters.memory-config >>
GRADLE_OPTS: << pipeline.parameters.memory-config >>
steps:
- checkout
- restore_cache:
keys:
- ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- ultrasonic-{{ .Branch }}
- ultrasonic
- run:
name: Assemble Debug
command: ./gradlew assembleDebug
- save_cache:
paths:
- ~/.gradle
key: ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
Assemble Release:
docker:
- image: cimg/android:2023.02.1
working_directory: ~/ultrasonic
environment:
JVM_OPTS: << pipeline.parameters.memory-config >>
JAVA_TOOL_OPTIONS: << pipeline.parameters.memory-config >>
GRADLE_OPTS: << pipeline.parameters.memory-config >>
steps:
- checkout
- restore_cache:
keys:
- ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- ultrasonic-{{ .Branch }}
- ultrasonic
- run:
name: Assemble Release
command: ./gradlew assembleRelease
- save_cache:
paths:
- ~/.gradle
key: ultrasonic-{{ .Branch }}-{{ checksum "gradle/libs.versions.toml" }}
- store_artifacts:
path: ultrasonic/build/outputs/apk/release/ultrasonic-release-unsigned.apk
destination: ultrasonic-release-unsigned
workflows:
version: 2
Check and Build:
jobs:
- Done in GitLab CI:
filters:
branches:
only:
- develop
- master
tags:
only: /.*/
- Check Style:
filters:
branches:
ignore:
- develop
- master
tags:
ignore: /.*/
- Static Analysis:
filters:
branches:
ignore:
- develop
- master
tags:
ignore: /.*/
- Lint:
filters:
branches:
ignore:
- develop
- master
tags:
ignore: /.*/
- Unit Tests:
filters:
branches:
ignore:
- develop
- master
tags:
ignore: /.*/
- Assemble Debug:
requires:
- Check Style
- Static Analysis
- Lint
- Unit Tests
filters:
branches:
ignore:
- develop
- master
tags:
ignore: /.*/
- Assemble Release:
requires:
- Check Style
- Static Analysis
- Lint
- Unit Tests
filters:
branches:
ignore:
- develop
- master
tags:
ignore: /.*/

2
.editorconfig Normal file
View File

@ -0,0 +1,2 @@
[*.{kt,kts}]
ktlint_code_style = android_studio

1
.gitignore vendored
View File

@ -18,6 +18,7 @@ out/
# Gradle files
.gradle/
.kotlin/
build/
# Local configuration file (sdk path, etc)

View File

@ -1,7 +1,9 @@
default:
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/cimg/android:2023.02.1
cache:
key: ${CI_COMMIT_REF_SLUG}
image: registry.gitlab.com/ultrasonic/ci-android:1.2.0
cache: &global_cache
key:
files:
- gradle/wrapper/gradle-wrapper.properties
paths:
- .gradle/
@ -15,83 +17,79 @@ variables:
PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/Ultrasonic/${CI_COMMIT_TAG}"
PACKAGE_APK: "ultrasonic-${CI_COMMIT_TAG}.apk"
PACKAGE_APK_IDSIG: "ultrasonic-${CI_COMMIT_TAG}.apk.idsig"
GRADLE_USER_HOME: "$CI_PROJECT_DIR/.gradle"
# The project id of https://gitlab.com/ultrasonic/ultrasonic/
ROOT_PROJECT_ID: 37671564
stages:
- Check
- Assemble
- Translations
- APK
- Build
- Sign APK
- Publish
- Release
Check Style:
stage: Check
script: ./gradlew -Pqc ktlintCheck
cache:
# inherit all global cache settings
<<: *global_cache
policy: pull
rules:
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != "37671564"
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != $ROOT_PROJECT_ID
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Static Analysis:
stage: Check
script: ./gradlew -Pqc detekt
cache:
# inherit all global cache settings
<<: *global_cache
policy: pull
rules:
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != "37671564"
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != $ROOT_PROJECT_ID
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Lint:
stage: Check
script: ./gradlew :ultrasonic:lintRelease
cache:
# inherit all global cache settings
<<: *global_cache
policy: pull-push
rules:
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != "37671564"
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != $ROOT_PROJECT_ID
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Unit Tests:
stage: Check
script: ./gradlew ciTest testDebugUnitTest
cache:
# inherit all global cache settings
<<: *global_cache
policy: pull-push
rules:
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != "37671564"
Assemble Debug:
stage: Assemble
script: ./gradlew assembleDebug
rules:
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != "37671564"
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != $ROOT_PROJECT_ID
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Assemble Release:
stage: Assemble
script: ./gradlew assembleRelease
stage: Build
script:
- sed -i 's/applicationId \"org.moire.ultrasonic\"/applicationId "org.moire.ultrasonic.gitlab"/' ultrasonic/build.gradle
- ./gradlew assembleRelease
artifacts:
name: ultrasonic-release-unsigned-${CI_COMMIT_SHA}
paths:
- ultrasonic/build/outputs/apk/release/ultrasonic-release-unsigned.apk
rules:
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != "37671564"
Push Translations:
stage: Translations
image: alpine:latest
script:
- wget -O /tmp/tx-linux-amd64.tar.gz https://github.com/transifex/cli/releases/latest/download/tx-linux-amd64.tar.gz
- tar xf /tmp/tx-linux-amd64.tar.gz -C /tmp
- mv /tmp/tx /usr/bin/tx
- tx push -s
rules:
- if: $CI_COMMIT_REF_NAME == "develop" && $CI_PROJECT_ID == "37671564"
Generate Signed Develop APK:
stage: APK
script:
- openssl aes-256-cbc -K ${ULTRASONIC_KEYSTORE_KEY} -iv ${ULTRASONIC_KEYSTORE_IV} -in ultrasonic-keystore.enc -out ultrasonic-keystore -d
- mkdir -p ${CI_PROJECT_DIR}/ultrasonic-release
- ${ANDROID_HOME}/build-tools/*/zipalign -v 4 ultrasonic/build/outputs/apk/release/ultrasonic-release-unsigned.apk ${CI_PROJECT_DIR}/ultrasonic-release/ultrasonic-${CI_COMMIT_SHA}.apk
- ${ANDROID_HOME}/build-tools/*/apksigner sign --verbose --ks ${CI_PROJECT_DIR}/ultrasonic-keystore --ks-pass pass:${ULTRASONIC_KEYSTORE_STOREPASS} --key-pass pass:${ULTRASONIC_KEYSTORE_KEYPASS} ${CI_PROJECT_DIR}/ultrasonic-release/ultrasonic-${CI_COMMIT_SHA}.apk
- ${ANDROID_HOME}/build-tools/*/apksigner verify --verbose ${CI_PROJECT_DIR}/ultrasonic-release/ultrasonic-${CI_COMMIT_SHA}.apk
artifacts:
name: ultrasonic-${CI_COMMIT_SHA}
paths:
- ultrasonic-release/
rules:
- if: $CI_COMMIT_REF_NAME == "develop" && $CI_PROJECT_ID == "37671564"
- if: $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_TAG || $CI_PROJECT_ID != $ROOT_PROJECT_ID
# We generate a signed package for each commit to develop as well as when making a release.
# Since the develop signed apk are not persistent they can be downloaded for around 3 weeks before Gitlab deletes them.
Generate Signed APK:
stage: APK
stage: Sign APK
# We don't need the gradle cache here
cache: []
script:
- openssl aes-256-cbc -K ${ULTRASONIC_KEYSTORE_KEY} -iv ${ULTRASONIC_KEYSTORE_IV} -in ultrasonic-keystore.enc -out ultrasonic-keystore -d
- mkdir -p ${CI_PROJECT_DIR}/ultrasonic-release
@ -99,11 +97,17 @@ Generate Signed APK:
- ${ANDROID_HOME}/build-tools/*/apksigner sign --verbose --ks ${CI_PROJECT_DIR}/ultrasonic-keystore --ks-pass pass:${ULTRASONIC_KEYSTORE_STOREPASS} --key-pass pass:${ULTRASONIC_KEYSTORE_KEYPASS} ${CI_PROJECT_DIR}/ultrasonic-release/${PACKAGE_APK}
- ${ANDROID_HOME}/build-tools/*/apksigner verify --verbose ${CI_PROJECT_DIR}/ultrasonic-release/${PACKAGE_APK}
artifacts:
name: ultrasonic-${CI_COMMIT_TAG}
name: $PACKAGE_APK
paths:
- ultrasonic-release/
rules:
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == "37671564"
# Run when releasing a new tag
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == $ROOT_PROJECT_ID
# Or when adding a new commit to develop (but never inside merge events)
- if: $CI_COMMIT_REF_NAME == "develop" && $CI_PROJECT_ID == $ROOT_PROJECT_ID && $CI_PIPELINE_SOURCE != "merge_request_event"
variables:
PACKAGE_APK: ultrasonic-${CI_COMMIT_SHA}.apk
Publish Signed APK:
stage: Publish
@ -114,7 +118,7 @@ Publish Signed APK:
- |
curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ultrasonic-release/${PACKAGE_APK_IDSIG} "${PACKAGE_REGISTRY_URL}/${PACKAGE_APK_IDSIG}"
rules:
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == "37671564"
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == $ROOT_PROJECT_ID
Release:
stage: Release
@ -124,4 +128,24 @@ Release:
--assets-link "{\"name\":\"${PACKAGE_APK}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${PACKAGE_APK}\"}" \
--assets-link "{\"name\":\"${PACKAGE_APK_IDSIG}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${PACKAGE_APK_IDSIG}\"}"
rules:
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == "37671564"
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == $ROOT_PROJECT_ID
RoboTest:
stage: Release
image: gcr.io/google.com/cloudsdktool/google-cloud-cli:latest
# We don't need the gradle cache here
cache: []
script:
- curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
- gcloud auth activate-service-account --key-file .secure_files/firebase-key.json
- gcloud firebase test android run --project ultrasonic-61089 --type robo --app ultrasonic-release/${PACKAGE_APK} --robo-directives click:button1= --device model=Nexus6,version=21,locale=en,orientation=portrait --device model=Pixel3,version=28,locale=fr,orientation=landscape
rules:
# Run when releasing a new tag
- if: $CI_COMMIT_TAG && $CI_PROJECT_ID == $ROOT_PROJECT_ID
# or when requested by using [ROBO] inside the commit message and merging to develop
# Would be nice to be able to run it in a MR as well, but currently not possible
# Because it would not have access to the protected keys.
- if: $CI_COMMIT_MESSAGE =~ /^\[ROBO\].*/ && $CI_PROJECT_ID == $ROOT_PROJECT_ID && $CI_COMMIT_REF_NAME == "develop" && $CI_PIPELINE_SOURCE != "merge_request_event"
variables:
PACKAGE_APK: ultrasonic-${CI_COMMIT_SHA}.apk

View File

@ -1,4 +1,3 @@
<!-- Please describe your changes here -->
----------------------------------------------------------------------------
@ -7,8 +6,6 @@
- [ ] I ran `./gradlew -Pqc ktlintCheck`, `./gradlew -Pqc detekt` and
`./gradlew :ultrasonic:lintRelease` and no problems found. See
[CONTRIBUTING](CONTRIBUTING.md) for further information.
- [ ] I'm using my own branch in my local copy. Ej, I want to merge
`myuser/ultrasonic:my-new-contribution` into `develop`.
- [ ] All commits [are
signed](https://docs.gitlab.com/ee/user/project/repository/gpg_signed_commits/).
- [ ] I agree to release my code and all other changes of this MR under the

View File

@ -0,0 +1,10 @@
#### Before merge:
- [ ] MR is targetting the master branch
- [ ] **Squash commits must be disabled!**
- [ ] RoboTests (5 physical, 10 virtual) on a Release apk return no errors
- [ ] Release notes present
#### After merge
- [ ] ``git fetch``
- [ ] Create an annotated and signed tag: ``git tag -sa``
- [ ] Push the tag to git:``git push --tags``

View File

@ -1,11 +1,6 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value />
</option>
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">

2
.idea/compiler.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
<bytecodeTargetLevel target="21" />
</component>
</project>

View File

@ -1,10 +0,0 @@
[main]
host = https://www.transifex.com
lang_map = fr_CA: fr-rCA, fr_FR: fr, es_ES: es, km_KH: km-rKH, th_TH: th, pl_PL: pl, zh_TW: zh-rTW, ru_RU: ru, pt_BR: pt-rBR, pt_PT: pt, he: iw, zh_HK: zh-rHK, da_DK: da-rDK, de_DE: de, bg_BG: bg, sr: sr, nl_NL: nl, zh_CN: zh-rCN, sv_SE: sv-rSE, el_GR: el, lt_LT: lt, it_IT: it, hu_HU: hu, kn_IN: kn-rIN, tr_TR: tr, cs_CZ: cs, id: in
[o:ultrasonic:p:ultrasonic:r:app]
file_filter = ultrasonic/src/main/res/values-<lang>/strings.xml
source_file = ultrasonic/src/main/res/values/strings.xml
source_lang = en
type = ANDROID

View File

@ -11,7 +11,7 @@ issue](https://gitlab.com/ultrasonic/ultrasonic/issues/new).
## Contributing Translations
Interested in help to translate Ultrasonic? You can contribute in our
[Transifex team](https://www.transifex.com/ultrasonic/ultrasonic/).
[Weblate team](https://hosted.weblate.org/projects/ultrasonic/).
## Contributing Code

View File

@ -31,12 +31,6 @@ If you want to use the version downloaded from F-Droid or from GitLab with
First, see if your issue havent been yet reported [here][issues], otherwise
open [a new issue][newissue].
### Known (not our) bugs
If you are using *Madsonic 5.1.X* several sections of Ultrasonic will not
work. This is caused by bad implementation of Subsonic API by Madsonic. For
more info about this you can read [this bug][madbug].
## Contributing
See [CONTRIBUTING](CONTRIBUTING.md).
@ -62,7 +56,6 @@ Full text of the license is available in the [LICENSE](LICENSE) file and
[wikiaa]: https://gitlab.com/ultrasonic/ultrasonic/-/wikis/Using-Ultrasonic-with-Android-Auto
[issues]: https://gitlab.com/ultrasonic/ultrasonic/-/issues
[newissue]: https://gitlab.com/ultrasonic/ultrasonic/-/issues/new
[madbug]: https://gitlab.com/ultrasonic/ultrasonic/-/issues/129
[subsonic]: http://www.subsonic.org/
[subapi]: http://www.subsonic.org/pages/api.jsp
[airsonic]: https://github.com/airsonic-advanced/airsonic-advanced

View File

@ -1,3 +1,5 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
apply from: 'gradle/versions.gradle'
@ -10,8 +12,8 @@ buildscript {
repositories {
google()
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
maven { url 'https://jitpack.io' }
gradlePluginPortal()
maven { url = "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath libs.gradle
@ -27,25 +29,32 @@ allprojects {
buildscript {
repositories {
mavenCentral()
gradlePluginPortal()
google()
}
}
repositories {
mavenCentral()
gradlePluginPortal()
google()
maven { url 'https://jitpack.io' }
}
// Set Kotlin JVM target to the same for all subprojects
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
tasks.withType(KotlinCompile).configureEach {
kotlinOptions {
jvmTarget = "11"
jvmTarget = "21"
}
}
tasks.withType(JavaCompile).tap {
configureEach {
options.compilerArgs.add("-Xlint:deprecation")
}
}
}
wrapper {
gradleVersion(libs.versions.gradle.get())
distributionType("all")
}
gradleVersion = libs.versions.gradle.get()
distributionType = "all"
}

View File

@ -52,7 +52,11 @@ style:
active: true
ForbiddenComment:
active: true
values: ['FIXME:', 'STOPSHIP:']
comments:
- reason: 'Forbidden FIXME todo marker in comment, please fix the problem.'
value: 'FIXME:'
- reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.'
value: 'STOPSHIP:'
WildcardImport:
active: true
MaxLineLength:

View File

@ -1,12 +1,20 @@
plugins {
alias libs.plugins.ksp
}
apply from: bootstrap.androidModule
apply plugin: 'kotlin-kapt'
dependencies {
implementation libs.core
implementation libs.roomRuntime
implementation libs.roomKtx
kapt libs.room
ksp libs.room
}
android {
namespace 'org.moire.ultrasonic.subsonic.domain'
namespace = 'org.moire.ultrasonic.subsonic.domain'
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
}

View File

@ -31,7 +31,7 @@ data class Album(
override var genre: String? = null,
override var starred: Boolean = false,
override var path: String? = null,
override var closeness: Int = 0,
override var closeness: Int = 0
) : MusicDirectory.Child() {
override var isDirectory = true
override var isVideo = false

View File

@ -13,10 +13,7 @@ class MusicDirectory : ArrayList<MusicDirectory.Child>() {
var name: String? = null
@JvmOverloads
fun getChildren(
includeDirs: Boolean = true,
includeFiles: Boolean = true
): List<Child> {
fun getChildren(includeDirs: Boolean = true, includeFiles: Boolean = true): List<Child> {
if (includeDirs && includeFiles) {
return toList()
}

View File

@ -1,5 +1,14 @@
plugins {
alias libs.plugins.ksp
}
apply from: bootstrap.kotlinModule
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
dependencies {
api libs.retrofit
api libs.jacksonConverter
@ -13,7 +22,6 @@ dependencies {
testImplementation libs.kotlinJunit
testImplementation libs.mockito
testImplementation libs.mockitoInline
testImplementation libs.mockitoKotlin
testImplementation libs.kluent
testImplementation libs.mockWebServer

View File

@ -8,7 +8,8 @@ import org.moire.ultrasonic.api.subsonic.rules.MockWebServerRule
* Base class for integration tests for [SubsonicAPIClient] class.
*/
abstract class SubsonicAPIClientTest {
@JvmField @Rule val mockWebServerRule = MockWebServerRule()
@JvmField @Rule
val mockWebServerRule = MockWebServerRule()
protected lateinit var config: SubsonicClientConfiguration
protected lateinit var client: SubsonicAPIClient

View File

@ -11,7 +11,8 @@ import org.moire.ultrasonic.api.subsonic.rules.MockWebServerRule
* Base class for testing [okhttp3.Interceptor] implementations.
*/
abstract class BaseInterceptorTest {
@Rule @JvmField val mockWebServerRule = MockWebServerRule()
@Rule @JvmField
val mockWebServerRule = MockWebServerRule()
lateinit var client: OkHttpClient

View File

@ -92,7 +92,13 @@ internal class ApiVersionCheckWrapper(
checkVersion(V1_4_0)
checkParamVersion(musicFolderId, V1_12_0)
return api.search2(
query, artistCount, artistOffset, albumCount, albumOffset, songCount, musicFolderId
query,
artistCount,
artistOffset,
albumCount,
albumOffset,
songCount,
musicFolderId
)
}
@ -108,7 +114,13 @@ internal class ApiVersionCheckWrapper(
checkVersion(V1_8_0)
checkParamVersion(musicFolderId, V1_12_0)
return api.search3(
query, artistCount, artistOffset, albumCount, albumOffset, songCount, musicFolderId
query,
artistCount,
artistOffset,
albumCount,
albumOffset,
songCount,
musicFolderId
)
}
@ -228,7 +240,13 @@ internal class ApiVersionCheckWrapper(
checkParamVersion(estimateContentLength, V1_8_0)
checkParamVersion(converted, V1_14_0)
return api.stream(
id, maxBitRate, format, timeOffset, videoSize, estimateContentLength, converted
id,
maxBitRate,
format,
timeOffset,
videoSize,
estimateContentLength,
converted
)
}
@ -335,8 +353,9 @@ internal class ApiVersionCheckWrapper(
private fun checkVersion(expectedVersion: SubsonicAPIVersions) {
// If it is true, it is probably the first call with this server
if (!isRealProtocolVersion) return
if (currentApiVersion < expectedVersion)
if (currentApiVersion < expectedVersion) {
throw ApiNotSupportedException(currentApiVersion)
}
}
private fun checkParamVersion(param: Any?, expectedVersion: SubsonicAPIVersions) {

View File

@ -90,10 +90,7 @@ interface SubsonicAPIDefinition {
): Call<SubsonicResponse>
@GET("setRating.view")
fun setRating(
@Query("id") id: String,
@Query("rating") rating: Int
): Call<SubsonicResponse>
fun setRating(@Query("id") id: String, @Query("rating") rating: Int): Call<SubsonicResponse>
@GET("getArtist.view")
fun getArtist(@Query("id") id: String): Call<GetArtistResponse>
@ -158,8 +155,7 @@ interface SubsonicAPIDefinition {
@Query("public") public: Boolean? = null,
@Query("songIdToAdd") songIdsToAdd: List<String>? = null,
@Query("songIndexToRemove") songIndexesToRemove: List<Int>? = null
):
Call<SubsonicResponse>
): Call<SubsonicResponse>
@GET("getPodcasts.view")
fun getPodcasts(
@ -227,10 +223,7 @@ interface SubsonicAPIDefinition {
@Streaming
@GET("getCoverArt.view")
fun getCoverArt(
@Query("id") id: String,
@Query("size") size: Long? = null
): Call<ResponseBody>
fun getCoverArt(@Query("id") id: String, @Query("size") size: Long? = null): Call<ResponseBody>
@Streaming
@GET("stream.view")

View File

@ -29,10 +29,12 @@ enum class SubsonicAPIVersions(val subsonicVersions: String, val restApiVersion:
V1_13_0("5.3", "1.13.0"),
V1_14_0("6.0", "1.14.0"),
V1_15_0("6.1", "1.15.0"),
V1_16_0("6.1.2", "1.16.0");
V1_16_0("6.1.2", "1.16.0")
;
companion object {
@JvmStatic @Throws(IllegalArgumentException::class)
@JvmStatic
@Throws(IllegalArgumentException::class)
fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions {
val versionComponents = apiVersion.split(".")
@ -41,8 +43,11 @@ enum class SubsonicAPIVersions(val subsonicVersions: String, val restApiVersion:
try {
val majorVersion = versionComponents[0].toInt()
val minorVersion = versionComponents[1].toInt()
val patchVersion = if (versionComponents.size > 2) versionComponents[2].toInt()
else 0
val patchVersion = if (versionComponents.size > 2) {
versionComponents[2].toInt()
} else {
0
}
when (majorVersion) {
1 -> when {

View File

@ -48,7 +48,10 @@ class VersionAwareJacksonConverterFactory(
retrofit: Retrofit
): Converter<*, RequestBody>? {
return jacksonConverterFactory?.requestBodyConverter(
type, parameterAnnotations, methodAnnotations, retrofit
type,
parameterAnnotations,
methodAnnotations,
retrofit
)
}
@ -63,7 +66,7 @@ class VersionAwareJacksonConverterFactory(
}
}
class VersionAwareResponseBodyConverter<T> (
class VersionAwareResponseBodyConverter<T>(
private val notifier: (SubsonicAPIVersions) -> Unit = {},
private val adapter: ObjectReader
) : Converter<ResponseBody, T> {

View File

@ -6,6 +6,7 @@ import okhttp3.Interceptor.Chain
import okhttp3.Response
internal const val SOCKET_READ_TIMEOUT_DOWNLOAD = 30 * 1000
// Allow 20 seconds extra timeout pear MB offset.
internal const val TIMEOUT_MILLIS_PER_OFFSET_BYTE = 0.02

View File

@ -23,7 +23,8 @@ enum class AlbumListType(val typeName: String) {
SORTED_BY_ARTIST("alphabeticalByArtist"),
STARRED("starred"),
BY_YEAR("byYear"),
BY_GENRE("byGenre");
BY_GENRE("byGenre")
;
override fun toString(): String {
return typeName

View File

@ -16,7 +16,8 @@ enum class JukeboxAction(val action: String) {
CLEAR("clear"),
REMOVE("remove"),
SHUFFLE("shuffle"),
SET_GAIN("setGain");
SET_GAIN("setGain")
;
override fun toString(): String {
return action

View File

@ -10,7 +10,8 @@ class BookmarksResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("bookmarks") private val bookmarksWrapper = BookmarkWrapper()
@JsonProperty("bookmarks")
private val bookmarksWrapper = BookmarkWrapper()
val bookmarkList: List<Bookmark> get() = bookmarksWrapper.bookmarkList
}

View File

@ -10,7 +10,8 @@ class ChatMessagesResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("chatMessages") private val wrapper = ChatMessagesWrapper()
@JsonProperty("chatMessages")
private val wrapper = ChatMessagesWrapper()
val chatMessages: List<ChatMessage> get() = wrapper.messagesList
}

View File

@ -10,7 +10,8 @@ class GenresResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("genres") private val genresWrapper = GenresWrapper()
@JsonProperty("genres")
private val genresWrapper = GenresWrapper()
val genresList: List<Genre> get() = genresWrapper.genresList
}

View File

@ -11,7 +11,8 @@ class GetAlbumList2Response(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("albumList2") private val albumWrapper2 = AlbumWrapper2()
@JsonProperty("albumList2")
private val albumWrapper2 = AlbumWrapper2()
val albumList: List<Album>
get() = albumWrapper2.albumList

View File

@ -10,7 +10,8 @@ class GetAlbumListResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("albumList") private val albumWrapper = AlbumWrapper()
@JsonProperty("albumList")
private val albumWrapper = AlbumWrapper()
val albumList: List<Album>
get() = albumWrapper.albumList

View File

@ -10,7 +10,8 @@ class GetPodcastsResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("podcasts") private val channelsWrapper = PodcastChannelWrapper()
@JsonProperty("podcasts")
private val channelsWrapper = PodcastChannelWrapper()
val podcastChannels: List<PodcastChannel>
get() = channelsWrapper.channelsList

View File

@ -10,7 +10,8 @@ class GetRandomSongsResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("randomSongs") private val songsWrapper = RandomSongsWrapper()
@JsonProperty("randomSongs")
private val songsWrapper = RandomSongsWrapper()
val songsList
get() = songsWrapper.songsList

View File

@ -10,7 +10,8 @@ class GetSongsByGenreResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("songsByGenre") private val songsByGenreList = SongsByGenreWrapper()
@JsonProperty("songsByGenre")
private val songsByGenreList = SongsByGenreWrapper()
val songsList get() = songsByGenreList.songsList
}

View File

@ -11,11 +11,13 @@ class JukeboxResponse(
error: SubsonicError?,
var jukebox: JukeboxStatus = JukeboxStatus()
) : SubsonicResponse(status, version, error) {
@JsonSetter("jukeboxStatus") fun setJukeboxStatus(jukebox: JukeboxStatus) {
@JsonSetter("jukeboxStatus")
fun setJukeboxStatus(jukebox: JukeboxStatus) {
this.jukebox = jukebox
}
@JsonSetter("jukeboxPlaylist") fun setJukeboxPlaylist(jukebox: JukeboxStatus) {
@JsonSetter("jukeboxPlaylist")
fun setJukeboxPlaylist(jukebox: JukeboxStatus) {
this.jukebox = jukebox
}
}

View File

@ -10,7 +10,8 @@ class MusicFoldersResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("musicFolders") private val wrapper = MusicFoldersWrapper()
@JsonProperty("musicFolders")
private val wrapper = MusicFoldersWrapper()
val musicFolders get() = wrapper.musicFolders
}

View File

@ -10,7 +10,8 @@ class SharesResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("shares") private val wrappedShares = SharesWrapper()
@JsonProperty("shares")
private val wrappedShares = SharesWrapper()
val shares get() = wrappedShares.share
}

View File

@ -20,7 +20,8 @@ open class SubsonicResponse(
) {
@JsonDeserialize(using = Status.Companion.StatusJsonDeserializer::class)
enum class Status(val jsonValue: String) {
OK("ok"), ERROR("failed");
OK("ok"),
ERROR("failed");
companion object {
fun getStatusFromJson(jsonValue: String) =

View File

@ -10,7 +10,8 @@ class VideosResponse(
version: SubsonicAPIVersions,
error: SubsonicError?
) : SubsonicResponse(status, version, error) {
@JsonProperty("videos") private val videosWrapper = VideosWrapper()
@JsonProperty("videos")
private val videosWrapper = VideosWrapper()
val videosList: List<MusicDirectoryChild> get() = videosWrapper.videosList
}

View File

@ -18,7 +18,9 @@ class ProxyPasswordInterceptorTest {
private val proxyInterceptor = ProxyPasswordInterceptor(
V1_12_0,
mockPasswordHexInterceptor, mockPasswordMd5Interceptor, false
mockPasswordHexInterceptor,
mockPasswordMd5Interceptor,
false
)
@Test
@ -40,8 +42,10 @@ class ProxyPasswordInterceptorTest {
@Test
fun `Should use hex password if forceHex is true`() {
val interceptor = ProxyPasswordInterceptor(
V1_16_0, mockPasswordHexInterceptor,
mockPasswordMd5Interceptor, true
V1_16_0,
mockPasswordHexInterceptor,
mockPasswordMd5Interceptor,
true
)
interceptor.intercept(mockChain)

View File

@ -1,27 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>ImplicitDefaultLocale:EditServerFragment.kt$EditServerFragment.&lt;no name provided>$String.format( "%s %s", resources.getString(R.string.settings_connection_failure), getErrorMessage(error) )</ID>
<ID>ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Failed to write log to %s", file)</ID>
<ID>ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Log file rotated, logging into file %s", file?.name)</ID>
<ID>ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Logging into file %s", file?.name)</ID>
<ID>ImplicitDefaultLocale:ShareHandler.kt$ShareHandler$String.format("%d:%s", timeSpanAmount, timeSpanType)</ID>
<ID>LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
<ID>LongMethod:PlaylistsFragment.kt$PlaylistsFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID>
<ID>LongMethod:ShareHandler.kt$ShareHandler$private fun showDialog( fragment: Fragment, shareDetails: ShareDetails, swipe: SwipeRefreshLayout?, cancellationToken: CancellationToken, additionalId: String? )</ID>
<ID>LongMethod:SharesFragment.kt$SharesFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID>
<ID>LongParameterList:ServerRowAdapter.kt$ServerRowAdapter$( private var context: Context, passedData: Array&lt;ServerSetting>, private val model: ServerSettingsModel, private val activeServerProvider: ActiveServerProvider, private val manageMode: Boolean, private val serverDeletedCallback: ((Int) -> Unit), private val serverEditRequestedCallback: ((Int) -> Unit) )</ID>
<ID>MagicNumber:ActiveServerProvider.kt$ActiveServerProvider$8192</ID>
<ID>MagicNumber:JukeboxMediaPlayer.kt$JukeboxMediaPlayer$0.05f</ID>
<ID>MagicNumber:JukeboxMediaPlayer.kt$JukeboxMediaPlayer$50</ID>
<ID>MagicNumber:RESTMusicService.kt$RESTMusicService$206</ID>
<ID>NestedBlockDepth:DownloadHandler.kt$DownloadHandler$private fun downloadRecursively( fragment: Fragment, id: String, name: String?, isShare: Boolean, isDirectory: Boolean, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean )</ID>
<ID>TooGenericExceptionCaught:FileLoggerTree.kt$FileLoggerTree$x: Throwable</ID>
<ID>TooGenericExceptionCaught:JukeboxMediaPlayer.kt$JukeboxMediaPlayer$x: Throwable</ID>
<ID>TooGenericExceptionCaught:JukeboxMediaPlayer.kt$JukeboxMediaPlayer.TaskQueue$x: Throwable</ID>
<ID>TooManyFunctions:RESTMusicService.kt$RESTMusicService : MusicService</ID>
<ID>UtilityClassWithPublicConstructor:FragmentTitle.kt$FragmentTitle</ID>
</CurrentIssues>
</SmellBaseline>

View File

@ -0,0 +1,7 @@
Bug fixes
- #831: Version 4.1.1 and develop: 'jukebox on/off' no longer shown in 'Now Playing'.
Enhancements
- #827: Make app full compliant Android Auto to publish in Play Store.
- #878: "Play shuffled" option for playlists always begins with the first track.
- #891: Dump config to log file when logging is enabled.

View File

@ -0,0 +1,4 @@
Bug fixes
- Fix a crash when a ID3 tag date is in a wrong format.
- Fix a crash on API 31 (newest Android).
- Fix empty search results.

View File

@ -0,0 +1,2 @@
Bug fixes
- Fix a crash when downloading the album art.

View File

@ -0,0 +1,8 @@
Bug fixes
- Fix various crashes
Changes since 4.2.0
- #827: Make app full compliant Android Auto to publish in Play Store.
- #878: "Play shuffled" option for playlists always begins with the first track.
- #891: Dump config to log file when logging is enabled.
- #854: Remove Videos menu option for servers which don't support it.

View File

@ -0,0 +1,8 @@
Bug fixes
- Fix more exceptions
Changes since 4.2.0
- #827: Make app full compliant Android Auto to publish in Play Store.
- #878: "Play shuffled" option for playlists always begins with the first track.
- #891: Dump config to log file when logging is enabled.
- #854: Remove Videos menu option for servers which don't support it.

View File

@ -0,0 +1,10 @@
Features:
- This releases focuses on shuffled playback. The view of the playlist will now present itself in the order it will actually play. You can toggle the shuffle mode to create a new order, while the past playback history will be preserved.
- Use Coroutines for triggering the download or playback of music through the context menus
- Enable Artists pictures by Default
Bug fixes:
- Remove an unhelpful popup that "ID must be set"
- Shuffle mode doesn't always play all tracks
- Shuffle mode starts with the first track most of the time

View File

@ -0,0 +1,10 @@
Features:
- This releases focuses on shuffled playback. The view of the playlist will now present itself in the order it will actually play. You can toggle the shuffle mode to create a new order, while the past playback history will be preserved.
- Use Coroutines for triggering the download or playback of music through the context menus
- Enable Artists pictures by Default
Bug fixes:
- Remove an unhelpful popup that "ID must be set"
- Shuffle mode doesn't always play all tracks
- Shuffle mode starts with the first track most of the time

View File

@ -0,0 +1,10 @@
Features:
- Revamp management of ratings. Tracks can be starred from the notification in Android 13, and the changes will show up everywhere immediately.
- Add a setting to control the maximum bitrate when pinning music (can be used to avoid downloading lossless files like flac).
- Modernize the Jukebox player.
- The hardware keys can be used to set the Jukebox volume.
- The current playlist shows a spinner when loading takes some time
Bug fixes:
- Request correct bluetooth permission on Android 13 (needed to pause/play on connect)
- Update dependencies (OkHttp, Material)

View File

@ -0,0 +1,12 @@
Features:
- Search is accesible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut
Bug fixes:
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active
- Upgrade material to 1.9.0

View File

@ -0,0 +1,15 @@
Features:
- Search is accessible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut
Bug fixes:
- Readd the "Star" button to the Now Playing screen
- Fix a rare crash when shuffling playlists with duplicate entries
- Fix a crash when choosing "Play next" on an empty playlist.
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active
- Upgrade material to 1.9.0

View File

@ -0,0 +1,15 @@
Features:
- Search is accessible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut
Bug fixes:
- Avoid triggering a bug in Supysonic
- Readd the "Star" button to the Now Playing screen
- Fix a rare crash when shuffling playlists with duplicate entries
- Fix a crash when choosing "Play next" on an empty playlist.
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active

View File

@ -0,0 +1,15 @@
Features:
- Search is accessible through a new icon on the main screen
- Modernize Back Handling
- Reenable R8 Code minification
- Add a "Play Random Songs" shortcut
Bug fixes:
- Fix a few crashes
- Avoid triggering a bug in Supysonic
- Readd the "Star" button to the Now Playing screen
- Fix a rare crash when shuffling playlists with duplicate entries
- Fix a crash when choosing "Play next" on an empty playlist.
- Tracks buttons flash a scrollbar sometimes in Android 13
- Fix EndlessScrolling in genre listing
- Couldn't delete a track when shuffle was active

View File

@ -0,0 +1,9 @@
### Features
- Added custom buttons for shuffling the current queue and setting repeat mode (Android Auto)
- Properly handling nested directory structures (Android Auto)
- Add a toast when adding tracks to the playlist
- Allow pinning when offline
### Dependencies
- Update koin
- Update media3 to v1.1.0

View File

@ -0,0 +1,12 @@
### Fixes
- Fix a bug in 4.7.0 that repeat mode was activated by default.
### Features
- Added custom buttons for shuffling the current queue and setting repeat mode (Android Auto)
- Properly handling nested directory structures (Android Auto)
- Add a toast when adding tracks to the playlist
- Allow pinning when offline
### Dependencies
- Update koin
- Update media3 to v1.1.0

View File

@ -0,0 +1,5 @@
### Features
- Improved display of rating stars
- Completely modernize all older code parts
- Updates for Android 14
- Update dependencies

View File

@ -1,17 +1,17 @@
Ultrasonic is a Subsonic (and compatible servers) client to Android. You can use Ultrasonic to connect with your server and listen music.
Main features:
* Thin
* Fast
* Dark and light theme
* Small size & fast
* Material You theme with dark and light variants
* Multiple server support
* Offline Mode
* Download tracks for offline playback
* Bookmarks
* Playlists on server
* Ramdom play
* Shuffled playback
* Jukebox mode
* Server chat
* And much more!!!
* And much more!!
Note: Ultrasonic uses semantic release versions. Releases with a zero in the last digit introduce new features or significant changes, all other releases focus on fixing bugs.
The source code is available with GPL license in GitLab: https://gitlab.com/ultrasonic/ultrasonic
If you have any issue, please post in: https://gitlab.com/ultrasonic/ultrasonic/issues

View File

@ -0,0 +1,7 @@
Corrección de errores
- #831: Versión 4.1.1 y desarrollo: 'jukebox on/off' ya no se muestra en 'Reproduciendo ahora'.
Mejoras
- #827: Hacer aplicación completamente compatible con Android Auto para publicar en Play Store.
- #878: "Reproducir aleatoriamente" ya no siempre comienza con la primera pista.
- #891: Volcado de configuración al archivo de registro cuando el registro está habilitado.

View File

@ -0,0 +1,4 @@
Corrección de errores
- Corrección de un fallo cuando la fecha de una etiqueta ID3 tiene un formato incorrecto.
- Corrección de un fallo en la API 31 (versión de Android más reciente).
- Corrección de resultados de búsqueda vacíos.

View File

@ -0,0 +1,2 @@
Corrección de errores
- Corrección de un fallo al descargar la carátula del álbum.

View File

@ -4,10 +4,22 @@ org.gradle.configureondemand=true
org.gradle.caching=true
org.gradle.jvmargs=-Xmx2g -XX:+UseParallelGC
kotlin.incremental=true
kotlin.caching.enabled=true
kotlin.incremental.usePreciseJavaTracking=true
android.useAndroidX=true
android.enableJetifier=false
# This properties enables transitive Resource classes, which decreases build time,
# but could lead to problems referencing Resources. Set them to false if needed.
android.nonTransitiveRClass=true
android.nonFinalResIds=true
# This config was suggested by Android Studio to reduce build time
# It can be removed if it makes problems
org.gradle.unsafe.configuration-cache=true
# TODO Renable on day (check that Retrofit, Jackson, and Imageloader are working)
android.enableR8.fullMode=true

View File

@ -1,44 +1,46 @@
[versions]
# You need to run ./gradlew wrapper after updating the version
gradle = "7.6"
gradle = "8.13"
navigation = "2.5.3"
gradlePlugin = "7.4.2"
androidxcore = "1.9.0"
ktlint = "0.43.2"
ktlintGradle = "11.3.1"
detekt = "1.22.0"
preferences = "1.2.0"
media3 = "1.0.0-rc02"
navigation = "2.8.9"
gradlePlugin = "8.9.1"
androidxcar = "1.4.0"
androidxcore = "1.16.0"
ktlint = "1.0.1"
ktlintGradle = "12.2.0"
detekt = "1.23.8"
preferences = "1.2.1"
media3 = "1.6.1"
androidSupport = "1.6.0"
materialDesign = "1.8.0"
constraintLayout = "2.1.4"
androidSupport = "1.9.1"
materialDesign = "1.12.0"
constraintLayout = "2.2.1"
activity = "1.10.1"
multidex = "2.0.1"
room = "2.5.0"
kotlin = "1.8.10"
kotlinxCoroutines = "1.6.4"
kotlinxGuava = "1.6.4"
viewModelKtx = "2.6.0"
room = "2.7.0"
kotlin = "2.1.20"
ksp = "2.1.20-2.0.0"
kotlinxCoroutines = "1.10.2"
viewModelKtx = "2.8.7"
swipeRefresh = "1.1.0"
retrofit = "2.9.0"
jackson = "2.14.2"
okhttp = "4.10.0"
koin = "3.3.2"
retrofit = "2.11.0"
jackson = "2.18.3"
okhttp = "4.12.0"
koin = "4.0.4"
picasso = "2.8"
junit4 = "4.13.2"
junit5 = "5.9.2"
mockito = "5.2.0"
mockitoKotlin = "4.1.0"
kluent = "1.72"
apacheCodecs = "1.15"
robolectric = "4.9.2"
junit5 = "5.12.2"
mockito = "5.17.0"
mockitoKotlin = "5.4.0"
kluent = "1.73"
apacheCodecs = "1.18.0"
robolectric = "4.14.1"
timber = "5.0.1"
fastScroll = "2.0.1"
colorPicker = "2.2.4"
rxJava = "3.1.6"
colorPicker = "2.3.0"
rxJava = "3.1.10"
rxAndroid = "3.0.2"
multiType = "4.3.0"
@ -48,6 +50,7 @@ kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin"
ktlintGradle = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlintGradle" }
detekt = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" }
car = { module = "androidx.car.app:app", version.ref = "androidxcar" }
core = { module = "androidx.core:core-ktx", version.ref = "androidxcore" }
design = { module = "com.google.android.material:material", version.ref = "materialDesign" }
annotations = { module = "androidx.annotation:annotation", version.ref = "androidSupport" }
@ -63,6 +66,7 @@ navigationFragmentKtx = { module = "androidx.navigation:navigation-fragment-kt
navigationUiKtx = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "navigation" }
navigationFeature = { module = "androidx.navigation:navigation-dynamic-features-fragment", version.ref = "navigation" }
navigationSafeArgs = { module = "androidx.navigation:navigation-safe-args-gradle-plugin", version.ref = "navigation"}
activity = { module = "androidx.activity:activity-ktx", version.ref = "activity" }
preferences = { module = "androidx.preference:preference", version.ref = "preferences" }
media3common = { module = "androidx.media3:media3-common", version.ref = "media3" }
media3exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" }
@ -73,7 +77,7 @@ swipeRefresh = { module = "androidx.swiperefreshlayout:swiperefreshla
kotlinStdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
kotlinReflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
kotlinxCoroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" }
kotlinxGuava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinxGuava"}
kotlinxGuava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinxCoroutines"}
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
gsonConverter = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
jacksonConverter = { module = "com.squareup.retrofit2:converter-jackson", version.ref = "retrofit" }
@ -95,9 +99,11 @@ junitVintage = { module = "org.junit.vintage:junit-vintage-engine", v
kotlinJunit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
mockitoKotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" }
mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" }
mockitoInline = { module = "org.mockito:mockito-inline", version.ref = "mockito" }
kluent = { module = "org.amshove.kluent:kluent", version.ref = "kluent" }
kluentAndroid = { module = "org.amshove.kluent:kluent-android", version.ref = "kluent" }
mockWebServer = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" }
apacheCodecs = { module = "commons-codec:commons-codec", version.ref = "apacheCodecs" }
robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" }
[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }

View File

@ -1,5 +1,5 @@
ext.versions = [
minSdk : 21,
minSdk : 26,
targetSdk : 33,
compileSdk : 33,
]
compileSdk : 35,
]

Binary file not shown.

View File

@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -2,9 +2,9 @@
* This module provides a base for for submodules which depend on the Android runtime
*/
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'org.jetbrains.kotlin.android'
apply from: "${project.rootDir}/gradle_scripts/code_quality.gradle"
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.devtools.ksp'
android {
compileSdkVersion versions.compileSdk
@ -16,8 +16,8 @@ android {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
sourceSets {

View File

@ -25,11 +25,8 @@ if (isCodeQualityEnabled) {
// Builds the AST in parallel. Rules are always executed in parallel.
// Can lead to speedups in larger projects.
parallel = true
baseline = file("${rootProject.projectDir}/detekt-baseline.xml")
config = files("${rootProject.projectDir}/detekt-config.yml")
}
}
tasks.detekt.jvmTarget = "11"
tasks.detekt.jvmTarget = "17"
}
}

View File

@ -2,7 +2,7 @@
* This module provides a base for for pure kotlin modules
*/
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.devtools.ksp'
apply from: "${project.rootDir}/gradle_scripts/code_quality.gradle"
sourceSets {
@ -12,7 +12,6 @@ sourceSets {
test.resources.srcDirs += "${projectDir}/src/integrationTest/resources"
}
dependencies {
api libs.kotlinStdlib

33
gradlew vendored
View File

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@ -83,10 +85,8 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -133,10 +133,13 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
@ -144,7 +147,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@ -152,7 +155,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -197,11 +200,15 @@ if "$cygwin" || "$msys" ; then
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \

22
gradlew.bat vendored
View File

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail

View File

@ -1,6 +1,9 @@
plugins {
alias libs.plugins.ksp
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: "androidx.navigation.safeargs.kotlin"
apply from: "../gradle_scripts/code_quality.gradle"
@ -9,12 +12,12 @@ android {
defaultConfig {
applicationId "org.moire.ultrasonic"
versionCode 112
versionName "4.2.2"
versionCode 130
versionName "4.8.0"
minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk
resConfigs 'cs', 'de', 'en', 'es', 'fr', 'hu', 'it', 'nl', 'pl', 'pt', 'pt-rBR', 'ru', 'zh-rCN', 'zh-rTW'
resourceConfigurations += ['cs', 'de', 'en', 'es', 'fr', 'gl', 'hu', 'it', 'ja', 'nb-rNO', 'nl', 'pl', 'pt', 'pt-rBR', 'ru', 'zh-rCN', 'zh-rTW']
}
bundle.language.enableSplit = false
@ -31,10 +34,10 @@ android {
'minify/proguard-kotlin.pro'
}
debug {
minifyEnabled false
multiDexEnabled true
testCoverageEnabled true
applicationIdSuffix ".debug"
minifyEnabled = false
multiDexEnabled = true
testCoverageEnabled = true
applicationIdSuffix = '.debug'
}
}
@ -50,41 +53,43 @@ android {
}
kotlinOptions {
jvmTarget = "11"
jvmTarget = "21"
}
buildFeatures {
viewBinding true
dataBinding true
viewBinding = true
dataBinding = true
buildConfig = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
kapt {
arguments {
arg("room.schemaLocation", "$rootDir/ultrasonic/schemas".toString())
}
ksp {
arg("room.schemaLocation", "$rootDir/ultrasonic/schemas")
}
lint {
baseline = file("lint-baseline.xml")
abortOnError true
warningsAsErrors true
disable 'IconMissingDensityFolder', 'VectorPath'
ignore 'MissingTranslation', 'UnusedQuantity', 'MissingQuantity'
abortOnError = true
warningsAsErrors = true
warning 'ImpliedQuantity'
disable 'IconMissingDensityFolder', 'VectorPath'
disable 'MissingTranslation', 'UnusedQuantity', 'MissingQuantity'
disable 'ObsoleteLintCustomCheck'
textReport true
checkDependencies true
// We manage dependencies on Gitlab with RenovateBot
disable 'GradleDependency'
disable 'AndroidGradlePluginVersion'
textReport = true
checkDependencies = true
}
namespace 'org.moire.ultrasonic'
namespace = 'org.moire.ultrasonic'
}
tasks.withType(Test) {
tasks.withType(Test).configureEach {
useJUnitPlatform()
}
@ -96,6 +101,7 @@ dependencies {
exclude group: "com.android.support"
}
implementation libs.car
implementation libs.core
implementation libs.design
implementation libs.multidex
@ -128,7 +134,7 @@ dependencies {
implementation libs.rxAndroid
implementation libs.multiType
kapt libs.room
ksp libs.room
testImplementation libs.kotlinReflect
testImplementation libs.junit
@ -136,11 +142,9 @@ dependencies {
testImplementation libs.kotlinJunit
testImplementation libs.kluent
testImplementation libs.mockito
testImplementation libs.mockitoInline
testImplementation libs.mockitoKotlin
testImplementation libs.robolectric
implementation libs.timber
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Failed to write log to %s", file)</ID>
<ID>ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Log file rotated, logging into file %s", file?.name)</ID>
<ID>ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Logging into file %s", file?.name)</ID>
<ID>ImplicitDefaultLocale:ShareHandler.kt$ShareHandler$String.format("%d:%s", timeSpanAmount, timeSpanType)</ID>
<ID>LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?)</ID>
<ID>LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?)</ID>
<ID>LongMethod:PlaylistsFragment.kt$PlaylistsFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID>
<ID>LongMethod:SharesFragment.kt$SharesFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean</ID>
<ID>MagicNumber:ActiveServerProvider.kt$ActiveServerProvider$8192</ID>
<ID>MagicNumber:JukeboxMediaPlayer.kt$JukeboxMediaPlayer$50</ID>
<ID>MagicNumber:RESTMusicService.kt$RESTMusicService$206</ID>
<ID>TooGenericExceptionCaught:JukeboxMediaPlayer.kt$JukeboxMediaPlayer.TaskQueue$x: Throwable</ID>
<ID>TooManyFunctions:RESTMusicService.kt$RESTMusicService : MusicService</ID>
</CurrentIssues>
</SmellBaseline>

View File

@ -1,27 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 7.4.0" type="baseline" client="gradle" dependencies="true" name="AGP (7.4.0)" variant="all" version="7.4.0">
<issue
id="MissingPermission"
message="Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`"
errorLine1=" manager.notify(NOTIFICATION_ID, notification)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/kotlin/org/moire/ultrasonic/service/DownloadService.kt"
line="260"
column="17"/>
</issue>
<issue
id="MissingPermission"
message="Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`"
errorLine1=" notificationManagerCompat.notify(notification.notificationId, notification.notification)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/kotlin/org/moire/ultrasonic/service/JukeboxMediaPlayer.kt"
line="194"
column="9"/>
</issue>
<issues format="6" by="lint 8.0.1" type="baseline" client="gradle" dependencies="true" name="AGP (8.0.1)" variant="all" version="8.0.1">
<issue
id="PluralsCandidate"
@ -30,7 +8,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/strings.xml"
line="152"
line="151"
column="5"/>
</issue>
@ -48,50 +26,6 @@
file="../core/subsonic-api/build/libs/subsonic-api.jar"/>
</issue>
<issue
id="ExportedContentProvider"
message="Exported content providers can provide access to potentially sensitive data"
errorLine1=" &lt;provider"
errorLine2=" ~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="128"
column="10"/>
</issue>
<issue
id="ExportedContentProvider"
message="Exported content providers can provide access to potentially sensitive data"
errorLine1=" &lt;provider"
errorLine2=" ~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="133"
column="10"/>
</issue>
<issue
id="ExportedReceiver"
message="Exported receiver does not require permission"
errorLine1=" &lt;receiver android:name=&quot;.receiver.UltrasonicIntentReceiver&quot;"
errorLine2=" ~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="88"
column="10"/>
</issue>
<issue
id="ExportedService"
message="Exported service does not require permission"
errorLine1=" &lt;service android:name=&quot;.playback.PlaybackService&quot;"
errorLine2=" ~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="77"
column="10"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.drawable.media3_notification_pause` appears to be unused"
@ -136,61 +70,6 @@
column="1"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.drawable.media3_notification_small_icon` appears to be unused"
errorLine1="&lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;"
errorLine2="^">
<location
file="src/main/res/drawable/media3_notification_small_icon.xml"
line="1"
column="1"/>
</issue>
<issue
id="Autofill"
message="Missing `autofillHints` attribute"
errorLine1=" &lt;EditText"
errorLine2=" ~~~~~~~~">
<location
file="src/main/res/layout/chat.xml"
line="33"
column="10"/>
</issue>
<issue
id="Autofill"
message="Missing `autofillHints` attribute"
errorLine1=" &lt;EditText"
errorLine2=" ~~~~~~~~">
<location
file="src/main/res/layout/save_playlist.xml"
line="9"
column="6"/>
</issue>
<issue
id="Autofill"
message="Missing `autofillHints` attribute"
errorLine1=" &lt;EditText"
errorLine2=" ~~~~~~~~">
<location
file="src/main/res/layout/share_details.xml"
line="29"
column="10"/>
</issue>
<issue
id="Autofill"
message="Missing `autofillHints` attribute"
errorLine1=" &lt;EditText"
errorLine2=" ~~~~~~~~">
<location
file="src/main/res/layout/time_span_dialog.xml"
line="28"
column="10"/>
</issue>
<issue
id="LabelFor"
message="Missing accessibility label: provide either a view with an `android:labelFor` that references this view or provide an `android:hint`"

View File

@ -1,5 +1,4 @@
#### From Jackson
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** {
*;

View File

@ -1,8 +1,14 @@
-dontobfuscate
### Don't remove subsonic api serializers/entities
-keep class org.moire.ultrasonic.api.subsonic.response.** { *; }
-keep class org.moire.ultrasonic.api.subsonic.models.** { *; }
-keep class org.moire.ultrasonic.api.subsonic.** { *; }
## Don't remove the domain models
-keep class org.moire.ultrasonic.domain.** { *; }
## Don't remove the imageloader
-keep class org.moire.ultrasonic.imageloader.** { *; }
-keep class org.moire.ultrasonic.provider.AlbumArtContentProvider { *; }
## Don't remove NowPlayingFragment
-keep class org.moire.ultrasonic.fragment.NowPlayingFragment { *; }

View File

@ -1,10 +1,41 @@
#### From retrofit
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain service method parameters.
-keepclassmembernames,allowobfuscation interface * {
# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
# Keep annotation default values (e.g., retrofit2.http.Field.encoded).
-keepattributes AnnotationDefault
# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit
# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
-dontwarn retrofit2.KotlinExtensions$*
# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy
# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.
-if interface * { @retrofit2.http.* <methods>; }
-keep,allowobfuscation interface <1>
# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

View File

@ -3,15 +3,17 @@
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-sdk tools:overrideLibrary="androidx.car.app" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
@ -20,18 +22,23 @@
android:xlargeScreens="true"/>
<application
android:allowBackup="true"
android:fullBackupContent="@xml/backup_descriptor"
android:dataExtractionRules="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.Material3.DynamicColors.Dark"
android:name=".app.UApp"
android:allowBackup="true"
android:dataExtractionRules="@xml/backup_rules"
android:enableOnBackInvokedCallback="true"
android:fullBackupContent="@xml/backup_descriptor"
android:hasFragileUserData="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/common.appname"
android:usesCleartextTraffic="true"
android:supportsRtl="false"
android:networkSecurityConfig="@xml/network_security_config"
android:preserveLegacyExternalStorage="true"
tools:ignore="UnusedAttribute">
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false"
android:theme="@style/Theme.Material3.DynamicColors.Dark"
android:usesCleartextTraffic="true"
tools:ignore="UnusedAttribute"
tools:targetApi="q">
<!-- Add for API 34 android:enableOnBackInvokedCallBack="true" -->
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
@ -66,18 +73,12 @@
android:exported="false">
</service>
<service
android:name=".service.JukeboxMediaPlayer"
android:label="Ultrasonic Jukebox Media Player Service"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
<!-- Needs to be exported: https://android.googlesource.com/platform/developers/build/+/4de32d4/prebuilts/gradle/MediaBrowserService/README.md -->
<service android:name=".playback.PlaybackService"
<service android:name=".service.PlaybackService"
android:label="@string/common.appname"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
android:exported="true"
tools:ignore="ExportedService">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService" />
@ -86,7 +87,8 @@
</service>
<receiver android:name=".receiver.UltrasonicIntentReceiver"
android:exported="true">
android:exported="true"
tools:ignore="ExportedReceiver">
<intent-filter>
<action android:name="org.moire.ultrasonic.CMD_TOGGLEPAUSE"/>
<action android:name="org.moire.ultrasonic.CMD_PLAY"/>
@ -107,6 +109,12 @@
<action android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED"/>
</intent-filter>
</receiver>
<receiver android:name="androidx.media3.session.MediaButtonReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<receiver
android:name=".provider.UltrasonicAppWidgetProvider"
android:label="Ultrasonic"
@ -119,21 +127,16 @@
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_info"/>
</receiver>
<receiver android:name=".receiver.MediaButtonIntentReceiver"
android:exported="true">
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
<provider
android:name=".provider.SearchSuggestionProvider"
android:authorities="${applicationId}.provider.SearchSuggestionProvider"
android:exported="true" />
android:exported="true"
tools:ignore="ExportedContentProvider" />
<provider
android:name=".provider.AlbumArtContentProvider"
android:authorities="${applicationId}.provider.AlbumArtContentProvider"
android:exported="true" />
android:exported="true"
tools:ignore="ExportedContentProvider" />
</application>
</manifest>

View File

@ -1,297 +0,0 @@
package org.moire.ultrasonic.fragment;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.moire.ultrasonic.R;
import org.moire.ultrasonic.data.ActiveServerProvider;
import org.moire.ultrasonic.domain.ChatMessage;
import org.moire.ultrasonic.service.MusicService;
import org.moire.ultrasonic.service.MusicServiceFactory;
import org.moire.ultrasonic.util.BackgroundTask;
import org.moire.ultrasonic.util.CancellationToken;
import org.moire.ultrasonic.util.FragmentBackgroundTask;
import org.moire.ultrasonic.util.Settings;
import org.moire.ultrasonic.util.Util;
import org.moire.ultrasonic.view.ChatAdapter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import kotlin.Lazy;
import static org.koin.java.KoinJavaComponent.inject;
import com.google.android.material.button.MaterialButton;
/**
* Provides online chat functionality
*/
public class ChatFragment extends Fragment {
private ListView chatListView;
private EditText messageEditText;
private MaterialButton sendButton;
private Timer timer;
private volatile static Long lastChatMessageTime = (long) 0;
private static final ArrayList<ChatMessage> messageList = new ArrayList<>();
private CancellationToken cancellationToken;
private SwipeRefreshLayout swipeRefresh;
private final Lazy<ActiveServerProvider> activeServerProvider = inject(ActiveServerProvider.class);
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
Util.applyTheme(this.getContext());
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.chat, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
swipeRefresh = view.findViewById(R.id.chat_refresh);
swipeRefresh.setEnabled(false);
cancellationToken = new CancellationToken();
messageEditText = view.findViewById(R.id.chat_edittext);
sendButton = view.findViewById(R.id.chat_send);
sendButton.setOnClickListener(view1 -> sendMessage());
chatListView = view.findViewById(R.id.chat_entries_list);
chatListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
chatListView.setStackFromBottom(true);
String serverName = activeServerProvider.getValue().getActiveServer().getName();
String userName = activeServerProvider.getValue().getActiveServer().getUserName();
String title = String.format("%s [%s@%s]", getResources().getString(R.string.button_bar_chat), userName, serverName);
FragmentTitle.Companion.setTitle(this, title);
setHasOptionsMenu(true);
messageEditText.setImeActionLabel("Send", KeyEvent.KEYCODE_ENTER);
messageEditText.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
@Override
public void afterTextChanged(Editable editable)
{
sendButton.setEnabled(!Util.isNullOrWhiteSpace(editable.toString()));
}
});
messageEditText.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE || (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN))
{
sendMessage();
return true;
}
return false;
});
load();
timerMethod();
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.chat, menu);
super.onCreateOptionsMenu(menu, inflater);
}
/*
* Listen for option item selections so that we receive a notification
* when the user requests a refresh by selecting the refresh action bar item.
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Check if user triggered a refresh:
if (item.getItemId() == R.id.menu_refresh) {
// Start the refresh background task.
load();
return true;
}
// User didn't trigger a refresh, let the superclass handle this action
return super.onOptionsItemSelected(item);
}
@Override
public void onResume()
{
super.onResume();
if (!messageList.isEmpty())
{
ListAdapter chatAdapter = new ChatAdapter(getContext(), messageList);
chatListView.setAdapter(chatAdapter);
}
if (timer == null)
{
timerMethod();
}
}
@Override
public void onPause()
{
super.onPause();
if (timer != null)
{
timer.cancel();
timer = null;
}
}
@Override
public void onDestroyView() {
cancellationToken.cancel();
super.onDestroyView();
}
private void timerMethod()
{
int refreshInterval = Settings.getChatRefreshInterval();
if (refreshInterval > 0)
{
timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
getActivity().runOnUiThread(() -> load());
}
}, refreshInterval, refreshInterval);
}
}
private void sendMessage()
{
if (messageEditText != null)
{
final String message;
Editable text = messageEditText.getText();
if (text == null)
{
return;
}
message = text.toString();
if (!Util.isNullOrWhiteSpace(message))
{
messageEditText.setText("");
BackgroundTask<Void> task = new FragmentBackgroundTask<Void>(getActivity(), false, swipeRefresh, cancellationToken)
{
@Override
protected Void doInBackground() throws Throwable
{
MusicService musicService = MusicServiceFactory.getMusicService();
musicService.addChatMessage(message);
return null;
}
@Override
protected void done(Void result)
{
load();
}
};
task.execute();
}
}
}
private synchronized void load()
{
BackgroundTask<List<ChatMessage>> task = new FragmentBackgroundTask<List<ChatMessage>>(getActivity(), false, swipeRefresh, cancellationToken)
{
@Override
protected List<ChatMessage> doInBackground() throws Throwable
{
MusicService musicService = MusicServiceFactory.getMusicService();
return musicService.getChatMessages(lastChatMessageTime);
}
@Override
protected void done(List<ChatMessage> result)
{
if (result != null && !result.isEmpty())
{
// Reset lastChatMessageTime if we have a newer message
for (ChatMessage message : result)
{
if (message.getTime() > lastChatMessageTime)
{
lastChatMessageTime = message.getTime();
}
}
// Reverse results to show them on the bottom
Collections.reverse(result);
messageList.addAll(result);
ListAdapter chatAdapter = new ChatAdapter(getContext(), messageList);
chatListView.setAdapter(chatAdapter);
}
}
@Override
protected void error(Throwable error) {
// Stop the timer in case of an error, otherwise it may repeat the error message forever
if (timer != null)
{
timer.cancel();
timer = null;
}
super.error(error);
}
};
task.execute();
}
}

View File

@ -1,37 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 (C) Sindre Mehus
*/
package org.moire.ultrasonic.provider;
import android.content.SearchRecentSuggestionsProvider;
/**
* Provides search suggestions based on recent searches.
*
* @author Sindre Mehus
*/
public class SearchSuggestionProvider extends SearchRecentSuggestionsProvider
{
public static final String AUTHORITY = SearchSuggestionProvider.class.getName();
public static final int MODE = DATABASE_MODE_QUERIES;
public SearchSuggestionProvider()
{
setupSuggestions(AUTHORITY, MODE);
}
}

View File

@ -1,100 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 (C) Sindre Mehus
*/
package org.moire.ultrasonic.receiver;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import org.moire.ultrasonic.util.Constants;
import org.moire.ultrasonic.util.Settings;
import timber.log.Timber;
/**
* Resume or pause playback on Bluetooth A2DP connect/disconnect.
*
* @author Sindre Mehus
*/
@SuppressLint("MissingPermission")
public class BluetoothIntentReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String action = intent.getAction();
String name = device != null ? device.getName() : "Unknown";
String address = device != null ? device.getAddress() : "Unknown";
Timber.d("A2DP State: %d; Action: %s; Device: %s; Address: %s", state, action, name, address);
boolean actionBluetoothDeviceConnected = false;
boolean actionBluetoothDeviceDisconnected = false;
boolean actionA2dpConnected = false;
boolean actionA2dpDisconnected = false;
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action))
{
actionBluetoothDeviceConnected = true;
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action) || BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action))
{
actionBluetoothDeviceDisconnected = true;
}
if (state == android.bluetooth.BluetoothA2dp.STATE_CONNECTED) actionA2dpConnected = true;
else if (state == android.bluetooth.BluetoothA2dp.STATE_DISCONNECTED) actionA2dpDisconnected = true;
boolean resume = false;
boolean pause = false;
switch (Settings.getResumeOnBluetoothDevice())
{
case Constants.PREFERENCE_VALUE_ALL: resume = actionA2dpConnected || actionBluetoothDeviceConnected;
break;
case Constants.PREFERENCE_VALUE_A2DP: resume = actionA2dpConnected;
break;
}
switch (Settings.getPauseOnBluetoothDevice())
{
case Constants.PREFERENCE_VALUE_ALL: pause = actionA2dpDisconnected || actionBluetoothDeviceDisconnected;
break;
case Constants.PREFERENCE_VALUE_A2DP: pause = actionA2dpDisconnected;
break;
}
if (resume)
{
Timber.i("Connected to Bluetooth device %s address %s, resuming playback.", name, address);
context.sendBroadcast(new Intent(Constants.CMD_RESUME_OR_PLAY).setPackage(context.getPackageName()));
}
if (pause)
{
Timber.i("Disconnected from Bluetooth device %s address %s, requesting pause.", name, address);
context.sendBroadcast(new Intent(Constants.CMD_PAUSE).setPackage(context.getPackageName()));
}
}
}

View File

@ -1,38 +0,0 @@
package org.moire.ultrasonic.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import timber.log.Timber;
import org.moire.ultrasonic.service.MediaPlayerLifecycleSupport;
import kotlin.Lazy;
import static org.koin.java.KoinJavaComponent.inject;
public class UltrasonicIntentReceiver extends BroadcastReceiver
{
private Lazy<MediaPlayerLifecycleSupport> lifecycleSupport = inject(MediaPlayerLifecycleSupport.class);
@Override
public void onReceive(Context context, Intent intent)
{
String intentAction = intent.getAction();
Timber.i("Received Ultrasonic Intent: %s", intentAction);
try
{
lifecycleSupport.getValue().receiveIntent(intent);
if (isOrderedBroadcast())
{
abortBroadcast();
}
}
catch (Exception x)
{
// Ignored.
}
}
}

View File

@ -1,53 +0,0 @@
package org.moire.ultrasonic.service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import org.moire.ultrasonic.app.UApp;
import timber.log.Timber;
/**
* Monitors the state of the mobile's external storage
*/
public class ExternalStorageMonitor
{
private BroadcastReceiver ejectEventReceiver;
private boolean externalStorageAvailable = true;
public void onCreate(final Runnable ejectedCallback)
{
// Stop when SD card is ejected.
ejectEventReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
externalStorageAvailable = Intent.ACTION_MEDIA_MOUNTED.equals(intent.getAction());
if (!externalStorageAvailable)
{
Timber.i("External media is ejecting. Stopping playback.");
ejectedCallback.run();
}
else
{
Timber.i("External media is available.");
}
}
};
IntentFilter ejectFilter = new IntentFilter(Intent.ACTION_MEDIA_EJECT);
ejectFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
ejectFilter.addDataScheme("file");
UApp.Companion.applicationContext().registerReceiver(ejectEventReceiver, ejectFilter);
}
public void onDestroy()
{
UApp.Companion.applicationContext().unregisterReceiver(ejectEventReceiver);
}
public boolean isExternalStorageAvailable() { return externalStorageAvailable; }
}

View File

@ -1,50 +0,0 @@
package org.moire.ultrasonic.service;
import timber.log.Timber;
import org.moire.ultrasonic.data.ActiveServerProvider;
import org.moire.ultrasonic.domain.Track;
/**
* Scrobbles played songs to Last.fm.
*
* @author Sindre Mehus
* @version $Id$
*/
public class Scrobbler
{
private String lastSubmission;
private String lastNowPlaying;
public void scrobble(final Track song, final boolean submission)
{
if (song == null || !ActiveServerProvider.Companion.isScrobblingEnabled()) return;
final String id = song.getId();
// Avoid duplicate registrations.
if (submission && id.equals(lastSubmission)) return;
if (!submission && id.equals(lastNowPlaying)) return;
if (submission) lastSubmission = id;
else lastNowPlaying = id;
new Thread(String.format("Scrobble %s", song))
{
@Override
public void run()
{
MusicService service = MusicServiceFactory.getMusicService();
try
{
service.scrobble(id, submission);
Timber.i("Scrobbled '%s' for %s", submission ? "submission" : "now playing", song);
}
catch (Exception x)
{
Timber.i(x, "Failed to scrobble'%s' for %s", submission ? "submission" : "now playing", song);
}
}
}.start();
}
}

View File

@ -1,12 +0,0 @@
package org.moire.ultrasonic.service;
/**
* Abstract class for supplying items to a consumer
* @param <T> The type of the item supplied
*/
public abstract class Supplier<T>
{
public abstract T get();
}

View File

@ -1,72 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 (C) Sindre Mehus
*/
package org.moire.ultrasonic.util;
import android.app.Activity;
import android.os.Handler;
/**
* @author Sindre Mehus
*/
public abstract class BackgroundTask<T> implements ProgressListener
{
private final Activity activity;
private final Handler handler;
public BackgroundTask(Activity activity)
{
this.activity = activity;
handler = new Handler();
}
protected Activity getActivity()
{
return activity;
}
protected Handler getHandler()
{
return handler;
}
public abstract void execute();
protected abstract T doInBackground() throws Throwable;
protected abstract void done(T result);
protected void error(Throwable error)
{
CommunicationError.handleError(error, activity);
}
protected String getErrorMessage(Throwable error)
{
return CommunicationError.getErrorMessage(error, activity);
}
@Override
public abstract void updateProgress(final String message);
@Override
public void updateProgress(int messageId)
{
updateProgress(activity.getResources().getString(messageId));
}
}

View File

@ -1,89 +0,0 @@
package org.moire.ultrasonic.util;
import android.app.Activity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
/**
* @author Sindre Mehus
* @version $Id$
*/
public abstract class FragmentBackgroundTask<T> extends BackgroundTask<T>
{
private final boolean changeProgress;
private final SwipeRefreshLayout swipe;
private final CancellationToken cancel;
public FragmentBackgroundTask(Activity activity, boolean changeProgress,
SwipeRefreshLayout swipe, CancellationToken cancel)
{
super(activity);
this.changeProgress = changeProgress;
this.swipe = swipe;
this.cancel = cancel;
}
@Override
public void execute()
{
if (changeProgress)
{
if (swipe != null) swipe.setRefreshing(true);
}
new Thread()
{
@Override
public void run()
{
try
{
final T result = doInBackground();
if (cancel.isCancellationRequested())
{
return;
}
getHandler().post(new Runnable()
{
@Override
public void run()
{
if (changeProgress)
{
if (swipe != null) swipe.setRefreshing(false);
}
done(result);
}
});
}
catch (final Throwable t)
{
if (cancel.isCancellationRequested())
{
return;
}
getHandler().post(new Runnable()
{
@Override
public void run()
{
if (changeProgress)
{
if (swipe != null) swipe.setRefreshing(false);
}
error(t);
}
});
}
}
}.start();
}
@Override
public void updateProgress(final String message)
{
}
}

View File

@ -1,66 +0,0 @@
package org.moire.ultrasonic.util;
import android.app.Activity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
/**
* @author Sindre Mehus
* @version $Id$
*/
public abstract class LoadingTask<T> extends BackgroundTask<T>
{
private final SwipeRefreshLayout swipe;
private final CancellationToken cancel;
public LoadingTask(Activity activity, SwipeRefreshLayout swipe, CancellationToken cancel)
{
super(activity);
this.swipe = swipe;
this.cancel = cancel;
}
@Override
public void execute()
{
swipe.setRefreshing(true);
new Thread()
{
@Override
public void run()
{
try
{
final T result = doInBackground();
if (cancel.isCancellationRequested())
{
return;
}
getHandler().post(() -> {
swipe.setRefreshing(false);
done(result);
});
}
catch (final Throwable t)
{
if (cancel.isCancellationRequested())
{
return;
}
getHandler().post(() -> {
swipe.setRefreshing(false);
error(t);
});
}
}
}.start();
}
@Override
public void updateProgress(final String message)
{
}
}

View File

@ -1,158 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 (C) Sindre Mehus
*/
package org.moire.ultrasonic.util;
import android.app.Activity;
import androidx.appcompat.app.AlertDialog;
import org.moire.ultrasonic.R;
import timber.log.Timber;
/**
* @author Sindre Mehus
*/
public abstract class ModalBackgroundTask<T> extends BackgroundTask<T>
{
private final AlertDialog progressDialog;
private Thread thread;
private final boolean finishActivityOnCancel;
private boolean cancelled;
public ModalBackgroundTask(Activity activity, boolean finishActivityOnCancel)
{
super(activity);
this.finishActivityOnCancel = finishActivityOnCancel;
progressDialog = createProgressDialog();
}
public ModalBackgroundTask(Activity activity)
{
this(activity, true);
}
private androidx.appcompat.app.AlertDialog createProgressDialog()
{
InfoDialog.Builder builder = new InfoDialog.Builder(getActivity().getApplicationContext());
builder.setTitle(R.string.background_task_wait);
builder.setMessage(R.string.background_task_loading);
builder.setOnCancelListener(dialogInterface -> cancel());
builder.setPositiveButton(R.string.common_cancel, (dialogInterface, i) -> cancel());
return builder.create();
}
@Override
public void execute()
{
cancelled = false;
progressDialog.show();
thread = new Thread()
{
@Override
public void run()
{
try
{
final T result = doInBackground();
if (cancelled)
{
progressDialog.dismiss();
return;
}
getHandler().post(new Runnable()
{
@Override
public void run()
{
try
{
progressDialog.dismiss();
}
catch (Exception e)
{
// nothing
}
done(result);
}
});
}
catch (final Throwable t)
{
if (cancelled)
{
return;
}
getHandler().post(new Runnable()
{
@Override
public void run()
{
try
{
progressDialog.dismiss();
}
catch (Exception e)
{
// nothing
}
error(t);
}
});
}
}
};
thread.start();
}
protected void cancel()
{
cancelled = true;
if (thread != null)
{
thread.interrupt();
}
if (finishActivityOnCancel)
{
getActivity().finish();
}
}
protected boolean isCancelled()
{
return cancelled;
}
@Override
protected void error(Throwable error)
{
Timber.w(error);
new ErrorDialog(getActivity(), getErrorMessage(error), getActivity(), finishActivityOnCancel);
}
@Override
public void updateProgress(final String message)
{
getHandler().post(() -> progressDialog.setMessage(message));
}
}

View File

@ -1,29 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 (C) Sindre Mehus
*/
package org.moire.ultrasonic.util;
/**
* @author Sindre Mehus
*/
public interface ProgressListener
{
void updateProgress(String message);
void updateProgress(int messageId);
}

View File

@ -1,16 +0,0 @@
package org.moire.ultrasonic.util;
import org.moire.ultrasonic.domain.Track;
import java.util.List;
/**
* Created by Josh on 12/17/13.
*/
public class ShareDetails
{
public String Description;
public boolean ShareOnServer;
public long Expiration;
public List<Track> Entries;
}

View File

@ -1,39 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 (C) Sindre Mehus
*/
package org.moire.ultrasonic.util;
import android.os.Binder;
/**
* @author Sindre Mehus
*/
public class SimpleServiceBinder<S> extends Binder
{
private final S service;
public SimpleServiceBinder(S service)
{
this.service = service;
}
public S getService()
{
return service;
}
}

View File

@ -1,38 +0,0 @@
package org.moire.ultrasonic.util;
import android.content.Context;
import android.util.AttributeSet;
import androidx.preference.DialogPreference;
import org.moire.ultrasonic.R;
/**
* Created by Joshua Bahnsen on 12/22/13.
*/
public class TimeSpanPreference extends DialogPreference
{
Context context;
public TimeSpanPreference(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
setPositiveButtonText(android.R.string.ok);
setNegativeButtonText(android.R.string.cancel);
setDialogIcon(null);
}
public String getText()
{
String persisted = getPersistedString("");
if (!"".equals(persisted))
{
return persisted.replace(':', ' ');
}
return this.context.getResources().getString(R.string.time_span_disabled);
}
}

View File

@ -1,159 +0,0 @@
package org.moire.ultrasonic.view;
import android.content.Context;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import org.moire.ultrasonic.R;
import org.moire.ultrasonic.data.ActiveServerProvider;
import org.moire.ultrasonic.domain.ChatMessage;
import org.moire.ultrasonic.imageloader.ImageLoader;
import org.moire.ultrasonic.subsonic.ImageLoaderProvider;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import kotlin.Lazy;
import static org.koin.java.KoinJavaComponent.inject;
public class ChatAdapter extends ArrayAdapter<ChatMessage>
{
private final Context context;
private final List<ChatMessage> messages;
private static final String phoneRegex = "1?\\W*([2-9][0-8][0-9])\\W*([2-9][0-9]{2})\\W*([0-9]{4})";
private static final Pattern phoneMatcher = Pattern.compile(phoneRegex);
private final Lazy<ActiveServerProvider> activeServerProvider = inject(ActiveServerProvider.class);
private final Lazy<ImageLoaderProvider> imageLoaderProvider = inject(ImageLoaderProvider.class);
public ChatAdapter(Context context, List<ChatMessage> messages)
{
super(context, R.layout.chat_item, messages);
this.context = context;
this.messages = messages;
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return false;
}
@Override
public int getCount()
{
return messages.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ChatMessage message = this.getItem(position);
ViewHolder holder;
int layout;
String messageUser = message.getUsername();
Date messageTime = new java.util.Date(message.getTime());
String messageText = message.getMessage();
String me = activeServerProvider.getValue().getActiveServer().getUserName();
layout = messageUser.equals(me) ? R.layout.chat_item_reverse : R.layout.chat_item;
if (convertView == null)
{
convertView = inflateView(layout, parent);
holder = createViewHolder(layout, convertView);
}
else
{
holder = (ViewHolder) convertView.getTag();
if (!holder.chatMessage.equals(message))
{
convertView = inflateView(layout, parent);
holder = createViewHolder(layout, convertView);
}
}
holder.chatMessage = message;
DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context);
String messageTimeFormatted = String.format("[%s]", timeFormat.format(messageTime));
ImageLoader imageLoader = imageLoaderProvider.getValue().getImageLoader();
if (holder.avatar != null && !TextUtils.isEmpty(messageUser))
{
imageLoader.loadAvatarImage(holder.avatar, messageUser);
}
holder.username.setText(messageUser);
holder.message.setText(messageText);
holder.time.setText(messageTimeFormatted);
return convertView;
}
private View inflateView(int layout, ViewGroup parent)
{
return LayoutInflater.from(context).inflate(layout, parent, false);
}
private static ViewHolder createViewHolder(int layout, View convertView)
{
ViewHolder holder = new ViewHolder();
holder.layout = layout;
TextView usernameView;
TextView timeView;
TextView messageView;
ImageView imageView;
if (convertView != null)
{
usernameView = (TextView) convertView.findViewById(R.id.chat_username);
timeView = (TextView) convertView.findViewById(R.id.chat_time);
messageView = (TextView) convertView.findViewById(R.id.chat_message);
imageView = (ImageView) convertView.findViewById(R.id.chat_avatar);
messageView.setMovementMethod(LinkMovementMethod.getInstance());
Linkify.addLinks(messageView, Linkify.ALL);
Linkify.addLinks(messageView, phoneMatcher, "tel:");
holder.avatar = imageView;
holder.message = messageView;
holder.username = usernameView;
holder.time = timeView;
convertView.setTag(holder);
}
return holder;
}
private static class ViewHolder
{
int layout;
ImageView avatar;
TextView message;
TextView username;
TextView time;
ChatMessage chatMessage;
}
}

View File

@ -1,110 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 (C) Sindre Mehus
*/
package org.moire.ultrasonic.view;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
import org.moire.ultrasonic.R;
import org.moire.ultrasonic.domain.Genre;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
/**
* @author Sindre Mehus
*/
public class GenreAdapter extends ArrayAdapter<Genre> implements SectionIndexer
{
private final LayoutInflater layoutInflater;
// Both arrays are indexed by section ID.
private final Object[] sections;
private final Integer[] positions;
public GenreAdapter(Context context, List<Genre> genres)
{
super(context, R.layout.list_item_generic, genres);
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Collection<String> sectionSet = new LinkedHashSet<String>(30);
List<Integer> positionList = new ArrayList<Integer>(30);
for (int i = 0; i < genres.size(); i++)
{
Genre genre = genres.get(i);
String index = genre.getIndex();
if (!sectionSet.contains(index))
{
sectionSet.add(index);
positionList.add(i);
}
}
sections = sectionSet.toArray(new Object[0]);
positions = positionList.toArray(new Integer[0]);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
rowView = layoutInflater.inflate(R.layout.list_item_generic, parent, false);
}
((TextView) rowView).setText(getItem(position).getName());
return rowView;
}
@Override
public Object[] getSections()
{
return sections;
}
@Override
public int getPositionForSection(int section)
{
return positions[section];
}
@Override
public int getSectionForPosition(int pos)
{
for (int i = 0; i < sections.length - 1; i++)
{
if (pos < positions[i + 1])
{
return i;
}
}
return sections.length - 1;
}
}

View File

@ -1,56 +0,0 @@
package org.moire.ultrasonic.view;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import org.moire.ultrasonic.R;
import org.moire.ultrasonic.domain.Share;
import java.util.List;
/**
* @author Sindre Mehus
*/
public class ShareAdapter extends ArrayAdapter<Share>
{
private final Context context;
public ShareAdapter(Context context, List<Share> Shares)
{
super(context, R.layout.share_list_item, Shares);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Share entry = getItem(position);
ShareView view;
if (convertView instanceof ShareView)
{
ShareView currentView = (ShareView) convertView;
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
view = currentView;
view.setViewHolder(viewHolder);
}
else
{
view = new ShareView(context);
view.setLayout();
}
view.setShare(entry);
return view;
}
static class ViewHolder
{
TextView url;
TextView description;
}
}

View File

@ -1,64 +0,0 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 (C) Sindre Mehus
*/
package org.moire.ultrasonic.view;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import org.moire.ultrasonic.R;
import org.moire.ultrasonic.domain.Share;
/**
* Used to display playlists in a {@code ListView}.
*
* @author Joshua Bahnsen
*/
public class ShareView extends LinearLayout
{
private final Context context;
private ShareAdapter.ViewHolder viewHolder;
public ShareView(Context context)
{
super(context);
this.context = context;
}
public void setLayout()
{
LayoutInflater.from(context).inflate(R.layout.share_list_item, this, true);
viewHolder = new ShareAdapter.ViewHolder();
viewHolder.url = findViewById(R.id.share_url);
viewHolder.description = findViewById(R.id.share_description);
setTag(viewHolder);
}
public void setViewHolder(ShareAdapter.ViewHolder viewHolder)
{
this.viewHolder = viewHolder;
setTag(this.viewHolder);
}
public void setShare(Share share)
{
viewHolder.url.setText(share.getName());
viewHolder.description.setText(share.getDescription());
}
}

View File

@ -1,6 +1,6 @@
/*
* NavigationActivity.kt
* Copyright (C) 2009-2022 Ultrasonic developers
* Copyright (C) 2009-2023 Ultrasonic developers
*
* Distributed under terms of the GNU GPLv3 license.
*/
@ -13,21 +13,23 @@ import android.content.Intent
import android.content.res.ColorStateList
import android.content.res.Resources
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.provider.SearchRecentSuggestions
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
import androidx.core.view.MenuProvider
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.FragmentContainerView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.media3.common.MediaItem
import androidx.media3.common.Player.STATE_BUFFERING
@ -35,6 +37,7 @@ import androidx.media3.common.Player.STATE_READY
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.onNavDestinationSelected
@ -46,17 +49,18 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koin.androidx.scope.ScopeActivity
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.moire.ultrasonic.NavigationGraphDirections
import org.moire.ultrasonic.R
import org.moire.ultrasonic.app.UApp
import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.data.ServerSettingDao
import org.moire.ultrasonic.fragment.OnBackPressedHandler
import org.moire.ultrasonic.model.ServerSettingsModel
import org.moire.ultrasonic.provider.SearchSuggestionProvider
import org.moire.ultrasonic.service.MediaPlayerController
import org.moire.ultrasonic.service.MediaPlayerLifecycleSupport
import org.moire.ultrasonic.service.MediaPlayerManager
import org.moire.ultrasonic.service.MusicServiceFactory
import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.service.plusAssign
import org.moire.ultrasonic.util.Constants
@ -64,6 +68,7 @@ import org.moire.ultrasonic.util.InfoDialog
import org.moire.ultrasonic.util.LocaleHelper
import org.moire.ultrasonic.util.ServerColor
import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.ShortcutUtil
import org.moire.ultrasonic.util.Storage
import org.moire.ultrasonic.util.UncaughtExceptionHandler
import org.moire.ultrasonic.util.Util
@ -75,7 +80,7 @@ import timber.log.Timber
* onCreate/onResume/onDestroy methods...
*/
@Suppress("TooManyFunctions")
class NavigationActivity : AppCompatActivity() {
class NavigationActivity : ScopeActivity() {
private var videoMenuItem: MenuItem? = null
private var chatMenuItem: MenuItem? = null
private var bookmarksMenuItem: MenuItem? = null
@ -90,15 +95,20 @@ class NavigationActivity : AppCompatActivity() {
private var drawerLayout: DrawerLayout? = null
private var host: NavHostFragment? = null
private var selectServerButton: MaterialButton? = null
private var selectServerDropdownImage: ImageView? = null
private var headerBackgroundImage: ImageView? = null
// We store the last search string in this variable.
// Seems a bit like a hack, is there a better way?
var searchQuery: String? = null
private lateinit var appBarConfiguration: AppBarConfiguration
private var rxBusSubscription: CompositeDisposable = CompositeDisposable()
private val serverSettingsModel: ServerSettingsModel by viewModel()
private val lifecycleSupport: MediaPlayerLifecycleSupport by inject()
private val mediaPlayerController: MediaPlayerController by inject()
private val mediaPlayerManager: MediaPlayerManager by inject()
private val activeServerProvider: ActiveServerProvider by inject()
private val serverRepository: ServerSettingDao by inject()
@ -127,6 +137,8 @@ class NavigationActivity : AppCompatActivity() {
navigationView = findViewById(R.id.nav_view)
drawerLayout = findViewById(R.id.drawer_layout)
setupDrawerLayout(drawerLayout!!)
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
@ -153,7 +165,7 @@ class NavigationActivity : AppCompatActivity() {
drawerLayout
)
setupActionBar(navController, appBarConfiguration)
setupActionBarWithNavController(navController, appBarConfiguration)
setupNavigationMenu(navController)
@ -192,10 +204,11 @@ class NavigationActivity : AppCompatActivity() {
}
rxBusSubscription += RxBus.playerStateObservable.subscribe {
if (it.state == STATE_READY)
if (it.state == STATE_READY) {
showNowPlaying()
else
} else {
hideNowPlaying()
}
}
rxBusSubscription += RxBus.themeChangedEventObservable.subscribe {
@ -211,6 +224,80 @@ class NavigationActivity : AppCompatActivity() {
cachedServerCount = count ?: 0
updateNavigationHeaderForServer()
}
// Setup app shortcuts on supported devices, but not on first start, when the server
// is not configured yet.
if (!UApp.instance!!.isFirstRun) {
ShortcutUtil.registerShortcuts(this)
}
// Register our options menu
addMenuProvider(
searchMenuProvider,
this,
Lifecycle.State.RESUMED
)
}
private val searchMenuProvider: MenuProvider = object : MenuProvider {
override fun onPrepareMenu(menu: Menu) {
setupSearchField(menu)
}
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.search_view_menu, menu)
}
override fun onMenuItemSelected(item: MenuItem): Boolean {
return false
}
}
fun setupSearchField(menu: Menu) {
Timber.i("Recreating search field")
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
val searchItem = menu.findItem(R.id.action_search)
val searchView = searchItem.actionView as SearchView
val searchableInfo = searchManager.getSearchableInfo(this.componentName)
searchView.setSearchableInfo(searchableInfo)
searchView.setIconifiedByDefault(false)
if (searchQuery != null) {
Timber.e("Found existing search query")
searchItem.expandActionView()
searchView.isIconified = false
searchView.setQuery(searchQuery, false)
searchView.clearFocus()
// Restore search text only once!
searchQuery = null
}
}
private fun setupDrawerLayout(drawerLayout: DrawerLayout) {
// Set initial state passed on drawer state
closeNavigationDrawerOnBack.isEnabled = drawerLayout.isOpen
// Add the back press listener
onBackPressedDispatcher.addCallback(this, closeNavigationDrawerOnBack)
// Listen to changes in the drawer state and enable the back press listener accordingly.
drawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener {
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
// Nothing
}
override fun onDrawerOpened(drawerView: View) {
closeNavigationDrawerOnBack.isEnabled = true
}
override fun onDrawerClosed(drawerView: View) {
closeNavigationDrawerOnBack.isEnabled = false
}
override fun onDrawerStateChanged(newState: Int) {
// Nothing
}
})
}
override fun onResume() {
@ -220,7 +307,7 @@ class NavigationActivity : AppCompatActivity() {
Storage.reset()
lifecycleScope.launch(Dispatchers.IO) {
Storage.ensureRootIsAvailable()
Storage.checkForErrorsWithCustomRoot()
}
setMenuForServerCapabilities()
@ -228,8 +315,11 @@ class NavigationActivity : AppCompatActivity() {
// Lifecycle support's constructor registers some event receivers so it should be created early
lifecycleSupport.onCreate()
if (!nowPlayingHidden) showNowPlaying()
else hideNowPlaying()
if (!nowPlayingHidden) {
showNowPlaying()
} else {
hideNowPlaying()
}
}
/*
@ -243,47 +333,31 @@ class NavigationActivity : AppCompatActivity() {
}
private fun updateNavigationHeaderForServer() {
// Only show the vector graphic on Android 11 or earlier
val showVectorBackground = (Build.VERSION.SDK_INT < Build.VERSION_CODES.S)
val activeServer = activeServerProvider.getActiveServer()
if (cachedServerCount == 0)
if (cachedServerCount == 0) {
selectServerButton?.text = getString(R.string.main_setup_server, activeServer.name)
else selectServerButton?.text = activeServer.name
} else {
selectServerButton?.text = activeServer.name
}
val foregroundColor =
ServerColor.getForegroundColor(this, activeServer.color, showVectorBackground)
ServerColor.getForegroundColor(this, activeServer.color)
val backgroundColor =
ServerColor.getBackgroundColor(this, activeServer.color)
if (activeServer.index == 0)
if (activeServer.index == 0) {
selectServerButton?.icon =
ContextCompat.getDrawable(this, R.drawable.ic_menu_screen_on_off)
else
} else {
selectServerButton?.icon =
ContextCompat.getDrawable(this, R.drawable.ic_menu_select_server)
}
selectServerButton?.iconTint = ColorStateList.valueOf(foregroundColor)
selectServerButton?.setTextColor(foregroundColor)
selectServerDropdownImage?.imageTintList = ColorStateList.valueOf(foregroundColor)
headerBackgroundImage?.setBackgroundColor(backgroundColor)
// Hide the vector graphic on Android 12 or later
if (!showVectorBackground) {
headerBackgroundImage?.setImageDrawable(null)
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
val isVolumeDown = keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
val isVolumeUp = keyCode == KeyEvent.KEYCODE_VOLUME_UP
val isVolumeAdjust = isVolumeDown || isVolumeUp
val isJukebox = mediaPlayerController.isJukeboxEnabled
if (isVolumeAdjust && isJukebox) {
mediaPlayerController.adjustVolume(isVolumeUp)
return true
}
return super.onKeyDown(keyCode, event)
}
private fun setupNavigationMenu(navController: NavController) {
@ -308,7 +382,7 @@ class NavigationActivity : AppCompatActivity() {
}
R.id.menu_exit -> {
setResult(Constants.RESULT_CLOSE_ALL)
mediaPlayerController.onDestroy()
mediaPlayerManager.onDestroy()
finish()
exit()
}
@ -328,26 +402,26 @@ class NavigationActivity : AppCompatActivity() {
selectServerButton =
navigationView?.getHeaderView(0)?.findViewById(R.id.header_select_server)
selectServerButton?.setOnClickListener {
if (drawerLayout?.isDrawerVisible(GravityCompat.START) == true)
selectServerDropdownImage =
navigationView?.getHeaderView(0)?.findViewById(R.id.edit_server_button)
val onClick: (View) -> Unit = {
if (drawerLayout?.isDrawerVisible(GravityCompat.START) == true) {
this.drawerLayout?.closeDrawer(GravityCompat.START)
}
navController.navigate(R.id.serverSelectorFragment)
}
selectServerButton?.setOnClickListener(onClick)
selectServerDropdownImage?.setOnClickListener(onClick)
headerBackgroundImage =
navigationView?.getHeaderView(0)?.findViewById(R.id.img_header_bg)
}
private fun setupActionBar(navController: NavController, appBarConfig: AppBarConfiguration) {
setupActionBarWithNavController(navController, appBarConfig)
}
override fun onBackPressed() {
if (drawerLayout?.isDrawerVisible(GravityCompat.START) == true) {
this.drawerLayout?.closeDrawer(GravityCompat.START)
} else {
val currentFragment = host!!.childFragmentManager.fragments.last()
if (currentFragment is OnBackPressedHandler) currentFragment.onBackPressed()
else super.onBackPressed()
private val closeNavigationDrawerOnBack = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
drawerLayout?.closeDrawer(GravityCompat.START)
}
}
@ -361,44 +435,79 @@ class NavigationActivity : AppCompatActivity() {
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return item.onNavDestinationSelected(findNavController(R.id.nav_host_fragment)) ||
val navController = findNavController(R.id.nav_host_fragment)
// Check if this item ID exists in the nav graph
val destinationExists = navController.graph.findNode(item.itemId) != null
return if (destinationExists) {
item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
} else {
// Let the fragments handle their own menu items
super.onOptionsItemSelected(item)
}
}
override fun onSupportNavigateUp(): Boolean {
val currentFragment = host!!.childFragmentManager.fragments.last()
return if (currentFragment is OnBackPressedHandler) {
currentFragment.onBackPressed()
true
} else {
findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration)
// This override is required by design when using setupActionBarWithNavController()
// with an AppBarConfiguration. It ensures that the Up button behavior is correctly
// delegated — either navigating "up" in the back stack, or opening the drawer if
// we're at a top-level destination.
return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration) ||
super.onSupportNavigateUp()
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
when (intent.action) {
Constants.INTENT_PLAY_RANDOM_SONGS -> {
playRandomSongs()
}
Intent.ACTION_MAIN -> {
if (intent.getBooleanExtra(Constants.INTENT_SHOW_PLAYER, false)) {
findNavController(R.id.nav_host_fragment).navigate(R.id.playerFragment)
}
}
Intent.ACTION_SEARCH -> {
searchQuery = intent.getStringExtra(SearchManager.QUERY)
handleSearchIntent(searchQuery, false)
}
MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH -> {
searchQuery = intent.getStringExtra(SearchManager.QUERY)
handleSearchIntent(searchQuery, true)
}
}
}
// TODO Test if this works with external Intents
// android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
if (intent == null) return
private fun handleSearchIntent(query: String?, autoPlay: Boolean) {
val suggestions = SearchRecentSuggestions(
this,
SearchSuggestionProvider.AUTHORITY,
SearchSuggestionProvider.MODE
)
suggestions.saveRecentQuery(query, null)
if (intent.getBooleanExtra(Constants.INTENT_SHOW_PLAYER, false)) {
findNavController(R.id.nav_host_fragment).navigate(R.id.playerFragment)
return
val action = NavigationGraphDirections.toSearchFragment(query, autoPlay)
findNavController(R.id.nav_host_fragment).navigate(action)
}
private fun playRandomSongs() {
val currentFragment = host?.childFragmentManager?.fragments?.last() ?: return
val service = MusicServiceFactory.getMusicService()
val musicDirectory = service.getRandomSongs(Settings.maxSongs)
mediaPlayerManager.addToPlaylist(
songs = musicDirectory.getTracks(),
autoPlay = true,
shuffle = false,
insertionMode = MediaPlayerManager.InsertionMode.CLEAR
)
if (Settings.shouldTransitionOnPlayback) {
currentFragment.findNavController().popBackStack(R.id.playerFragment, true)
currentFragment.findNavController().navigate(R.id.playerFragment)
}
val query = intent.getStringExtra(SearchManager.QUERY)
if (query != null) {
val autoPlay = intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
val suggestions = SearchRecentSuggestions(
this,
SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE
)
suggestions.saveRecentQuery(query, null)
val action = NavigationGraphDirections.toSearchFragment(query, autoPlay)
findNavController(R.id.nav_host_fragment).navigate(action)
}
return
}
/**
@ -428,7 +537,6 @@ class NavigationActivity : AppCompatActivity() {
private fun showWelcomeDialog() {
if (!UApp.instance!!.setupDialogDisplayed) {
Settings.firstInstalledVersion = Util.getVersionCode(UApp.applicationContext())
InfoDialog.Builder(this)
@ -475,9 +583,9 @@ class NavigationActivity : AppCompatActivity() {
}
if (nowPlayingView != null) {
val playerState: Int = mediaPlayerController.playbackState
val playerState: Int = mediaPlayerManager.playbackState
if (playerState == STATE_BUFFERING || playerState == STATE_READY) {
val item: MediaItem? = mediaPlayerController.currentMediaItem
val item: MediaItem? = mediaPlayerManager.currentMediaItem
if (item != null) {
nowPlayingView?.visibility = View.VISIBLE
}

View File

@ -15,28 +15,28 @@ import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.media3.common.HeartRating
import androidx.recyclerview.widget.RecyclerView
import com.drakeet.multitype.ItemViewDelegate
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.moire.ultrasonic.R
import org.moire.ultrasonic.data.RatingUpdate
import org.moire.ultrasonic.domain.Album
import org.moire.ultrasonic.imageloader.ImageLoader
import org.moire.ultrasonic.service.MusicServiceFactory.getMusicService
import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.subsonic.ImageLoaderProvider
import org.moire.ultrasonic.util.LayoutType
import org.moire.ultrasonic.util.Settings.shouldUseId3Tags
import timber.log.Timber
/**
* Creates a Row in a RecyclerView which contains the details of an Album
*/
open class AlbumRowDelegate(
open val onItemClick: (Album) -> Unit,
open val onContextMenuClick: (MenuItem, Album) -> Boolean,
private val imageLoader: ImageLoader
open val onContextMenuClick: (MenuItem, Album) -> Boolean
) : ItemViewDelegate<Album, AlbumRowDelegate.ListViewHolder>(), KoinComponent {
private val starDrawable: Int = R.drawable.ic_star_full
private val starHollowDrawable: Int = R.drawable.ic_star_hollow
private val starDrawable: Int = R.drawable.rating_star_full
private val starHollowDrawable: Int = R.drawable.rating_star_hollow
open var layoutType = LayoutType.LIST
@ -58,10 +58,16 @@ open class AlbumRowDelegate(
holder.star.setImageResource(if (item.starred) starDrawable else starHollowDrawable)
holder.star.setOnClickListener { onStarClick(item, holder.star) }
imageLoader.loadImage(
holder.coverArt, item,
false, 0, R.drawable.unknown_album
)
val imageLoaderProvider: ImageLoaderProvider by inject()
imageLoaderProvider.executeOn {
it.loadImage(
holder.coverArt,
item,
false,
0,
R.drawable.unknown_album
)
}
}
/**
@ -109,27 +115,13 @@ open class AlbumRowDelegate(
private fun onStarClick(entry: Album, star: ImageView) {
entry.starred = !entry.starred
star.setImageResource(if (entry.starred) starDrawable else starHollowDrawable)
val musicService = getMusicService()
Thread {
val useId3 = shouldUseId3Tags
try {
if (entry.starred) {
musicService.star(
if (!useId3) entry.id else null,
if (useId3) entry.id else null,
null
)
} else {
musicService.unstar(
if (!useId3) entry.id else null,
if (useId3) entry.id else null,
null
)
}
} catch (all: Exception) {
Timber.e(all)
}
}.start()
RxBus.ratingSubmitter.onNext(
RatingUpdate(
entry.id,
HeartRating(entry.starred)
)
)
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup): ListViewHolder {
@ -148,8 +140,7 @@ open class AlbumRowDelegate(
class AlbumGridDelegate(
onItemClick: (Album) -> Unit,
onContextMenuClick: (MenuItem, Album) -> Boolean,
imageLoader: ImageLoader
) : AlbumRowDelegate(onItemClick, onContextMenuClick, imageLoader) {
onContextMenuClick: (MenuItem, Album) -> Boolean
) : AlbumRowDelegate(onItemClick, onContextMenuClick) {
override var layoutType = LayoutType.COVER
}

View File

@ -17,12 +17,17 @@ import android.widget.TextView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.drakeet.multitype.ItemViewBinder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.moire.ultrasonic.R
import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.domain.ArtistOrIndex
import org.moire.ultrasonic.domain.Identifiable
import org.moire.ultrasonic.imageloader.ImageLoader
import org.moire.ultrasonic.subsonic.ImageLoaderProvider
import org.moire.ultrasonic.util.FileUtil
import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Util
@ -33,7 +38,6 @@ import org.moire.ultrasonic.util.Util
class ArtistRowBinder(
val onItemClick: (ArtistOrIndex) -> Unit,
val onContextMenuClick: (MenuItem, ArtistOrIndex) -> Boolean,
private val imageLoader: ImageLoader,
private val enableSections: Boolean = true
) : ItemViewBinder<ArtistOrIndex, ArtistRowBinder.ViewHolder>(),
KoinComponent,
@ -59,17 +63,26 @@ class ArtistRowBinder(
holder.coverArtId = item.coverArt
val imageLoaderProvider: ImageLoaderProvider by inject()
if (showArtistPicture()) {
holder.coverArt.visibility = View.VISIBLE
val key = FileUtil.getArtistArtKey(item.name, false)
imageLoader.loadImage(
view = holder.coverArt,
id = holder.coverArtId,
key = key,
large = false,
size = 0,
defaultResourceId = R.drawable.ic_contact_picture
)
CoroutineScope(Dispatchers.IO).launch {
val key = FileUtil.getArtistArtKey(item.name, false)
withContext(Dispatchers.Main) {
imageLoaderProvider.executeOn {
it.loadImage(
view = holder.coverArt,
id = holder.coverArtId,
key = key,
large = false,
size = 0,
defaultResourceId = R.drawable.ic_contact_picture
)
}
}
}
} else {
holder.coverArt.visibility = View.GONE
}
@ -111,7 +124,7 @@ class ArtistRowBinder(
}
private fun showArtistPicture(): Boolean {
return ActiveServerProvider.isID3Enabled() && Settings.shouldShowArtistPicture
return ActiveServerProvider.shouldUseId3Tags() && Settings.shouldShowArtistPicture
}
/**

View File

@ -26,7 +26,8 @@ import timber.log.Timber
* It should be kept generic enough that it can be used a Base for all lists in the app.
*/
@Suppress("unused", "UNUSED_PARAMETER")
class BaseAdapter<T : Identifiable> : MultiTypeAdapter(), FastScrollRecyclerView.SectionedAdapter {
class BaseAdapter<T : Identifiable>(allowDuplicateEntries: Boolean = false) :
MultiTypeAdapter(), FastScrollRecyclerView.SectionedAdapter {
// Update the BoundedTreeSet if selection type is changed
internal var selectionType: SelectionType = SelectionType.MULTIPLE
@ -41,7 +42,7 @@ class BaseAdapter<T : Identifiable> : MultiTypeAdapter(), FastScrollRecyclerView
private val diffCallback = GenericDiffCallback<T>()
init {
setHasStableIds(true)
setHasStableIds(!allowDuplicateEntries)
}
override fun getItemId(position: Int): Long {

Some files were not shown because too many files have changed in this diff Show More