96 Commits

Author SHA1 Message Date
eddyizm
36d2320e70 chore: bump version and changelog for release 2025-11-06 15:44:46 -08:00
eddyizm
17713ee400 fix: Add listener to enable equalizer when audioSessionId changes (#235) 2025-11-06 15:40:39 -08:00
eddyizm
ee3465868e Album track list bug (#237) 2025-11-06 15:40:14 -08:00
eddyizm
9e8141a8d9 chore: name version 2025-11-06 14:49:19 -08:00
eddyizm
043e1b39b0 Revert "fix: do not override itemType and itemId"
This reverts commit d35146dba3.
2025-11-06 14:35:29 -08:00
Jaime García
938c1de906 chore: Remove comment 2025-11-06 04:48:24 +01:00
Jaime García
a0dfe63660 fix: Add listener to enable equalizer when audioSessionId changes 2025-11-06 03:18:39 +01:00
eddyizm
28c2f87b26 chore: updated change log 2025-11-05 09:15:11 -08:00
eddyizm
9ab22bfede chore: bump version 2025-11-05 07:51:55 -08:00
eddyizm
20900fb557 chore: pre release prep 2025-11-04 22:11:02 -08:00
eddyizm
7457c5b6e3 fix: skip mapping downloaded item (#228) 2025-11-04 15:43:04 -08:00
pca006132
e5a928ec0f fix: skip mapping downloaded item 2025-11-05 00:35:27 +08:00
eddyizm
147c8360a6 Revert "improve battery consumption" (#227) 2025-11-04 07:02:50 -08:00
eddyizm
d5d504fc64 Revert "improve battery consumption" 2025-11-04 07:02:19 -08:00
eddyizm
24eead2d0a improve battery consumption (#223) 2025-11-03 21:20:06 -08:00
pca006132
2644fa52b6 enable offload 2025-11-03 22:33:42 +08:00
pca006132
38c144c073 avoid rebuffering after track change 2025-11-03 22:33:21 +08:00
pca006132
1dca1ef68d avoid updating player bottom sheet when not visible 2025-11-03 16:16:06 +08:00
pca006132
ba94d7e5cc fix null 2025-11-03 16:01:15 +08:00
pca006132
0028872e3f update one media item only 2025-11-03 15:07:29 +08:00
pca006132
be9eec625a avoid full updates 2025-11-03 14:50:06 +08:00
pca006132
b335ddec01 cache artwork bitmap 2025-11-03 13:33:22 +08:00
eddyizm
eb5c4721d1 fix: update MediaItems after network change (#222) 2025-11-02 08:01:43 -08:00
eddyizm
b0e8fa75ca chore: update media3 dependencies (#217) 2025-11-02 08:00:55 -08:00
eddyizm
27d7288ee9 fix: do not override getItemViewType and getItemId (#221) 2025-11-02 08:00:37 -08:00
eddyizm
287921de09 fix: playlist page should not snap (#218) 2025-11-02 07:59:51 -08:00
eddyizm
e5cb8793b0 fix: remove NestedScrollViews for fragment_album_page (#216) 2025-11-02 07:59:34 -08:00
eddyizm
f25e7f250a Fix downloaded tab performance (#210) 2025-11-02 07:59:10 -08:00
eddyizm
911acc3c2d feat: sort artists by album count (#206) 2025-11-02 07:58:46 -08:00
pca006132
4b7f60bb8c fix: update MediaItems after network change 2025-11-02 16:44:15 +08:00
pca006132
d35146dba3 fix: do not override itemType and itemId 2025-11-02 14:54:32 +08:00
eddyizm
6c3897a400 Update USAGE.md with instant mix details (#220) 2025-11-01 16:50:47 -07:00
Thomas Anderson
1002499d92 Update USAGE.md with instant mix details
Follow up of https://github.com/eddyizm/tempus/issues/184#issuecomment-3475333928
2025-11-01 22:43:09 +03:00
pca006132
77c0b86dac fix: playlist page should not snap 2025-11-01 13:34:47 +08:00
pca006132
0abdfc6b19 fix: remove NestedScrollViews for fragment_album_page 2025-11-01 13:31:05 +08:00
pca006132
52b2ca8fa7 chore: update media3 dependencies 2025-11-01 11:44:40 +08:00
pca006132
7f66124614 fix: download tab performance 2025-10-31 20:16:01 +08:00
eddyizm
9930537486 shuffle for artists without using getTopSongs (#207) 2025-10-30 18:54:19 -07:00
pca006132
5d51132921 feat: add preference to sort artists by album count 2025-10-30 20:01:47 +08:00
pca006132
4b2e963a81 fix: shuffle for artists without using getTopSongs 2025-10-30 20:01:28 +08:00
pca006132
4c865e199d feat: sort artists by album count 2025-10-30 18:01:07 +08:00
eddyizm
fc58869354 chore(i18n): Update Spanish (es-ES) translation (#205) 2025-10-29 17:47:03 -07:00
Jaime García
5e1a2b41e9 chore(i18n): Update Spanish (es-ES) translation 2025-10-29 22:06:13 +01:00
eddyizm
77bdd71d79 chore: updated bug issue 2025-10-29 09:29:36 -07:00
eddyizm
4ab1f034d8 chore: bumped version for release, added changelogs 2025-10-28 18:53:45 -07:00
eddyizm
4bd8bbfa4c chore: removed build badge since its not live yet 2025-10-28 18:39:41 -07:00
eddyizm
3fc03114e2 chore: updated github url 2025-10-28 18:37:45 -07:00
eddyizm
576c93e6cb Crash on share no expiration date or field returned from api (#199) 2025-10-27 20:57:36 -07:00
eddyizm
ac674d937a fix: handle null or no expiry field being sent back from server 2025-10-27 20:47:46 -07:00
eddyizm
0ed329022e fix: gradle updated to exclude offending blobs, change log link fixed, removed old screenshots. 2025-10-27 19:55:29 -07:00
eddyizm
b8b4a77349 chore: updated tempo references to tempus including github check (#197) 2025-10-27 09:08:13 -07:00
eddyizm
de14663b25 chore: updated tempo references to tempus including github check 2025-10-27 09:06:57 -07:00
eddyizm
747af0d81c fix: updated crash report and degoogled icon for izzydroid #195 2025-10-27 07:39:07 -07:00
eddyizm
c95e7cc5e0 fix: disabled workflow, manual build 2025-10-26 12:01:51 -07:00
eddyizm
0c3b43c5dc fix: build paths 2025-10-26 11:49:08 -07:00
eddyizm
830e9076f1 never surrender 2025-10-26 11:32:23 -07:00
eddyizm
cd9ae97bc7 fix: bumped version, update path from build error logs 2025-10-26 11:17:59 -07:00
eddyizm
1b59a8e8ef chore: bumped build version 2025-10-26 10:59:22 -07:00
eddyizm
391405fc76 fix: workflow broken, taking another approach 2025-10-26 10:58:18 -07:00
eddyizm
4bdcbacf62 chore: bumped version for new workflow build 2025-10-26 10:15:22 -07:00
eddyizm
6cbae700bf fix: type in the workflow yaml 2025-10-26 10:02:59 -07:00
eddyizm
e7555119f0 chore: bumped version, updated ignore file 2025-10-26 09:35:12 -07:00
eddyizm
e228e74e6a Update Polish translation (#188) 2025-10-26 07:27:11 -07:00
skajmer
062f4db2cf Merge branch 'eddyizm:development' into development 2025-10-26 09:53:04 +01:00
eddyizm
cb75e34b92 fix: updated work flow for new tempus release 2025-10-25 19:51:12 -07:00
eddyizm
36005c5f51 Tempus rebrand (#183) 2025-10-25 13:12:49 -07:00
eddyizm
8ae0900269 Merge branch 'development' into tempus-rebrand 2025-10-25 13:12:32 -07:00
eddyizm
f286c7b1b9 fix: readme update for new screenshot size 2025-10-25 13:10:58 -07:00
eddyizm
c5d0af67a7 chore: added a few more screenshots 2025-10-25 13:06:24 -07:00
skajmer
3fb4ccd791 Update strings.xml
#158, #161
2025-10-24 23:10:57 +02:00
eddyizm
577b50a85b chore: bumped to alpha to release debug apks 2025-10-22 21:45:03 -07:00
eddyizm
e6a56ba1d2 chore: update readme and usage references to tempus. added new banner… (#182) 2025-10-22 08:27:57 -07:00
eddyizm
2740b6da29 feat: added green launcher to degoogled variant 2025-10-22 07:55:13 -07:00
eddyizm
21c4ae77ba fix: splash logo sized to not crop anymore 2025-10-21 11:25:01 -07:00
eddyizm
7a83a03a90 feat: first pass swapping new icon, build config and rename folder structure 2025-10-21 09:23:25 -07:00
eddyizm
be0480538e Merge branch 'development' into tempus-readme-update 2025-10-20 12:22:25 -07:00
eddyizm
b48057b4a2 fix: persist album sorting on resume (#181) 2025-10-20 12:18:41 -07:00
eddyizm
fa430eaac4 Unhide genre from album details view (#161) 2025-10-20 12:18:11 -07:00
eddyizm
82ee9b4639 chore: reset changelog to 1 since its a new app 2025-10-20 09:27:31 -07:00
eddyizm
9b807fde31 fix: typo in spanish/port language, fixing capitalizion in git url 2025-10-19 18:25:34 -07:00
eddyizm
c7ba4235b3 chore: updated strings with tempus and updated screenshots. 2025-10-19 17:37:55 -07:00
eddyizm
d27e431f73 fix: typo in readme link 2025-10-19 11:18:19 -07:00
eddyizm
d23eea4f27 chore: updated fastlane docs, icon, and reset changelogs to start initial release 2025-10-19 10:08:23 -07:00
eddyizm
430e7105eb fix: updated html for banner 2025-10-19 08:19:48 -07:00
eddyizm
024c4e6118 chore: update readme and usage references to tempus. added new banner logo 2025-10-18 22:19:03 -07:00
eddyizm
7b2ee9da3a fix: updated workflow for 32/64 bit apks (#176) 2025-10-18 17:27:00 -07:00
eddyizm
c3cce18600 fix: persist album sorting on resume 2025-10-18 17:16:11 -07:00
sebaFlame
442fe1ea01 Merge branch 'development' into main 2025-10-18 01:48:47 +02:00
cba
cb0874dca4 Added setting to make album detail visible 2025-10-18 01:00:00 +02:00
cba
079149c1d5 Revert "removed dropdown for album info"
This reverts commit ceaffa254b.
2025-10-18 00:37:06 +02:00
eddyizm
118f742cb6 Check also underlying transport (#90) 2025-10-17 06:46:56 -07:00
Thomas Anderson
c028c52576 Merge branch 'main' into patch-1 2025-10-17 12:26:42 +03:00
eddyizm
96c5d0fca8 fix: updated workflow for 32/64 bit apks 2025-10-16 21:54:53 -07:00
eddyizm
e39a5e2d5c chore: updated changelog 2025-10-16 17:19:49 -07:00
cba
ceaffa254b removed dropdown for album info 2025-10-09 23:03:25 +02:00
Thomas Anderson
ffcfd81c28 Check also underlaying transport 2025-09-05 15:45:00 +03:00
186 changed files with 1135 additions and 953 deletions

View File

@@ -26,6 +26,7 @@ Outline the steps required to reproduce the bug, including any specific actions,
- Android device: [Device Model]
- Android OS version: [Android Version]
- App version: [App Version]
- App variant: [goole play services, degoogled]
- Other relevant details: [e.g., specific network conditions, external dependencies]
## Logs or Screenshots

View File

@@ -23,10 +23,11 @@ Please provide the steps to reproduce the crash:
- Android device: [Device Model]
- Android OS version: [Android Version]
- App version: [App Version]
- App variant: [goole play services, degoogled]
- Other relevant details: [e.g., specific network conditions, external dependencies]
## Crash Logs/Stack trace
<!-- If available, please provide the crash log or stack trace related to the crash. Include it inside a code block (surround with triple backticks ```). Please use the unsigned apk (app-tempo-debug.apk), as the logs would be illegible and therefore useless for this purpose. -->
<!-- If available, please provide the crash log or stack trace related to the crash. Include it inside a code block (surround with triple backticks ```). Please use the unsigned apk (app-tempus-debug.apk), as the logs would be illegible and therefore useless for this purpose. -->
## Screenshots
<!-- If applicable, add screenshots to help explain the problem. -->

View File

@@ -3,7 +3,7 @@ name: Github Release Workflow
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+'
jobs:
build:
@@ -35,21 +35,21 @@ jobs:
echo "BUILD_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV
echo Last build tool version is: $BUILD_TOOL_VERSION
- name: Build All APKs
- name: Build All Release APKs
id: build
run: |
# Build release variants
bash ./gradlew assembleTempoRelease
bash ./gradlew assembleNotquitemyRelease
# Build debug variants
bash ./gradlew assembleTempoDebug
bash ./gradlew assembleNotquitemyDebug
# Only build release variants (removed debug builds)
bash ./gradlew assembleTempusRelease
bash ./gradlew assembleDegoogledRelease
- name: Sign Tempo Release APKs
id: sign_tempo_release
- name: Create Artifact Staging Directory
run: mkdir -p release-artifacts
- name: Sign Tempus Release APKs
id: sign_tempus_release
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/tempo/release
releaseDirectory: app/build/outputs/apk/tempus/release
signingKeyBase64: ${{ secrets.KEYSTORE_BASE64 }}
alias: ${{ secrets.KEY_ALIAS_GITHUB }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
@@ -57,11 +57,31 @@ jobs:
env:
BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOL_VERSION }}
- name: Sign NotQuiteMy Release APKs
id: sign_notquitemy_release
- name: Prepare Signed Tempus APKs for Release
run: |
TEMPUS_PATH=app/build/outputs/apk/tempus/release
echo "--- Tempus Files BEFORE Move ---"
ls -la $TEMPUS_PATH
echo "--------------------------------"
# FIX: Use find/xargs for robust file matching and moving.
# Renaming 64-bit APK and moving to safe staging directory
find $TEMPUS_PATH -name '*arm64-v8a*signed.apk' -print0 | xargs -0 mv -t ./release-artifacts/
mv ./release-artifacts/*arm64-v8a*signed.apk ./release-artifacts/app-tempus-arm64-v8a-release.apk
# Renaming 32-bit APK and moving to safe staging directory
find $TEMPUS_PATH -name '*armeabi-v7a*signed.apk' -print0 | xargs -0 mv -t ./release-artifacts/
mv ./release-artifacts/*armeabi-v7a*signed.apk ./release-artifacts/app-tempus-armeabi-v7a-release.apk
echo "Prepared Tempus APKs."
- name: Sign Degoogled Release APKs
id: sign_degoogled_release
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/notquitemy/release
releaseDirectory: app/build/outputs/apk/degoogled/release
signingKeyBase64: ${{ secrets.KEYSTORE_BASE64 }}
alias: ${{ secrets.KEY_ALIAS_GITHUB }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
@@ -69,50 +89,41 @@ jobs:
env:
BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOL_VERSION }}
- name: Prepare Signed Degoogled APKs for Release
run: |
DEGOOGLED_PATH=app/build/outputs/apk/degoogled/release
echo "--- Degoogled Files BEFORE Move ---"
ls -la $DEGOOGLED_PATH
echo "--------------------------------"
# FIX: Use find/xargs for robust file matching and moving.
# Renaming 64-bit APK and moving to safe staging directory
find $DEGOOGLED_PATH -name '*arm64-v8a*signed.apk' -print0 | xargs -0 mv -t ./release-artifacts/
mv ./release-artifacts/*arm64-v8a*signed.apk ./release-artifacts/app-degoogled-arm64-v8a-release.apk
# Renaming 32-bit APK and moving to safe staging directory
find $DEGOOGLED_PATH -name '*armeabi-v7a*signed.apk' -print0 | xargs -0 mv -t ./release-artifacts/
mv ./release-artifacts/*armeabi-v7a*signed.apk ./release-artifacts/app-degoogled-armeabi-v7a-release.apk
echo "Prepared Degoogled APKs."
ls -la ./release-artifacts/
- name: Create Release
id: create_release
uses: actions/create-release@v1
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ github.ref }}
release_name: Release v${{ github.ref }}
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
body: '> Changelog coming soon'
env:
GITHUB_TOKEN: ${{ github.token }}
draft: false
prerelease: false
files: ./release-artifacts/*.apk
- name: Upload Release APKs
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{steps.sign_tempo_release.outputs.signedReleaseFile}}
asset_name: app-tempo-release.apk
asset_content_type: application/vnd.android.package-archive
- name: Upload NotQuiteMy Release APK
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{steps.sign_notquitemy_release.outputs.signedReleaseFile}}
asset_name: app-notquitemy-release.apk
asset_content_type: application/vnd.android.package-archive
- name: Upload Debug APKs as artifacts
uses: actions/upload-artifact@v4
with:
name: debug-apks
path: |
app/build/outputs/apk/tempo/debug/
app/build/outputs/apk/notquitemy/debug/
retention-days: 30
- name: Upload Release APKs as artifacts
- name: Upload Release APKs as artifacts (For easy pipeline access)
uses: actions/upload-artifact@v4
with:
name: release-apks
path: |
${{steps.sign_tempo_release.outputs.signedReleaseFile}}
${{steps.sign_notquitemy_release.outputs.signedReleaseFile}}
retention-days: 30
path: ./release-artifacts/*.apk
retention-days: 30

4
.gitignore vendored
View File

@@ -17,5 +17,5 @@
.vscode/settings.json
# release / debug files
tempus-release-key.jks
app/tempo/
app/notquitemy/
app/tempus/
app/degoogled/

View File

@@ -1,6 +1,68 @@
# Changelog
***This log is for this fork to detail updates since 3.9.0 from the main repo.***
## Pending release..
* fix: reverts change causing album disc/track list to get out of order by @eddyizm in https://github.com/eddyizm/tempus/pull/237
* fix: Add listener to enable equalizer when audioSessionId changes by @jaime-grj in https://github.com/eddyizm/tempus/pull/235
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.1.0...v4.1.2
## [4.1.0](https://github.com/eddyizm/tempo/releases/tag/v4.1.0) (2025-11-05)
## What's Changed
* chore(i18n): Update Spanish (es-ES) translation by @jaime-grj in https://github.com/eddyizm/tempus/pull/205
* shuffle for artists without using `getTopSongs` by @pca006132 in https://github.com/eddyizm/tempus/pull/207
* Update USAGE.md with instant mix details by @zc-devs in https://github.com/eddyizm/tempus/pull/220
* feat: sort artists by album count by @pca006132 in https://github.com/eddyizm/tempus/pull/206
* Fix downloaded tab performance by @pca006132 in https://github.com/eddyizm/tempus/pull/210
* fix: remove NestedScrollViews for fragment_album_page by @pca006132 in https://github.com/eddyizm/tempus/pull/216
* fix: playlist page should not snap by @pca006132 in https://github.com/eddyizm/tempus/pull/218
* fix: do not override getItemViewType and getItemId by @pca006132 in https://github.com/eddyizm/tempus/pull/221
* chore: update media3 dependencies by @pca006132 in https://github.com/eddyizm/tempus/pull/217
* fix: update MediaItems after network change by @pca006132 in https://github.com/eddyizm/tempus/pull/222
* fix: skip mapping downloaded item by @pca006132 in https://github.com/eddyizm/tempus/pull/228
## New Contributors
* @pca006132 made their first contribution in https://github.com/eddyizm/tempus/pull/207
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.0.7...v4.1.0
## [4.0.7](https://github.com/eddyizm/tempo/releases/tag/v4.0.7) (2025-10-28)
## What's Changed
* chore: updated tempo references to tempus including github check by @eddyizm in https://github.com/eddyizm/tempus/pull/197
* fix: Crash on share no expiration date or field returned from api by @eddyizm in https://github.com/eddyizm/tempus/pull/199
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v4.0.6...v4.0.7
## [4.0.6](https://github.com/eddyizm/tempo/releases/tag/v4.0.6) (2025-10-26)
## Attention
This release will not update previous installs as it is considered a new app, no longer `Tempo`, new icon, new app id, and new app name. Hoping it will not be a huge inconvenience but was necessary in order to publish to app stores like IzzyDroid and FDroid.
**Android Auto**
Support should be the same as before, however, I was not able to test any of the icons/visuals, so please let me know if there are any remnants of the tempo logo/icon as I believe I removed them all and replaced them successfully.
## What's Changed
* Check also underlying transport by @zc-devs in https://github.com/eddyizm/tempus/pull/90
* fix: updated workflow for 32/64 bit apks by @eddyizm in https://github.com/eddyizm/tempus/pull/176
* Unhide genre from album details view by @sebaFlame in https://github.com/eddyizm/tempus/pull/161
* fix: persist album sorting on resume by @eddyizm in https://github.com/eddyizm/tempus/pull/181
* chore: update readme and usage references to tempus. added new banner… by @eddyizm in https://github.com/eddyizm/tempus/pull/182
* Tempus rebrand by @eddyizm in https://github.com/eddyizm/tempus/pull/183
* Update Polish translation by @skajmer in https://github.com/eddyizm/tempus/pull/188
## New Contributors
* @zc-devs made their first contribution in https://github.com/eddyizm/tempus/pull/90
* @sebaFlame made their first contribution in https://github.com/eddyizm/tempus/pull/161
**Full Changelog**: https://github.com/eddyizm/tempus/compare/v3.17.14...v4.0.1
## [3.17.14](https://github.com/eddyizm/tempo/releases/tag/v3.17.14) (2025-10-16)
## What's Changed
* fix: General build warning and playback issues by @le-firehawk in https://github.com/eddyizm/tempo/pull/167
* fix: persist album sort preference by @eddyizm in https://github.com/eddyizm/tempo/pull/168
* Fix album parse empty date field by @eddyizm in https://github.com/eddyizm/tempo/pull/171
* fix: Include shuffle/repeat controls in f-droid build's media notific… by @le-firehawk in https://github.com/eddyizm/tempo/pull/174
* fix: limits image size to prevent widget crash #172 by @eddyizm in https://github.com/eddyizm/tempo/pull/175
**Full Changelog**: https://github.com/eddyizm/tempo/compare/v3.17.0...v3.17.14
## [3.17.0](https://github.com/eddyizm/tempo/releases/tag/v3.17.0) (2025-10-10)
## What's Changed
@@ -160,3 +222,5 @@
[\#400](https://github.com/CappielloAntonio/tempo/pull/400)
- [Chore] Spanish translation [\#374](https://github.com/CappielloAntonio/tempo/pull/374)
- [Chore] Polish translation [\#378](https://github.com/CappielloAntonio/tempo/pull/378)
***This log is for this fork to detail updates since 3.9.0 from the main repo.***

View File

@@ -1,68 +1,72 @@
<p align="center">
<img alt="Tempo" title="Tempo" src="mockup/svg/horizontal_logo.svg" width="250">
<img alt="Tempus" title="Tempus" src="mockup/svg/tempus_horizontal_logo.png" width="250">
</p>
---
<p align="center">
<b>Access your music library on all your android devices</b>
</p>
<div align="center">
<!-- Reproducible build -->
<!-- [<img src="https://shields.rbtlog.dev/simple/com.eddyizm.degoogled.tempus" alt="RB Status">](https://shields.rbtlog.dev/com.eddyizm.degoogled.tempus) -->
</div>
<p align="center">
<a href="https://github.com/eddyizm/tempo/releases"><img src="https://i.ibb.co/q0mdc4Z/get-it-on-github.png" width="200"></a>
<a href="https://github.com/eddyizm/tempus/releases"><img src="https://i.ibb.co/q0mdc4Z/get-it-on-github.png" width="200"></a>
<a href="https://apt.izzysoft.de/fdroid/index/apk/com.eddyizm.degoogled.tempus"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" width="200"></a>
</p>
<!-- <p align="center">
<!--
<a href="https://f-droid.org/packages/com.cappielloantonio.notquitemy.tempo"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" width="200"></a>
<a href="https://apt.izzysoft.de/fdroid/index/apk/com.cappielloantonio.tempo"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" width="200"></a>
</p> -->
-->
**Tempo** is an open-source and lightweight music client for Subsonic, designed and built natively for Android. It provides a seamless and intuitive music streaming experience, allowing you to access and play your Subsonic music library directly from your Android device.
**Tempus** is an open-source and lightweight music client for Subsonic, designed and built natively for Android. It provides a seamless and intuitive music streaming experience, allowing you to access and play your Subsonic music library directly from your Android device.
Tempo does not rely on magic algorithms to decide what you should listen to. Instead, the interface is built around your listening history, randomness, and optionally integrates with services like Last.fm to personalize your music experience.
Tempus does not rely on magic algorithms to decide what you should listen to. Instead, the interface is built around your listening history, randomness, and optionally integrates with services like Last.fm to personalize your music experience.
**If you find Tempo useful, please consider starring the project on GitHub. It would mean a lot to me and help promote the app to a wider audience.**
The project is a fork of [Tempo](#credits).
**If you find Tempus useful, please consider starring the project on GitHub. It would mean a lot to me and help promote the app to a wider audience.**
**Use the Github version of the app for full Android Auto and Chromecast support.**
## Fork
sha256 signing key fingerprint
`B7:85:01:B9:34:D0:4E:0A:CA:8D:94:AF:D6:72:6A:4D:1D:CE:65:79:7F:1D:41:71:0F:64:3C:29:00:EB:1D:1D`
This fork is my attempt to keep development moving forward and merge in PR's that have been sitting for a while in the main repo. Thankful to @CappielloAntonio for the amazing app and hopefully we can continue to build on top of it. I will only be releasing on github and if I am not able to merge back to the main repo, I plan to rename the app to be able to publish it to fdroid and possibly google play? We will see.
### Releases
Please note the two variants in the release assets include release/debug and 32/64 bit flavors.
`app-tempo` <- The github release with all the android auto/chromecast features
`app-tempus` <- The github release with all the android auto/chromecast features
`app-notquitemy*` <- The f-droid release that goes without any of the google stuff. It was last released at 3.8.1 from the original repo. Since I don't have access to that original repo, I am releasing the apk's here on github.
`app-degoogled*` <- The izzyOnDroid release that goes without any of the google stuff. It is now available on izzyOnDroid (64bit) I am releasing the both 32/64bit apk's here on github for those who need a 32bit version.
As mentioned above, I am working towards a rebrand to get into app stores with a new name an icon.
Moved details to [CHANGELOG.md](CHANGELOG.md)
Fork [**sponsorship here**](https://ko-fi.com/eddyizm).
[CHANGELOG.md](CHANGELOG.md)
## Usage
[Documentation](USAGE.md) (work in progress)
## Features
- **Subsonic Integration**: Tempo seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go.
- **Subsonic Integration**: Tempus seamlessly integrates with your Subsonic server, providing you with easy access to your entire music collection on the go.
- **Sleek and Intuitive UI**: Enjoy a clean and user-friendly interface designed to enhance your music listening experience, tailored to your preferences and listening history.
- **Browse and Search**: Easily navigate through your music library using various browsing and searching options, including artists, albums, genres, playlists, decades and more.
- **Streaming and Offline Mode**: Stream music directly from your Subsonic server. Offline mode is currently under active development and may have limitations when using multiple servers.
- **Playlist Management**: Create, edit, and manage playlists to curate your perfect music collection.
- **Gapless Playback**: Experience uninterrupted playback with gapless listening mode.
- **Chromecast Support**: Stream your music to Chromecast devices. The support is currently in a rudimentary state.
- **Scrobbling Integration**: Optionally integrate Tempo with Last.fm to scrobble your played tracks, gather music insights, and further personalize your music recommendations, if supported by your Subsonic server.
- **Podcasts and Radio**: If your Subsonic server supports it, listen to podcasts and radio shows directly within Tempo, expanding your audio entertainment options.
- **Scrobbling Integration**: Optionally integrate Tempus with Last.fm or Listenbrainz.org to scrobble your played tracks, gather music insights, and further personalize your music recommendations, if supported by your Subsonic server.
- **Podcasts and Radio**: If your Subsonic server supports it, listen to podcasts and radio shows directly within Tempus, expanding your audio entertainment options.
- **Transcoding Support**: Activate transcoding of tracks on your Subsonic server, allowing you to set a transcoding profile for optimized streaming directly from the app. This feature requires support from your Subsonic server.
- **Android Auto Support**: Enjoy your favorite music on the go with full Android Auto integration, allowing you to seamlessly control and listen to your tracks directly from your mobile device while driving.
- **Multiple Libraries**: Tempo handles multi-library setups gracefully. They are displayed as Library folders.
## Credits
Thanks to the original repo/creator [CappielloAntonio](https://github.com/CappielloAntonio) (3.9.0)
- **Multiple Libraries**: Tempus handles multi-library setups gracefully. They are displayed as Library folders.
- **Equalizer**: Option to use in app equalizer.
- **Widget**: New widget to keeping the basic controls on your screen at all times.
- **Available in 11 languages**: Currently in Chinese, French, German, Italian, Korean, Polish, Portuguese, Russion, Spanish and Turkish
## Screenshot
@@ -71,14 +75,13 @@ Thanks to the original repo/creator [CappielloAntonio](https://github.com/Cappie
</p>
<p align="center">
<img src="mockup/light/1_screenshot.png" width=200>
<img src="mockup/light/2_screenshot.png" width=200>
<img src="mockup/light/3_screenshot.png" width=200>
<img src="mockup/light/4_screenshot.png" width=200>
<img src="mockup/light/5_screenshot.png" width=200>
<img src="mockup/light/6_screenshot.png" width=200>
<img src="mockup/light/7_screenshot.png" width=200>
<img src="mockup/light/8_screenshot.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/1_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/3_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/4_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/5_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/6_light.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_light.png" width=200>
</p>
<br>
@@ -88,14 +91,14 @@ Thanks to the original repo/creator [CappielloAntonio](https://github.com/Cappie
</p>
<p align="center">
<img src="mockup/dark/1_screenshot.png" width=200>
<img src="mockup/dark/2_screenshot.png" width=200>
<img src="mockup/dark/3_screenshot.png" width=200>
<img src="mockup/dark/4_screenshot.png" width=200>
<img src="mockup/dark/5_screenshot.png" width=200>
<img src="mockup/dark/6_screenshot.png" width=200>
<img src="mockup/dark/7_screenshot.png" width=200>
<img src="mockup/dark/8_screenshot.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/1_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/2_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/3_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/4_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/5_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/6_dark.png" width=200>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/8_dark.png" width=200>
</p>
## Contributing
@@ -108,6 +111,16 @@ Currently there are no tests but I would love to start on some unit tests.
Not a hard requirement but any new feature/change should ideally include an update to the nacent documention.
## Support
[**Buy me a coffee**](https://ko-fi.com/eddyizm)
bitcoin: `3QVHSSCJvn6yXEcJ3A3cxYLMmbvFsrnUs5`
## License
Tempo is released under the [GNU General Public License v3.0](LICENSE). Feel free to modify, distribute, and use the app in accordance with the terms of the license. Contributions to the project are also welcome.
Tempus is released under the [GNU General Public License v3.0](LICENSE). Feel free to modify, distribute, and use the app in accordance with the terms of the license. Contributions to the project are also welcome.
## Credits
Thanks to the original repo/creator [CappielloAntonio](https://github.com/CappielloAntonio) (forked from v3.9.0)
[Opensvg.org](https://opensvg.org) for the new turntable logo.

View File

@@ -1,4 +1,4 @@
# Tempo Usage Guide
# Tempus Usage Guide
[<- back home](README.md)
## Table of Contents
@@ -34,7 +34,7 @@ This app works with any service that implements the Subsonic API, including:
## Getting Started
### Installation
1. Download the APK from the [Releases](https://github.com/eddyizm/tempo/releases) section
1. Download the APK from the [Releases](https://github.com/eddyizm/tempus/releases) section
2. Enable "Install from unknown sources" in your Android settings
3. Install the application
@@ -60,11 +60,11 @@ This app works with any service that implements the Subsonic API, including:
**Multi-library**
Tempo handles multi-library setups gracefully. They are displayed as Library folders.
Tempus handles multi-library setups gracefully. They are displayed as Library folders.
However, if you want to limit or change libraries you could use a workaround, if your server supports it.
You can create multiple users , one for each library, and save each of them in Tempo app.
You can create multiple users , one for each library, and save each of them in Tempus app.
### Now Playing Screen
@@ -78,6 +78,9 @@ On the main player control screen, tapping on the artwork will reveal a small co
1. Downloads the track (there is a notification if the android screen but not a pop toast currently )
2. Adds track to playlist - pops up playlist dialog.
3. Adds tracks to the queue via instant mix function
* TBD: what is the _instant mix function_?
* Uses [getSimilarSongs](https://opensubsonic.netlify.app/docs/endpoints/getsimilarsongs/) of OpenSubsonic API.
Which tracks to be mixed depends on the server implementation. For example, Navidrome gets 15 similar artists from LastFM, then 20 top songs from each.
4. Saves play queue (if the feature is enabled in the settings)
* if the setting is not enabled, it toggles a view of the lyrics if available (slides to the right)
@@ -157,10 +160,10 @@ On the main player control screen, tapping on the artwork will reveal a small co
### Support
For additional help:
- Question? Start a [Discussion](https://github.com/eddyizm/tempo/discussions)
- Open an [issue](https://github.com/eddyizm/tempo/issues) if you don't find a discussion solving your issue.
- Question? Start a [Discussion](https://github.com/eddyizm/tempus/discussions)
- Open an [issue](https://github.com/eddyizm/tempus/issues) if you don't find a discussion solving your issue.
- Consult your Subsonic server's documentation
---
*Note: This app requires a pre-existing Subsonic-compatible server with music content.*
*Note: This app requires a pre-existing Subsonic-compatible server with music content.*

View File

@@ -10,8 +10,8 @@ android {
minSdkVersion 24
targetSdk 35
versionCode 36
versionName '3.17.14'
versionCode 4
versionName '4.1.2'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
javaCompileOptions {
@@ -35,19 +35,24 @@ android {
}
}
dependenciesInfo {
// Disables dependency metadata when building APKs (for IzzyOnDroid/F-Droid)
includeInApk = false
// Disables dependency metadata when building Android App Bundles (for Google Play)
includeInBundle = false
}
flavorDimensions += "default"
productFlavors {
tempo {
tempus {
dimension = "default"
applicationId 'com.cappielloantonio.tempo'
applicationId 'com.eddyizm.tempus'
}
notquitemy {
degoogled {
dimension = "default"
applicationId "com.cappielloantonio.notquitemy.tempo"
applicationId "com.eddyizm.degoogled.tempus"
}
}
@@ -105,12 +110,12 @@ dependencies {
implementation 'com.github.bumptech.glide:annotations:4.16.0'
// Media3
implementation 'androidx.media3:media3-session:1.5.1'
implementation 'androidx.media3:media3-common:1.5.1'
implementation 'androidx.media3:media3-exoplayer:1.5.1'
implementation 'androidx.media3:media3-ui:1.5.1'
implementation 'androidx.media3:media3-exoplayer-hls:1.5.1'
tempoImplementation 'androidx.media3:media3-cast:1.5.1'
implementation 'androidx.media3:media3-session:1.8.0'
implementation 'androidx.media3:media3-common:1.8.0'
implementation 'androidx.media3:media3-exoplayer:1.8.0'
implementation 'androidx.media3:media3-ui:1.8.0'
implementation 'androidx.media3:media3-exoplayer-hls:1.8.0'
tempusImplementation 'androidx.media3:media3-cast:1.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -5,18 +5,20 @@ import android.app.PendingIntent.FLAG_IMMUTABLE
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.app.TaskStackBuilder
import android.content.Intent
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.os.Binder
import android.os.Bundle
import android.os.IBinder
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.media3.common.*
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.DefaultLoadControl
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.exoplayer.source.TrackGroupArray
import androidx.media3.exoplayer.trackselection.TrackSelectionArray
import androidx.media3.session.*
import androidx.media3.session.MediaSession.ControllerInfo
import com.cappielloantonio.tempo.R
@@ -43,6 +45,7 @@ class MediaService : MediaLibraryService() {
private lateinit var mediaLibrarySession: MediaLibrarySession
private lateinit var shuffleCommands: List<CommandButton>
private lateinit var repeatCommands: List<CommandButton>
private lateinit var networkCallback: CustomNetworkCallback
lateinit var equalizerManager: EqualizerManager
private var customLayout = ImmutableList.of<CommandButton>()
@@ -79,6 +82,39 @@ class MediaService : MediaLibraryService() {
private const val CUSTOM_COMMAND_TOGGLE_REPEAT_MODE_ALL =
"android.media3.session.demo.REPEAT_ALL"
const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER"
const val ACTION_EQUALIZER_UPDATED = "com.cappielloantonio.tempo.service.EQUALIZER_UPDATED"
}
fun updateMediaItems() {
Log.d("MediaService", "update items");
val n = player.mediaItemCount
val k = player.currentMediaItemIndex
val current = player.currentPosition
val items = (0 .. n-1).map{i -> MappingUtil.mapMediaItem(player.getMediaItemAt(i))}
player.clearMediaItems()
player.setMediaItems(items, k, current)
}
inner class CustomNetworkCallback : ConnectivityManager.NetworkCallback() {
var wasWifi = false
init {
val manager = getSystemService(ConnectivityManager::class.java)
val network = manager.activeNetwork
val capabilities = manager.getNetworkCapabilities(network)
if (capabilities != null)
wasWifi = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
}
override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) {
val isWifi = networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
if (isWifi != wasWifi) {
wasWifi = isWifi
widgetUpdateHandler.post(Runnable {
updateMediaItems()
})
}
}
}
override fun onCreate() {
@@ -90,6 +126,7 @@ class MediaService : MediaLibraryService() {
restorePlayerFromQueue()
initializePlayerListener()
initializeEqualizerManager()
initializeNetworkListener()
setPlayer(player)
}
@@ -99,6 +136,7 @@ class MediaService : MediaLibraryService() {
}
override fun onDestroy() {
releaseNetworkCallback()
equalizerManager.release()
stopWidgetUpdates()
releasePlayer()
@@ -246,16 +284,7 @@ class MediaService : MediaLibraryService() {
private fun initializeEqualizerManager() {
equalizerManager = EqualizerManager()
val audioSessionId = player.audioSessionId
if (equalizerManager.attachToSession(audioSessionId)) {
val enabled = Preferences.isEqualizerEnabled()
equalizerManager.setEnabled(enabled)
val bands = equalizerManager.getNumberOfBands()
val savedLevels = Preferences.getEqualizerBandLevels(bands)
for (i in 0 until bands) {
equalizerManager.setBandLevel(i.toShort(), savedLevels[i])
}
}
attachEqualizerIfPossible(audioSessionId)
}
private fun initializeMediaLibrarySession() {
@@ -275,6 +304,12 @@ class MediaService : MediaLibraryService() {
}
}
private fun initializeNetworkListener() {
networkCallback = CustomNetworkCallback()
getSystemService(ConnectivityManager::class.java).registerDefaultNetworkCallback(networkCallback)
updateMediaItems()
}
private fun restorePlayerFromQueue() {
if (player.mediaItemCount > 0) return
@@ -383,6 +418,10 @@ class MediaService : MediaLibraryService() {
customLayout = librarySessionCallback.buildCustomLayout(player)
mediaLibrarySession.setCustomLayout(customLayout)
}
override fun onAudioSessionIdChanged(audioSessionId: Int) {
attachEqualizerIfPossible(audioSessionId)
}
})
if (player.isPlaying) {
scheduleWidgetUpdates()
@@ -398,6 +437,10 @@ class MediaService : MediaLibraryService() {
mediaLibrarySession.release()
}
private fun releaseNetworkCallback() {
getSystemService(ConnectivityManager::class.java).unregisterNetworkCallback(networkCallback)
}
@SuppressLint("PrivateResource")
private fun getShuffleCommandButton(sessionCommand: SessionCommand): CommandButton {
val isOn = sessionCommand.customAction == CUSTOM_COMMAND_TOGGLE_SHUFFLE_MODE_ON
@@ -494,6 +537,21 @@ class MediaService : MediaLibraryService() {
widgetUpdateScheduled = false
}
private fun attachEqualizerIfPossible(audioSessionId: Int): Boolean {
if (audioSessionId == 0 || audioSessionId == -1) return false
val attached = equalizerManager.attachToSession(audioSessionId)
if (attached) {
val enabled = Preferences.isEqualizerEnabled()
equalizerManager.setEnabled(enabled)
val bands = equalizerManager.getNumberOfBands()
val savedLevels = Preferences.getEqualizerBandLevels(bands)
for (i in 0 until bands) {
equalizerManager.setBandLevel(i.toShort(), savedLevels[i])
}
sendBroadcast(Intent(ACTION_EQUALIZER_UPDATED))
}
return attached
}
private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false)

View File

@@ -0,0 +1,54 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="512"
android:viewportHeight="512">
<group android:scaleX="0.49"
android:scaleY="0.49"
android:translateX="130.56"
android:translateY="130.56">
<path
android:pathData="M512,437.33c0,11.78 -9.56,21.34 -21.34,21.34H21.33C9.55,458.67 0,449.11 0,437.33V96c0,-11.78 9.55,-21.33 21.33,-21.33h469.33c11.78,0 21.34,9.55 21.34,21.33L512,437.33L512,437.33z"
android:fillColor="#8CC152"/> <path
android:pathData="M512,416.01c0,11.78 -9.56,21.31 -21.34,21.31H21.33C9.55,437.33 0,427.8 0,416.01V74.67c0,-11.78 9.55,-21.34 21.33,-21.34h469.33c11.78,0 21.34,9.56 21.34,21.34L512,416.01L512,416.01z"
android:fillColor="#62A43B"/> <path
android:pathData="M63.99,160c-5.89,0 -10.66,4.78 -10.66,10.67v149.34c0,5.88 4.77,10.66 10.66,10.66c5.89,0 10.67,-4.78 10.67,-10.66V170.67C74.66,164.78 69.88,160 63.99,160z"
android:fillColor="#8CC152"/> <path
android:pathData="M74.66,106.67c0,5.89 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.77 -10.66,-10.66S58.1,96 63.99,96C69.88,96 74.66,100.78 74.66,106.67z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M74.66,384.01c0,5.88 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.78 -10.66,-10.66c0,-5.91 4.77,-10.69 10.66,-10.69C69.88,373.33 74.66,378.11 74.66,384.01z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M448,123.73h-21.34v203.19l-40.31,50.41v0.02c-1.47,1.83 -2.34,4.14 -2.34,6.67c0,5.88 4.78,10.66 10.66,10.66c3.38,0 6.38,-1.56 8.33,-4h0.02l42.66,-53.34l0,0c1.47,-1.81 2.34,-4.13 2.34,-6.66V123.73z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,149.33c-11.77,0 -21.33,-9.56 -21.33,-21.33s9.56,-21.33 21.33,-21.33s21.33,9.56 21.33,21.33S449.09,149.33 437.33,149.33z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,96c-17.67,0 -32,14.33 -32,32s14.33,32 32,32s32,-14.33 32,-32S455,96 437.33,96zM437.33,138.67c-5.89,0 -10.67,-4.8 -10.67,-10.67c0,-5.88 4.78,-10.67 10.67,-10.67s10.67,4.8 10.67,10.67C448,133.88 443.22,138.67 437.33,138.67z"
android:fillColor="#CCD1D9"/>
<path
android:pathData="M405.33,245.33c0,82.48 -66.86,149.34 -149.33,149.34c-82.47,0 -149.33,-66.86 -149.33,-149.34C106.66,162.86 173.52,96 255.99,96C338.47,96 405.33,162.86 405.33,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M266.66,149.33c0,-5.89 -4.77,-10.66 -10.67,-10.66c-58.91,0 -106.66,47.75 -106.66,106.65l0,0c0,5.89 4.77,10.67 10.67,10.67s10.67,-4.78 10.67,-10.67l0,0c0,-22.78 8.88,-44.22 24.99,-60.33c16.12,-16.13 37.55,-25 60.34,-25C261.89,160 266.66,155.22 266.66,149.33z"
android:fillColor="#656D78"/>
<path
android:pathData="M352,234.67c-5.9,0 -10.67,4.77 -10.67,10.66l0,0c0,22.8 -8.88,44.23 -24.98,60.34c-16.13,16.13 -37.56,25 -60.35,25c-5.89,0 -10.66,4.78 -10.66,10.66c0,5.91 4.77,10.69 10.66,10.69c58.91,0 106.66,-47.77 106.66,-106.69C362.65,239.44 357.89,234.67 352,234.67z"
android:fillColor="#656D78"/>
<path
android:pathData="M255.99,288.01c-23.52,0 -42.66,-19.16 -42.66,-42.69c0,-23.52 19.14,-42.66 42.66,-42.66c23.54,0 42.66,19.14 42.66,42.66C298.65,268.86 279.53,288.01 255.99,288.01z"
android:fillColor="#FFCE54"/>
<path
android:pathData="M255.99,192c-29.45,0 -53.33,23.88 -53.33,53.33s23.88,53.34 53.33,53.34c29.46,0 53.34,-23.89 53.34,-53.34S285.45,192 255.99,192zM255.99,277.34c-17.64,0 -32,-14.36 -32,-32.02c0,-17.64 14.36,-32 32,-32c17.65,0 32.01,14.36 32.01,32C288,262.98 273.64,277.34 255.99,277.34z"
android:fillColor="#F6BB42"/>
<path
android:pathData="M266.66,245.33c0,5.89 -4.77,10.67 -10.67,10.67c-5.89,0 -10.66,-4.78 -10.66,-10.67s4.77,-10.66 10.66,-10.66C261.89,234.67 266.66,239.44 266.66,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M74.66,234.67H53.33c-5.89,0 -10.66,4.77 -10.66,10.66s4.77,10.67 10.66,10.67h21.34c5.89,0 10.66,-4.78 10.66,-10.67S80.56,234.67 74.66,234.67z"
android:fillColor="#434A54"/>
</group>
</vector>

View File

@@ -0,0 +1,53 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="512"
android:viewportHeight="512">
<group android:scaleX="0.55"
android:scaleY="0.55"
android:translateX="150.56"
android:translateY="150.56">
<path
android:pathData="M512,437.33c0,11.78 -9.56,21.34 -21.34,21.34H21.33C9.55,458.67 0,449.11 0,437.33V96c0,-11.78 9.55,-21.33 21.33,-21.33h469.33c11.78,0 21.34,9.55 21.34,21.33L512,437.33L512,437.33z"
android:fillColor="#8CC152"/> <path
android:pathData="M512,416.01c0,11.78 -9.56,21.31 -21.34,21.31H21.33C9.55,437.33 0,427.8 0,416.01V74.67c0,-11.78 9.55,-21.34 21.33,-21.34h469.33c11.78,0 21.34,9.56 21.34,21.34L512,416.01L512,416.01z"
android:fillColor="#62A43B"/> <path
android:pathData="M63.99,160c-5.89,0 -10.66,4.78 -10.66,10.67v149.34c0,5.88 4.77,10.66 10.66,10.66c5.89,0 10.67,-4.78 10.67,-10.66V170.67C74.66,164.78 69.88,160 63.99,160z"
android:fillColor="#8CC152"/> <path
android:pathData="M74.66,106.67c0,5.89 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.77 -10.66,-10.66S58.1,96 63.99,96C69.88,96 74.66,100.78 74.66,106.67z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M74.66,384.01c0,5.88 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.78 -10.66,-10.66c0,-5.91 4.77,-10.69 10.66,-10.69C69.88,373.33 74.66,378.11 74.66,384.01z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M448,123.73h-21.34v203.19l-40.31,50.41v0.02c-1.47,1.83 -2.34,4.14 -2.34,6.67c0,5.88 4.78,10.66 10.66,10.66c3.38,0 6.38,-1.56 8.33,-4h0.02l42.66,-53.34l0,0c1.47,-1.81 2.34,-4.13 2.34,-6.66V123.73z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,149.33c-11.77,0 -21.33,-9.56 -21.33,-21.33s9.56,-21.33 21.33,-21.33s21.33,9.56 21.33,21.33S449.09,149.33 437.33,149.33z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,96c-17.67,0 -32,14.33 -32,32s14.33,32 32,32s32,-14.33 32,-32S455,96 437.33,96zM437.33,138.67c-5.89,0 -10.67,-4.8 -10.67,-10.67c0,-5.88 4.78,-10.67 10.67,-10.67s10.67,4.8 10.67,10.67C448,133.88 443.22,138.67 437.33,138.67z"
android:fillColor="#CCD1D9"/>
<path
android:pathData="M405.33,245.33c0,82.48 -66.86,149.34 -149.33,149.34c-82.47,0 -149.33,-66.86 -149.33,-149.34C106.66,162.86 173.52,96 255.99,96C338.47,96 405.33,162.86 405.33,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M266.66,149.33c0,-5.89 -4.77,-10.66 -10.67,-10.66c-58.91,0 -106.66,47.75 -106.66,106.65l0,0c0,5.89 4.77,10.67 10.67,10.67s10.67,-4.78 10.67,-10.67l0,0c0,-22.78 8.88,-44.22 24.99,-60.33c16.12,-16.13 37.55,-25 60.34,-25C261.89,160 266.66,155.22 266.66,149.33z"
android:fillColor="#656D78"/>
<path
android:pathData="M352,234.67c-5.9,0 -10.67,4.77 -10.67,10.66l0,0c0,22.8 -8.88,44.23 -24.98,60.34c-16.13,16.13 -37.56,25 -60.35,25c-5.89,0 -10.66,4.78 -10.66,10.66c0,5.91 4.77,10.69 10.66,10.69c58.91,0 106.66,-47.77 106.66,-106.69C362.65,239.44 357.89,234.67 352,234.67z"
android:fillColor="#656D78"/>
<path
android:pathData="M255.99,288.01c-23.52,0 -42.66,-19.16 -42.66,-42.69c0,-23.52 19.14,-42.66 42.66,-42.66c23.54,0 42.66,19.14 42.66,42.66C298.65,268.86 279.53,288.01 255.99,288.01z"
android:fillColor="#FFCE54"/>
<path
android:pathData="M255.99,192c-29.45,0 -53.33,23.88 -53.33,53.33s23.88,53.34 53.33,53.34c29.46,0 53.34,-23.89 53.34,-53.34S285.45,192 255.99,192zM255.99,277.34c-17.64,0 -32,-14.36 -32,-32.02c0,-17.64 14.36,-32 32,-32c17.65,0 32.01,14.36 32.01,32C288,262.98 273.64,277.34 255.99,277.34z"
android:fillColor="#F6BB42"/>
<path
android:pathData="M266.66,245.33c0,5.89 -4.77,10.67 -10.67,10.67c-5.89,0 -10.66,-4.78 -10.66,-10.67s4.77,-10.66 10.66,-10.66C261.89,234.67 266.66,239.44 266.66,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M74.66,234.67H53.33c-5.89,0 -10.66,4.77 -10.66,10.66s4.77,10.67 10.66,10.67h21.34c5.89,0 10.66,-4.78 10.66,-10.67S80.56,234.67 74.66,234.67z"
android:fillColor="#434A54"/>
</group>
</vector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#626A75</color>
</resources>

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -3,8 +3,8 @@ package com.cappielloantonio.tempo.github;
import com.cappielloantonio.tempo.github.api.release.ReleaseClient;
public class Github {
private static final String OWNER = "CappielloAntonio";
private static final String REPO = "Tempo";
private static final String OWNER = "eddyizm";
private static final String REPO = "Tempus";
private ReleaseClient releaseClient;
public ReleaseClient getReleaseClient() {

View File

@@ -13,9 +13,11 @@ import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.subsonic.models.IndexID3;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import retrofit2.Call;
import retrofit2.Callback;
@@ -312,24 +314,42 @@ public class ArtistRepository {
App.getSubsonicClientInstance(false)
.getBrowsingClient()
.getTopSongs(artist.getName(), count)
.getArtist(artist.getId())
.enqueue(new Callback<ApiResponse>() {
@Override
public void onResponse(@NonNull Call<ApiResponse> call, @NonNull Response<ApiResponse> response) {
if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getTopSongs() != null && response.body().getSubsonicResponse().getTopSongs().getSongs() != null) {
List<Child> songs = response.body().getSubsonicResponse().getTopSongs().getSongs();
if (response.isSuccessful() && response.body() != null &&
response.body().getSubsonicResponse().getArtist() != null &&
response.body().getSubsonicResponse().getArtist().getAlbums() != null) {
if (songs != null && !songs.isEmpty()) {
Collections.shuffle(songs);
List<AlbumID3> albums = response.body().getSubsonicResponse().getArtist().getAlbums();
Log.d("ArtistRepository", "Got albums directly: " + albums.size());
if (albums.isEmpty()) {
Log.d("ArtistRepository", "No albums found in artist response");
return;
}
randomSongs.setValue(songs);
Collections.shuffle(albums);
int[] counts = albums.stream().mapToInt(AlbumID3::getSongCount).toArray();
Arrays.parallelPrefix(counts, Integer::sum);
int albumLimit = 0;
int multiplier = 4; // get more than the limit so we can shuffle them
while (albumLimit < albums.size() && counts[albumLimit] < count * multiplier)
albumLimit++;
Log.d("ArtistRepository", String.format("Retaining %d/%d albums", albumLimit, albums.size()));
fetchAllAlbumSongsWithCallback(albums.stream().limit(albumLimit).collect(Collectors.toList()), songs -> {
Collections.shuffle(songs);
randomSongs.setValue(songs.stream().limit(count).collect(Collectors.toList()));
});
} else {
Log.d("ArtistRepository", "Failed to get artist info");
}
}
@Override
public void onFailure(@NonNull Call<ApiResponse> call, @NonNull Throwable t) {
Log.d("ArtistRepository", "Error getting artist info: " + t.getMessage());
}
});

View File

@@ -7,7 +7,7 @@ import java.util.UUID;
public class SubsonicPreferences {
private String serverUrl;
private String username;
private String clientName = "Tempo";
private String clientName = "Tempus";
private SubsonicAuthentication authentication;
public String getServerUrl() {

View File

@@ -38,21 +38,36 @@ public class CacheUtil {
return chain.proceed(request);
};
private boolean isConnected() {
ConnectivityManager connectivityManager = (ConnectivityManager) App.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
Network network = connectivityManager.getActiveNetwork();
if (network != null) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities != null) {
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
}
}
if (connectivityManager == null) {
return false;
}
return false;
Network network = connectivityManager.getActiveNetwork();
if (network == null) {
return false;
}
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities == null) {
return false;
}
boolean hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
if (!hasInternet) {
return false;
}
boolean hasAppropriateTransport = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
|| capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
|| capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
if (!hasAppropriateTransport) {
return false;
}
return true;
}
}

View File

@@ -438,7 +438,7 @@ public class MainActivity extends BaseActivity {
}
private void checkTempoUpdate() {
if (BuildConfig.FLAVOR.equals("tempo") && Preferences.showTempoUpdateDialog()) {
if (BuildConfig.FLAVOR.equals("tempus") && Preferences.showTempoUpdateDialog()) {
mainViewModel.checkTempoUpdate().observe(this, latestRelease -> {
if (latestRelease != null && UpdateUtil.showUpdateDialog(latestRelease)) {
GithubTempoUpdateDialog dialog = new GithubTempoUpdateDialog(latestRelease);

View File

@@ -152,6 +152,12 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter<AlbumCatalogueAd
}
}
public void setItemsWithoutFilter(List<AlbumID3> albums) {
this.albumsFull = new ArrayList<>(albums);
this.albums = new ArrayList<>(albums);
notifyDataSetChanged();
}
public void sort(String order) {
if (albums == null) return;

View File

@@ -151,6 +151,9 @@ public class ArtistCatalogueAdapter extends RecyclerView.Adapter<ArtistCatalogue
case Constants.ARTIST_ORDER_BY_RANDOM:
Collections.shuffle(artists);
break;
case Constants.ARTIST_ORDER_BY_ALBUM_COUNT:
artists.sort(Comparator.comparing(ArtistID3::getAlbumCount).reversed());
break;
}
notifyDataSetChanged();

View File

@@ -3,6 +3,7 @@ package com.cappielloantonio.tempo.ui.fragment;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -35,6 +36,10 @@ import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.Preferences;
import com.cappielloantonio.tempo.viewmodel.AlbumCatalogueViewModel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@OptIn(markerClass = UnstableApi.class)
public class AlbumCatalogueFragment extends Fragment implements ClickCallback {
private static final String TAG = "AlbumCatalogueFragment";
@@ -45,15 +50,33 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback {
private AlbumCatalogueAdapter albumAdapter;
private String currentSortOrder;
private List<com.cappielloantonio.tempo.subsonic.models.AlbumID3> originalAlbums;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
currentSortOrder = Preferences.getAlbumSortOrder();
initData();
}
@Override
public void onResume() {
super.onResume();
String latestSort = Preferences.getAlbumSortOrder();
if (!latestSort.equals(currentSortOrder)) {
currentSortOrder = latestSort;
}
// Re-apply sort when returning to fragment
if (originalAlbums != null && currentSortOrder != null) {
applySortToAlbums(currentSortOrder);
} else {
Log.d(TAG, "onResume - Cannot re-sort, missing data");
}
}
@Override
public void onDestroy() {
super.onDestroy();
@@ -118,8 +141,10 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback {
albumAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);
bind.albumCatalogueRecyclerView.setAdapter(albumAdapter);
albumCatalogueViewModel.getAlbumList().observe(getViewLifecycleOwner(), albums -> {
albumAdapter.setItems(albums);
applySavedSortOrder();
originalAlbums = albums;
currentSortOrder = Preferences.getAlbumSortOrder();
applySortToAlbums(currentSortOrder);
updateSortIndicator();
});
bind.albumCatalogueRecyclerView.setOnTouchListener((v, event) -> {
@@ -130,6 +155,16 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback {
bind.albumListSortImageView.setOnClickListener(view -> showPopupMenu(view, R.menu.sort_album_popup_menu));
}
private void applySortToAlbums(String sortOrder) {
if (originalAlbums == null) {
return;
}
albumAdapter.setItemsWithoutFilter(originalAlbums);
if (sortOrder != null) {
albumAdapter.sort(sortOrder);
}
}
private void initProgressLoader() {
albumCatalogueViewModel.getLoadingStatus().observe(getViewLifecycleOwner(), isLoading -> {
if (isLoading) {
@@ -142,13 +177,6 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback {
});
}
private void applySavedSortOrder() {
String savedSortOrder = Preferences.getAlbumSortOrder();
currentSortOrder = savedSortOrder;
albumAdapter.sort(savedSortOrder);
updateSortIndicator();
}
private void updateSortIndicator() {
if (bind == null) return;
@@ -235,8 +263,8 @@ public class AlbumCatalogueFragment extends Fragment implements ClickCallback {
if (newSortOrder != null) {
currentSortOrder = newSortOrder;
albumAdapter.sort(newSortOrder);
Preferences.setAlbumSortOrder(newSortOrder);
applySortToAlbums(newSortOrder);
updateSortIndicator();
return true;
}

View File

@@ -248,6 +248,10 @@ public class AlbumPageFragment extends Fragment implements ClickCallback {
bind.albumDetailView.setVisibility(View.GONE);
}
});
if(Preferences.showAlbumDetail()){
bind.albumDetailView.setVisibility(View.VISIBLE);
}
}
private void initAlbumInfoTextButton() {

View File

@@ -34,6 +34,7 @@ import com.cappielloantonio.tempo.interfaces.ClickCallback;
import com.cappielloantonio.tempo.ui.activity.MainActivity;
import com.cappielloantonio.tempo.ui.adapter.ArtistCatalogueAdapter;
import com.cappielloantonio.tempo.util.Constants;
import com.cappielloantonio.tempo.util.Preferences;
import com.cappielloantonio.tempo.viewmodel.ArtistCatalogueViewModel;
import com.cappielloantonio.tempo.subsonic.models.ArtistID3;
@@ -114,7 +115,10 @@ public class ArtistCatalogueFragment extends Fragment implements ClickCallback {
artistAdapter = new ArtistCatalogueAdapter(this);
artistAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);
bind.artistCatalogueRecyclerView.setAdapter(artistAdapter);
artistCatalogueViewModel.getArtistList().observe(getViewLifecycleOwner(), artistList -> artistAdapter.setItems(artistList));
artistCatalogueViewModel.getArtistList().observe(getViewLifecycleOwner(), artistList -> {
artistAdapter.setItems(artistList);
artistAdapter.sort(Preferences.getArtistSortOrder());
});
bind.artistCatalogueRecyclerView.setOnTouchListener((v, event) -> {
hideKeyboard(v);
@@ -192,6 +196,9 @@ public class ArtistCatalogueFragment extends Fragment implements ClickCallback {
} else if (menuItem.getItemId() == R.id.menu_artist_sort_random) {
artistAdapter.sort(Constants.ARTIST_ORDER_BY_RANDOM);
return true;
} else if (menuItem.getItemId() == R.id.menu_artist_sort_album_count) {
artistAdapter.sort(Constants.ARTIST_ORDER_BY_ALBUM_COUNT);
return true;
}
return false;

View File

@@ -188,8 +188,6 @@ public class ArtistPageFragment extends Fragment implements ClickCallback {
} else {
if (bind != null)
bind.artistPageTopSongsSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE);
if (bind != null)
bind.artistPageShuffleButton.setEnabled(!songs.isEmpty());
songHorizontalAdapter.setItems(songs);
reapplyPlayback();
}

View File

@@ -117,14 +117,12 @@ public class DownloadFragment extends Fragment implements ClickCallback {
if (songs.isEmpty()) {
if (bind != null) {
bind.emptyDownloadLayout.setVisibility(View.VISIBLE);
bind.fragmentDownloadNestedScrollView.setVisibility(View.GONE);
bind.downloadDownloadedSector.setVisibility(View.GONE);
bind.downloadedGroupByImageView.setVisibility(View.GONE);
}
} else {
if (bind != null) {
bind.emptyDownloadLayout.setVisibility(View.GONE);
bind.fragmentDownloadNestedScrollView.setVisibility(View.VISIBLE);
bind.downloadDownloadedSector.setVisibility(View.VISIBLE);
bind.downloadedGroupByImageView.setVisibility(View.VISIBLE);

View File

@@ -3,7 +3,9 @@ package com.cappielloantonio.tempo.ui.fragment
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.ServiceConnection
import android.content.BroadcastReceiver
import android.os.Bundle
import android.os.IBinder
import android.view.Gravity
@@ -12,6 +14,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.annotation.OptIn
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.media3.common.util.UnstableApi
import com.cappielloantonio.tempo.R
@@ -28,6 +31,17 @@ class EqualizerFragment : Fragment() {
private lateinit var safeSpace: Space
private val bandSeekBars = mutableListOf<SeekBar>()
private var receiverRegistered = false
private val equalizerUpdatedReceiver = object : BroadcastReceiver() {
@OptIn(UnstableApi::class)
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == MediaService.ACTION_EQUALIZER_UPDATED) {
initUI()
restoreEqualizerPreferences()
}
}
}
private val connection = object : ServiceConnection {
@OptIn(UnstableApi::class)
override fun onServiceConnected(className: ComponentName, service: IBinder) {
@@ -49,12 +63,29 @@ class EqualizerFragment : Fragment() {
intent.action = MediaService.ACTION_BIND_EQUALIZER
requireActivity().bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
if (!receiverRegistered) {
ContextCompat.registerReceiver(
requireContext(),
equalizerUpdatedReceiver,
IntentFilter(MediaService.ACTION_EQUALIZER_UPDATED),
ContextCompat.RECEIVER_NOT_EXPORTED
)
receiverRegistered = true
}
}
override fun onStop() {
super.onStop()
requireActivity().unbindService(connection)
equalizerManager = null
if (receiverRegistered) {
try {
requireContext().unregisterReceiver(equalizerUpdatedReceiver)
} catch (_: Exception) {
// ignore if not registered
}
receiverRegistered = false
}
}
override fun onCreateView(
@@ -234,4 +265,4 @@ class EqualizerFragment : Fragment() {
}
private fun Int.dpToPx(context: Context): Int =
(this * context.resources.displayMetrics.density).toInt()
(this * context.resources.displayMetrics.density).toInt()

View File

@@ -89,6 +89,9 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement
ArtistRepository artistRepository = new ArtistRepository();
artistRepository.getInstantMix(artist, 20).observe(getViewLifecycleOwner(), songs -> {
// navidrome may return null for this
if (songs == null)
return;
MusicUtil.ratingFilter(songs);
if (!songs.isEmpty()) {

View File

@@ -40,6 +40,7 @@ object Constants {
const val ARTIST_STARRED = "ARTIST_STARRED"
const val ARTIST_ORDER_BY_NAME = "ARTIST_ORDER_BY_NAME"
const val ARTIST_ORDER_BY_RANDOM = "ARTIST_ORDER_BY_RANDOM"
const val ARTIST_ORDER_BY_ALBUM_COUNT = "ARTIST_ORDER_BY_ALBUM_COUNT"
const val ARTIST_ORDER_BY_MOST_RECENTLY_STARRED = "ARTIST_ORDER_BY_MOST_RECENTLY_STARRED"
const val ARTIST_ORDER_BY_LEAST_RECENTLY_STARRED = "ARTIST_ORDER_BY_LEAST_RECENTLY_STARRED"

View File

@@ -115,6 +115,29 @@ public class MappingUtil {
.build();
}
public static MediaItem mapMediaItem(MediaItem old) {
String mediaId = null;
if (old.requestMetadata.extras != null)
mediaId = old.requestMetadata.extras.getString("id");
if (mediaId != null && DownloadUtil.getDownloadTracker(App.getContext()).isDownloaded(mediaId)) {
return old;
}
Uri uri = old.requestMetadata.mediaUri == null ? null : MusicUtil.updateStreamUri(old.requestMetadata.mediaUri);
return new MediaItem.Builder()
.setMediaId(old.mediaId)
.setMediaMetadata(old.mediaMetadata)
.setRequestMetadata(
new MediaItem.RequestMetadata.Builder()
.setMediaUri(uri)
.setExtras(old.requestMetadata.extras)
.build()
)
.setMimeType(MimeTypes.BASE_TYPE_AUDIO)
.setUri(uri)
.build();
}
public static List<MediaItem> mapDownloads(List<Child> items) {
ArrayList<MediaItem> downloads = new ArrayList<>();

View File

@@ -21,11 +21,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class MusicUtil {
private static final String TAG = "MusicUtil";
private static final Pattern BITRATE_PATTERN = Pattern.compile("&maxBitRate=\\d+");
private static final Pattern FORMAT_PATTERN = Pattern.compile("&format=\\w+");
public static Uri getStreamUri(String id) {
Map<String, String> params = App.getSubsonicClientInstance(false).getParams();
@@ -61,6 +66,24 @@ public class MusicUtil {
return Uri.parse(uri.toString());
}
public static Uri updateStreamUri(Uri uri) {
String s = uri.toString();
Matcher m1 = BITRATE_PATTERN.matcher(s);
s = m1.replaceAll("");
Matcher m2 = FORMAT_PATTERN.matcher(s);
s = m2.replaceAll("");
s = s.replace("&estimateContentLength=true", "");
if (!Preferences.isServerPrioritized())
s += "&maxBitRate=" + getBitratePreference();
if (!Preferences.isServerPrioritized())
s += "&format=" + getTranscodingFormatPreference();
if (Preferences.askForEstimateContentLength())
s += "&estimateContentLength=true";
return Uri.parse(s);
}
public static Uri getDownloadUri(String id) {
StringBuilder uri = new StringBuilder();

View File

@@ -76,8 +76,10 @@ object Preferences {
private const val EQUALIZER_ENABLED = "equalizer_enabled"
private const val EQUALIZER_BAND_LEVELS = "equalizer_band_levels"
private const val MINI_SHUFFLE_BUTTON_VISIBILITY = "mini_shuffle_button_visibility"
private const val ALBUM_DETAIL = "album_detail"
private const val ALBUM_SORT_ORDER = "album_sort_order"
private const val DEFAULT_ALBUM_SORT_ORDER = Constants.ALBUM_ORDER_BY_NAME
private const val ARTIST_SORT_BY_ALBUM_COUNT= "artist_sort_by_album_count"
@JvmStatic
fun getServer(): String? {
@@ -641,6 +643,11 @@ object Preferences {
return ShortArray(bandCount.toInt()) { i -> parts[i].toShortOrNull() ?: 0 }
}
@JvmStatic
fun showAlbumDetail(): Boolean {
return App.getInstance().preferences.getBoolean(ALBUM_DETAIL, false)
}
@JvmStatic
fun getAlbumSortOrder(): String {
return App.getInstance().preferences.getString(ALBUM_SORT_ORDER, DEFAULT_ALBUM_SORT_ORDER) ?: DEFAULT_ALBUM_SORT_ORDER
@@ -650,4 +657,14 @@ object Preferences {
fun setAlbumSortOrder(sortOrder: String) {
App.getInstance().preferences.edit().putString(ALBUM_SORT_ORDER, sortOrder).apply()
}
@JvmStatic
fun getArtistSortOrder(): String {
val sort_by_album_count = App.getInstance().preferences.getBoolean(ARTIST_SORT_BY_ALBUM_COUNT, false)
Log.d("Preferences", "getSortOrder")
if (sort_by_album_count)
return Constants.ARTIST_ORDER_BY_ALBUM_COUNT
else
return Constants.ARTIST_ORDER_BY_NAME
}
}

View File

@@ -105,7 +105,11 @@ public class UIUtil {
}
public static String getReadableDate(Date date) {
if (date == null) {
return App.getContext().getString(R.string.share_no_expiration);
}
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM, yyyy", Locale.getDefault());
return formatter.format(date);
}
}

View File

@@ -0,0 +1,56 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="512"
android:viewportHeight="512">
<group android:scaleX="0.49"
android:scaleY="0.49"
android:translateX="130.56"
android:translateY="130.56">
<path
android:pathData="M512,437.33c0,11.78 -9.56,21.34 -21.34,21.34H21.33C9.55,458.67 0,449.11 0,437.33V96c0,-11.78 9.55,-21.33 21.33,-21.33h469.33c11.78,0 21.34,9.55 21.34,21.33L512,437.33L512,437.33z"
android:fillColor="#DA4453"/>
<path
android:pathData="M512,416.01c0,11.78 -9.56,21.31 -21.34,21.31H21.33C9.55,437.33 0,427.8 0,416.01V74.67c0,-11.78 9.55,-21.34 21.33,-21.34h469.33c11.78,0 21.34,9.56 21.34,21.34L512,416.01L512,416.01z"
android:fillColor="#ED5564"/>
<path
android:pathData="M63.99,160c-5.89,0 -10.66,4.78 -10.66,10.67v149.34c0,5.88 4.77,10.66 10.66,10.66c5.89,0 10.67,-4.78 10.67,-10.66V170.67C74.66,164.78 69.88,160 63.99,160z"
android:fillColor="#DA4453"/>
<path
android:pathData="M74.66,106.67c0,5.89 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.77 -10.66,-10.66S58.1,96 63.99,96C69.88,96 74.66,100.78 74.66,106.67z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M74.66,384.01c0,5.88 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.78 -10.66,-10.66c0,-5.91 4.77,-10.69 10.66,-10.69C69.88,373.33 74.66,378.11 74.66,384.01z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M448,123.73h-21.34v203.19l-40.31,50.41v0.02c-1.47,1.83 -2.34,4.14 -2.34,6.67c0,5.88 4.78,10.66 10.66,10.66c3.38,0 6.38,-1.56 8.33,-4h0.02l42.66,-53.34l0,0c1.47,-1.81 2.34,-4.13 2.34,-6.66V123.73z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,149.33c-11.77,0 -21.33,-9.56 -21.33,-21.33s9.56,-21.33 21.33,-21.33s21.33,9.56 21.33,21.33S449.09,149.33 437.33,149.33z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,96c-17.67,0 -32,14.33 -32,32s14.33,32 32,32s32,-14.33 32,-32S455,96 437.33,96zM437.33,138.67c-5.89,0 -10.67,-4.8 -10.67,-10.67c0,-5.88 4.78,-10.67 10.67,-10.67s10.67,4.8 10.67,10.67C448,133.88 443.22,138.67 437.33,138.67z"
android:fillColor="#CCD1D9"/>
<path
android:pathData="M405.33,245.33c0,82.48 -66.86,149.34 -149.33,149.34c-82.47,0 -149.33,-66.86 -149.33,-149.34C106.66,162.86 173.52,96 255.99,96C338.47,96 405.33,162.86 405.33,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M266.66,149.33c0,-5.89 -4.77,-10.66 -10.67,-10.66c-58.91,0 -106.66,47.75 -106.66,106.65l0,0c0,5.89 4.77,10.67 10.66,10.67s10.67,-4.78 10.67,-10.67l0,0c0,-22.78 8.88,-44.22 24.99,-60.33c16.12,-16.13 37.55,-25 60.34,-25C261.89,160 266.66,155.22 266.66,149.33z"
android:fillColor="#656D78"/>
<path
android:pathData="M352,234.67c-5.9,0 -10.67,4.77 -10.67,10.66l0,0c0,22.8 -8.88,44.23 -24.98,60.34c-16.13,16.13 -37.56,25 -60.35,25c-5.89,0 -10.66,4.78 -10.66,10.66c0,5.91 4.77,10.69 10.66,10.69c58.91,0 106.66,-47.77 106.66,-106.69C362.65,239.44 357.89,234.67 352,234.67z"
android:fillColor="#656D78"/>
<path
android:pathData="M255.99,288.01c-23.52,0 -42.66,-19.16 -42.66,-42.69c0,-23.52 19.14,-42.66 42.66,-42.66c23.54,0 42.66,19.14 42.66,42.66C298.65,268.86 279.53,288.01 255.99,288.01z"
android:fillColor="#FFCE54"/>
<path
android:pathData="M255.99,192c-29.45,0 -53.33,23.88 -53.33,53.33s23.88,53.34 53.33,53.34c29.46,0 53.34,-23.89 53.34,-53.34S285.45,192 255.99,192zM255.99,277.34c-17.64,0 -32,-14.36 -32,-32.02c0,-17.64 14.36,-32 32,-32c17.65,0 32.01,14.36 32.01,32C288,262.98 273.64,277.34 255.99,277.34z"
android:fillColor="#F6BB42"/>
<path
android:pathData="M266.66,245.33c0,5.89 -4.77,10.67 -10.67,10.67c-5.89,0 -10.66,-4.78 -10.66,-10.67s4.77,-10.66 10.66,-10.66C261.89,234.67 266.66,239.44 266.66,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M74.66,234.67H53.33c-5.89,0 -10.66,4.77 -10.66,10.66s4.77,10.67 10.66,10.67h21.34c5.89,0 10.66,-4.78 10.66,-10.67S80.56,234.67 74.66,234.67z"
android:fillColor="#434A54"/>
</group>
</vector>

View File

@@ -1,54 +1,56 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="288dp"
android:height="288dp"
android:viewportWidth="288"
android:viewportHeight="288">
<path
android:pathData="M141.67,131.18h4.67v88.93h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M132.33,138.18h4.67v65.58h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M122.99,145.18h4.67v21.01h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M94.98,145.18h4.67v21.01h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M188.35,145.18h4.67v21.01h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M113.65,138.18h4.67v35.02h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M169.68,138.18h4.67v35.02h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M104.32,131.18h4.67v49.02h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M179.02,131.18h4.67v49.02h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M160.34,145.18h4.67v21.01h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="M151,138.18h4.67v65.58h-4.67z"
android:fillColor="#f24b6a"/>
<path
android:pathData="m114.29,92.75v4.22h-7.13v19.62h-5.01v-19.62h-7.16v-4.22h19.31Z"
android:fillColor="#fff"/>
<path
android:pathData="m126.32,111.41c-0.12,1.05 -0.66,2.11 -1.63,3.19 -1.51,1.71 -3.62,2.57 -6.34,2.57 -2.24,0 -4.22,-0.72 -5.94,-2.17 -1.71,-1.44 -2.57,-3.8 -2.57,-7.05 0,-3.05 0.77,-5.39 2.32,-7.02 1.55,-1.63 3.56,-2.44 6.02,-2.44 1.47,0 2.79,0.27 3.96,0.82 1.18,0.55 2.15,1.42 2.91,2.6 0.69,1.05 1.14,2.26 1.34,3.64 0.12,0.81 0.17,1.97 0.15,3.49h-12.07c0.06,1.77 0.62,3.01 1.67,3.72 0.64,0.44 1.4,0.66 2.3,0.66 0.95,0 1.72,-0.27 2.31,-0.81 0.32,-0.29 0.61,-0.7 0.86,-1.21h4.71ZM121.76,106.01c-0.08,-1.22 -0.44,-2.14 -1.11,-2.77 -0.66,-0.63 -1.49,-0.95 -2.47,-0.95 -1.07,0 -1.9,0.33 -2.48,1 -0.59,0.67 -0.96,1.57 -1.11,2.72h7.16Z"
android:fillColor="#fff"/>
<path
android:pathData="m138.65,103.81c-0.39,-0.85 -1.15,-1.28 -2.28,-1.28 -1.32,0 -2.2,0.43 -2.65,1.28 -0.25,0.49 -0.37,1.21 -0.37,2.17v10.61h-4.67v-17.6h4.48v2.57c0.57,-0.92 1.11,-1.57 1.62,-1.96 0.89,-0.69 2.05,-1.04 3.48,-1.04 1.35,0 2.44,0.3 3.27,0.89 0.67,0.55 1.18,1.26 1.52,2.12 0.6,-1.04 1.35,-1.8 2.25,-2.28 0.95,-0.49 2.01,-0.73 3.17,-0.73 0.78,0 1.54,0.15 2.3,0.45 0.75,0.3 1.44,0.83 2.05,1.58 0.5,0.61 0.83,1.37 1,2.26 0.11,0.59 0.16,1.46 0.16,2.6l-0.03,11.11h-4.72v-11.22c0,-0.67 -0.11,-1.22 -0.32,-1.65 -0.41,-0.82 -1.16,-1.23 -2.26,-1.23 -1.27,0 -2.15,0.53 -2.64,1.58 -0.25,0.56 -0.37,1.23 -0.37,2.02v10.5h-4.64v-10.5c0,-1.05 -0.11,-1.81 -0.32,-2.28Z"
android:fillColor="#fff"/>
<path
android:pathData="m171.26,100.85c1.42,1.52 2.13,3.75 2.13,6.7 0,3.11 -0.7,5.47 -2.09,7.1 -1.4,1.63 -3.19,2.44 -5.39,2.44 -1.4,0 -2.57,-0.35 -3.49,-1.05 -0.51,-0.39 -1,-0.95 -1.49,-1.7v9.19h-4.56v-24.57h4.42v2.6c0.5,-0.77 1.02,-1.37 1.58,-1.81 1.02,-0.79 2.24,-1.18 3.66,-1.18 2.06,0 3.81,0.76 5.24,2.28ZM168.64,107.77c0,-1.36 -0.31,-2.56 -0.93,-3.61 -0.62,-1.05 -1.63,-1.57 -3.02,-1.57 -1.67,0 -2.82,0.79 -3.44,2.38 -0.32,0.84 -0.49,1.91 -0.49,3.2 0,2.05 0.54,3.49 1.63,4.32 0.65,0.49 1.41,0.73 2.3,0.73 1.28,0 2.26,-0.5 2.94,-1.49 0.67,-0.99 1.01,-2.31 1.01,-3.96Z"
android:fillColor="#fff"/>
<path
android:pathData="m190.79,101.19c1.49,1.87 2.23,4.07 2.23,6.61s-0.74,4.8 -2.23,6.64c-1.49,1.84 -3.75,2.76 -6.78,2.76s-5.29,-0.92 -6.78,-2.76c-1.49,-1.84 -2.23,-4.05 -2.23,-6.64s0.74,-4.75 2.23,-6.61c1.49,-1.87 3.75,-2.8 6.78,-2.8s5.29,0.93 6.78,2.8ZM184,102.29c-1.35,0 -2.39,0.48 -3.11,1.43 -0.73,0.95 -1.09,2.32 -1.09,4.08s0.36,3.13 1.09,4.09c0.73,0.96 1.77,1.44 3.11,1.44s2.38,-0.48 3.11,-1.44c0.72,-0.96 1.08,-2.32 1.08,-4.09s-0.36,-3.13 -1.08,-4.08c-0.72,-0.95 -1.76,-1.43 -3.11,-1.43Z"
android:fillColor="#fff"/>
android:width="108dp"
android:height="108dp"
android:viewportWidth="512"
android:viewportHeight="512">
<group android:scaleX="0.55"
android:scaleY="0.55"
android:translateX="150.56"
android:translateY="150.56">
<path
android:pathData="M512,437.33c0,11.78 -9.56,21.34 -21.34,21.34H21.33C9.55,458.67 0,449.11 0,437.33V96c0,-11.78 9.55,-21.33 21.33,-21.33h469.33c11.78,0 21.34,9.55 21.34,21.33L512,437.33L512,437.33z"
android:fillColor="#DA4453"/>
<path
android:pathData="M512,416.01c0,11.78 -9.56,21.31 -21.34,21.31H21.33C9.55,437.33 0,427.8 0,416.01V74.67c0,-11.78 9.55,-21.34 21.33,-21.34h469.33c11.78,0 21.34,9.56 21.34,21.34L512,416.01L512,416.01z"
android:fillColor="#ED5564"/>
<path
android:pathData="M63.99,160c-5.89,0 -10.66,4.78 -10.66,10.67v149.34c0,5.88 4.77,10.66 10.66,10.66c5.89,0 10.67,-4.78 10.67,-10.66V170.67C74.66,164.78 69.88,160 63.99,160z"
android:fillColor="#DA4453"/>
<path
android:pathData="M74.66,106.67c0,5.89 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.77 -10.66,-10.66S58.1,96 63.99,96C69.88,96 74.66,100.78 74.66,106.67z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M74.66,384.01c0,5.88 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.78 -10.66,-10.66c0,-5.91 4.77,-10.69 10.66,-10.69C69.88,373.33 74.66,378.11 74.66,384.01z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M448,123.73h-21.34v203.19l-40.31,50.41v0.02c-1.47,1.83 -2.34,4.14 -2.34,6.67c0,5.88 4.78,10.66 10.66,10.66c3.38,0 6.38,-1.56 8.33,-4h0.02l42.66,-53.34l0,0c1.47,-1.81 2.34,-4.13 2.34,-6.66V123.73z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,149.33c-11.77,0 -21.33,-9.56 -21.33,-21.33s9.56,-21.33 21.33,-21.33s21.33,9.56 21.33,21.33S449.09,149.33 437.33,149.33z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,96c-17.67,0 -32,14.33 -32,32s14.33,32 32,32s32,-14.33 32,-32S455,96 437.33,96zM437.33,138.67c-5.89,0 -10.67,-4.8 -10.67,-10.67c0,-5.88 4.78,-10.67 10.67,-10.67s10.67,4.8 10.67,10.67C448,133.88 443.22,138.67 437.33,138.67z"
android:fillColor="#CCD1D9"/>
<path
android:pathData="M405.33,245.33c0,82.48 -66.86,149.34 -149.33,149.34c-82.47,0 -149.33,-66.86 -149.33,-149.34C106.66,162.86 173.52,96 255.99,96C338.47,96 405.33,162.86 405.33,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M266.66,149.33c0,-5.89 -4.77,-10.66 -10.67,-10.66c-58.91,0 -106.66,47.75 -106.66,106.65l0,0c0,5.89 4.77,10.67 10.66,10.67s10.67,-4.78 10.67,-10.67l0,0c0,-22.78 8.88,-44.22 24.99,-60.33c16.12,-16.13 37.55,-25 60.34,-25C261.89,160 266.66,155.22 266.66,149.33z"
android:fillColor="#656D78"/>
<path
android:pathData="M352,234.67c-5.9,0 -10.67,4.77 -10.67,10.66l0,0c0,22.8 -8.88,44.23 -24.98,60.34c-16.13,16.13 -37.56,25 -60.35,25c-5.89,0 -10.66,4.78 -10.66,10.66c0,5.91 4.77,10.69 10.66,10.69c58.91,0 106.66,-47.77 106.66,-106.69C362.65,239.44 357.89,234.67 352,234.67z"
android:fillColor="#656D78"/>
<path
android:pathData="M255.99,288.01c-23.52,0 -42.66,-19.16 -42.66,-42.69c0,-23.52 19.14,-42.66 42.66,-42.66c23.54,0 42.66,19.14 42.66,42.66C298.65,268.86 279.53,288.01 255.99,288.01z"
android:fillColor="#FFCE54"/>
<path
android:pathData="M255.99,192c-29.45,0 -53.33,23.88 -53.33,53.33s23.88,53.34 53.33,53.34c29.46,0 53.34,-23.89 53.34,-53.34S285.45,192 255.99,192zM255.99,277.34c-17.64,0 -32,-14.36 -32,-32.02c0,-17.64 14.36,-32 32,-32c17.65,0 32.01,14.36 32.01,32C288,262.98 273.64,277.34 255.99,277.34z"
android:fillColor="#F6BB42"/>
<path
android:pathData="M266.66,245.33c0,5.89 -4.77,10.67 -10.67,10.67c-5.89,0 -10.66,-4.78 -10.66,-10.67s4.77,-10.66 10.66,-10.66C261.89,234.67 266.66,239.44 266.66,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M74.66,234.67H53.33c-5.89,0 -10.66,4.77 -10.66,10.66s4.77,10.67 10.66,10.67h21.34c5.89,0 10.66,-4.78 10.66,-10.67S80.56,234.67 74.66,234.67z"
android:fillColor="#434A54"/>
</group>
</vector>

View File

@@ -1,39 +1,52 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="307.57dp"
android:height="278.96dp"
android:viewportWidth="307.57"
android:viewportHeight="278.96">
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:pathData="M146.46,0h14.65v278.96h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M512,437.33c0,11.78 -9.56,21.34 -21.34,21.34H21.33C9.55,458.67 0,449.11 0,437.33V96c0,-11.78 9.55,-21.33 21.33,-21.33h469.33c11.78,0 21.34,9.55 21.34,21.33L512,437.33L512,437.33z"
android:fillColor="#DA4453"/>
<path
android:pathData="M117.17,21.97h14.65v205.73h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M512,416.01c0,11.78 -9.56,21.31 -21.34,21.31H21.33C9.55,437.33 0,427.8 0,416.01V74.67c0,-11.78 9.55,-21.34 21.33,-21.34h469.33c11.78,0 21.34,9.56 21.34,21.34L512,416.01L512,416.01z"
android:fillColor="#ED5564"/>
<path android:pathData="M63.99,160c-5.89,0 -10.66,4.78 -10.66,10.67v149.34c0,5.88 4.77,10.66 10.66,10.66c5.89,0 10.67,-4.78 10.67,-10.66V170.67C74.66,164.78 69.88,160 63.99,160z"
android:fillColor="#DA4453"/>
<path
android:pathData="M87.88,43.94h14.65v65.91h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M74.66,106.67c0,5.89 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.77 -10.66,-10.66S58.1,96 63.99,96C69.88,96 74.66,100.78 74.66,106.67z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M0,43.94h14.65v65.91h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M74.66,384.01c0,5.88 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.78 -10.66,-10.66c0,-5.91 4.77,-10.69 10.66,-10.69C69.88,373.33 74.66,378.11 74.66,384.01z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M292.92,43.94h14.65v65.91h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M448,123.73h-21.34v203.19l-40.31,50.41v0.02c-1.47,1.83 -2.34,4.14 -2.34,6.67c0,5.88 4.78,10.66 10.66,10.66c3.38,0 6.38,-1.56 8.33,-4h0.02l42.66,-53.34l0,0c1.47,-1.81 2.34,-4.13 2.34,-6.66V123.73z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M58.58,21.97h14.65v109.85h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M437.33,149.33c-11.77,0 -21.33,-9.56 -21.33,-21.33s9.56,-21.33 21.33,-21.33s21.33,9.56 21.33,21.33S449.09,149.33 437.33,149.33z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M234.34,21.97h14.65v109.85h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M437.33,96c-17.67,0 -32,14.33 -32,32s14.33,32 32,32s32,-14.33 32,-32S455,96 437.33,96zM437.33,138.67c-5.89,0 -10.67,-4.8 -10.67,-10.67c0,-5.88 4.78,-10.67 10.67,-10.67s10.67,4.8 10.67,10.67C448,133.88 443.22,138.67 437.33,138.67z"
android:fillColor="#CCD1D9"/>
<path
android:pathData="M29.29,0h14.65v153.79h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M405.33,245.33c0,82.48 -66.86,149.34 -149.33,149.34c-82.47,0 -149.33,-66.86 -149.33,-149.34C106.66,162.86 173.52,96 255.99,96C338.47,96 405.33,162.86 405.33,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M263.63,0h14.65v153.79h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M266.66,149.33c0,-5.89 -4.77,-10.66 -10.67,-10.66c-58.91,0 -106.66,47.75 -106.66,106.65l0,0c0,5.89 4.77,10.67 10.67,10.67s10.67,-4.78 10.67,-10.67l0,0c0,-22.78 8.88,-44.22 24.99,-60.33c16.12,-16.13 37.55,-25 60.34,-25C261.89,160 266.66,155.22 266.66,149.33z"
android:fillColor="#656D78"/>
<path
android:pathData="M205.05,43.94h14.65v65.91h-14.65z"
android:fillColor="#f24b6a"/>
android:pathData="M352,234.67c-5.9,0 -10.67,4.77 -10.67,10.66l0,0c0,22.8 -8.88,44.23 -24.98,60.34c-16.13,16.13 -37.56,25 -60.35,25c-5.89,0 -10.66,4.78 -10.66,10.66c0,5.91 4.77,10.69 10.66,10.69c58.91,0 106.66,-47.77 106.66,-106.69C362.65,239.44 357.89,234.67 352,234.67z"
android:fillColor="#656D78"/>
<path
android:pathData="M175.75,21.97h14.65v205.73h-14.65z"
android:fillColor="#f24b6a"/>
</vector>
android:pathData="M255.99,288.01c-23.52,0 -42.66,-19.16 -42.66,-42.69c0,-23.52 19.14,-42.66 42.66,-42.66c23.54,0 42.66,19.14 42.66,42.66C298.65,268.86 279.53,288.01 255.99,288.01z"
android:fillColor="#FFCE54"/>
<path
android:pathData="M255.99,192c-29.45,0 -53.33,23.88 -53.33,53.33s23.88,53.34 53.33,53.34c29.46,0 53.34,-23.89 53.34,-53.34S285.45,192 255.99,192zM255.99,277.34c-17.64,0 -32,-14.36 -32,-32.02c0,-17.64 14.36,-32 32,-32c17.65,0 32.01,14.36 32.01,32C288,262.98 273.64,277.34 255.99,277.34z"
android:fillColor="#F6BB42"/>
<path
android:pathData="M266.66,245.33c0,5.89 -4.77,10.67 -10.67,10.67c-5.89,0 -10.66,-4.78 -10.66,-10.67s4.77,-10.66 10.66,-10.66C261.89,234.67 266.66,239.44 266.66,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M74.66,234.67H53.33c-5.89,0 -10.66,4.77 -10.66,10.66s4.77,10.67 10.66,10.67h21.34c5.89,0 10.66,-4.78 10.66,-10.67S80.56,234.67 74.66,234.67z"
android:fillColor="#434A54"/>
</vector>

View File

@@ -0,0 +1,51 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="800dp"
android:height="800dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:pathData="M512,437.33c0,11.78 -9.56,21.34 -21.34,21.34H21.33C9.55,458.67 0,449.11 0,437.33V96c0,-11.78 9.55,-21.33 21.33,-21.33h469.33c11.78,0 21.34,9.55 21.34,21.33L512,437.33L512,437.33z"
android:fillColor="#DA4453"/>
<path
android:pathData="M512,416.01c0,11.78 -9.56,21.31 -21.34,21.31H21.33C9.55,437.33 0,427.8 0,416.01V74.67c0,-11.78 9.55,-21.34 21.33,-21.34h469.33c11.78,0 21.34,9.56 21.34,21.34L512,416.01L512,416.01z"
android:fillColor="#ED5564"/>
<path
android:pathData="M63.99,160c-5.89,0 -10.66,4.78 -10.66,10.67v149.34c0,5.88 4.77,10.66 10.66,10.66c5.89,0 10.67,-4.78 10.67,-10.66V170.67C74.66,164.78 69.88,160 63.99,160z"
android:fillColor="#DA4453"/>
<path
android:pathData="M74.66,106.67c0,5.89 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.77 -10.66,-10.66S58.1,96 63.99,96C69.88,96 74.66,100.78 74.66,106.67z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M74.66,384.01c0,5.88 -4.78,10.66 -10.67,10.66c-5.89,0 -10.66,-4.78 -10.66,-10.66c0,-5.91 4.77,-10.69 10.66,-10.69C69.88,373.33 74.66,378.11 74.66,384.01z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M448,123.73h-21.34v203.19l-40.31,50.41v0.02c-1.47,1.83 -2.34,4.14 -2.34,6.67c0,5.88 4.78,10.66 10.66,10.66c3.38,0 6.38,-1.56 8.33,-4h0.02l42.66,-53.34l0,0c1.47,-1.81 2.34,-4.13 2.34,-6.66V123.73z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,149.33c-11.77,0 -21.33,-9.56 -21.33,-21.33s9.56,-21.33 21.33,-21.33s21.33,9.56 21.33,21.33S449.09,149.33 437.33,149.33z"
android:fillColor="#E6E9ED"/>
<path
android:pathData="M437.33,96c-17.67,0 -32,14.33 -32,32s14.33,32 32,32s32,-14.33 32,-32S455,96 437.33,96zM437.33,138.67c-5.89,0 -10.67,-4.8 -10.67,-10.67c0,-5.88 4.78,-10.67 10.67,-10.67s10.67,4.8 10.67,10.67C448,133.88 443.22,138.67 437.33,138.67z"
android:fillColor="#CCD1D9"/>
<path
android:pathData="M405.33,245.33c0,82.48 -66.86,149.34 -149.33,149.34c-82.47,0 -149.33,-66.86 -149.33,-149.34C106.66,162.86 173.52,96 255.99,96C338.47,96 405.33,162.86 405.33,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M266.66,149.33c0,-5.89 -4.77,-10.66 -10.67,-10.66c-58.91,0 -106.66,47.75 -106.66,106.65l0,0c0,5.89 4.77,10.67 10.66,10.67s10.67,-4.78 10.67,-10.67l0,0c0,-22.78 8.88,-44.22 24.99,-60.33c16.12,-16.13 37.55,-25 60.34,-25C261.89,160 266.66,155.22 266.66,149.33z"
android:fillColor="#656D78"/>
<path
android:pathData="M352,234.67c-5.9,0 -10.67,4.77 -10.67,10.66l0,0c0,22.8 -8.88,44.23 -24.98,60.34c-16.13,16.13 -37.56,25 -60.35,25c-5.89,0 -10.66,4.78 -10.66,10.66c0,5.91 4.77,10.69 10.66,10.69c58.91,0 106.66,-47.77 106.66,-106.69C362.65,239.44 357.89,234.67 352,234.67z"
android:fillColor="#656D78"/>
<path
android:pathData="M255.99,288.01c-23.52,0 -42.66,-19.16 -42.66,-42.69c0,-23.52 19.14,-42.66 42.66,-42.66c23.54,0 42.66,19.14 42.66,42.66C298.65,268.86 279.53,288.01 255.99,288.01z"
android:fillColor="#FFCE54"/>
<path
android:pathData="M255.99,192c-29.45,0 -53.33,23.88 -53.33,53.33s23.88,53.34 53.33,53.34c29.46,0 53.34,-23.89 53.34,-53.34S285.45,192 255.99,192zM255.99,277.34c-17.64,0 -32,-14.36 -32,-32.02c0,-17.64 14.36,-32 32,-32c17.65,0 32.01,14.36 32.01,32C288,262.98 273.64,277.34 255.99,277.34z"
android:fillColor="#F6BB42"/>
<path
android:pathData="M266.66,245.33c0,5.89 -4.77,10.67 -10.67,10.67c-5.89,0 -10.66,-4.78 -10.66,-10.67s4.77,-10.66 10.66,-10.66C261.89,234.67 266.66,239.44 266.66,245.33z"
android:fillColor="#434A54"/>
<path
android:pathData="M74.66,234.67H53.33c-5.89,0 -10.66,4.77 -10.66,10.66s4.77,10.67 10.66,10.67h21.34c5.89,0 10.66,-4.78 10.66,-10.67S80.56,234.67 74.66,234.67z"
android:fillColor="#434A54"/>
</vector>

View File

@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="288dp"
android:height="288dp"
android:drawable="@android:color/transparent"
android:gravity="center" />
<item
android:width="220dp"
android:height="220dp"
android:drawable="@drawable/ic_splash_logo"
android:gravity="center" />
</layer-list>

View File

@@ -14,22 +14,21 @@
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_arrow_back" />
<androidx.core.widget.NestedScrollView
android:id="@+id/fragment_album_page_nested_scroll_view"
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/album_info_sector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:paddingTop="8dp">
android:paddingTop="8dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/album_cover_image_view"
@@ -252,53 +251,15 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/album_page_button_layout" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/global_padding_bottom"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/song_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"
android:paddingTop="8dp" />
<LinearLayout
android:id="@+id/similar_album_sector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<TextView
style="@style/TitleLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingTop="32dp"
android:paddingEnd="20dp"
android:text="@string/album_page_extra_info_button" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/similar_albums_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"
android:paddingStart="16dp"
android:paddingTop="8dp"
android:paddingEnd="8dp"
android:paddingBottom="8dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/song_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingTop="8dp"
android:paddingBottom="@dimen/global_padding_bottom"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>

View File

@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/toolbar_fragment"
@@ -26,6 +27,7 @@
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/global_padding_bottom"
android:visibility="gone">
<ImageView
@@ -57,92 +59,78 @@
android:text="@string/download_info_empty_subtitle" />
</LinearLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/fragment_download_nested_scroll_view"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/download_downloaded_sector"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:visibility="gone"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
tools:visibility="visible">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/download_downloaded_sector"
<TextView
android:id="@+id/downloaded_text_view_refreshable"
style="@style/TitleLarge"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/download_title_section"
app:layout_constraintEnd_toStartOf="@+id/downloaded_refresh_image_view"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/shuffle_downloaded_text_view_clickable"
style="@style/TitleMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="@dimen/global_padding_bottom"
android:visibility="gone"
tools:visibility="visible">
android:text="@string/download_shuffle_all_subtitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/downloaded_text_view_refreshable" />
<TextView
android:id="@+id/downloaded_text_view_refreshable"
style="@style/TitleLarge"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/download_title_section"
app:layout_constraintEnd_toStartOf="@+id/downloaded_refresh_image_view"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/downloaded_refresh_image_view"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:background="@drawable/ic_refresh"
android:contentDescription="@string/download_refresh_button_content_description"
app:layout_constraintBottom_toBottomOf="@+id/downloaded_text_view_refreshable"
app:layout_constraintEnd_toStartOf="@id/downloaded_go_back_image_view"
app:layout_constraintStart_toEndOf="@id/downloaded_text_view_refreshable"
app:layout_constraintTop_toTopOf="@+id/downloaded_text_view_refreshable" />
<TextView
android:id="@+id/shuffle_downloaded_text_view_clickable"
style="@style/TitleMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/download_shuffle_all_subtitle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/downloaded_text_view_refreshable"/>
<ImageView
android:id="@+id/downloaded_go_back_image_view"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:layout_marginHorizontal="12dp"
android:background="@drawable/ic_arrow_back"
app:layout_constraintBottom_toBottomOf="@+id/downloaded_text_view_refreshable"
app:layout_constraintEnd_toStartOf="@id/downloaded_group_by_image_view"
app:layout_constraintStart_toEndOf="@id/downloaded_refresh_image_view"
app:layout_constraintTop_toTopOf="@+id/downloaded_text_view_refreshable" />
<ImageView
android:id="@+id/downloaded_refresh_image_view"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:background="@drawable/ic_refresh"
android:contentDescription="@string/download_refresh_button_content_description"
app:layout_constraintBottom_toBottomOf="@+id/downloaded_text_view_refreshable"
app:layout_constraintEnd_toStartOf="@id/downloaded_go_back_image_view"
app:layout_constraintStart_toEndOf="@id/downloaded_text_view_refreshable"
app:layout_constraintTop_toTopOf="@+id/downloaded_text_view_refreshable" />
<ImageView
android:id="@+id/downloaded_group_by_image_view"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:background="@drawable/ic_filter_list"
app:layout_constraintBottom_toBottomOf="@+id/downloaded_text_view_refreshable"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/downloaded_text_view_refreshable" />
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:id="@+id/downloaded_go_back_image_view"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginHorizontal="12dp"
android:layout_gravity="center"
android:background="@drawable/ic_arrow_back"
app:layout_constraintBottom_toBottomOf="@+id/downloaded_text_view_refreshable"
app:layout_constraintEnd_toStartOf="@id/downloaded_group_by_image_view"
app:layout_constraintStart_toEndOf="@id/downloaded_refresh_image_view"
app:layout_constraintTop_toTopOf="@+id/downloaded_text_view_refreshable" />
<ImageView
android:id="@+id/downloaded_group_by_image_view"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:background="@drawable/ic_filter_list"
app:layout_constraintBottom_toBottomOf="@+id/downloaded_text_view_refreshable"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/downloaded_text_view_refreshable" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/downloaded_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"
android:paddingTop="12dp"
android:paddingBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/shuffle_downloaded_text_view_clickable" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/downloaded_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:nestedScrollingEnabled="false"
android:paddingHorizontal="12dp"
android:paddingTop="12dp"
android:paddingBottom="@dimen/global_padding_bottom" />
</LinearLayout>

View File

@@ -27,7 +27,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurface"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/playlist_cover_image_view_top_left"

View File

@@ -6,4 +6,7 @@
<item
android:id="@+id/menu_artist_sort_random"
android:title="@string/menu_sort_random" />
<item
android:id="@+id/menu_artist_sort_album_count"
android:title="@string/menu_sort_album_count" />
</menu>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 857 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Veröffentlicht am %1$s, ursprünglich %2$s</string>
<string name="album_page_shuffle_button">Zufällige Wiedergabe</string>
<string name="album_page_tracks_count_and_duration">%1$d Tracks • %2$d Minuten</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Suche…</string>
<string name="artist_bottom_sheet_instant_mix">Instant mix</string>
<string name="artist_bottom_sheet_shuffle">Mischen</string>
@@ -256,7 +256,7 @@
<string name="server_unreachable_dialog_positive_button">Trotzdem weitermachen</string>
<string name="server_unreachable_dialog_summary">Der angefragte Server ist nicht erreichbar. Wenn Du trotzdem weitermachst, wird dieser Dialog für eine Stunden nicht wieder erscheinen.</string>
<string name="server_unreachable_dialog_title">Server nicht erreichbar</string>
<string name="settings_about_summary">Tempo ist ein nativ für Android entwickelter, leichtgewichtiger Open-Source Client für Subsonic.</string>
<string name="settings_about_summary">Tempus ist ein nativ für Android entwickelter, leichtgewichtiger Open-Source Client für Subsonic.</string>
<string name="settings_about_title">Über</string>
<string name="settings_always_on_display">Immer anzeigen</string>
<string name="settings_audio_transcode_download_format">Transkodierungs-Format</string>
@@ -284,7 +284,7 @@
<string name="settings_download_storage_title">Download storage</string>
<string name="settings_system_equalizer_summary">Audio Einstellungen anpassen</string>
<string name="settings_system_equalizer_title">System-Equalizer</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Verfolge die Entwicklung</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">Bilder Auflösung anpassen</string>
@@ -411,9 +411,9 @@
<string name="track_info_path">Pfad</string>
<string name="track_info_disc_number">Disk Nummer</string>
<string name="track_info_summary_downloaded_file">Diese Datei wurde mit den Subsonic APIs heruntergeladen. Der Codec und die Bitrate sind unverändert zur original Datei.</string>
<string name="track_info_summary_server_prioritized">Die Qualität des abzuspielenden Titels wird vom Server bestimmt. Tempo stellt keinen Codec und keine Bitrate für eine potentielle Transkodierung sicher.</string>
<string name="track_info_summary_original_file">Tempo wird nur die original Datei, so wie sie vom Server geliefert wird, lesen. Die Anwendung wird den Server explizit nach einer nicht-transkodierten Version der Datei mit der Bitrate der original Datei fragen.</string>
<string name="track_info_summary_transcoding_codec">Tempo wird den Server bitten, die Datei zu transkodieren. Der vom Benutzer gewünschte Codec ist %1$s, die Bitrate wird dieselbe wie bei der original Datei sein. Die potentielle Transkodierung der Datei in das gewünschte Format ist vom Server abhängig. Dieser kann die Operation gegebenenfalls nicht unterstützen.</string>
<string name="track_info_summary_transcoding_bitrate">Tempo wird den Server bitten, die Bitrate der Datei zu erändern. Die vom Benutzer gewünschte Bitrate ist %1$s, der Codec der Originaldatei wird nicht verändert. Änderungen an der Bitrate der Datei werden vom Server ausgeführt, dieser kann die Operation gegebenenfalls nicht unterstützen.</string>
<string name="track_info_summary_server_prioritized">Die Qualität des abzuspielenden Titels wird vom Server bestimmt. Tempus stellt keinen Codec und keine Bitrate für eine potentielle Transkodierung sicher.</string>
<string name="track_info_summary_original_file">Tempus wird nur die original Datei, so wie sie vom Server geliefert wird, lesen. Die Anwendung wird den Server explizit nach einer nicht-transkodierten Version der Datei mit der Bitrate der original Datei fragen.</string>
<string name="track_info_summary_transcoding_codec">Tempus wird den Server bitten, die Datei zu transkodieren. Der vom Benutzer gewünschte Codec ist %1$s, die Bitrate wird dieselbe wie bei der original Datei sein. Die potentielle Transkodierung der Datei in das gewünschte Format ist vom Server abhängig. Dieser kann die Operation gegebenenfalls nicht unterstützen.</string>
<string name="track_info_summary_transcoding_bitrate">Tempus wird den Server bitten, die Bitrate der Datei zu erändern. Die vom Benutzer gewünschte Bitrate ist %1$s, der Codec der Originaldatei wird nicht verändert. Änderungen an der Bitrate der Datei werden vom Server ausgeführt, dieser kann die Operation gegebenenfalls nicht unterstützen.</string>
<string name="track_info_summary_full_transcode">Die Anwendung wird den Server bitten die Datei zu transkodieren und die Bitrate zu verändern. Der vom Benutzer gewünschte Codec ist %1$s, mit der Bitrate %2$s. Änderungen am Codec und an der Bitrate der Datei werden vom Server ausgeführt, dieser kann die Operation gegebenenfalls nicht unterstützen.</string>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="album_page_tracks_count_and_duration">%1$d pistas • %2$d minutos</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="activity_battery_optimizations_conclusion">Si tienes problemas, visita https://dontkillmyapp.com. Ofrece instrucciones detalladas para desactivar características de ahorro de energía que podrían afectar al rendimiento de la app.</string>
<string name="activity_battery_optimizations_summary">Por favor, desactive las optimizaciones de batería para continuar la reproducción multimedia mientras la pantalla está apagada.</string>
<string name="activity_battery_optimizations_title">Optimizaciones de batería</string>
@@ -183,7 +183,7 @@
<string name="settings_language">Idioma</string>
<string name="settings_system_language">Idioma del sistema</string>
<string name="settings_logout_title">Cerrar sesión</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Siga el desarrollo</string>
<string name="settings_github_title">Github</string>
<string name="menu_group_by_genre">Género</string>
@@ -289,21 +289,21 @@
<string name="server_unreachable_dialog_positive_button">Continuar de todas formas</string>
<string name="server_unreachable_dialog_summary">El servidor no está disponible. Si decide continuar, este diálogo no aparecerá de nuevo durante una hora.</string>
<string name="server_unreachable_dialog_title">No se puede conectar con el servidor</string>
<string name="settings_about_summary">Tempo es un cliente de música Subsonic ligero y de código abierto, diseñado nativamente para Android.</string>
<string name="settings_about_summary">Tempus es un cliente de música Subsonic ligero y de código abierto, diseñado nativamente para Android.</string>
<string name="settings_about_title">Acerca de</string>
<string name="settings_always_on_display">Pantalla siempre activa</string>
<string name="settings_allow_playlist_duplicates_summary">Si está habilitada, no se comprobará si hay pistas repetidas cuando se añadan a la lista.</string>
<string name="settings_audio_transcode_download_format">Formato de transcodificación</string>
<string name="settings_audio_transcode_download_priority_summary">Si está habilitada, Tempo no descargará la pista con las opciones de transcodificación que aparecen a continuación.</string>
<string name="settings_audio_transcode_download_priority_summary">Si está habilitada, Tempus no descargará la pista con las opciones de transcodificación que aparecen a continuación.</string>
<string name="settings_audio_transcode_download_priority_title">Dar prioridad a las opciones del servidor usadas para el streaming en las descargas</string>
<string name="settings_audio_transcode_download_summary">Si está habilitada, Tempo descargará las pistas transcodificadas.</string>
<string name="settings_audio_transcode_download_summary">Si está habilitada, Tempus descargará las pistas transcodificadas.</string>
<string name="settings_audio_transcode_download_title">Descargas pistas transcodificadas</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Si está habilitada, se pedirá al servidor la duración estimada de la pista.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Calcular la duración del contenido</string>
<string name="settings_audio_transcode_format_download">Formato de transcodificación para las descargas</string>
<string name="settings_audio_transcode_format_mobile">Formato de transcodificación en red de datos móviles</string>
<string name="settings_audio_transcode_format_wifi">Formato de transcodificación en red Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">Si está habilitada, Tempo no reproducirá la pista con las opciones de transcodificación que aparecen a continuación.</string>
<string name="settings_audio_transcode_priority_summary">Si está habilitada, Tempus no reproducirá la pista con las opciones de transcodificación que aparecen a continuación.</string>
<string name="settings_audio_transcode_priority_title">Dar prioridad a las opciones de transcodificación del servidor</string>
<string name="settings_audio_transcode_priority_toast">Prioridad a la hora de transcodificar una pista</string>
<string name="settings_buffering_strategy">Estrategia de buffer</string>
@@ -413,7 +413,9 @@
<string name="share_bottom_sheet_delete">Eliminar compartición</string>
<string name="share_bottom_sheet_update">Actualizar compartición</string>
<string name="share_subtitle_item">Fecha de caducidad: %1$s</string>
<string name="share_no_expiration">Nunca</string>
<string name="share_unsupported_error">El uso compartido no está soportado o no está habilitado</string>
<string name="asset_link_debug_toast">Enlace de recurso: %1$s</string>
<string name="share_update_dialog_hint_description">Descripción</string>
<string name="share_update_dialog_hint_expiration_date">Fecha de caducidad</string>
<string name="song_bottom_sheet_add_to_queue">Añadir a la cola</string>
@@ -463,9 +465,9 @@
<string name="settings_app_equalizer_summary">Abrir el ecualizador integrado</string>
<string name="settings_download_folder_cleared">Se ha limpiado la carpeta de descargas.</string>
<string name="settings_download_folder_set">Se ha establecido la carpeta de descargas</string>
<string name="widget_label">Widget de Tempo</string>
<string name="widget_label">Widget de Tempus</string>
<string name="widget_not_playing">En pausa</string>
<string name="widget_placeholder_subtitle">Abrir Tempo</string>
<string name="widget_placeholder_subtitle">Abrir Tempus</string>
<string name="widget_time_duration_placeholder">0:00</string>
<string name="widget_content_desc_album_art">Portada del álbum</string>
<string name="widget_content_desc_play_pause">Reproducir o pausar</string>
@@ -486,4 +488,21 @@
<string name="settings_sync_starred_artists_for_offline_use_summary">Si está habilitada, los artistas destacados se descargarán para uso sin conexión.</string>
<string name="widget_time_elapsed_placeholder">0:00</string>
<string name="exo_controls_heart_off_description">Eliminar de favoritos</string>
<string name="asset_link_chip_text">%1$s • %2$s</string>
<string name="asset_link_copied_toast">Copiado %1$s al portapapeles</string>
<string name="settings_album_detail">Mostrar los detalles del álbum</string>
<string name="settings_album_detail_summary">Si está habilitada, muestra los detalles del álbum, como el género, el número de pistas, etc. en la página de álbum</string>
<string name="asset_link_clipboard_label">Enlace de recurso de Tempus</string>
<string name="asset_link_label_song">UID de la pista</string>
<string name="asset_link_label_album">UID del álbum</string>
<string name="asset_link_label_artist">UID del artista</string>
<string name="asset_link_label_playlist">UID de la lista de reproducción</string>
<string name="asset_link_label_genre">UID del género</string>
<string name="asset_link_label_year">UID del año</string>
<string name="asset_link_label_unknown">UID del recurso</string>
<string name="asset_link_error_unsupported">Enlace de recurso no válido</string>
<string name="asset_link_error_song">No se ha podido abrir la pista</string>
<string name="asset_link_error_album">No se ha podido abrir el álbum</string>
<string name="asset_link_error_artist">No se ha podido abrir el artista</string>
<string name="asset_link_error_playlist">No se ha podido abrir la lista de reproducción</string>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Sorti le %1$s, initialement %2$s</string>
<string name="album_page_shuffle_button">Mélanger</string>
<string name="album_page_tracks_count_and_duration">%1$d titres • %2$d minutes</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Recherche…</string>
<string name="artist_bottom_sheet_instant_mix">Mix instantané</string>
<string name="artist_bottom_sheet_shuffle">Mélanger</string>
@@ -270,20 +270,20 @@
<string name="server_unreachable_dialog_positive_button">Continuer quand même</string>
<string name="server_unreachable_dialog_summary">Le serveur est injoignable. Si vous décidez de continuer, cette fenêtre n\'apparaîtra plus pendant une heure.</string>
<string name="server_unreachable_dialog_title">Serveur injoignable</string>
<string name="settings_about_summary">Tempo est un client open source et léger pour Subsonic, développé et compilé nativement pour Android.</string>
<string name="settings_about_summary">Tempus est un client open source et léger pour Subsonic, développé et compilé nativement pour Android.</string>
<string name="settings_about_title">À propos</string>
<string name="settings_always_on_display">Toujours visible</string>
<string name="settings_audio_transcode_download_format">Format de transcodage</string>
<string name="settings_audio_transcode_download_priority_summary">Si activé, Tempo ne forcera pas le téléchargement de la piste avec les paramètres de transcodage ci-dessous.</string>
<string name="settings_audio_transcode_download_priority_summary">Si activé, Tempus ne forcera pas le téléchargement de la piste avec les paramètres de transcodage ci-dessous.</string>
<string name="settings_audio_transcode_download_priority_title">Prioriser les paramètres du serveurs, utilisés pour le streaming, dans les téléchargements</string>
<string name="settings_audio_transcode_download_summary">Si activé, Tempo téléchargera les pistes transcodées.</string>
<string name="settings_audio_transcode_download_summary">Si activé, Tempus téléchargera les pistes transcodées.</string>
<string name="settings_audio_transcode_download_title">Télécharger les pistes transcodées</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Si activé, une estimation de la durée de la piste sera demandée au serveur.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Estimer la durée du contenu</string>
<string name="settings_audio_transcode_format_download">Format de transcodage pour les téléchargements</string>
<string name="settings_audio_transcode_format_mobile">Format de transcodage (mobile)</string>
<string name="settings_audio_transcode_format_wifi">Format de transcodage (Wi-Fi)</string>
<string name="settings_audio_transcode_priority_summary">Si activé, Tempo ne forcera pas le streaming des pistes avec les paramètres ci-dessous.</string>
<string name="settings_audio_transcode_priority_summary">Si activé, Tempus ne forcera pas le streaming des pistes avec les paramètres ci-dessous.</string>
<string name="settings_audio_transcode_priority_title">Prioriser les paramètres de transcodage du serveur</string>
<string name="settings_audio_transcode_priority_toast">La priorité au transcodage de la piste est donnée au serveur</string>
<string name="settings_buffering_strategy">Stratégie de mise en mémoire tampon</string>
@@ -298,7 +298,7 @@
<string name="settings_download_storage_title">Stockage des téléchargements</string>
<string name="settings_system_equalizer_summary">Ajuster les paramètres audios</string>
<string name="settings_system_equalizer_title">Égaliseur du système</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Suivre le développement</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">Définir la résolution des images</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Rilasciato il %1$s, originariamente il %2$s</string>
<string name="album_page_shuffle_button">Riproduzione casuale</string>
<string name="album_page_tracks_count_and_duration">%1$d brani • %2$d minuti</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Ricerca in corso…</string>
<string name="artist_bottom_sheet_instant_mix">Mix istantaneo</string>
<string name="artist_bottom_sheet_shuffle">Riproduzione casuale</string>
@@ -256,20 +256,20 @@
<string name="server_unreachable_dialog_positive_button">Continua comunque</string>
<string name="server_unreachable_dialog_summary">Il server richiesto non è disponibile. Se scegli di continuare, questo messaggio non apparirà per la prossima ora.</string>
<string name="server_unreachable_dialog_title">Server irraggiungibile</string>
<string name="settings_about_summary">Tempo è un client musicale open source e leggero per Subsonic, progettato e costruito nativamente per Android.</string>
<string name="settings_about_summary">Tempus è un client musicale open source e leggero per Subsonic, progettato e costruito nativamente per Android.</string>
<string name="settings_about_title">Informazioni</string>
<string name="settings_always_on_display">Sempre attivo</string>
<string name="settings_audio_transcode_download_format">Formato transcodifica</string>
<string name="settings_audio_transcode_download_priority_summary">Se abilitato, Tempo non forzerà il download del brano con le impostazioni di transcodifica sottostanti.</string>
<string name="settings_audio_transcode_download_priority_summary">Se abilitato, Tempus non forzerà il download del brano con le impostazioni di transcodifica sottostanti.</string>
<string name="settings_audio_transcode_download_priority_title">Dare priorità alle impostazioni del server per lo streaming nei download</string>
<string name="settings_audio_transcode_download_summary">Se abilitato, Tempo scaricherà i brani transcodificati.</string>
<string name="settings_audio_transcode_download_summary">Se abilitato, Tempus scaricherà i brani transcodificati.</string>
<string name="settings_audio_transcode_download_title">Scarica brani transcodificati</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Se abilitato, verrà richiesto al server di fornire la durata stimata del brano.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Stima della lunghezza del contenuto</string>
<string name="settings_audio_transcode_format_download">Formato transcodifica per download</string>
<string name="settings_audio_transcode_format_mobile">Formato transcodifica su mobile</string>
<string name="settings_audio_transcode_format_wifi">Formato transcodifica su Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">Se abilitato, Tempo non forzerà lo streaming del brano con le impostazioni di transcodifica sottostanti.</string>
<string name="settings_audio_transcode_priority_summary">Se abilitato, Tempus non forzerà lo streaming del brano con le impostazioni di transcodifica sottostanti.</string>
<string name="settings_audio_transcode_priority_title">Dare priorità alle impostazioni di transcodifica del server</string>
<string name="settings_audio_transcode_priority_toast">Priorità di transcodifica del brano assegnata al server</string>
<string name="settings_buffering_strategy">Strategia di buffering</string>
@@ -284,7 +284,7 @@
<string name="settings_download_storage_title">Archivio download</string>
<string name="settings_system_equalizer_summary">Regola le impostazioni audio</string>
<string name="settings_system_equalizer_title">Equalizzatore di sistema</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Segui lo sviluppo</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">Imposta risoluzione delle immagini</string>

View File

@@ -27,7 +27,7 @@
<string name="album_page_release_dates_label">%1$s에 발매, %2$s에 최초 발매됨</string>
<string name="album_page_shuffle_button">셔플</string>
<string name="album_page_tracks_count_and_duration">%1$d 곡 • %2$d 분</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">탐색 중…</string>
<string name="artist_bottom_sheet_instant_mix">인스턴트 믹스</string>
<string name="artist_bottom_sheet_shuffle">셔플</string>
@@ -238,7 +238,7 @@
<string name="server_unreachable_dialog_positive_button">무시하고 계속</string>
<string name="server_unreachable_dialog_summary">요청한 서버를 사용할 수 없습니다. 계속하면 한 시간 동안 더 이상 경고하지 않습니다.</string>
<string name="server_unreachable_dialog_title">서버에 연결할 수 없음</string>
<string name="settings_about_summary">Tempo는 안드로이드용 경량 Subsonic 오픈 소스 음악 클라이언트입니다.</string>
<string name="settings_about_summary">Tempus는 안드로이드용 경량 Subsonic 오픈 소스 음악 클라이언트입니다.</string>
<string name="settings_about_title">About</string>
<string name="settings_audio_transcode_download_format">트랜스코딩 포맷</string>
<string name="settings_audio_transcode_download_priority_summary">활성화 시, 아래 트랜스코딩 설정으로 트랙 강제 다운로드를 하지 않습니다.</string>
@@ -263,7 +263,7 @@
<string name="settings_download_storage_title">스토리지 다운로드</string>
<string name="settings_system_equalizer_summary">오디오 설정 적용</string>
<string name="settings_system_equalizer_title">시스템 이퀄라이저</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Follow the development</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">이미지 해상도 설정</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Wydane %1$s, oryginalnie %2$s</string>
<string name="album_page_shuffle_button">Odtwarzaj losowo</string>
<string name="album_page_tracks_count_and_duration">%1$d utworów • %2$d minut</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Szukanie…</string>
<string name="artist_bottom_sheet_instant_mix">Natychmiastowy mix mix</string>
<string name="artist_bottom_sheet_shuffle">Odtwórz losowo</string>
@@ -282,22 +282,22 @@
<string name="server_unreachable_dialog_positive_button">Kontynuuj mimo wszystko</string>
<string name="server_unreachable_dialog_summary">Wybrany serwer jest niedostępny. Jeżeli wybierzesz żeby kontynuować ta informacja nie będzie się wyświetlać przez następną godzinę.</string>
<string name="server_unreachable_dialog_title">Serwer jest niedostępny</string>
<string name="settings_about_summary">Tempo jest otwarto-źródłowym i lekkim klientem muzycznym dla Subsonic, stworzonym i zbudowanym natywnie dla Androida.</string>
<string name="settings_about_summary">Tempus jest otwarto-źródłowym i lekkim klientem muzycznym dla Subsonic, stworzonym i zbudowanym natywnie dla Androida.</string>
<string name="settings_about_title">O aplikacji</string>
<string name="settings_always_on_display">Always on display</string>
<string name="settings_allow_playlist_duplicates">Zezwalaj na dodawania duplikatów do playlist</string>
<string name="settings_allow_playlist_duplicates_summary">Jeżeli włączone, duplikaty nie będą sprawdzane podczas dodawania do playlisty.</string>
<string name="settings_audio_transcode_download_format">Format transkodowania</string>
<string name="settings_audio_transcode_download_priority_summary">Jeżeli włączone, Tempo nie będzię wymuszał pobierania utworu z ustawieniami transkodowania wybranymi poniżej.</string>
<string name="settings_audio_transcode_download_priority_summary">Jeżeli włączone, Tempus nie będzię wymuszał pobierania utworu z ustawieniami transkodowania wybranymi poniżej.</string>
<string name="settings_audio_transcode_download_priority_title">Priorytetyzuj ustawienia serwera używanego do strumieniowania w pobieraniach</string>
<string name="settings_audio_transcode_download_summary">Jeżeli włączone, Tempo będzie pobierał transkodowane utwory.</string>
<string name="settings_audio_transcode_download_summary">Jeżeli włączone, Tempus będzie pobierał transkodowane utwory.</string>
<string name="settings_audio_transcode_download_title">Pobieraj transkodowane utwory</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Jeżeli włączone, serwer bedzię odpytywany o przybliżoną długość utworu.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Szacuj długość treści</string>
<string name="settings_audio_transcode_format_download">Format transkodowania dla pobierania</string>
<string name="settings_audio_transcode_format_mobile">Format transkodowania w sieci komórkowej</string>
<string name="settings_audio_transcode_format_wifi">Format transkodowania w sieci Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">Jeżeli włączone, Tempo nie będzie wymuszał strumieniowania utworu z ustawieniami transkodowania wybranymi poniżej.</string>
<string name="settings_audio_transcode_priority_summary">Jeżeli włączone, Tempus nie będzie wymuszał strumieniowania utworu z ustawieniami transkodowania wybranymi poniżej.</string>
<string name="settings_audio_transcode_priority_title">Priorytetyzuj ustawienia transkodowania serwera</string>
<string name="settings_audio_transcode_priority_toast">Priorytet przy transkodowaniu utworu danego serwerowi</string>
<string name="settings_buffering_strategy">Strategia buforowania</string>
@@ -317,10 +317,10 @@
<string name="settings_set_download_folder">Ustaw folder pobierania</string>
<string name="settings_system_equalizer_summary">Zmień ustawienia audio</string>
<string name="settings_system_equalizer_title">Korektor systemowy</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Śledź tworzenie aplikacji</string>
<string name="settings_github_title">GitHub</string>
<string name="settings_support_discussion_link">https://github.com/eddyizm/tempo/discussions</string>
<string name="settings_support_discussion_link">https://github.com/eddyizm/tempus/discussions</string>
<string name="settings_support_summary">Dołącz do dyskusji i wsparcia społeczności</string>
<string name="settings_support_title">Wsparcie użytkowników</string>
<string name="settings_scan_result">Skanowanie: naliczono %1$d utworów</string>
@@ -401,6 +401,22 @@
<string name="share_bottom_sheet_update">Zaktualizuj udostępnianie</string>
<string name="share_subtitle_item">Data wygaśnięcia: %1$s</string>
<string name="share_unsupported_error">Udostępnianie nie jest wspierane lub włączone</string>
<string name="asset_link_clipboard_label">Link zasobu Tempus</string>
<string name="asset_link_label_song">UID piosenki</string>
<string name="asset_link_label_album">UID albumu</string>
<string name="asset_link_label_artist">UID wykonmawcy</string>
<string name="asset_link_label_playlist">UID playlisty</string>
<string name="asset_link_label_genre">UID gatunku</string>
<string name="asset_link_label_year">UID roku</string>
<string name="asset_link_label_unknown">UID zasobu</string>
<string name="asset_link_error_unsupported">Niewspierany link zasobu</string>
<string name="asset_link_error_song">Piosenka nie mogła zostać otwarta</string>
<string name="asset_link_error_album">Album nie mógł zostać otwarty</string>
<string name="asset_link_error_artist">Wykonawca nie mógł zostać otwarty</string>
<string name="asset_link_error_playlist">Playlista nie mogła zostać otwarta</string>
<string name="asset_link_chip_text">%1$s • %2$s</string>
<string name="asset_link_copied_toast">Skopiowano %1$s do schowka</string>
<string name="asset_link_debug_toast">Link zasobu: %1$s</string>
<string name="share_update_dialog_hint_description">Opis</string>
<string name="share_update_dialog_hint_expiration_date">Data wygaśnięcia</string>
<string name="share_update_dialog_negative_button">Anuluj</string>
@@ -469,9 +485,9 @@
<string name="undraw_page">unDraw</string>
<string name="undraw_thanks">Specjalne podziękowania dla unDraw bez którego ilustracji nie mogliśmy uczynić tej aplikacji jeszcze piękniejszą.</string>
<string name="undraw_url">https://undraw.co/</string>
<string name="widget_label">Widget Tempo</string>
<string name="widget_label">Widget Tempus</string>
<string name="widget_not_playing">Nie odtwarza</string>
<string name="widget_placeholder_subtitle">Otwórz Tempo</string>
<string name="widget_placeholder_subtitle">Otwórz Tempus</string>
<string name="widget_time_elapsed_placeholder">0:00</string>
<string name="widget_time_duration_placeholder">0:00</string>
<string name="widget_content_desc_album_art">Okładka albumu</string>
@@ -498,4 +514,6 @@
<string name="equalizer_not_supported">Nie wspierane na tym urządzeniu</string>
<string name="settings_app_equalizer">Korektor dźwięku</string>
<string name="settings_app_equalizer_summary">Otwórz wbudowany korektor dźwięku</string>
<string name="settings_album_detail">Pokaż szczegóły albumu</string>
<string name="settings_album_detail_summary">Jeżeli włączone, pokaż szczegóły albumu takie jak gatunek, ilość piosenek itp. na stronie albumu</string>
</resources>

View File

@@ -25,7 +25,7 @@
<string name="album_page_extra_info_button">Sugestões semelhantes</string>
<string name="album_page_play_button">Reproduzir</string>
<string name="album_page_shuffle_button">Aleatório</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Procurando…</string>
<string name="artist_bottom_sheet_instant_mix">Mixagem instantânea</string>
<string name="artist_bottom_sheet_shuffle">Aleatório</string>
@@ -224,20 +224,20 @@
<string name="server_unreachable_dialog_positive_button">Continuar mesmo assim</string>
<string name="server_unreachable_dialog_summary">O servidor solicitado não está disponível. Se você optar por continuar, essa caixa de diálogo não será exibida pela próxima hora.</string>
<string name="server_unreachable_dialog_title">Servidor inacessível</string>
<string name="settings_about_summary">O Tempo é um cliente de música leve e de código aberto para Subsonic, projetado e desenvolvido nativamente para Android.</string>
<string name="settings_about_summary">O Tempus é um cliente de música leve e de código aberto para Subsonic, projetado e desenvolvido nativamente para Android.</string>
<string name="settings_about_title">Sobre</string>
<string name="settings_always_on_display">Tela sempre ativa</string>
<string name="settings_audio_transcode_download_format">Formato de transcodificação</string>
<string name="settings_audio_transcode_download_priority_summary">Se ativado, Tempo não forçará o download da faixa com as configurações de transcodificação abaixo.</string>
<string name="settings_audio_transcode_download_priority_summary">Se ativado, Tempus não forçará o download da faixa com as configurações de transcodificação abaixo.</string>
<string name="settings_audio_transcode_download_priority_title">Priorizar as configurações do servidor usadas para streaming nos downloads</string>
<string name="settings_audio_transcode_download_summary">Se ativado, Tempo irá baixar faixas transcodificadas.</string>
<string name="settings_audio_transcode_download_summary">Se ativado, Tempus irá baixar faixas transcodificadas.</string>
<string name="settings_audio_transcode_download_title">Baixar faixas transcodificadas</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Se ativado, o servidor será solicitado a informar a duração estimada da faixa.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Calcular tamanho do conteúdo</string>
<string name="settings_audio_transcode_format_download">Formato de transcodificação para downloads</string>
<string name="settings_audio_transcode_format_mobile">Formato de transcodificação na rede móvel</string>
<string name="settings_audio_transcode_format_wifi">Formato de transcodificação no Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">Se ativado, Tempo não forçará a transmissão da faixa com as configurações de transcodificação abaixo.</string>
<string name="settings_audio_transcode_priority_summary">Se ativado, Tempus não forçará a transmissão da faixa com as configurações de transcodificação abaixo.</string>
<string name="settings_audio_transcode_priority_title">Priorizar configurações de transcodificação do servidor</string>
<string name="settings_audio_transcode_priority_toast">Prioridade na transcodificação da faixa fornecida pelo servidor</string>
<string name="settings_buffering_strategy">Estratégia de buffer</string>
@@ -250,7 +250,7 @@
<string name="settings_download_storage_title">Armazenamento dos downloads</string>
<string name="settings_system_equalizer_summary">Ajustar configurações de áudio</string>
<string name="settings_system_equalizer_title">Equalizador do sistema</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Acompanhe o desenvolvimento</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">Definir resolução da imagem</string>
@@ -285,7 +285,7 @@
<string name="settings_summary_syncing">Retorna o estado da fila de reprodução para esse usuário. Isso inclui as faixas na fila de reprodução, a faixa sendo reproduzida e a posição nesta faixa. O servidor deve suportar este recurso.</string>
<string name="settings_summary_transcoding">Prioridade dada ao modo de transcodificação. Se definido para \"Reprodução direta\" a taxa de bits do arquivo não será alterada.</string>
<string name="settings_summary_transcoding_download">Baixar mídia transcodificada. Se ativado, o endpoint de download não será usado, e sim, as seguintes configurações. \n\n Se \"Formato de transcodificação para downloads\" estiver definido como \"Download direto\" a taxa de bits do arquivo não será alterada.</string>
<string name="settings_summary_transcoding_estimate_content_length">Quando o arquivo é transcodificado em tempo real, o cliente geralmente não mostra a duração da faixa. É possível solicitar aos servidores que suportam a funcionalidade, que informem a duração da faixa que está sendo reproduzida, porém, os tempos de resposta podem ser mais longos.</string>
<string name="settings_summary_transcoding_estimate_content_length">Quando o arquivo é transcodificado em Tempus real, o cliente geralmente não mostra a duração da faixa. É possível solicitar aos servidores que suportam a funcionalidade, que informem a duração da faixa que está sendo reproduzida, porém, os Tempuss de resposta podem ser mais longos.</string>
<string name="settings_sync_starred_tracks_for_offline_use_summary">Se ativado, as faixas favoritadas serão baixadas para uso offline.</string>
<string name="settings_sync_starred_tracks_for_offline_use_title">Sincronizar faixas favoritas para uso offline</string>
<string name="settings_theme">Tema</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Выпущен %1$s, оригинал %2$s</string>
<string name="album_page_shuffle_button">Смешать</string>
<string name="album_page_tracks_count_and_duration">%1$d треков • %2$d минут</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Поиск…</string>
<string name="artist_bottom_sheet_instant_mix">Мгновенный микс</string>
<string name="artist_bottom_sheet_shuffle">Смешать</string>
@@ -268,20 +268,20 @@
<string name="server_unreachable_dialog_positive_button">Продолжить в любом случае</string>
<string name="server_unreachable_dialog_summary">Запрошенный сервер недоступен. Если вы решите продолжить, это диалоговое окно не появится в течение следующего часа</string>
<string name="server_unreachable_dialog_title">Сервер недоступен</string>
<string name="settings_about_summary">Tempo — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный и созданный специально для Android.</string>
<string name="settings_about_summary">Tempus — это легкий музыкальный клиент с открытым исходным кодом для Subsonic, разработанный и созданный специально для Android.</string>
<string name="settings_about_title">О нас</string>
<string name="settings_always_on_display">Всегда на дисплее</string>
<string name="settings_audio_transcode_download_format">Формат перекодирования</string>
<string name="settings_audio_transcode_download_priority_summary">Если этот параметр включен, Tempo не будет принудительно загружать трек с настройками перекодирования, указанными ниже.</string>
<string name="settings_audio_transcode_download_priority_summary">Если этот параметр включен, Tempus не будет принудительно загружать трек с настройками перекодирования, указанными ниже.</string>
<string name="settings_audio_transcode_download_priority_title">Установите приоритет настроек сервера, используемых для потоковой передачи при загрузке</string>
<string name="settings_audio_transcode_download_summary">Если этот параметр включен, Tempo будет загружать перекодированные треки.</string>
<string name="settings_audio_transcode_download_summary">Если этот параметр включен, Tempus будет загружать перекодированные треки.</string>
<string name="settings_audio_transcode_download_title">Скачать перекодированные треки</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Если этот параметр включен, на сервере будет запрошена предполагаемая продолжительность трека.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Оцените длину содержимого</string>
<string name="settings_audio_transcode_format_download">Формат перекодирования для загрузки</string>
<string name="settings_audio_transcode_format_mobile">Формат перекодирования в мобильном телефоне</string>
<string name="settings_audio_transcode_format_wifi">Перекодировать формат в Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">Если этот параметр включен, Tempo не будет принудительно транслировать трек с настройками перекодирования, указанными ниже.</string>
<string name="settings_audio_transcode_priority_summary">Если этот параметр включен, Tempus не будет принудительно транслировать трек с настройками перекодирования, указанными ниже.</string>
<string name="settings_audio_transcode_priority_title">Приоритизация настроек перекодирования сервера</string>
<string name="settings_audio_transcode_priority_toast">Приоритет при перекодировании трека отдается серверу</string>
<string name="settings_buffering_strategy">Стратегия буферизации</string>
@@ -296,7 +296,7 @@
<string name="settings_download_storage_title">Загрузить хранилище</string>
<string name="settings_system_equalizer_summary">Отрегулируйте настройки звука</string>
<string name="settings_system_equalizer_title">Системный эквалайзер</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Следите за развитием</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">Установить разрешение изображения</string>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">%1$s tarihinde yayınlandı, orijinali %2$s</string>
<string name="album_page_shuffle_button">Karıştır</string>
<string name="album_page_tracks_count_and_duration">%1$d parça • %2$d dakika</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Aranıyor…</string>
<string name="artist_bottom_sheet_instant_mix">Anında karışım</string>
<string name="artist_bottom_sheet_shuffle">Karıştır</string>
@@ -271,20 +271,20 @@
<string name="server_unreachable_dialog_positive_button">Yine de devam et</string>
<string name="server_unreachable_dialog_summary">İstenen sunucuya ulaşılamıyor. Devam etmeyi seçerseniz bu iletişim penceresi bir saat boyunca tekrar görünmez.</string>
<string name="server_unreachable_dialog_title">Sunucuya ulaşılamıyor</string>
<string name="settings_about_summary">Tempo, Subsonic için açık kaynaklı ve hafif bir müzik istemcisidir, Android için yerel olarak tasarlanıp geliştirilmiştir.</string>
<string name="settings_about_summary">Tempus, Subsonic için açık kaynaklı ve hafif bir müzik istemcisidir, Android için yerel olarak tasarlanıp geliştirilmiştir.</string>
<string name="settings_about_title">Hakkında</string>
<string name="settings_always_on_display">Her zaman açık ekran</string>
<string name="settings_audio_transcode_download_format">Dönüştürme formatı</string>
<string name="settings_audio_transcode_download_priority_summary">Etkinleştirildiğinde, Tempo parçayı aşağıdaki dönüştürme ayarlarıyla indirmeye zorlamaz.</string>
<string name="settings_audio_transcode_download_priority_summary">Etkinleştirildiğinde, Tempus parçayı aşağıdaki dönüştürme ayarlarıyla indirmeye zorlamaz.</string>
<string name="settings_audio_transcode_download_priority_title">İndirmelerde yayın için kullanılan sunucu ayarlarına öncelik ver</string>
<string name="settings_audio_transcode_download_summary">Etkinleştirildiğinde, Tempo dönüştürülmüş parçaları indirir.</string>
<string name="settings_audio_transcode_download_summary">Etkinleştirildiğinde, Tempus dönüştürülmüş parçaları indirir.</string>
<string name="settings_audio_transcode_download_title">Dönüştürülmüş parçaları indir</string>
<string name="settings_audio_transcode_estimate_content_length_summary">Etkinleştirildiğinde, parçanın tahmini süresi sunucudan istenir.</string>
<string name="settings_audio_transcode_estimate_content_length_title">İçerik uzunluğunu tahmin et</string>
<string name="settings_audio_transcode_format_download">İndirmeler için dönüştürme formatı</string>
<string name="settings_audio_transcode_format_mobile">Mobilde dönüştürme formatı</string>
<string name="settings_audio_transcode_format_wifi">Wi-Fida dönüştürme formatı</string>
<string name="settings_audio_transcode_priority_summary">Etkinleştirildiğinde, Tempo parçayı aşağıdaki dönüştürme ayarlarıyla yayınlamayacaktır.</string>
<string name="settings_audio_transcode_priority_summary">Etkinleştirildiğinde, Tempus parçayı aşağıdaki dönüştürme ayarlarıyla yayınlamayacaktır.</string>
<string name="settings_audio_transcode_priority_title">Sunucu dönüştürme ayarlarına öncelik ver</string>
<string name="settings_audio_transcode_priority_toast">Parçanın dönüştürülmesinde öncelik sunucuya verildi</string>
<string name="settings_buffering_strategy">Önbellekleme stratejisi</string>
@@ -299,7 +299,7 @@
<string name="settings_download_storage_title">İndirme depolaması</string>
<string name="settings_system_equalizer_summary">Ses ayarlarını düzenle</string>
<string name="settings_system_equalizer_title">Sistem ekolayzır</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Gelişmeleri takip et</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">Görsel çözünürlüğünü ayarla</string>
@@ -442,9 +442,9 @@
<string name="undraw_thanks">İllüstrasyonlarıyla bu uygulamayı daha güzel hale getirmemize yardımcı olan unDrawa özel teşekkürler.</string>
<string name="undraw_url">https://undraw.co/</string>
<string name="home_sync_starred_albums_title">Yıldızlı Albümleri Senkronize Et</string>
<string name="widget_label">Tempo Widget</string>
<string name="widget_label">Tempus Widget</string>
<string name="widget_not_playing">Şu an oynatılmıyor</string>
<string name="widget_placeholder_subtitle">Tempoyu aç</string>
<string name="widget_placeholder_subtitle">Tempusyu aç</string>
<string name="widget_time_elapsed_placeholder">0:00</string>
<string name="widget_time_duration_placeholder">0:00</string>
<string name="widget_content_desc_album_art">Albüm kapağı</string>

View File

@@ -26,7 +26,7 @@
<string name="album_page_play_button">播放</string>
<string name="album_page_shuffle_button">随机播放</string>
<string name="album_page_tracks_count_and_duration">%1$d 首歌曲 • %2$d 分钟</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">正在搜索...</string>
<string name="artist_bottom_sheet_instant_mix">即时混合</string>
<string name="artist_bottom_sheet_shuffle">随机播放</string>
@@ -229,20 +229,20 @@
<string name="server_unreachable_dialog_positive_button">仍然继续</string>
<string name="server_unreachable_dialog_summary">请求的服务器不可用。 如果您选择继续,此对话框在接下来的一个小时内将不会再次出现。</string>
<string name="server_unreachable_dialog_title">服务器无法访问</string>
<string name="settings_about_summary">Tempo 是 Subsonic 的开源轻量级音乐客户端,专为 Android 设计和构建。</string>
<string name="settings_about_summary">Tempus 是 Subsonic 的开源轻量级音乐客户端,专为 Android 设计和构建。</string>
<string name="settings_about_title">关于</string>
<string name="settings_always_on_display">保持屏幕常亮</string>
<string name="settings_audio_transcode_download_format">转码格式</string>
<string name="settings_audio_transcode_download_priority_summary">如果启用Tempo 将不会强制使用下面的转码设置下载曲目。</string>
<string name="settings_audio_transcode_download_priority_summary">如果启用Tempus 将不会强制使用下面的转码设置下载曲目。</string>
<string name="settings_audio_transcode_download_priority_title">优先考虑服务器上用于流式传输的设置</string>
<string name="settings_audio_transcode_download_summary">如果启用Tempo 将下载转码后的曲目。</string>
<string name="settings_audio_transcode_download_summary">如果启用Tempus 将下载转码后的曲目。</string>
<string name="settings_audio_transcode_download_title">下载转码后的曲目</string>
<string name="settings_audio_transcode_estimate_content_length_summary">如果启用,将发送请求到服务器以查询曲目的估计持续时间。</string>
<string name="settings_audio_transcode_estimate_content_length_title">估计内容长度</string>
<string name="settings_audio_transcode_format_download">用于下载的转码格式</string>
<string name="settings_audio_transcode_format_mobile">移动数据下的转码格式</string>
<string name="settings_audio_transcode_format_wifi">Wi-Fi 下的转码格式</string>
<string name="settings_audio_transcode_priority_summary">如果启用Tempo 将不会强制使用下面的转码设置流式传输曲目。</string>
<string name="settings_audio_transcode_priority_summary">如果启用Tempus 将不会强制使用下面的转码设置流式传输曲目。</string>
<string name="settings_audio_transcode_priority_title">优先考虑服务器转码设置</string>
<string name="settings_audio_transcode_priority_toast">曲目转码设置优先级设置为服务器</string>
<string name="settings_buffering_strategy">缓存策略</string>
@@ -257,7 +257,7 @@
<string name="settings_download_storage_title">下载存储</string>
<string name="settings_system_equalizer_summary">调整音频设置</string>
<string name="settings_system_equalizer_title">系统均衡器</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">关注开发进展</string>
<string name="settings_github_title">Github</string>
<string name="settings_image_size">设置图像分辨率</string>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#626A75</color>
</resources>

View File

@@ -28,7 +28,7 @@
<string name="album_page_release_dates_label">Released on %1$s, originally %2$s</string>
<string name="album_page_shuffle_button">Shuffle</string>
<string name="album_page_tracks_count_and_duration">%1$d songs • %2$d minutes</string>
<string name="app_name">Tempo</string>
<string name="app_name">Tempus</string>
<string name="artist_adapter_radio_station_starting">Searching…</string>
<string name="artist_bottom_sheet_instant_mix">Instant mix</string>
<string name="artist_bottom_sheet_shuffle">Shuffle</string>
@@ -200,6 +200,7 @@
<string name="menu_sort_artist">Artist</string>
<string name="menu_sort_name">Name</string>
<string name="menu_sort_random">Random</string>
<string name="menu_sort_album_count">Album Count</string>
<string name="menu_sort_recently_added">Recently added</string>
<string name="menu_sort_recently_played">Recently played</string>
<string name="menu_sort_most_played">Most played</string>
@@ -291,22 +292,22 @@
<string name="server_unreachable_dialog_positive_button">Continue anyway</string>
<string name="server_unreachable_dialog_summary">The requested server is unavailable. If you choose to continue this dialog will not appear for the next hour.</string>
<string name="server_unreachable_dialog_title">Server unreachable</string>
<string name="settings_about_summary">Tempo is an open source and lightweight music client for Subsonic, designed and built natively for Android.</string>
<string name="settings_about_summary">Tempus is an open source and lightweight music client for Subsonic, designed and built natively for Android.</string>
<string name="settings_about_title">About</string>
<string name="settings_always_on_display">Always on display</string>
<string name="settings_allow_playlist_duplicates">Allow adding duplicates to playlist</string>
<string name="settings_allow_playlist_duplicates_summary">If enabled, duplicates won\'t be checked while adding to a playlist.</string>
<string name="settings_audio_transcode_download_format">Transcode format</string>
<string name="settings_audio_transcode_download_priority_summary">If enabled, Tempo will not force download the track with the transcode settings below.</string>
<string name="settings_audio_transcode_download_priority_summary">If enabled, Tempus will not force download the track with the transcode settings below.</string>
<string name="settings_audio_transcode_download_priority_title">Prioritize server settings used for streaming in downloads</string>
<string name="settings_audio_transcode_download_summary">If enabled, Tempo will download transcoded tracks.</string>
<string name="settings_audio_transcode_download_summary">If enabled, Tempus will download transcoded tracks.</string>
<string name="settings_audio_transcode_download_title">Download transcoded tracks</string>
<string name="settings_audio_transcode_estimate_content_length_summary">If enabled, the server will be asked for the estimated duration of the track.</string>
<string name="settings_audio_transcode_estimate_content_length_title">Estimate content length</string>
<string name="settings_audio_transcode_format_download">Transcode format for downloads</string>
<string name="settings_audio_transcode_format_mobile">Transcode format in mobile</string>
<string name="settings_audio_transcode_format_wifi">Transcode format in Wi-Fi</string>
<string name="settings_audio_transcode_priority_summary">If enabled, Tempo will not force stream the track with the transcode settings below.</string>
<string name="settings_audio_transcode_priority_summary">If enabled, Tempus will not force stream the track with the transcode settings below.</string>
<string name="settings_audio_transcode_priority_title">Prioritize server transcode settings</string>
<string name="settings_audio_transcode_priority_toast">Priority on transcoding of track given to server</string>
<string name="settings_buffering_strategy">Buffering strategy</string>
@@ -326,10 +327,10 @@
<string name="settings_set_download_folder">Set download folder</string>
<string name="settings_system_equalizer_summary">Adjust audio settings</string>
<string name="settings_system_equalizer_title">System equalizer</string>
<string name="settings_github_link">https://github.com/eddyizm/tempo</string>
<string name="settings_github_link">https://github.com/eddyizm/tempus</string>
<string name="settings_github_summary">Follow the development</string>
<string name="settings_github_title">Github</string>
<string name="settings_support_discussion_link">https://github.com/eddyizm/tempo/discussions</string>
<string name="settings_support_discussion_link">https://github.com/eddyizm/tempus/discussions</string>
<string name="settings_support_summary">Join community discussions and support</string>
<string name="settings_support_title">User support</string>
<string name="settings_scan_result">Scanning: counting %1$d tracks</string>
@@ -409,8 +410,9 @@
<string name="share_bottom_sheet_delete">Delete share</string>
<string name="share_bottom_sheet_update">Update share</string>
<string name="share_subtitle_item">Expiration date: %1$s</string>
<string name="share_no_expiration">Never</string>
<string name="share_unsupported_error">Sharing is not supported or not enabled</string>
<string name="asset_link_clipboard_label">Tempo asset link</string>
<string name="asset_link_clipboard_label">Tempus asset link</string>
<string name="asset_link_label_song">Song UID</string>
<string name="asset_link_label_album">Album UID</string>
<string name="asset_link_label_artist">Artist UID</string>
@@ -494,9 +496,9 @@
<string name="undraw_page">unDraw</string>
<string name="undraw_thanks">A special thanks goes to unDraw without whose illustrations we could not have made this application more beautiful.</string>
<string name="undraw_url">https://undraw.co/</string>
<string name="widget_label">Tempo Widget</string>
<string name="widget_label">Tempus Widget</string>
<string name="widget_not_playing">Not playing</string>
<string name="widget_placeholder_subtitle">Open Tempo</string>
<string name="widget_placeholder_subtitle">Open Tempus</string>
<string name="widget_time_elapsed_placeholder">0:00</string>
<string name="widget_time_duration_placeholder">0:00</string>
<string name="widget_content_desc_album_art">Album artwork</string>
@@ -523,4 +525,9 @@
<string name="equalizer_not_supported">Not supported on this device</string>
<string name="settings_app_equalizer">Equalizer</string>
<string name="settings_app_equalizer_summary">Open the built-in equalizer</string>
<string name="settings_album_detail">Show album detail</string>
<string name="settings_album_detail_summary">If enabled, show the album details like genre, song count etc. on the album page</string>
<string name="settings_artist_sort_by_album_count">Sort artists by album count</string>
<string name="settings_artist_sort_by_album_count_summary">If enabled, sort the artists by album count. Sort by name if disabled.</string>
</resources>

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