Compare commits

...

1748 Commits

Author SHA1 Message Date
Niels van Velzen
1a8d821622 Show UI mode notification on startup screen 2023-07-01 15:34:32 +02:00
Niels van Velzen
bf4fa8ea5d Add more logging to authentication code
(cherry picked from commit f18557934c)
2023-07-01 15:24:54 +02:00
Niv Harel
df561f88f5 focus back on versions button when selecting a version
(cherry picked from commit 84e9ced5ad)
2023-07-01 15:24:02 +02:00
Niels van Velzen
20f62243aa Fix horizontal grid position resetting on resume 2023-07-01 08:59:12 +02:00
Niels van Velzen
027d1b1010 Fix ItemLauncher retrieving base item via from media manager when launching a photo 2023-06-03 14:14:37 +02:00
StubbyB
d565617e0b Fix InfoLayoutHelper not using first video stream, update details when selecting version (#2812)
(cherry picked from commit 9657743a19)
2023-06-03 14:00:33 +02:00
Niels van Velzen
208dc4feb9 Fix Live TV progress reporting
(cherry picked from commit 046917020d)
2023-06-03 14:00:33 +02:00
Niels van Velzen
3c4613c63f Fix rare race condition crash in HomeFragment
(cherry picked from commit 49b8526338)
2023-06-03 14:00:33 +02:00
Niels van Velzen
b6605958b1 Fix playback of seasons with external player
(cherry picked from commit 49a326c74c)
2023-06-03 14:00:33 +02:00
Niels van Velzen
57730b75e2 Fix race condition in HomeFragment causing a crash when profile picture loads when the view is already destroyed
(cherry picked from commit 570f9ec4ba)
2023-06-03 14:00:32 +02:00
Niels van Velzen
74fe6658cc Fix PictureViewerFragment using activityViewModel
(cherry picked from commit 61324816d7)
2023-06-03 14:00:32 +02:00
renovate[bot]
a8d45cecd7 Update dependency org.jellyfin.exoplayer:exoplayer-ffmpeg-extension to v2.18.7+1
(cherry picked from commit 79c80198c1)
2023-06-03 13:51:45 +02:00
renovate[bot]
6994234bd0 Update dependency com.google.android.exoplayer:exoplayer to v2.18.7
(cherry picked from commit fd16bf51b8)
2023-06-03 13:51:42 +02:00
Niels van Velzen
1ccfa7eae6 Hide SSA tags from SRT subtitles
(cherry picked from commit 05651d37d2)
2023-06-03 13:50:11 +02:00
Niels van Velzen
7749e401ad Fix resume row not hiding when empty
(cherry picked from commit c437842209)
2023-05-02 17:12:32 +02:00
Niels van Velzen
b2b60bf78a Add support for retrieving resume items in BaseRowAdapter using the SDK
(cherry picked from commit 1d44c83501)
2023-04-30 16:31:18 +02:00
Niels van Velzen
e2ede5b7be Allow changing the (a)ac3 bitstreaming option on all devices
(cherry picked from commit 1d91af6956)
2023-04-27 19:36:30 +02:00
renovate[bot]
985e4ef9a7 Update dependency org.jellyfin.exoplayer:exoplayer-ffmpeg-extension to v2.18.6+1
(cherry picked from commit 936356f835)
2023-04-27 17:22:46 +02:00
Niels van Velzen
7d5895134b Fix ExoPlayerProfile not always listing SubRip and SRT as external
(cherry picked from commit 991447f797)
2023-04-27 17:22:45 +02:00
Niels van Velzen
dc5bf6b47d Fix ExpandableTextView cutting content
(cherry picked from commit 3d5142c108)
2023-04-27 17:22:43 +02:00
renovate[bot]
147fc4f772 Update dependency org.jellyfin.sdk:jellyfin-core to v1.4.2
(cherry picked from commit 84efc6a693)
2023-04-27 17:22:42 +02:00
Niels van Velzen
ecead3fad8 Fix ExoPlayer extensions not used for music playback (backport) 2023-04-27 15:24:12 +02:00
Niels van Velzen
834bebb03f Add DVB subtitle support in ExoPlayer
(cherry picked from commit 93979e1d38)
2023-04-23 15:40:58 +02:00
Niels van Velzen
a001846da7 Enable PGS subtitles in ExoPlayer
(cherry picked from commit d63ac02525)
2023-04-23 10:58:46 +02:00
Niels van Velzen
5c7bf941ea Fix switching ExoPlayer subtitle track
(cherry picked from commit e903d8c347)
2023-04-23 10:58:44 +02:00
Niels van Velzen
53b92184a4 Fix offsetStreamIndex when selecting last track
(cherry picked from commit f862a17223)
2023-04-23 10:58:43 +02:00
renovate[bot]
1e369480fd Update dependency com.google.android.exoplayer:exoplayer to v2.18.6
(cherry picked from commit 4699454d5d)
2023-04-23 10:58:26 +02:00
Niels van Velzen
e00f6d3f40 Fix app crash when playback stop is requested without an active player
(cherry picked from commit f99451d22e)
2023-04-23 10:55:33 +02:00
Niels van Velzen
5e85a876bd Add F-Droid badge to README
(cherry picked from commit 1b44358f10)
2023-04-03 21:04:43 +02:00
Niels van Velzen
5249209f3a Fix "null" on Live TV guide "load channels" button 2023-04-03 19:32:56 +02:00
Niels van Velzen
276e138d7a Set screenOrientation for PreferencesActivity
(cherry picked from commit fb651b173c)
2023-04-03 19:31:41 +02:00
Niels van Velzen
00cc8f14ec Fix app closing when music queue ends
(cherry picked from commit 25e8738818)
2023-04-03 19:31:36 +02:00
Niels van Velzen
f14a8fa6b8 Store accounts in Account Manager by address
(cherry picked from commit 6806f69c62)
2023-04-03 19:31:23 +02:00
Niels van Velzen
6191044057 Always check server id when retrieving user data from AccountManagerStore
(cherry picked from commit 6712eeb781)
2023-03-12 10:34:04 +01:00
Niels van Velzen
d0365ced7e Fix SearchFragment not restoring properly
(cherry picked from commit 0a30b50904)
2023-03-12 10:34:03 +01:00
Niels van Velzen
9c8143368f Add workaround for non reproducible baseline profiles in AGP
(cherry picked from commit eada9ea21c)
2023-03-12 10:34:03 +01:00
omm
266d5738a6 Add IncludeType param when sending number query
(cherry picked from commit 68f6b3a3ef)
2023-03-12 10:34:03 +01:00
renovate[bot]
e34442a432 Update dependency com.google.android.exoplayer:exoplayer to v2.18.4
(cherry picked from commit 7a5ee0b229)
2023-03-12 10:34:02 +01:00
David Fairbrother
12e4c96304 Accept KEYCODE_ENTER as alt to KEYCODE_CENTER
Adds KEYCODE_ENTER wherever we accept KEYCODE_DPAD_CENTER. This was
reported in #2526 where third-party remotes will use the former instead
of the latter value.

I've added this to all places we accept CENTER, since our most of our
Kotlin code already accepts this as an alternative and I can't forsee a
case where we would want these to accept different things.

This was tested in the emulator to ensure we've not broken the existing
mapping, but short of using the enter key (which works) I can't verify
this fixes the original issue.

(cherry picked from commit b3bc4b0d8c)
2023-03-12 10:33:34 +01:00
Niels van Velzen
857ad84771 Add missing mediaManager injection to EnhancedBrowseFragment 2023-02-26 17:10:48 +01:00
Niels van Velzen
7dfd3b9179 Mark LibVLC as experimental
(cherry picked from commit 74a7898fcd)
2023-02-26 17:08:16 +01:00
Niels van Velzen
63de8d16d2 Fix theme not applied before creating views
(cherry picked from commit 328072a36c)
2023-02-26 16:59:46 +01:00
Niels van Velzen
b771bb4c27 Only attach background service in activities
(cherry picked from commit bbc7f3eea4)
2023-02-26 16:59:42 +01:00
Niels van Velzen
2b01ac9ffc Don't show "invalid credentials" message when authentication fails with an SDK exception
(cherry picked from commit 84dc7fc48d)
2023-02-26 16:59:34 +01:00
renovate[bot]
b857fb4f1c Update dependency com.google.android.exoplayer:exoplayer to v2.18.3
(cherry picked from commit f10cbc05d7)
2023-02-26 16:59:24 +01:00
Timmeh
19707eb9c8 Fix old items are shown when new filter is applied. (#2472)
* clear rows after applying new filter.

* Always set current item to toolbar if current item is filtered out.

(cherry picked from commit 215b0e9f2c)
2023-02-26 16:58:34 +01:00
Niels van Velzen
c60d210e87 Fix rare picture viewer crash when album is empty
(cherry picked from commit e3d5262b5b)
2023-02-26 16:58:16 +01:00
Niels van Velzen
cb046c26c5 Change opening menu to ACTION_UP instead of ACTION_DOWN
(cherry picked from commit 22b4ecf0ec)
2023-01-24 21:23:20 +01:00
Niels van Velzen
3d97b5abb0 Use HEADER_ACCEPT from SDK as Glide Accept header value
(cherry picked from commit a7b06d39e1)
2023-01-24 21:23:18 +01:00
Niels van Velzen
da8c7c2837 Set Accept header in Glide requests
(cherry picked from commit 3839d1c5d1)
2023-01-24 21:23:17 +01:00
renovate[bot]
d9c11d86ad Update dependency org.jellyfin.sdk:jellyfin-core to v1.4.1
(cherry picked from commit 80a2dd5ac1)
2023-01-24 21:23:15 +01:00
Niels van Velzen
b9172845d8 Increase amount of logs added to crash reports
Some stacktraces with Kotlin coroutines can get big. Right now we have 100 lines and this often is not enough to see what happened before the exception. Increasing the count to 250 should hopefully fix that.

(cherry picked from commit 5b83a6de9a)
2023-01-24 21:23:15 +01:00
Niels van Velzen
3d3fa76771 Remove experimental audio codecs from transcoding profile
(cherry picked from commit 3c70b8abf5)
2023-01-10 13:45:37 +01:00
Niels van Velzen
521183d427 Fix BrowseGridFragment focus not restoring when going back
(cherry picked from commit b5b87fb625)
2023-01-10 13:45:36 +01:00
Niels van Velzen
103f8babd5 Fix IndexOutOfBoundsException in setExoPlayerTrack 2023-01-04 22:06:58 +01:00
kevgrig
4ec0bcba72 Support fast forward and rewind in audio player (#2380)
* Support fast forward and rewind in audio player

Signed-off-by: Kevin G <kevin@myplaceonline.com>

* Use CDI for UserSettingPreferences

Signed-off-by: Kevin G <kevin@myplaceonline.com>

Signed-off-by: Kevin G <kevin@myplaceonline.com>
2023-01-04 08:55:00 +01:00
Niels van Velzen
096a4362c6 Allow all supported audio codecs in ExoPlayer transcoding profile 2023-01-04 08:54:06 +01:00
Martin P
3ad59c8a4d Translated using Weblate (French)
Currently translated at 100.0% (495 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2023-01-01 14:51:18 -05:00
ByKripsy
a07a2d5fbe Translated using Weblate (French)
Currently translated at 99.7% (494 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-12-31 11:51:17 -05:00
Niels van Velzen
ad1f12b289 Fix crash when opening menu for AlbumArtist
isFolder() returned null which caused a NPE
2022-12-30 09:30:07 +01:00
Niels van Velzen
06d98f64a8 Fix scaling of album images in audio queue on now playing screen 2022-12-29 20:52:41 +01:00
Niels van Velzen
9ad1ff0cde Update build files 2022-12-29 09:55:34 +01:00
0TTA
a3d7a69d5f Translated using Weblate (Arabic)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/ar/
2022-12-26 08:51:16 -05:00
0TTA
d9b0835687 Translated using Weblate (Arabic)
Currently translated at 98.7% (489 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2022-12-26 08:51:16 -05:00
Niels van Velzen
342b0724ed Validate current user from UserRepository in validateAuthentication() 2022-12-17 21:27:05 +01:00
Niels van Velzen
9045a65721 Fix race condition in ItemListFragment causing favorite music screen to crash 2022-12-17 16:01:08 +01:00
Weblate
d08ea45cb2 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-12-17 09:58:23 -05:00
Teo Baranga
c1c6cd1aea Remember button focus on details screen 2022-12-17 15:58:19 +01:00
Bas
d62315ffd9 Translated using Weblate (Dutch)
Currently translated at 98.3% (487 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-12-16 08:51:11 -05:00
Weblate
2bb5dde570 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-12-14 03:12:32 -05:00
Niels van Velzen
aca0c454cd Remove direct path option from external player (#2342)
* Remove direct path option from external player

Direct paths have been deprecated in the server a while back (and is pending removal). Now that it broke in 0.15 it's easier to remove then to fix it.

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/ExternalPlayerActivity.java

Co-authored-by: Cody Robibero <cody@robibe.ro>

Co-authored-by: Cody Robibero <cody@robibe.ro>
2022-12-14 09:12:27 +01:00
DJSweder
f0b86e44d8 Translated using Weblate (Czech)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-12-13 06:51:11 -05:00
João Batista
747b821ec7 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2022-12-12 13:51:10 -05:00
Niels van Velzen
f0178663d5 Revert "Remember button focus on summary page"
This reverts commit 0c8fe45b06.
2022-12-10 19:20:18 +01:00
danngalann
c7b7f2f718 Translated using Weblate (Catalan)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ca/
2022-12-10 06:51:10 -05:00
renovate[bot]
965da62f28 Update dependency androidx.compose.ui:ui-tooling to v1.3.2 2022-12-10 12:29:00 +01:00
Niels van Velzen
59f16ca4cf Split compose versions in catalog 2022-12-10 12:19:47 +01:00
renovate[bot]
8bf9bd1c57 Update dependency androidx.fragment:fragment-ktx to v1.5.5 2022-12-10 11:04:03 +01:00
hoanghuy309
fb259dfe46 Translated using Weblate (Vietnamese)
Currently translated at 97.9% (488 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-12-07 21:51:09 -05:00
Niels van Velzen
6ab2c24e53 Fix crash when stopping playback with back button when refresh rate switching is enabled 2022-12-07 09:35:08 +01:00
Niels van Velzen
9d3c2d2db8 Fix Live TV program time in RecordPopup 2022-12-07 07:59:25 +01:00
Niels van Velzen
8cf9cc30ba Fix opening Live TV recordings in FullDetailsFragment 2022-12-07 07:59:25 +01:00
Niels van Velzen
d5b48a95f0 Fix Live TV program end time in FullDetailsFragment 2022-12-07 07:59:25 +01:00
Niels van Velzen
13a8990b81 Fix acra-core dependency using wrong name 2022-12-07 07:07:59 +01:00
renovate[bot]
fef0e76733 Update dependency org.jellyfin.sdk:jellyfin-core to v1.4.0 2022-12-06 15:11:58 +01:00
Niels van Velzen
a6729a7ec7 Rewrite session validation code to not use callbacks 2022-12-06 10:15:40 +01:00
João Batista
4777840bb0 Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2022-12-05 12:51:08 -05:00
Niels van Velzen
2bcd2b9482 Fix LegacyImageCardView scaling on non-1080p devices 2022-12-04 17:42:06 +01:00
Teo Baranga
0c8fe45b06 Remember button focus on summary page 2022-12-04 17:37:32 +01:00
Bas
225b78d67a Translated using Weblate (Dutch)
Currently translated at 98.3% (490 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-12-03 10:51:07 -05:00
Niels van Velzen
6020ed2e74 Remove mActivity from EnhancedBrowseFragment 2022-12-03 14:16:16 +01:00
Kirill Tyurin
3439038f8c Translated using Weblate (Russian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-11-29 14:51:06 -05:00
Niels van Velzen
3264d22fb2 Fix notification card not focusable on older Android versions 2022-11-29 19:32:50 +01:00
Niels van Velzen
4d4b4515bb Fix crash when opening Live TV series 2022-11-29 15:38:46 +01:00
renovate[bot]
236314050d Update exoplayer 2022-11-27 10:54:43 +01:00
wolong gl
41cd7425df Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-11-26 06:51:05 -05:00
fknght
b0178cca8c Translated using Weblate (Greek)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-11-26 06:51:04 -05:00
Niels van Velzen
675f285a72 Rewrite theming code to not use callbacks 2022-11-25 11:54:42 +01:00
Niels van Velzen
5523309223 Fix opening Live TV series timers 2022-11-25 11:54:25 +01:00
Niels van Velzen
45a29f34bc Fix opening Live TV recordings 2022-11-25 11:54:12 +01:00
Niels van Velzen
ed06b5c255 Fix TimeUtils.getDate not using UTC for offset 2022-11-22 15:23:57 +01:00
Per
6629864913 Translated using Weblate (German)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-11-22 05:51:03 -05:00
renovate[bot]
f7a89233bc Update dependency org.jellyfin.sdk:jellyfin-core to v1.4.0-beta.2 2022-11-20 09:36:49 +01:00
hoanghuy309
95cf3751ae Translated using Weblate (Vietnamese)
Currently translated at 96.3% (480 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-11-19 12:51:02 -05:00
Niels van Velzen
aeebbaf5c1 Fix NPE in ExternalPlayerActivity when getMediaSource() returns null 2022-11-17 09:52:24 +01:00
Niels van Velzen
36009c5ab4 Fix opening user view with no collection type 2022-11-17 09:52:14 +01:00
renovate[bot]
ab1d976458 Update github/codeql-action digest to 678fc3a 2022-11-16 21:27:42 +01:00
Niels van Velzen
6c91002725 Fix EnhancedBrowseFragment duplicating items on resume 2022-11-16 18:52:02 +01:00
Niels van Velzen
0c966e1936 Use ItemRowAdapterHelper.setItems for more row types 2022-11-16 18:51:53 +01:00
nextlooper42
2057ec95c3 Translated using Weblate (Slovak)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-11-16 06:40:45 -05:00
Niels van Velzen
5968bb0965 Delay home fragment refreshing 2022-11-14 20:38:58 +01:00
renovate[bot]
f46e5fc807 Update github/codeql-action digest to 4238421 2022-11-14 17:27:19 +01:00
Andi Chandler
a990538ffa Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-11-14 07:51:00 -05:00
Csaba
1276956229 Translated using Weblate (Hungarian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-11-14 02:51:00 -05:00
Niels van Velzen
476e73d988 Fix missing checkboxes in player audio, subtitle and zoom menu 2022-11-14 08:39:07 +01:00
Oskari Lavinto
36e1a3c2c1 Translated using Weblate (Finnish)
Currently translated at 99.1% (494 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-11-13 08:51:00 -05:00
DeathHarmony
bdf0d1ca2c Translated using Weblate (German)
Currently translated at 97.7% (486 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-11-12 08:28:40 -05:00
Niels van Velzen
8e9d5ef24c Add dismissible notification for beta releases 2022-11-12 14:28:35 +01:00
Bas
04acbb9e30 Translated using Weblate (Dutch)
Currently translated at 98.5% (490 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-11-12 05:50:59 -05:00
Larvitar
9945c870bc Translated using Weblate (Polish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2022-11-11 19:51:00 -05:00
renovate[bot]
2a6d236b1d Update dependency com.squareup.leakcanary:leakcanary-android to v2.10 2022-11-11 15:46:18 +01:00
Tom
986ad0c17e Translated using Weblate (Lithuanian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2022-11-11 08:51:02 -05:00
lojden
067bb13287 Translated using Weblate (Swedish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-11-11 08:50:59 -05:00
renovate[bot]
fdec4d8407 Update androidx-compose to v1.3.1 2022-11-11 07:10:14 +01:00
João Batista
51df9e4c17 Translated using Weblate (Portuguese (Portugal))
Currently translated at 95.9% (477 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2022-11-10 16:50:59 -05:00
Niels van Velzen
33df66172d Fix bad version.ref in dependency catalog 2022-11-10 22:31:30 +01:00
Tom
8f74d49e87 Translated using Weblate (Lithuanian)
Currently translated at 50.1% (249 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2022-11-10 11:51:00 -05:00
Weblate
2775f4d8de Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-11-10 08:51:00 -05:00
Tom
70f4b2c967 Translated using Weblate (Lithuanian)
Currently translated at 30.7% (153 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2022-11-10 08:50:59 -05:00
Herman Ho
1d334f94cf Translated using Weblate (Chinese (Traditional))
Currently translated at 96.7% (481 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2022-11-09 20:50:59 -05:00
Tom
2b31fd3f97 Translated using Weblate (Lithuanian)
Currently translated at 23.9% (119 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2022-11-09 12:50:59 -05:00
Niels van Velzen
6486713146 Avoid clearing all items on ItemRowAdapter load 2022-11-09 16:03:21 +01:00
linlou
ab6ae6cd16 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.5% (485 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-11-09 04:50:58 -05:00
DenizenB
23250c6888 apply subtitle delay to external subs 2022-11-08 13:13:36 +01:00
The Randalorian
0619cbdbcf Add Video Codec Tag 2022-11-08 13:13:00 +01:00
Niels van Velzen
f53dba8491 Focus HomeRowsFragment by default, fix wrong focus on resume 2022-11-08 12:42:51 +01:00
Niels van Velzen
5657dfb22a Merge HomeToolbarFragment into HomeFragment 2022-11-08 12:42:51 +01:00
DJSweder
4ce0fe81b2 Translated using Weblate (Czech)
Currently translated at 97.7% (486 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-11-06 09:50:57 -05:00
renovate[bot]
1270123872 Update github/codeql-action digest to c3b6fce 2022-11-05 10:43:36 +01:00
Niels van Velzen
78b1de23c7 Fix app crash when playing trailers 2022-11-04 21:49:29 +01:00
Niels van Velzen
83e1fb9a59 Always reset navigation in StartupActivity 2022-11-04 21:49:18 +01:00
DenizenB
f1e8e989ed Translated using Weblate (Swedish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-11-04 13:50:57 -04:00
renovate[bot]
ee9520d45b Update dependency com.google.devtools.ksp to v1.7.20-1.0.8 2022-11-04 09:17:14 +01:00
renovate[bot]
4eddfaf8f3 Update dependency io.kotest:kotest-runner-junit5 to v5.5.4 2022-11-04 09:17:05 +01:00
renovate[bot]
be51a9893b Update github/codeql-action digest to 18fe527 2022-11-03 08:50:55 +01:00
Csaba
46a7b4a345 Translated using Weblate (Hungarian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-11-02 05:50:56 -04:00
Eduardo Santiago
104b707b9b Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-11-01 11:50:56 -04:00
lenn219
51fdd79999 Translated using Weblate (Dutch)
Currently translated at 98.5% (490 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-11-01 11:50:56 -04:00
Niels van Velzen
00e1eb6e08 Update Jellyfin SDK to 1.4.0-beta.1 2022-11-01 14:18:46 +01:00
Niels van Velzen
9d66eeef0d Rename xml layout starting with activity_ to fragment_ 2022-11-01 06:58:23 +01:00
Niels van Velzen
5acbae0c16 Fix StartupActivity set destination is ignored 2022-10-31 20:46:39 +01:00
Andi Chandler
9a9d513de6 Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-10-31 12:50:55 -04:00
renovate[bot]
4345ea301d Update eps1lon/actions-label-merge-conflict action to v2.1.0 2022-10-31 14:15:35 +01:00
Weblate
d6ca138cdf Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-10-31 05:50:56 -04:00
millallo
019c62756d Translated using Weblate (Italian)
Currently translated at 99.5% (495 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-10-31 05:50:55 -04:00
Niels van Velzen
52465bb3c8 Add placeholder drawable for ImageProvider 2022-10-31 07:31:43 +01:00
sensei73
c8355ae445 Translated using Weblate (French)
Currently translated at 99.3% (494 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-10-30 21:50:55 -04:00
Niels van Velzen
6429fb3ff5 Update Detekt to ignore FunctionNaming for @Composable 2022-10-30 12:25:25 +01:00
Niels van Velzen
099dd125bd Rewrite SplashFragment in Compose 2022-10-30 12:25:25 +01:00
Niels van Velzen
1301cb9f52 Load fresh item data in AudioTrackQueue 2022-10-29 22:16:52 +02:00
Stelios Diamantis
2b48e39195 Translated using Weblate (Greek)
Currently translated at 98.9% (492 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-10-29 15:50:55 -04:00
Dionysis Theofilopoulos
e336763964 Translated using Weblate (Greek)
Currently translated at 97.1% (483 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-10-29 06:50:54 -04:00
renovate[bot]
2d4cd0ebd8 Update alexellis/upload-assets action to v0.4.0 2022-10-29 12:17:23 +02:00
cameron
4a4efb2467 fix seekbar not updating when using ff/rw buttons 2022-10-29 11:29:49 +02:00
Peng-Hui Yang
0cf79cfd82 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.7% (486 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-10-29 00:50:54 -04:00
Niels van Velzen
196d3bc6bd Use fade animation when navigating 2022-10-28 21:10:56 +02:00
Niels van Velzen
b5a6e733c2 Fix EnhancedBrowseFragment registering multiple listeners 2022-10-28 21:10:48 +02:00
emidriel
d5a9744123 Translated using Weblate (Norwegian Bokmål)
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/nb_NO/
2022-10-28 12:50:54 -04:00
renovate[bot]
cb1a84862d Update kotest to v5.5.3 2022-10-28 08:48:25 +02:00
Oskari Lavinto
2fa53e7650 Translated using Weblate (Finnish)
Currently translated at 99.1% (493 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-10-27 04:50:54 -04:00
Niels van Velzen
a73e04c216 Fix setExoPlayerTrack exception when allStreams is empty 2022-10-27 07:07:40 +02:00
Niels van Velzen
0938a8a19a Rework BrandedQueueEntry and UserQueueEntry implementation 2022-10-26 23:04:28 +02:00
Niels van Velzen
539c8f5937 Add queue 2022-10-26 23:04:28 +02:00
Niels van Velzen
4db9973d65 Minor changes to subtitle coloring code 2022-10-26 22:15:25 +02:00
sparky3387
8845429e9f Initial commit
pick 13699f674 Initial commit
    squash 7e8af2dc4 Modify RichListDialog to display subtitle colors
    squash 19fcb1514 Modify RichListOption to display subtitle colors

Modify RichListDialog to display subtitle colors

Modify RichListOption to display subtitle colors

Add Subtitle options to preferences list

Added dark grey option and match master commit as much as possible

Fix line length

Fix line length

Fix API Level to Support 21 Lint Error 1

Fix API Level to Support 21 Lint Error 1

Fix API Level to Support 21 Lint Error 1

Fix API Level to Support 21 Lint Error 2

Update app/src/main/res/values/strings.xml

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/preference/UserPreferences.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/shared/StrokeTextView.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Requested resolutions implemented part 1

Update app/src/main/java/org/jellyfin/androidtv/ui/preference/dsl/OptionsColorList.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/shared/StrokeTextView.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Requested resolutions implemented part 2, restore RichListDialogFragment.kt and add ColorPickerDialogFragment and ColorListPreference

Requested resolutions implemented part 3, restore distributionkey

Rebased PlaybackPreferencesScreen.kt

Update app/src/main/java/org/jellyfin/androidtv/preference/UserPreferences.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/preference/dsl/OptionsColorList.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Resolve line length and magic number issues, using different background for the brighter colors

Update app/src/main/java/org/jellyfin/androidtv/ui/shared/StrokeTextView.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Resolve magic numbers attempt

Resolve line length issue

Remove unnecessary antialias

Update app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/PlaybackPreferencesScreen.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Move subtitle setting preference to where the rest of the settings are located
Resolve formatting issue in PlaybackPreferenceScreen

Update PlaybackPreferencesScreen.kt

Fixing formatting

Move subtitle setting preference to where the rest of the settings are located
Resolve formatting issue in PlaybackPreferenceScreen
Resolve import of userpreferences in StrokeTextView.kt

Removed unnecessary functions and data attributes from ColorPickerDialogFragment.k

Update app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Update app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/PlaybackPreferencesScreen.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Resolve magic numbers on lighter colors

Resolve positioning of subtitles and importing of preferences

Correct positioning of subtitlesTextColor in UserPreferences.kt
Lower Increment

Resolve preference issue

Resolve UserPreferences import
2022-10-26 22:15:25 +02:00
Niels van Velzen
9aec957ca5 Use ImageProvider in MediaContentProvider
This fixes the issue where images would not show when the server was accessed over HTTP
2022-10-26 17:56:13 +02:00
Niels van Velzen
0408b5d842 Use ImageProvider in LeanbackChannelWorker 2022-10-26 17:56:13 +02:00
Niels van Velzen
d0c3c51ef2 Add ImageProvider for retrieval of images in platform integration 2022-10-26 17:56:13 +02:00
renovate[bot]
b6459bde73 Update github/codeql-action digest to ec3cf9c 2022-10-26 14:57:24 +02:00
KD Puvvadi
a71329a2f6 Translated using Weblate (Telugu)
Currently translated at 8.4% (41 of 485 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/te/
2022-10-26 03:50:53 -04:00
Niels van Velzen
05f8b79cd4 Don't use LibraryDreamService.TRANSITION_DURATION in FadeViewSwitcherLayout 2022-10-25 14:30:53 +02:00
Niels van Velzen
8ac5606f06 Remove direct GSON dependency
We don't use it in the app anymore, it's still added indirectly because the old apiclient uses it.
2022-10-25 14:30:42 +02:00
KD Puvvadi
12cf7d8e66 Added translation using Weblate (Telugu) 2022-10-25 07:44:53 -04:00
renovate[bot]
ecf556e416 Update koin to v3.3.0 2022-10-25 09:25:12 +02:00
renovate[bot]
bf8db9c600 Update gradle/wrapper-validation-action digest to 55e685c 2022-10-24 20:49:02 +02:00
renovate[bot]
e994238de1 Update dependency io.insert-koin:koin-androidx-compose to v3.3.0 2022-10-24 20:44:21 +02:00
renovate[bot]
47551a89e8 Update dependency androidx.activity:activity-ktx to v1.6.1 2022-10-24 16:44:16 +02:00
renovate[bot]
0ea00447b8 Update dependency androidx.fragment:fragment-ktx to v1.5.4 2022-10-24 16:44:09 +02:00
renovate[bot]
a0515002c1 Update kotest to v5.5.2 2022-10-23 22:24:35 +02:00
renovate[bot]
4738b0c0ad Update gradle/gradle-build-action digest to 3fbe033 2022-10-22 19:17:11 +02:00
renovate[bot]
d21b35830c Update dependency io.insert-koin:koin-androidx-compose to v3.2.2 2022-10-22 13:14:37 +02:00
Niels van Velzen
62c1e816b6 Add compose support 2022-10-22 10:13:45 +02:00
renovate[bot]
7c769c2f41 Update actions/upload-artifact digest to 83fd05a 2022-10-22 10:02:44 +02:00
renovate[bot]
7e386babde Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.7 2022-10-19 21:46:49 +02:00
renovate[bot]
bc5441b157 Update koin to v3.2.3 2022-10-18 21:13:46 +02:00
Paul Dee
f5acc050af Translated using Weblate (Ukrainian)
Currently translated at 100.0% (485 of 485 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-10-18 12:50:52 -04:00
renovate[bot]
6628b00851 Update actions/setup-java digest to de1bb2b 2022-10-18 18:50:49 +02:00
renovate[bot]
7815f80da6 Update github/codeql-action digest to cc7986c 2022-10-18 18:50:42 +02:00
newton181
de7d8e6b8b Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (485 of 485 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2022-10-17 21:50:50 -04:00
renovate[bot]
b4c0ca341e Update aboutlibraries to v10.5.1 2022-10-17 22:16:33 +02:00
Niels van Velzen
b12b204c80 Show keyboard on right on text search fragment 2022-10-15 14:57:31 +02:00
Weblate
eb36d61217 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-10-15 05:05:27 -04:00
Niels van Velzen
c568ec6a7a Remove PhotoPlayerActivity 2022-10-15 11:05:23 +02:00
Niels van Velzen
3048fd602f Automatically hide picture viewer actions after 4 seconds 2022-10-15 10:57:31 +02:00
renovate[bot]
37a586a91e Update dependency org.jetbrains.kotlinx:kotlinx-serialization-json to v1.4.1 2022-10-15 10:21:58 +02:00
Segi
962d56e95e Translated using Weblate (Hebrew)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/he/
2022-10-14 01:50:48 -04:00
Segi
111d527e27 Translated using Weblate (Hebrew)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2022-10-14 01:50:48 -04:00
Niels van Velzen
48a46ca146 Show picture viewer controls by default 2022-10-14 07:29:59 +02:00
renovate[bot]
c7500ec862 Update dependency com.google.devtools.ksp to v1.7.20-1.0.7 2022-10-14 07:29:48 +02:00
Weblate
e85a84f14d Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-10-13 15:16:53 -04:00
renovate[bot]
aee3e2c8ba Update dependency com.android.tools.build:gradle to v7.3.1 2022-10-13 21:16:49 +02:00
netanel
bdb4acfdc7 Translated using Weblate (Hebrew)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2022-10-13 08:50:48 -04:00
Segi
f9c7cfb0e5 Translated using Weblate (Hebrew)
Currently translated at 99.7% (485 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2022-10-13 03:50:48 -04:00
Weblate
7959bd5c19 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-10-12 10:33:45 -04:00
Niels van Velzen
6960c4ec7b Rewrite smaller playback classes to Kotlin 2022-10-12 16:33:39 +02:00
Niels van Velzen
dad7d64f6c Rewrite data\compat in Kotlin 2022-10-12 16:33:39 +02:00
Weblate
43b3d121bc Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-10-11 01:30:30 -04:00
Niels van Velzen
31be62946b Remove unused strings 2022-10-11 07:30:25 +02:00
Niels van Velzen
905ca61d38 Remove unused actors and search tile drawables 2022-10-11 07:30:25 +02:00
renovate[bot]
db497c0ad9 Update kotest to v5.5.1 2022-10-09 21:54:22 +02:00
Niels van Velzen
6bdde2c2bc Don't use activity.isFinishing() 2022-10-09 19:22:54 +02:00
Niels van Velzen
e497f3998c Replace Response<> usages with LifecycleAwareResponse<> in fragments 2022-10-09 19:22:44 +02:00
millallo
409301f526 Translated using Weblate (Italian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-10-09 05:54:40 -04:00
Niels van Velzen
a48c696a34 Fix PictureViewerFragment crashing when opening photo from latest row 2022-10-09 08:43:58 +02:00
wolong gl
ee2ff96327 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hans/
2022-10-09 01:54:39 -04:00
wolong gl
52e92b995a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-10-09 01:54:39 -04:00
Niels van Velzen
553e218d83 Check Lifecycle.State.STARTED instead of Lifecycle.State.INITIALIZED 2022-10-08 22:59:18 +02:00
Alan Azar
964a100f0b Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-10-08 14:54:40 -04:00
Niels van Velzen
8c3f54899e Check lifecycle state when runnable executes 2022-10-08 18:28:36 +02:00
nextlooper42
84b0291a65 Translated using Weblate (Slovak)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-10-08 09:54:39 -04:00
hoanghuy309
fd958874c0 Translated using Weblate (Vietnamese)
Currently translated at 98.1% (488 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-10-08 06:54:39 -04:00
Niels van Velzen
4fa4cd48f5 Add lifecycle response 2022-10-08 10:12:46 +02:00
Niels van Velzen
d3c35725e8 Rewrite MyDetailsOverviewRow in Kotlin 2022-10-08 10:12:36 +02:00
Niels van Velzen
04b6be7177 Rewrite presenters in Kotlin 2022-10-08 10:12:26 +02:00
renovate[bot]
023b4a8e86 Update glide to v4.14.2 2022-10-08 10:06:14 +02:00
Niels van Velzen
b0c642a0c2 Add PictureViewerFragment as destination 2022-10-08 09:51:24 +02:00
Niels van Velzen
ee9763973f Remove GsonJsonSerializer
Also migrates a bunch of stuff to the SDK so we can use kotlinx.serialization
2022-10-07 16:19:31 +02:00
renovate[bot]
a20b893066 Update actions/stale digest to 5ebf00e 2022-10-07 16:19:22 +02:00
Niels van Velzen
0a372fe3f0 Split a long navigation line in BrowseGridFragment 2022-10-07 08:05:59 +02:00
Niels van Velzen
4317917759 Fix navigation repository history not reset when activity recreated 2022-10-07 08:05:59 +02:00
Niels van Velzen
e63314402e Fix key event not reaching nested fragments 2022-10-07 08:05:59 +02:00
Niels van Velzen
b7a8bbf0af Use NavigationRepository for PlaybackOverlayActivity 2022-10-07 08:05:59 +02:00
Niels van Velzen
b8c542ede1 Add NavigationAction to control fragment manager 2022-10-07 08:05:59 +02:00
Niels van Velzen
a80ab9c7c1 Implement display mirroring 2022-10-07 08:05:59 +02:00
Niels van Velzen
b24f135efb Rewrite navigation 2022-10-07 08:05:59 +02:00
renovate[bot]
532b6b92d2 Update github/codeql-action digest to 8075783 2022-10-07 08:05:07 +02:00
YusanTayir
c715dbd149 Added translation using Weblate (Uyghur) 2022-10-06 01:15:43 -04:00
renovate[bot]
8bb4a61d6b Update actions/checkout digest to 2541b12 2022-10-05 19:34:11 +02:00
renovate[bot]
8fc5d9c23d Update dependency org.jellyfin.exoplayer:exoplayer-ffmpeg-extension to v2.18.1+2 2022-10-05 15:43:22 +02:00
Niels van Velzen
07ea277269 Fix crash when media info contains a data stream 2022-10-04 20:28:37 +02:00
renovate[bot]
ed972667eb Update actions/checkout digest to 93ea575 2022-10-04 15:21:27 +02:00
newton181
f98be9daee Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2022-10-03 21:54:38 -04:00
florentsarat
d808943695 Translated using Weblate (French)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-10-03 21:54:38 -04:00
VocalFan
245e977057 Translated using Weblate (Russian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-10-03 09:54:38 -04:00
VocalFan
3f4a2c5863 Translated using Weblate (Spanish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-10-03 09:54:37 -04:00
renovate[bot]
fc52c6ba72 Update kotest to v5.5.0 2022-10-03 09:39:13 +02:00
Nils Fürniß
a31945b09c Translated using Weblate (German)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-10-02 17:54:37 -04:00
Niels van Velzen
3a9881c52e Fix audio player screensaver starting too soon 2022-10-01 19:13:14 +02:00
Niels van Velzen
5a8108a129 Add CustomMessageRepository, remove BaseActivity 2022-10-01 15:21:42 +02:00
Weevild
b2c993b058 Translated using Weblate (Swedish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-09-30 12:54:36 -04:00
Niels van Velzen
26ec721c0f Use fragment arguments instead of activity intent 2022-09-30 16:27:20 +02:00
Niels van Velzen
9830c12fac Replace Kapt with KSP 2022-09-30 12:17:46 +02:00
renovate[bot]
523067bde9 Update glide to v4.14.1 2022-09-30 08:00:01 +02:00
Niels van Velzen
ab3710f0ed Remove key listener from BaseActivity 2022-09-29 19:57:41 +02:00
Niels van Velzen
fe6fcbe539 Refactor LiveTvGuideActivity to fragment 2022-09-29 19:57:34 +02:00
Niels van Velzen
4f781b9610 Refactor ItemListActivity to fragment 2022-09-29 19:57:27 +02:00
Niels van Velzen
1d411d1e3f Refactor FullDetailsActivity to fragment 2022-09-29 19:57:17 +02:00
Niels van Velzen
79bdc601c4 Refactor AudioNowPlayingActivity to fragment 2022-09-29 19:57:02 +02:00
Niels van Velzen
b3463a8975 Rename .java to .kt 2022-09-29 19:57:02 +02:00
renovate[bot]
4a0dba229c Update github/codeql-action digest to e0e5ded 2022-09-29 19:55:21 +02:00
renovate[bot]
bf61dba6ed Update Kotlin to v1.7.20 2022-09-29 19:47:17 +02:00
renovate[bot]
c06b7e7c67 Update aboutlibraries to v10.5.0 2022-09-29 19:46:23 +02:00
renovate[bot]
0c79dabecc Update gradle/gradle-build-action digest to fd32ae9 2022-09-29 19:45:08 +02:00
DW
9cd4c433ea Translated using Weblate (Dutch)
Currently translated at 96.5% (480 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-09-29 09:54:36 -04:00
CoooLdk
f8d7345ff3 Translated using Weblate (Danish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2022-09-29 09:54:36 -04:00
renovate[bot]
21e40cae24 Update dependency io.mockk:mockk to v1.13.2 2022-09-29 07:10:22 +02:00
renovate[bot]
c650bdcc20 Update glide to v4.14.0 2022-09-28 21:06:44 +02:00
Niels van Velzen
9dee1629da Rewrite search UI in Kotlin 2022-09-28 19:02:04 +02:00
Niels van Velzen
7941d72104 Rename .java to .kt 2022-09-28 19:02:04 +02:00
Niels van Velzen
d0d5d29fab Always use repeatOnLifecycle instead of launchWhenX functions 2022-09-28 19:01:55 +02:00
Niels van Velzen
4225317172 Merge StdBrowseFragment and BrowseFolderFragment and rewrite in Kotlin 2022-09-28 19:01:43 +02:00
renovate[bot]
1af9d9be9d Update actions/setup-java digest to a18c333 2022-09-27 15:10:47 +02:00
Niels van Velzen
d3b1faeb99 Remove most deprecation annotations 2022-09-27 12:34:10 +02:00
Oskari Lavinto
57e2c3acc6 Translated using Weblate (Finnish)
Currently translated at 99.1% (493 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-09-27 03:54:35 -04:00
Csaba
338be54355 Translated using Weblate (Hungarian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-09-27 03:54:35 -04:00
Niels van Velzen
c33a567828 Fix series queuing not working 2022-09-27 07:18:15 +02:00
Niels van Velzen
59e47b2f37 Don't use KoinJavaComponent in Kotlin files 2022-09-26 19:54:54 +02:00
Niels van Velzen
748051e261 Fix blurhash not showing in CardPresenter 2022-09-26 19:46:12 +02:00
Niels van Velzen
01dcc65b1f Add audio night mode (as preference) to level out/compress audio volume. 2022-09-26 17:37:06 +02:00
Niels van Velzen
a4fbb205fc Update GitHub actions workflows 2022-09-25 17:09:58 +02:00
Niels van Velzen
5012a1211b Use AsyncImageView for Live TV program image 2022-09-25 17:07:13 +02:00
Niels van Velzen
fc8ab38a57 Switch slf4j timber to a different library 2022-09-25 17:07:00 +02:00
renovate[bot]
7fc9819b63 Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.6 2022-09-25 11:51:46 +02:00
Niels van Velzen
2277bb79a8 Fix NPE when live tv program is null 2022-09-24 18:08:44 +02:00
Niels van Velzen
03856f7e2f Move package declaration to Gradle build files 2022-09-24 18:08:10 +02:00
Niels van Velzen
2974dd3b6a Disable jetifier 2022-09-24 18:03:57 +02:00
sunrisela
b6eb83cd0e remove credit authors in-code 2022-09-24 15:42:49 +02:00
sunrisela
edd0aab718 Normalize commited code. 2022-09-24 15:42:49 +02:00
sunrisela
e6ba8a89b6 External players support high-priority external subtitles, e.g. MX Player, VLC, nPlayer. 2022-09-24 15:42:49 +02:00
renovate[bot]
fcfa242588 Update koin to v3.2.2 2022-09-24 10:00:57 +02:00
Niels van Velzen
135645ff61 Convert to Date before using DateFormat 2022-09-23 22:37:32 +02:00
Niels van Velzen
903d9fa22e Always use BaseItemDto from SDK 2022-09-23 22:37:32 +02:00
renovate[bot]
af0a5cd317 Update dependency io.mockk:mockk to v1.13.1 2022-09-23 17:06:08 +02:00
renovate[bot]
e0e5316062 Update actions/stale action to v6 2022-09-22 07:55:30 +02:00
renovate[bot]
5a5db8609d Update github/codeql-action digest to 86f3159 2022-09-22 07:54:42 +02:00
renovate[bot]
db1c7289be Update dependency androidx.activity:activity-ktx to v1.6.0 2022-09-21 20:16:20 +02:00
renovate[bot]
9bf0995599 Update dependency androidx.fragment:fragment-ktx to v1.5.3 2022-09-21 20:14:49 +02:00
Niels van Velzen
8d8cc41290 Rewrite BaseRowItem in Kotlin 2022-09-20 13:26:37 +02:00
Niels van Velzen
1cb1fc4713 Rename .java to .kt 2022-09-20 13:26:37 +02:00
Niels van Velzen
00b62e8f9d Fix crash when selecting or clicking items in grid view 2022-09-19 21:39:16 +02:00
Niels van Velzen
570c2490d5 Use MutableObjectAdapter<Object> as base for ItemRowAdapter 2022-09-19 19:20:36 +02:00
Niels van Velzen
4dd0feb417 Use MutableObjectAdapter<Row> for rows 2022-09-19 19:14:16 +02:00
Niels van Velzen
c4ea2e9b40 Merge StdRowsFragment into HomeFragment 2022-09-19 19:08:28 +02:00
Niels van Velzen
a5b4b66fe1 Rewrite CompositeListeners in Kotlin 2022-09-19 19:08:04 +02:00
Niels van Velzen
db773e0c51 Rename .java to .kt 2022-09-19 19:08:04 +02:00
Josip Volf
47c7ba369d Translated using Weblate (Croatian)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/hr/
2022-09-18 17:54:32 -04:00
Josip Volf
b1cdc91f47 Translated using Weblate (Croatian)
Currently translated at 77.1% (382 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hr/
2022-09-18 17:54:32 -04:00
Niels van Velzen
e53bd5c838 Use appcompat theme as base 2022-09-18 15:02:10 +02:00
Niels van Velzen
fcc7e5fd5f Rewrite all Java interfaces in Kotlin 2022-09-18 15:02:00 +02:00
Niels van Velzen
e61159e3f2 Rename .java to .kt 2022-09-18 15:02:00 +02:00
Niels van Velzen
3824eae7c1 Rewrite data package in Kotlin 2022-09-17 16:34:28 +02:00
Niels van Velzen
c086d023b6 Rename .java to .kt 2022-09-17 16:34:28 +02:00
Niels van Velzen
08e239a544 Clear BlurHash and Glide caches on low memory 2022-09-17 16:28:25 +02:00
Niels van Velzen
82177db96d Replace BlurHashDecoder with com.vanniktech.blurhash dependency 2022-09-17 16:28:25 +02:00
Niels van Velzen
ebe5f3fc94 Fix two crashes when trying to view a person 2022-09-17 16:24:32 +02:00
Stelios Diamantis
a45ef35972 Translated using Weblate (Greek)
Currently translated at 97.7% (484 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-09-16 17:54:32 -04:00
renovate[bot]
5d1bc0466d Update dependency com.android.tools.build:gradle to v7.3.0 2022-09-16 19:54:44 +02:00
renovate[bot]
9a87d5c5c3 Update github/codeql-action digest to 904260d 2022-09-16 18:07:34 +02:00
Alan Azar
ba11bb9e88 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hans/
2022-09-16 08:54:31 -04:00
Niels van Velzen
a0da2075a8 Rewrite Utils in Kotlin 2022-09-15 21:58:22 +02:00
Niels van Velzen
1eef03706b Rewrite DeviceUtils in Kotlin 2022-09-15 21:58:22 +02:00
Niels van Velzen
dd60dbbd98 Rename .java to .kt 2022-09-15 21:58:22 +02:00
renovate[bot]
192f674b2b Update github/codeql-action digest to 6a38b7d 2022-09-15 15:25:47 +02:00
renovate[bot]
fe9ddf1816 Update dependency io.mockk:mockk to v1.12.8 2022-09-15 15:25:32 +02:00
DAVID CHEN
ea7cfa5943 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hans/
2022-09-15 06:11:37 -04:00
Oskari Lavinto
28a88c8173 Translated using Weblate (Finnish)
Currently translated at 99.1% (491 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-09-15 06:11:37 -04:00
DAVID CHEN
551c895088 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (495 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-09-15 06:11:36 -04:00
renovate[bot]
26060c6779 Update actions/stale digest to 99b6c70 2022-09-14 18:31:25 +02:00
Csaba
6fc96c34b0 Translated using Weblate (Hungarian)
Currently translated at 100.0% (495 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-09-14 05:11:36 -04:00
Zachary Cohen
bc169d68c6 Add Quality Selection to Playback Overlay (#1924)
* Created SelectQualityAction for Playback Controller UI

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/overlay/action/SelectQualityAction.kt

Co-authored-by: Cameron <mueslimak3r@users.noreply.github.com>

* Moved QualityProfiles Enum Class to org.jellyfin.androidtv.constant. Moved Auto quality to top of list.

* Suppressing errors. Fixing line length.

* Update app/src/main/res/values/strings.xml

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

* Injected dependency via constructor.
Removed unused members.
Updated format of vector file.

* Convert to set

* Needed to target correct key/values

* Inject UserPreferences via constructor

* Removed unused import

* Moved mapping to function

* Miscellaneous formatting changes

Co-authored-by: Cameron <mueslimak3r@users.noreply.github.com>
Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
Co-authored-by: Niels van Velzen <git@ndat.nl>
2022-09-13 17:16:40 +00:00
renovate[bot]
1a13cb0f9e Update koin to v3.2.1 2022-09-12 15:36:08 +02:00
renovate[bot]
cc59a50479 Update dependency androidx.core:core-ktx to v1.9.0 2022-09-10 14:16:33 +02:00
Niels van Velzen
d984792e2d Bump Android compile & target version to 33 (Android 13) 2022-09-10 14:07:02 +02:00
renovate[bot]
ae12625366 Update actions/setup-java digest to d854b6d 2022-09-08 22:13:39 +02:00
renovate[bot]
163af9e756 Update dependency androidx.appcompat:appcompat to v1.5.1 2022-09-07 21:38:51 +02:00
Niels van Velzen
02b9fb60bb Use random device id when initializing QuickConnect 2022-09-06 18:19:28 +02:00
Niels van Velzen
b731b36656 Add SocketInstance to dependency injection
Required for playback rewrite module to share the same WebSocket connection
2022-09-06 15:01:20 +02:00
Niels van Velzen
ffe674912c Fix missing imports causing a build issue 2022-09-06 09:07:21 +02:00
Niels van Velzen
1b8bb7b327 Always set base item type on custom base item dto instances 2022-09-06 07:17:06 +02:00
Niels van Velzen
c500006b9d Replace BaseItemType usages with BaseItemKind (SDK) 2022-09-06 07:16:51 +02:00
Niels van Velzen
8713cd5317 Set defaultFocusHighlightEnabled to false in TextUnderButton 2022-09-04 19:32:19 +02:00
Niels van Velzen
e7ec5c5bd2 Fix app crashing when opening "other options" menu in FullDetailsActivity 2022-09-04 19:32:06 +02:00
Niels van Velzen
352f472769 Set defaultFocusHighlightEnabled to false in DefaultCardView
Fixes an incompatibility with Android 13
2022-09-04 17:52:11 +02:00
Niels van Velzen
46b66fa8ad Add monochrome layer to adaptive icon 2022-09-04 17:52:00 +02:00
Niels van Velzen
c8f757f467 Rewrite ChapterItemInfo to not use the apiclient 2022-09-03 22:30:24 +02:00
Niels van Velzen
0e1c79e933 Rename .java to .kt 2022-09-03 22:30:24 +02:00
renovate[bot]
fed10724e7 Update github/codeql-action digest to b398f52 2022-09-01 15:46:09 +02:00
Weblate
3c8d5c5fab Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-09-01 01:12:25 -04:00
Niels van Velzen
fdb18aca8c Add empty playback modules for rewrite 2022-09-01 07:12:21 +02:00
Weblate
98de292fa3 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-08-31 15:23:25 -04:00
Niels van Velzen
1dea42a39a Remove unused video queue from UI code 2022-08-31 21:23:21 +02:00
Niels van Velzen
3b9094fe2b Fix crash when opening favorites and video queue 2022-08-31 07:11:07 +02:00
newton181
2c395ac7c4 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2022-08-29 19:11:31 -04:00
Niels van Velzen
6e94f99b52 Migrate favorite and played toggles in KeyProcessor to SDK 2022-08-27 22:23:00 +02:00
Niels van Velzen
c7e2789021 Rewrite MediaCodecCapabilitiesTest in Kotlin 2022-08-27 21:51:50 +02:00
Niels van Velzen
6d8b997d89 Rename .java to .kt 2022-08-27 21:51:50 +02:00
Niels van Velzen
11193c749d Replace most utils with SDK 2022-08-27 20:49:28 +02:00
Niels van Velzen
80d34e507d Use SDK in HomeFragment 2022-08-27 17:02:17 +02:00
newton181
70063e9546 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2022-08-25 22:11:30 -04:00
newton181
0fcb678977 Translated using Weblate (Spanish (Mexico))
Currently translated at 95.9% (476 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2022-08-25 22:11:29 -04:00
renovate[bot]
9e45e6e4e8 Update github/codeql-action digest to c7f292e 2022-08-25 19:26:53 +02:00
newton181
3ad6eddd0c Translated using Weblate (Spanish (Latin America))
Currently translated at 94.7% (470 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2022-08-24 22:11:29 -04:00
Xavi Fortes
84fe0fd6ca Translated using Weblate (Spanish)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-08-24 22:11:29 -04:00
Xavi Fortes
2208e2e7a7 Translated using Weblate (Spanish)
Currently translated at 97.9% (486 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-08-24 18:09:06 -04:00
Xavi Fortes
593869deb3 Translated using Weblate (Spanish)
Currently translated at 97.3% (483 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-08-24 18:07:26 -04:00
renovate[bot]
d74581d350 Update dependency com.android.tools:desugar_jdk_libs to v1.2.2 (#2008)
* Update dependency com.android.tools:desugar_jdk_libs to v1.2.2

* Update libs.versions.toml

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2022-08-24 19:04:43 +00:00
avionics75
947f36f28e Translated using Weblate (French)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-08-24 14:11:28 -04:00
Max Kremer
5b56ebf614 Translated using Weblate (German)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-08-23 17:11:29 -04:00
renovate[bot]
35c1da9a7e Update dependency io.mockk:mockk to v1.12.7 2022-08-23 15:39:35 +02:00
WWWesten
d0475c5eb0 Translated using Weblate (Esperanto)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-08-22 17:11:28 -04:00
WWWesten
218f2e6a14 Translated using Weblate (Russian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-08-22 17:11:28 -04:00
WWWesten
ca7246afcc Translated using Weblate (Kazakh)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-08-22 17:11:28 -04:00
renovate[bot]
850ec393f4 Update github/codeql-action digest to 7fee4ca 2022-08-22 14:41:13 +02:00
Cercky
0a64cfd8d2 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-08-22 01:11:28 -04:00
Marian Radev
db81460102 Translated using Weblate (Bulgarian)
Currently translated at 32.0% (159 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bg/
2022-08-21 10:11:27 -04:00
Oskari Lavinto
e805003df9 Translated using Weblate (Finnish)
Currently translated at 99.1% (492 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-08-21 06:11:27 -04:00
Niels van Velzen
38fe985bd8 Migrate most of KeyProcessor to SDK types 2022-08-21 09:16:15 +02:00
Niels van Velzen
5c3222490b Fix crash when trying to start a picture slideshow 2022-08-20 20:14:42 +02:00
Andy Walsh
7207b3d812 Keep ordering from album view in picture viewer 2022-08-20 20:14:36 +02:00
Niels van Velzen
ee3008b5cd Remove USE_DOWNLOAD_API from picture viewer 2022-08-20 20:14:29 +02:00
Niels van Velzen
acc4533868 Use MediaStream from SDK in MediaInfoCardView and InfoCardPresenter 2022-08-20 14:09:09 +02:00
Niels van Velzen
a58c6244f2 Use SDK in StartupActivity 2022-08-20 14:08:35 +02:00
Niels van Velzen
833c026bbe Use SDK SortOrder enum in LibraryPreferences 2022-08-20 08:08:28 +02:00
Niels van Velzen
86b34ac7fb Remove commented log statements 2022-08-20 08:08:16 +02:00
lyaschuchenko
d68edaca4d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-08-20 00:11:27 -04:00
Niels van Velzen
e6b7ca865e Simplify reportPlaybackStopped code 2022-08-19 22:34:37 +02:00
Andy Walsh
66ea6988ff fix CommunityRating display (#1992) 2022-08-19 18:05:53 +00:00
hadicharara
7e2bbbc61a Add RTL Support (#1842)
* Initial commit

* Fixed shadow bug
2022-08-19 19:14:06 +02:00
renovate[bot]
2ae4c87595 Update github/codeql-action digest to f5d217b 2022-08-19 14:07:31 +02:00
renovate[bot]
95932bb8f5 Update dependency org.jetbrains.kotlinx:kotlinx-serialization-json to v1.4.0 2022-08-18 21:39:56 +02:00
DJSweder
186b963e3a Translated using Weblate (Czech)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-08-18 04:11:26 -04:00
Kevin G
9ee8c7fb50 Support previous button in video playlist
Fixes #1940

Signed-off-by: Kevin G <kevin@myplaceonline.com>
2022-08-18 08:21:30 +02:00
Niels van Velzen
95e31975ba Always use SDK SearchHint 2022-08-18 07:43:39 +02:00
Niels van Velzen
57c3b7f2aa Use MediaType constants from SDK instead of strings 2022-08-17 18:12:04 +02:00
Niels van Velzen
91c777ea3a Use CollectionType constants from SDK instead of strings 2022-08-17 18:12:04 +02:00
Niels van Velzen
70f250e875 Use MediaType constants from SDK 2022-08-17 18:12:04 +02:00
Niels van Velzen
f37db62dbe Use ItemSortBy constants from SDK 2022-08-17 18:12:04 +02:00
Niels van Velzen
4669afb224 Remove unused ApiEventListener from legacy apiclient 2022-08-17 07:24:51 +02:00
Niels van Velzen
318c007aeb Always use SDK BaseItemPerson and PersonType 2022-08-17 07:24:38 +02:00
Csaba
a6f7364c09 Translated using Weblate (Hungarian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-08-16 02:11:26 -04:00
Oskari Lavinto
b2e8517e0f Translated using Weblate (Finnish)
Currently translated at 99.1% (492 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-08-15 17:11:25 -04:00
renovate[bot]
1cafe6c539 Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.5 2022-08-14 20:57:35 +02:00
Niels van Velzen
38d33536f9 Fix movie items crashing 2022-08-14 17:13:47 +02:00
Niels van Velzen
acc77901ad Fix Live TV guide crashing 2022-08-14 17:13:47 +02:00
Niels van Velzen
47844799c8 Migrate InfoLayoutHelper to use SDK models 2022-08-14 15:50:33 +02:00
Niels van Velzen
040d46e5f5 Replace GSON encoding usages in EnhancedBrowseFragment with kotlinx.serialization 2022-08-14 15:50:17 +02:00
Niels van Velzen
0a621fa9a3 Replace GSON usages in ItemLauncher with kotlinx.serialization 2022-08-14 15:50:17 +02:00
Niels van Velzen
2971e0368f Use view binding directly in BrowseGridFragment 2022-08-14 15:50:05 +02:00
Niels van Velzen
c60586c13e Use AsyncImageView in GuideChannelHeader 2022-08-14 15:49:52 +02:00
Niels van Velzen
a682757b8b Use AsyncImageView in ClockUserView 2022-08-14 15:49:40 +02:00
Niels van Velzen
454c0d6fec Add circleCrop to AsyncImageView 2022-08-14 15:49:40 +02:00
Niels van Velzen
14e7391bc2 Properly handle specials in item naming 2022-08-14 15:49:12 +02:00
Niels van Velzen
5bb1ee7819 Don't open library settings for unsupported types
Only collection types that use the grid should open the DisplayPreferencesScreen. Added a special case to open the Live TV (guide) settings as a bonus.
2022-08-14 15:49:05 +02:00
Niels van Velzen
cd33bea725 Fix ActivityLifecycleCallback calls on Android 9 and lower 2022-08-14 15:48:56 +02:00
Niels van Velzen
a404b99ab1 Migrate DefaultLifecycleObserver setup to androidx.startup 2022-08-14 15:48:48 +02:00
Niels van Velzen
6e54d2d412 Merge GridFragment into BrowseGridFragment 2022-08-14 09:30:40 +02:00
Niels van Velzen
8a3ac11643 Merge StdGridFragment into BrowseGridFragment 2022-08-14 09:30:40 +02:00
Niels van Velzen
e592017602 Allow app installation on external storage 2022-08-14 08:15:38 +02:00
Niels van Velzen
6960f808f2 Fix alignment of ClockUserView in live TV guide 2022-08-13 21:12:21 +02:00
Arceer
888eafb4b3 Translated using Weblate (Swedish)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/sv/
2022-08-13 07:22:31 -04:00
Arceer
7987e14a65 Translated using Weblate (Swedish)
Currently translated at 100.0% (495 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-08-13 07:22:31 -04:00
renovate[bot]
8f6109e93f Update kotest to v5.4.2 2022-08-13 10:45:52 +02:00
Niels van Velzen
0074062633 Catch decoding exception in AuthenticationStore
Fixes corrupt JSON causing the app to crash
2022-08-13 09:59:17 +02:00
Oskari Lavinto
a46e88b970 Translated using Weblate (Finnish)
Currently translated at 99.1% (491 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-08-12 03:22:30 -04:00
Niels van Velzen
fa94dba71a Add new experimental picture viewer (#1829)
* Add KeyHandler

* Add PictureViewerFragment to replace PhotoPlayerActivity

* Address review feedback
2022-08-11 20:56:07 +02:00
renovate[bot]
21769a926c Update dependency androidx.appcompat:appcompat to v1.5.0 2022-08-11 20:01:45 +02:00
Niels van Velzen
2b2569772c Bump Android compile and target SDK to 32 (Android 12L)
Required for the new appcompat version
2022-08-11 19:40:49 +02:00
renovate[bot]
eb8ce2d0a1 Update dependency org.videolan.android:libvlc-all to v3.5.1 2022-08-11 18:59:36 +02:00
renovate[bot]
6542595a5f Update dependency androidx.fragment:fragment-ktx to v1.5.2 2022-08-11 09:14:38 +02:00
cameron
d7db8890d7 remove removePreviousQueueItems and sync mediaManager video queue index 2022-08-10 19:17:59 +02:00
Niels van Velzen
6ac9e7d207 Remove usages of BaseItemType's that don't exist in the server anymore 2022-08-10 08:21:37 +02:00
Weblate
f4902f5a70 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-08-09 08:53:40 -04:00
Niels van Velzen
6378920ac4 Remove item delete functionality 2022-08-09 14:53:36 +02:00
kevgrig
c72b817364 Handle uninitialized current media position (#1943)
* Handle uninitialized current media position

Signed-off-by: Kevin G <kevin@myplaceonline.com>

* Enhance uninitialized current media position check

Signed-off-by: Kevin G <kevin@myplaceonline.com>

* Enhance uninitialized current media position check

Signed-off-by: Kevin G <kevin@myplaceonline.com>
2022-08-09 10:23:23 +02:00
Andy Walsh
c4dd60527d fix BaseRowItem.refresh() crash 2022-08-09 08:31:09 +02:00
Niels van Velzen
5a30dfe04e Disable Detekt InvalidPackageDeclaration rule
It doesn't work properly because we don't have an org/jellyfin/androidtv package in the playback and preference modules
2022-08-08 21:40:08 +02:00
Niels van Velzen
dfa37c831a Forward music play requests to PlaybackLauncher
This allows the playback rewrite to play audio
2022-08-08 21:40:00 +02:00
Kevin G
f85cef52c7 Fix 'Play from Here' in video playlists
Fixes #1712

Signed-off-by: Kevin G <kevin@myplaceonline.com>
2022-08-08 07:54:43 +02:00
Alan Azar
ccb97ac195 Translated using Weblate (Malayalam)
Currently translated at 69.0% (342 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ml/
2022-08-06 15:22:29 -04:00
Alan Azar
9fff04e157 Translated using Weblate (Turkish)
Currently translated at 78.9% (391 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2022-08-06 15:22:29 -04:00
Alan Azar
94e6b416d6 Translated using Weblate (Croatian)
Currently translated at 77.3% (383 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hr/
2022-08-06 15:22:29 -04:00
Alan Azar
393ad954d7 Translated using Weblate (Spanish (Argentina))
Currently translated at 91.5% (453 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_AR/
2022-08-06 15:22:29 -04:00
Alan Azar
3a4b5417f7 Translated using Weblate (Serbian)
Currently translated at 81.2% (402 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sr/
2022-08-06 15:22:29 -04:00
Alan Azar
393c42e8a1 Translated using Weblate (Japanese)
Currently translated at 66.4% (329 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2022-08-06 15:22:29 -04:00
Alan Azar
04a786fc62 Translated using Weblate (Norwegian Bokmål)
Currently translated at 71.3% (353 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nb_NO/
2022-08-06 15:22:28 -04:00
Alan Azar
69d0e6be04 Translated using Weblate (Greek)
Currently translated at 81.0% (401 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-08-06 15:22:28 -04:00
Alan Azar
f5f33b8495 Translated using Weblate (Danish)
Currently translated at 96.1% (476 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2022-08-06 15:22:28 -04:00
gradle-update-robot
0b5079573e Update Gradle Wrapper from 7.5 to 7.5.1.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2022-08-06 09:37:29 +02:00
renovate[bot]
cdf74b87bc Update aboutlibraries to v10.4.0 2022-08-05 18:52:19 +02:00
dyxen
f0981abd6d Translated using Weblate (Slovenian)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/sl/
2022-08-05 08:22:31 -04:00
dyxen
8e1f1d75b5 Translated using Weblate (Slovenian)
Currently translated at 98.5% (488 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sl/
2022-08-05 08:22:31 -04:00
Niels van Velzen
d61829e11a Remove generation timestamp from AboutLibraries data file 2022-08-05 08:17:03 +02:00
Moritz
4d35efc5a4 Translated using Weblate (German)
Currently translated at 97.9% (485 of 495 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-08-04 10:22:28 -04:00
renovate[bot]
8f273ae7df Update github/codeql-action digest to 2ca79b6 2022-08-03 20:54:17 +02:00
renovate[bot]
3077d66032 Update dependency com.android.tools.build:gradle to v7.2.2 2022-08-03 20:47:40 +02:00
Kevin G
c1817601f7 Fix 'Shuffle All' for video playlist
Signed-off-by: Kevin G <kevin@myplaceonline.com>
2022-08-02 15:57:23 +02:00
renovate[bot]
a1999180d2 Update appleboy/ssh-action action to v0.1.5 2022-08-02 15:57:07 +02:00
renovate[bot]
8019a9ed8b Update github/codeql-action digest to 0c670bb 2022-08-02 15:56:55 +02:00
renovate[bot]
5ff081eb17 Update dependency ch.acra:acra-toast to v5.9.6 2022-08-02 15:56:42 +02:00
renovate[bot]
87895473d9 Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.4 2022-08-02 15:32:15 +02:00
Weblate
8c32cee4ee Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-31 14:09:13 -04:00
Niels van Velzen
0c4a09bcca Throw error when EditServerScreen and EditUserScreen open with invalid arguments 2022-07-31 20:09:09 +02:00
Weblate
9cb564cc8e Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-31 07:21:49 -04:00
Niels van Velzen
7865038710 Remove seasonal greetings & libvlc subtitle delay preferences
Both were unused
2022-07-31 13:21:45 +02:00
renovate[bot]
777657709d Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.3 2022-07-30 10:34:59 +02:00
renovate[bot]
d947d8b7b9 Update kotest to v5.4.1 2022-07-28 14:53:20 +02:00
renovate[bot]
2e15684b16 Update dependency androidx.fragment:fragment-ktx to v1.5.1 2022-07-28 08:01:26 +02:00
renovate[bot]
8595cf33a0 Update actions/stale digest to 9c1b1c6 2022-07-28 08:00:59 +02:00
renovate[bot]
3e45a433f8 Update dependency androidx.activity:activity-ktx to v1.5.1 2022-07-27 21:48:17 +02:00
renovate[bot]
66dab66be2 Update androidx-lifecycle to v2.5.1 2022-07-27 21:48:10 +02:00
renovate[bot]
3245ad4f43 Update dependency io.mockk:mockk to v1.12.5 2022-07-27 18:57:45 +02:00
Matias Barros
16e63ff428 Translated using Weblate (Spanish (Argentina))
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/es_AR/
2022-07-27 02:22:24 -04:00
millallo
b6f2ad279f Translated using Weblate (Italian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-07-26 16:53:31 -04:00
Bill Thornton
69cefe7e30 Remove whitespace prepended to the no gude data titles 2022-07-26 08:36:45 +02:00
Bill Thornton
25cb3d0db2 Remove live tv guide banner images 2022-07-26 08:15:28 +02:00
DJSweder
6a4dc857e2 Translated using Weblate (Czech)
Currently translated at 99.1% (494 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-07-25 20:11:23 -04:00
Bill Thornton
f9c3f2e8ae Fix channel load more button size in popup guide 2022-07-25 22:02:25 +02:00
Stéphane Dupont
fe7d3d58e3 Translated using Weblate (French)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/fr/
2022-07-25 10:47:43 -04:00
Cody Robibero
9f7ea0c156 Update strings.xml 2022-07-25 16:47:40 +02:00
renovate[bot]
21a3b2dbc7 Update kotest to v5.4.0 2022-07-25 09:52:08 +02:00
Jaroslav Lichtblau
cfcc8f3ad2 Translated using Weblate (Czech)
Currently translated at 96.9% (483 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-07-24 19:22:24 -04:00
Kenneth SB
cf05fe9322 Translated using Weblate (Danish)
Currently translated at 96.3% (480 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2022-07-24 14:22:25 -04:00
Kenneth SB
0ca18ba0e9 Translated using Weblate (Danish)
Currently translated at 76.7% (382 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2022-07-24 11:22:24 -04:00
HanaO00
5a01749d90 Translated using Weblate (French)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-07-24 00:22:23 -04:00
WWWesten
9a34b59da2 Translated using Weblate (Esperanto)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-07-23 17:22:24 -04:00
WWWesten
19b65d6cc8 Translated using Weblate (Russian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-07-23 17:22:23 -04:00
WWWesten
ea88a5c523 Translated using Weblate (Kazakh)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-07-23 17:22:23 -04:00
Niels van Velzen
cb767a2db2 Set minimum server version in SDK from ServerRepository constant 2022-07-23 14:13:32 +02:00
Niels van Velzen
966ef05291 Use clientLogApi.logFileUrl to generate crash report URL 2022-07-23 14:13:21 +02:00
renovate[bot]
23dd0c4c6c Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.2 2022-07-23 14:03:21 +02:00
Bill Thornton
1151de2388 Update load more channels button styling 2022-07-23 09:31:07 +02:00
Cameron
1f2b757d79 handle exoplayer track selection indexes starting at 1 (#1878)
* handle exoplayer track selection indexes  starting at 1

* fix capitalization
2022-07-23 09:29:40 +02:00
Bill Thornton
4609cd4e0f Fix live tv guide sorting (#1861)
* Fix live tv guide sorting

* Remove commented logging
2022-07-23 09:28:37 +02:00
Bill Thornton
df7ecd55be Fix channel logo display (#1870)
* Fix channel logo display

* Update tv tile name and size
2022-07-23 09:27:56 +02:00
renovate[bot]
b640afff2e Update dependency org.videolan.android:libvlc-all to v3.4.9 2022-07-22 19:47:57 +02:00
cameron
c3d75c7e30 fix series logo scaling in player 2022-07-22 19:28:33 +02:00
Bill Thornton
4aba7570aa Fix live tv guide load more button height 2022-07-22 19:19:39 +02:00
Andreas
dfc4d39275 Emit ServerUnavailableState on TimeoutException 2022-07-22 16:33:34 +02:00
renovate[bot]
4f3ca77194 Update exoplayer 2022-07-22 15:40:30 +02:00
HanaO00
ec370fe9be Translated using Weblate (French)
Currently translated at 99.5% (496 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-07-21 01:22:22 -04:00
Calum Smith
9e72fc05d8 Translated using Weblate (French)
Currently translated at 98.9% (493 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-07-20 21:22:22 -04:00
Bill Thornton
94c41edcb5 Fix live tv guide option button styles 2022-07-20 09:17:56 +02:00
Bill Thornton
fb8cf751a1 Add support for the Fire Stick 4k Max 2022-07-20 09:14:53 +02:00
Bill Thornton
c2ec0cd767 Update button order on item details screen 2022-07-20 09:12:13 +02:00
cameron
211fe8e892 set max audio channels to 8 for exoplayer 2022-07-20 09:10:51 +02:00
Bill Thornton
d3e266a01a Fix inconsistent red color for recordings 2022-07-20 09:09:55 +02:00
Niels van Velzen
45658ffc6e Remove stateListAnimator from button styles
Amazon changes the platform Button widget to scale when pressed, this doesn't work nice with some of our custom button styles and is not consistent with other platforms. This change removes the animation.
2022-07-20 08:24:18 +02:00
Bill Thornton
83b24dc215 Fix null text in info row 2022-07-20 08:24:01 +02:00
Prabjot Singh
0ad3e2ddad Translated using Weblate (Punjabi)
Currently translated at 1.0% (5 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pa/
2022-07-19 21:22:22 -04:00
HanaO00
740d47c14d Translated using Weblate (French)
Currently translated at 96.9% (483 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-07-19 21:22:22 -04:00
Bill Thornton
0a8e03fc4e Fix live tv guide options not persisting 2022-07-19 21:01:32 +02:00
Csaba
0752095292 Translated using Weblate (Hungarian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-07-18 08:22:22 -04:00
millallo
007afef059 Translated using Weblate (Italian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-07-18 08:22:22 -04:00
HanaO00
848060a8a8 Translated using Weblate (French)
Currently translated at 96.9% (483 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-07-17 20:22:21 -04:00
nextlooper42
e98ec0c3bc Translated using Weblate (Slovak)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-07-17 13:22:21 -04:00
Niels van Velzen
ba25b9b5c8 Update issue template for 0.14 2022-07-17 18:59:00 +02:00
renovate[bot]
e0fd381b5b Update dependency io.gitlab.arturbosch.detekt to v1.21.0 2022-07-17 15:11:54 +02:00
Oskari Lavinto
5a5717ec2a Translated using Weblate (Finnish)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/fi/
2022-07-17 04:22:21 -04:00
Oskari Lavinto
f9033b11d1 Translated using Weblate (Finnish)
Currently translated at 99.1% (494 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-07-17 04:22:21 -04:00
Niels van Velzen
91cc60b086 Always use Quick Connect 2022-07-17 09:24:08 +02:00
wolong gl
859dc0f0a2 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-07-17 00:22:21 -04:00
Niels van Velzen
a97c54735c Fix app crash when switching users while playing music 2022-07-16 12:42:19 +02:00
Niels van Velzen
e9c536cbb1 Show notification on server screen when server setup is incomplete (#1834)
* Show notification on server screen when server setup is incomplete

* Adjust server setup notification message
2022-07-16 11:05:24 +02:00
EVOTk
6ba6303199 Translated using Weblate (French)
Currently translated at 97.1% (483 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-07-15 16:22:21 -04:00
WWWesten
a64b1dd56c Translated using Weblate (Esperanto)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-07-15 04:22:20 -04:00
gradle-update-robot
7fbd6e7a9b Update Gradle Wrapper from 7.4.2 to 7.5.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2022-07-15 09:27:47 +02:00
Pol
0531575dc6 Translated using Weblate (Catalan)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ca/
2022-07-14 11:22:21 -04:00
Alfonso Scarpino
4bb89a7076 Translated using Weblate (Italian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-07-14 11:22:20 -04:00
WWWesten
897b6460f9 Translated using Weblate (Russian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-07-14 03:22:20 -04:00
WWWesten
63f404be3e Translated using Weblate (Kazakh)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-07-14 03:22:20 -04:00
Niels van Velzen
2977452d0a Avoid multiple discovery processes running at the same time
When switching between the user and server selection screens the process continuously restarted. This causes a lot of logs and network activity. Prevent this by running only one process at a time.
2022-07-14 08:56:04 +02:00
colson
f03172336a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-07-14 00:22:20 -04:00
renovate[bot]
569bb51627 Update Kotlin to v1.6.4 2022-07-13 19:33:53 +02:00
renovate[bot]
7cf8d69d59 Update github/codeql-action digest to 3e7e3b3 2022-07-13 19:33:46 +02:00
chakhee
e7fabc3b5c Translated using Weblate (Chinese (Simplified))
Currently translated at 98.7% (491 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-07-13 00:22:20 -04:00
hoanghuy309
ae38598c40 Translated using Weblate (Vietnamese)
Currently translated at 98.1% (488 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-07-12 15:22:20 -04:00
Weblate
384120caac Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-12 09:56:00 -04:00
Niels van Velzen
c2a2a01b37 Fix crash when not restoring a session 2022-07-12 15:55:57 +02:00
Niels van Velzen
c909c57146 Fix crash when reporting a crash 2022-07-12 15:55:45 +02:00
Weblate
a8c75349d7 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-12 08:07:48 -04:00
renovate[bot]
ba5ada02f9 Update actions/setup-java digest to 2c7a487 2022-07-12 14:07:44 +02:00
Csaba
6eca40a77c Translated using Weblate (Hungarian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-07-12 07:22:20 -04:00
Oskari Lavinto
bc64fc046d Translated using Weblate (Finnish)
Currently translated at 99.1% (493 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-07-12 03:22:19 -04:00
Weblate
350a50e897 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-11 16:21:29 -04:00
Weblate
18aefed6e1 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-11 16:21:28 -04:00
millallo
74fcb2761e Translated using Weblate (Italian)
Currently translated at 99.4% (498 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-07-11 16:21:27 -04:00
Niels van Velzen
f93d4028dc Ignore server discovery in ServerFragment 2022-07-11 22:21:24 +02:00
Niels van Velzen
744b28de7c Rewrite crash reporting 2022-07-11 22:20:50 +02:00
Niels van Velzen
95f20cdcf9 Flatten TrackSelectionOverrides class into TrackSelectionParameters 2022-07-11 18:00:59 +02:00
renovate[bot]
5c84e75112 Update exoplayer 2022-07-11 18:00:59 +02:00
Niels van Velzen
d53af5330d Fix serverRepository.getServer not working when server info is not refreshing
This issue only happens when using the function within a 10 minute window and causes login to fail (without any hints as to why)
2022-07-11 17:52:34 +02:00
Csaba
70158ebaaa Translated using Weblate (Hungarian)
Currently translated at 100.0% (501 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-07-11 03:22:19 -04:00
WWWesten
95a3ed70e7 Translated using Weblate (Esperanto)
Currently translated at 100.0% (501 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-07-10 18:22:19 -04:00
lyaschuchenko
37dfe2a858 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (501 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-07-10 18:22:19 -04:00
WWWesten
25d1a6c7fd Translated using Weblate (Russian)
Currently translated at 100.0% (501 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-07-10 18:22:19 -04:00
WWWesten
d94bfab1f4 Translated using Weblate (Kazakh)
Currently translated at 100.0% (501 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-07-10 18:22:19 -04:00
nextlooper42
e9bfe69db6 Translated using Weblate (Slovak)
Currently translated at 100.0% (501 of 501 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-07-10 08:22:19 -04:00
Niels van Velzen
30094e0d83 Don't try to load splashscreen when disabled in branding options 2022-07-10 14:06:14 +02:00
Niels van Velzen
1948858cc1 Show notification when server version is not supported 2022-07-10 09:54:58 +02:00
Niels van Velzen
3e1ae8eb4b Validate server version on session restore 2022-07-10 09:54:58 +02:00
Niels van Velzen
97fe47a050 Add external trailer support 2022-07-09 16:56:34 +02:00
Weblate
30a1cb6acf Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-09 09:38:15 -04:00
Andy Walsh
bb98a642d9 adjust TV detection logic (#1822)
* adjust TV detection logic

* Update app/src/main/java/org/jellyfin/androidtv/data/repository/NotificationsRepository.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2022-07-09 15:38:12 +02:00
yolylight
29cbe6ac2a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hans/
2022-07-09 04:22:19 -04:00
Oskari Lavinto
913e2ffb38 Translated using Weblate (Finnish)
Currently translated at 99.2% (496 of 500 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-07-09 04:22:19 -04:00
yolylight
50906a1988 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (500 of 500 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-07-09 04:22:18 -04:00
Weblate
a46c7e2986 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-07-08 09:25:25 -04:00
Andy Walsh
cec666a7e2 rework, optimize GridFragment
add auto image size logic
add/change Ui size names
remove superfluous "Default" naming
fix grid layout fragment to following screen layout/size
fix card refresh not working after resume
fix/optimize chunk size logic
fix card padding/spacing
remove vertical grid "hacks"
remove unnecessary grid reload's
reduce status-line update timer 400->250ms to feel more responsive
2022-07-08 15:25:21 +02:00
Andy Walsh
1fa68ab51e fix, don't send invalid sub/audio index
fix DlnaProfileType
2022-07-08 15:15:29 +02:00
v41p3r
da8b93d1ce Translated using Weblate (Bulgarian)
Currently translated at 30.3% (151 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bg/
2022-07-08 04:31:44 -04:00
dspencer001
8d7fbcc79d Add showing additional parts (#1775)
* Add showing additional parts

* Rewrite additional parts query in Kotlin

* Use a data class instead of manually defining getter

* Fix error message for additional parts
2022-07-08 10:31:40 +02:00
renovate[bot]
88fac33856 Update Kotlin to v1.7.10 2022-07-08 10:07:59 +02:00
WWWesten
12a9997a4a Translated using Weblate (Esperanto)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-07-07 12:22:18 -04:00
WWWesten
162c5803be Translated using Weblate (Russian)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-07-07 12:22:18 -04:00
WWWesten
38576bf832 Translated using Weblate (Kazakh)
Currently translated at 100.0% (498 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-07-07 12:22:18 -04:00
Niels van Velzen
ea43730ac6 Fix BrandingOptions for servers using JF < 10.8.1 2022-07-07 17:48:04 +02:00
Andy Walsh
2ff2a19916 Fix server Startup discovery
loadDiscoveryServers() was never called
fix binding.discoveryServers in wrong scope
2022-07-07 16:52:10 +02:00
Andy Walsh
90d0e7ed13 add AVC "high 10" profile test
enable AllowVideoStreamCopy, setAllowAudioStream
2022-07-07 09:46:43 +02:00
Fedir Smilianets
2f9361aedc Translated using Weblate (Ukrainian)
Currently translated at 99.3% (495 of 498 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-07-06 15:22:17 -04:00
Niels van Velzen
e7708724c0 Add UI mode notification 2022-07-06 10:30:12 +02:00
Niels van Velzen
d47d7b2fdd Add notifications to show app announcement stuff 2022-07-06 10:30:12 +02:00
Andy Walsh
73b92cc10f fix playNext start position for ExternaPlayerActivity
* fix playNext start position for ExternaPlayerActivity
* fix some missing null checks and finish() calls
2022-07-05 23:03:13 +02:00
Andy Walsh
54934482ba Fix wrong counter/pos onResponse via loadMoreItemsIfNeeded
* fix wrong counter/pos onResponse via loadMoreItemsIfNeeded
2022-07-05 22:51:27 +02:00
renovate[bot]
d961fc8a13 Update aboutlibraries to v10.3.1 2022-07-05 21:57:31 +02:00
renovate[bot]
113cf50602 Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.1 2022-07-05 21:51:05 +02:00
renovate[bot]
1409ba30cc Update acra to v5.9.5 2022-07-05 21:49:02 +02:00
renovate[bot]
452ad33873 Update androidx-lifecycle to v2.5.0 2022-07-05 21:43:06 +02:00
renovate[bot]
c4bd1c99cd Update dependency androidx.activity:activity-ktx to v1.5.0 2022-07-05 21:42:58 +02:00
renovate[bot]
b16a7fbf5b Update dependency androidx.fragment:fragment-ktx to v1.5.0 2022-07-05 21:42:49 +02:00
renovate[bot]
57db91107b Update actions/setup-java digest to 16cca54 2022-07-05 21:41:52 +02:00
renovate[bot]
c135dd16cf Update kotest to v5.3.2 2022-07-05 21:41:45 +02:00
renovate[bot]
921da0c472 Update github/codeql-action digest to 3f62b75 2022-07-05 21:41:36 +02:00
renovate[bot]
e9ee0f4921 Update Kotlin to v1.6.3 2022-07-05 21:40:49 +02:00
Rithesh Dsouza
8c7cb94a49 Translated using Weblate (Kannada)
Currently translated at 2.6% (13 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kn/
2022-07-05 06:22:17 -04:00
Fedir Smilianets
f3cd49821e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/uk/
2022-07-03 13:22:20 -04:00
Fedir Smilianets
3364c64599 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (495 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-07-03 13:22:19 -04:00
D221
6ee9a584cc Translated using Weblate (Lithuanian)
Currently translated at 17.5% (87 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2022-06-29 20:22:15 -04:00
Martim Pinheiro
87e79a1537 Translated using Weblate (Portuguese (Portugal))
Currently translated at 95.3% (474 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2022-06-21 11:22:12 -04:00
Mattia
d8731ef40e Translated using Weblate (Italian)
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/it/
2022-06-20 19:22:11 -04:00
nextlooper42
4770152114 Translated using Weblate (Slovak)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-06-20 11:22:11 -04:00
wolong gl
8fe865c3fb Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-06-19 14:22:11 -04:00
Cameron
affdb6dd75 fix subtitle background alignment, center subtitle text (#1786)
* fix subtitle background alignment, center subtitle text

* add suppress RtlHardcoded annotation
2022-06-19 06:46:29 +02:00
hoanghuy309
33f67a6f9f Translated using Weblate (Vietnamese)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/vi/
2022-06-19 00:22:11 -04:00
hoanghuy309
03734b33b4 Translated using Weblate (Vietnamese)
Currently translated at 98.3% (489 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-06-19 00:22:11 -04:00
Andy Walsh
0e3a07c256 fix ItemRowAdapter.retrieveNext() Query StartIndex
*  make sure we reset the StartIndex, since the Query object is reused
2022-06-18 16:19:42 +02:00
Renovate Bot
e27c92e0df Update gradle-update/update-gradle-wrapper-action digest to 981c551 2022-06-14 16:38:39 +02:00
Renovate Bot
9d56f8d944 Update Kotlin to v1.7.0 2022-06-14 08:48:30 +02:00
Renovate Bot
5ac55e1caf Update kotest to v5.3.1 2022-06-14 08:39:44 +02:00
Théo Vanden Driessche
9313e3d48b Translated using Weblate (French)
Currently translated at 99.7% (496 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-06-11 19:22:08 -04:00
Aragon
5585bf594c Translated using Weblate (Hebrew)
Currently translated at 99.3% (494 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2022-06-11 10:22:09 -04:00
Oskari Lavinto
b9b3ee4cb4 Translated using Weblate (Finnish)
Currently translated at 99.1% (493 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-06-11 10:22:08 -04:00
Renovate Bot
d77ff4eda4 Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.0 2022-06-11 13:11:32 +02:00
Fallenbagel
36c8cdf56a Fix EAC3 transcoding on 10.8.0-beta3 2022-06-11 08:48:40 +02:00
Weevild
f150ce3e00 Translated using Weblate (Swedish)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-06-10 10:22:08 -04:00
Moritz
155941d8d3 Translated using Weblate (German)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-06-10 10:22:08 -04:00
WWWesten
573eb12970 Translated using Weblate (Esperanto)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-06-10 05:22:08 -04:00
Csaba
8d1f1ea70f Translated using Weblate (Hungarian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-06-10 05:22:08 -04:00
WWWesten
0724441b79 Translated using Weblate (Russian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-06-10 05:22:08 -04:00
WWWesten
dccb6a6b99 Translated using Weblate (Kazakh)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-06-10 05:22:08 -04:00
millallo
621be3cbff Translated using Weblate (Italian)
Currently translated at 100.0% (497 of 497 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-06-10 05:22:08 -04:00
Niels van Velzen
dac0542882 Change lbl_filters 2022-06-09 19:14:48 +02:00
Niels van Velzen
a82087d122 Remove some unused code from LiveTvGuideActivity 2022-06-09 19:14:48 +02:00
Niels van Velzen
7d9b25fba9 Replace Live TV guide options popup with preference screen 2022-06-09 19:14:48 +02:00
Niels van Velzen
8cd395b772 Replace Live TV guide filter popup with preference screen 2022-06-09 19:14:48 +02:00
WWWesten
a8bc1a7829 Translated using Weblate (Russian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-06-09 06:22:07 -04:00
Niels van Velzen
0ede654513 Merge ConnectHelpAlertFragment and AlertFragment 2022-06-08 09:14:47 +02:00
Niels van Velzen
134acf4897 Fix flickering of splash screen when using auto login 2022-06-08 09:14:37 +02:00
G. Ribeiro
8dbb992cf3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/pt_BR/
2022-06-07 15:22:07 -04:00
G. Ribeiro
9252a86fa4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-06-07 15:22:07 -04:00
Niels van Velzen
4692483251 Fix AuthPreferencesScreen sometimes not showing any servers/users 2022-06-07 16:21:29 +02:00
Niels van Velzen
a6c9fd0ac6 Hide channel number from ChannelCardView when null 2022-06-07 16:21:13 +02:00
nextlooper42
9ca2d5181a Translated using Weblate (Slovak)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-06-06 15:22:06 -04:00
Niels van Velzen
732c978c10 Restyle TextSearchFragment 2022-06-05 11:08:18 +02:00
Niels van Velzen
6d15eb1ba1 Add textColorHint to Input.Default 2022-06-05 11:08:18 +02:00
Niels van Velzen
c64d43090c Check for RECORD_AUDIO permission in SearchActivity 2022-06-05 11:08:18 +02:00
Niels van Velzen
8f1cee7d14 Rewrite SearchProvider 2022-06-05 09:51:52 +02:00
Niels van Velzen
3f63473f44 Rename .java to .kt 2022-06-05 09:51:52 +02:00
Niels van Velzen
4fd1c7fe66 Use popup menu styling for popup windows 2022-06-04 13:10:19 +02:00
Oskari Lavinto
2487d4eb65 Translated using Weblate (Finnish)
Currently translated at 98.3% (488 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-06-03 15:22:05 -04:00
hogenf
bd155406b1 Translated using Weblate (Swedish)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/sv/
2022-06-03 06:22:06 -04:00
hogenf
16177ea6ec Translated using Weblate (Swedish)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-06-03 06:22:06 -04:00
Garrett B
fb0e34b785 Fix Typo 2022-06-03 08:47:43 +02:00
Moritz
d47b1b48e9 Translated using Weblate (German)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-06-02 10:22:05 -04:00
Renovate Bot
2214cfd0fa Update dependency androidx.core:core-ktx to v1.8.0 2022-06-01 21:59:14 +02:00
Renovate Bot
b7029b6a0d Update github/codeql-action digest to 27ea8f8 2022-06-01 21:59:07 +02:00
Renovate Bot
8d5766d11c Update dependency androidx.appcompat:appcompat to v1.4.2 2022-06-01 21:59:01 +02:00
B v H
be73c8dc1f Translated using Weblate (Dutch)
Currently translated at 99.5% (494 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-05-31 16:22:05 -04:00
Csaba
872e77dccd Translated using Weblate (Hungarian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-05-31 03:22:04 -04:00
Niels van Velzen
5c6b6f1b0c Use AsyncImageView in ItemListActivity 2022-05-30 21:31:52 +02:00
Niels van Velzen
1113277962 Use AsyncImageView in NowPlayingView 2022-05-30 21:31:52 +02:00
Niels van Velzen
1daf617f02 Use AsyncImageView in CustomPlaybackOverlayFragment logo 2022-05-30 21:31:52 +02:00
Niels van Velzen
ff63fbf90a Remove unused imageUrl from GridButton 2022-05-30 21:31:52 +02:00
Niels van Velzen
f84e8d6e28 Use AsyncImageView in LegacyImageCardView 2022-05-30 21:31:52 +02:00
Niels van Velzen
19a9cda075 Use AsyncImageView in AudioNowPlayingActivity poster 2022-05-30 21:31:52 +02:00
Niels van Velzen
6c6b881747 Use AsyncImageView in FullDetailsActivity poster 2022-05-30 21:31:52 +02:00
Niels van Velzen
cd168ad805 Use AsyncImageView in NextUpFragment 2022-05-30 21:31:52 +02:00
Niels van Velzen
50e69b79b4 Disable AsyncImageView transitions for now 2022-05-30 21:31:52 +02:00
Niels van Velzen
4be56a1201 Use AsyncImageView in DefaultCardView 2022-05-30 21:31:52 +02:00
Niels van Velzen
9d726f940f Add AsyncImageView 2022-05-30 21:31:52 +02:00
WWWesten
16eb676346 Translated using Weblate (Esperanto)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-05-29 18:22:04 -04:00
WWWesten
7a72cd371d Translated using Weblate (Russian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-05-29 18:22:04 -04:00
WWWesten
d0b0437e1b Translated using Weblate (Kazakh)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-05-29 18:22:04 -04:00
millallo
14b6e9f936 Translated using Weblate (Italian)
Currently translated at 100.0% (496 of 496 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-05-29 09:22:04 -04:00
Timmeh
4c2ce10004 add seperate button to adjust subtitle delay (if subtitles are present). (#1731)
* add seperate button to adjust subtitle delay (if subtitles are present).

* merge subtitle delay action and audio delay action to single button.

* Remove "m" prefix
Fix magic numbers
Fix formatting
Remove superfluous member variables

* Changes after review
Move all logic from `init` to constructor.

* Minor changes to SettingsPopup

Co-authored-by: Tim van Katwijk <tim.van.katwijk@moba.net>
2022-05-29 09:12:46 +00:00
Weblate
ba38e778dd Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-05-29 03:22:05 -04:00
Weblate
42cbd921af Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-05-29 03:22:04 -04:00
azumukupoe
d5238622cb Translated using Weblate (Japanese)
Currently translated at 68.3% (337 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2022-05-29 03:22:03 -04:00
Niels van Velzen
421df7696c Propagate errors from ItemRowAdapter to RetrieveFinishedListener 2022-05-29 09:08:15 +02:00
Niels van Velzen
b9e566902e Remove MathUtils 2022-05-28 22:52:48 +02:00
Andy Walsh
f9b647c7e2 Add Vimu external player support and fix some MX Player issues
* add Vimu external player support
* add better title support on external playback
* add filename to mx player extras
* fix mPosition conversion to int
* add detection for playback completion
2022-05-28 16:34:33 +02:00
Cameron
5e767ad7d1 fix player track selection - offset MediaStream indexes to account for external tracks (#1732)
* offset mediastream indexes used for player track selection to account for external tracks

* use imports for libVLC classes
2022-05-28 13:59:06 +02:00
Renovate Bot
d1d27e1762 Update Kotlin to v1.6.2 2022-05-27 21:47:31 +02:00
Renovate Bot
da0a8a4ff1 Update aboutlibraries to v10.3.0 2022-05-27 18:29:27 +02:00
Renovate Bot
2e926390b9 Update dependency com.android.tools.build:gradle to v7.2.1 2022-05-25 19:18:30 +02:00
radimous
7307a85740 Translated using Weblate (Czech)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/cs/
2022-05-22 05:22:01 -04:00
Renovate Bot
9a7c5b9d86 Pin dependencies 2022-05-20 22:21:24 +02:00
Renovate Bot
0f6ed41b9d Update dependency androidx.constraintlayout:constraintlayout to v2.1.4 2022-05-20 22:12:46 +02:00
Niels van Velzen
06df00f7e7 Add splashscreen to login 2022-05-19 13:55:33 +02:00
Johnny Lin
77b50bd2a4 Translated using Weblate (Chinese (Traditional))
Currently translated at 96.7% (477 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2022-05-19 06:22:00 -04:00
Bill Thornton
aad9eace35 Remove a useless local variable 2022-05-18 22:09:47 +02:00
Weevild
f3d494790a Translated using Weblate (Swedish)
Currently translated at 50.0% (2 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/sv/
2022-05-16 13:13:55 -04:00
Renovate Bot
ff996cebaa Update dependency org.jellyfin.sdk:jellyfin-core to v1.3.0-beta.3 2022-05-16 12:38:52 +02:00
José Albano
9168bdc339 Translated using Weblate (Spanish)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/es/
2022-05-16 04:13:55 -04:00
José Albano
41d8aab873 Translated using Weblate (Spanish)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-05-16 04:13:55 -04:00
Niels van Velzen
e8f14cf83a Update popup menu theme 2022-05-14 10:07:02 +02:00
Niels van Velzen
fd7180f498 Add popupmenu for servers in SelectServerFragment 2022-05-14 10:06:34 +02:00
Niels van Velzen
aeff8940aa Add popupmenu for users in ServerFragment 2022-05-14 10:06:34 +02:00
Niels van Velzen
5fa4e287fc Add MenuBuilder and DefaultCardView.setPopupMenu to easily create context menus for cards 2022-05-14 10:06:34 +02:00
Niels van Velzen
eaf8db542e Move DefaultCardView animation duration to integers.xml 2022-05-14 10:06:34 +02:00
Renovate Bot
f903bf11ed Update aboutlibraries to v10.2.0 2022-05-13 17:10:55 +02:00
Renovate Bot
f214af3103 Update dependency org.jetbrains.kotlinx:kotlinx-serialization-json to v1.3.3 2022-05-12 15:34:10 +02:00
Renovate Bot
c566930aa9 Update dependency io.mockk:mockk to v1.12.4 2022-05-11 18:46:07 +02:00
Page Asgardius
e807f6f893 Translated using Weblate (Spanish (Mexico))
Currently translated at 97.3% (480 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2022-05-11 12:13:54 -04:00
hoanghuy309
ef433ab97f Translated using Weblate (Vietnamese)
Currently translated at 98.1% (484 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-05-11 06:13:54 -04:00
newton181
5a78b7862a Translated using Weblate (Spanish (Latin America))
Currently translated at 96.1% (474 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2022-05-10 23:13:54 -04:00
kraus
bed370a9e5 Translated using Weblate (Polish)
Currently translated at 97.7% (482 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2022-05-10 15:13:53 -04:00
Moritz
c32cd64068 Translated using Weblate (German)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-05-10 12:13:53 -04:00
Renovate Bot
1f1f403838 Update koin to v3.2.0 2022-05-10 08:38:29 +02:00
Renovate Bot
17ab2abe8d Update dependency com.android.tools.build:gradle to v7.2.0 2022-05-09 22:02:02 +02:00
Oatavandi
820936ec46 Translated using Weblate (Tamil)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2022-05-08 02:13:53 -04:00
wolong gl
b523fee047 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hans/
2022-05-07 03:13:53 -04:00
Oskari Lavinto
f044790748 Translated using Weblate (Finnish)
Currently translated at 98.5% (486 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-05-07 03:13:52 -04:00
wolong gl
bee9d363ee Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-05-07 03:13:52 -04:00
millallo
3999c817a2 Translated using Weblate (Italian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-05-07 03:13:52 -04:00
Niels van Velzen
876e6bc5e9 Use JF_BOT_TOKEN in app-publish workflow 2022-05-06 20:31:30 +02:00
cameron
408f6073d0 revert subtitle alignment back to left align, fix srt newline parsing 2022-05-05 19:33:03 +02:00
nextlooper42
45324cd0d0 Translated using Weblate (Slovak)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-05-05 12:13:52 -04:00
Renovate Bot
56b4d0f463 Update com.github.bumptech.glide to v4.13.2 2022-05-05 08:34:48 +02:00
blob03
38240fa9f1 Translated using Weblate (French)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-05-04 17:13:51 -04:00
Niels van Velzen
b7cb47bc42 Remove sound effects from ItemRowView 2022-05-04 18:46:10 +02:00
Niels van Velzen
0918c73ed2 Inline drawable resources 2022-05-04 10:03:40 +02:00
WWWesten
07b9c84e3b Translated using Weblate (Esperanto)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-05-04 03:13:51 -04:00
Csaba
9319d05eaf Translated using Weblate (Hungarian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-05-04 03:13:51 -04:00
WWWesten
82c2403b76 Translated using Weblate (Russian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-05-04 03:13:51 -04:00
WWWesten
b48f7da67f Translated using Weblate (Kazakh)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-05-04 03:13:51 -04:00
Renovate Bot
756f534e57 Update kotest to v5.3.0 2022-05-03 21:00:25 +02:00
Weblate
702853a540 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-05-03 12:26:34 -04:00
Niels van Velzen
6bfe7bb617 Add dash between server address and issue in ServerAddFragment 2022-05-03 18:26:30 +02:00
Niels van Velzen
1f46104642 Redesign AddServerFragment 2022-05-03 18:26:30 +02:00
millallo
a522a2f9a8 Translated using Weblate (Italian)
Currently translated at 99.5% (491 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-05-03 07:13:51 -04:00
Thomas Schwery
632fa162a5 Translated using Weblate (French)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/fr/
2022-05-03 04:13:51 -04:00
WWWesten
26fe507ef4 Translated using Weblate (Esperanto)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-05-03 04:13:51 -04:00
Csaba
08123209de Translated using Weblate (Hungarian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-05-03 04:13:51 -04:00
WWWesten
8e6aaaac86 Translated using Weblate (Russian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-05-03 04:13:51 -04:00
WWWesten
26aadee010 Translated using Weblate (Kazakh)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-05-03 04:13:51 -04:00
Thomas Schwery
f07994752d Translated using Weblate (French)
Currently translated at 97.3% (480 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-05-03 04:13:51 -04:00
Weblate
1115ad9773 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-05-02 12:57:36 -04:00
Rhodri
0880f4c1be Translated using Weblate (Welsh)
Currently translated at 31.7% (156 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cy/
2022-05-02 12:57:35 -04:00
Cameron
6dafe0a9d0 Use enum for refresh rate switching setting - allow choosing between scaling on device or on tv (#1647)
* use enum for refresh rate switching preference

* fixed enum value comments

* renamed preference key

* log every considered mode, restored accidentally deleted string

* added missing brackets

* updated comment for migration, use original depends for preference screen

* renamed string

* offset default resolutionDifference by 1 to fix SCALE_ON_DEVICE ranking
2022-05-02 18:57:30 +02:00
Weblate
7ab7563f89 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-05-02 10:45:02 -04:00
cameron
04967b5811 initialize video manager when falling back to vlc 2022-05-02 16:44:58 +02:00
WWWesten
f6d60da090 Translated using Weblate (Esperanto)
Currently translated at 100.0% (491 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-05-02 09:13:51 -04:00
Csaba
62326fe6a6 Translated using Weblate (Hungarian)
Currently translated at 100.0% (491 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-05-02 09:13:51 -04:00
WWWesten
799ddc9742 Translated using Weblate (Russian)
Currently translated at 100.0% (491 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-05-02 09:13:51 -04:00
WWWesten
15cd147bd7 Translated using Weblate (Kazakh)
Currently translated at 100.0% (491 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-05-02 09:13:51 -04:00
Weblate
82c28eb9cc Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-05-02 02:56:59 -04:00
Niels van Velzen
bf358bfd4c Increase margin for "connecting to" subtitle in login fragment 2022-05-02 08:56:55 +02:00
Niels van Velzen
090678ce25 Implement QuickConnect 2022-05-02 08:56:55 +02:00
Niels van Velzen
9feaf107b2 Fix button remapping not saving the new button 2022-05-01 22:28:04 +02:00
Niels van Velzen
4462fd64a7 Add season id when querying video queue based on episode 2022-05-01 22:27:50 +02:00
Niels van Velzen
dd19e23a59 Update LicensesScreen to new AboutLibraries API 2022-05-01 22:27:34 +02:00
Renovate Bot
7005df16c3 Update dependency com.mikepenz:aboutlibraries-core to v10 2022-05-01 22:27:34 +02:00
Renovate Bot
47f256a4e3 Update plugin detekt to v1.20.0 2022-04-30 11:13:02 +02:00
Niels van Velzen
9a0fd6cd43 Update ACRA dialog builder code 2022-04-29 20:57:13 +02:00
Renovate Bot
9675ba2caa Update ch.acra to v5.9.3 2022-04-29 20:57:13 +02:00
Niels van Velzen
ec652b8950 Fix nullability issue in PreferencesFragment 2022-04-29 20:52:42 +02:00
Renovate Bot
213cd633e7 Update dependency androidx.preference:preference-ktx to v1.2.0 2022-04-29 20:52:42 +02:00
Renovate Bot
831035db04 Update io.kotest to v5.2.3 2022-04-29 20:40:47 +02:00
Renovate Bot
3795fe89ef Update dependency com.squareup.leakcanary:leakcanary-android to v2.9.1 2022-04-29 20:33:32 +02:00
Renovate Bot
f8dd24a73d Update com.github.bumptech.glide to v4.13.1 2022-04-29 19:41:35 +02:00
Renovate Bot
a4ae98fdb4 Update org.jetbrains.kotlinx 2022-04-29 18:45:17 +02:00
Renovate Bot
bf95ddca0c Update dependency org.jetbrains.kotlin:kotlin-gradle-plugin to v1.6.21 2022-04-29 17:58:06 +02:00
Renovate Bot
6d13eb75e4 Update dependency io.mockk:mockk to v1.12.3 2022-04-29 17:57:06 +02:00
Renovate Bot
7c38864f65 Update dependency com.android.tools.build:gradle to v7.1.3 2022-04-29 17:06:09 +02:00
Renovate Bot
b383fd5774 Update dependency androidx.fragment:fragment-ktx to v1.4.1 2022-04-29 17:05:06 +02:00
Renovate Bot
2aed16ac2f Update dependency androidx.appcompat:appcompat to v1.4.1 2022-04-29 17:04:28 +02:00
Renovate Bot
212c11368c Update dependency androidx.constraintlayout:constraintlayout to v2.1.3 2022-04-29 17:03:56 +02:00
Renovate Bot
17defd5705 Update dependency androidx.window:window to v1.0.0 2022-04-29 17:03:19 +02:00
Renovate Bot
74be025ccb Update io.insert-koin to v3.1.6 2022-04-29 17:02:42 +02:00
Niels van Velzen
448fc99291 Delete dependabot.yml 2022-04-28 22:08:36 +02:00
renovate[bot]
31af06ee77 Configure Renovate (#1650)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2022-04-28 21:18:53 +02:00
dependabot[bot]
57e814844c Bump github/codeql-action from 1 to 2
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 19:12:09 +02:00
MardukGD
4588872cb8 Translated using Weblate (Polish)
Currently translated at 99.5% (482 of 484 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2022-04-24 19:13:48 -04:00
Martim Pinheiro
d7889072cd Translated using Weblate (Portuguese (Portugal))
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/pt_PT/
2022-04-24 13:13:49 -04:00
Martim Pinheiro
e2015dd288 Translated using Weblate (Portuguese (Portugal))
Currently translated at 99.1% (480 of 484 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2022-04-24 13:13:48 -04:00
Oskari Lavinto
50abc9b901 Translated using Weblate (Finnish)
Currently translated at 99.1% (480 of 484 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-04-23 07:13:47 -04:00
m33ts4k0z
52d0745ada Translated using Weblate (Greek)
Currently translated at 87.6% (424 of 484 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-04-20 19:13:46 -04:00
nextlooper42
c88edf4c3f Translated using Weblate (Slovak)
Currently translated at 100.0% (484 of 484 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-04-20 10:13:46 -04:00
Niels van Velzen
c3acae06cb Update Jellyfin SDK to 1.3.0-beta.2 2022-04-19 20:45:44 +02:00
Niels van Velzen
bd114167ef Hide currently watching video from next up integration 2022-04-19 13:16:34 +02:00
Niels van Velzen
5d120f2198 Use SDK models in PhotoPlayerActivity 2022-04-19 07:58:59 +02:00
Niels van Velzen
b94fe0f2a6 Update to Kotlin SDK 1.3.0 (Jellyfin 10.8) 2022-04-18 10:21:49 +02:00
Weblate
59ef25091a Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-04-17 05:39:40 -04:00
Niels van Velzen
62a19a56fd Fix not opening last active server on authentication clearance 2022-04-17 11:39:36 +02:00
Weblate
cfd8d4d6c4 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-04-17 04:45:28 -04:00
Niels van Velzen
ec6ac9b6e0 Catch exceptions in SocketHandler.updateSession 2022-04-17 10:45:24 +02:00
Niels van Velzen
e4ad084824 Refactor authentication code 2022-04-17 10:45:24 +02:00
zero0200
dc57413fac Translated using Weblate (Thai)
Currently translated at 15.6% (76 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/th/
2022-04-16 15:13:46 -04:00
Niels van Velzen
748dd56dec Update playback rewrite build files 2022-04-16 12:53:21 +02:00
ccrisinel
a80d303bc2 Translated using Weblate (French)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-04-15 18:13:44 -04:00
Niels van Velzen
33005e3939 Refactor preference code
- Allow migrations in all store types
- Remove blocking functions from the preference module
- Move Preference.xx functions to global functions
2022-04-15 16:07:36 +02:00
Niels van Velzen
0e9281388a Move preference code to new preference module 2022-04-13 09:40:06 +02:00
Niels van Velzen
5ecaf93b27 Fix WebSocket connection not always reconnecting on session start 2022-04-13 09:30:08 +02:00
David Fairbrother
0d12a149f8 Bump to Exoplayer 1.27.1
This release has been out for 4 weeks (at the time of this commit) so it
reasonably well baked.

Some highlights that might help us from their release notes:
( https://github.com/google/ExoPlayer/releases/tag/r2.17.0 )

- Update video and audio track selection logic to only choose formats for adaptive selections that have the same level of decoder and hardware support
- Update video track selection logic to prefer more efficient codecs if multiple codecs are supported by primary, hardware-accelerated decoders
- Prefer audio content preferences (for example, the "default" audio track or a track matching the system locale language) over technical track selection constraints (for example, preferred MIME type, or maximum channel count).
- Fix decoder fallback logic for Dolby Vision to use a compatible H264/H265 decoder if needed.
- Fix decoder fallback logic for Dolby Atmos (E-AC3-JOC) to use a compatible E-AC3 decoder if needed.
- (HLS) Use chunkless preparation by default to improve start up time.
2022-04-12 12:57:44 +02:00
dependabot[bot]
0c0aee4194 Bump actions/upload-artifact from 2 to 3
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-11 21:08:17 +02:00
dependabot[bot]
7b1b678fcd Bump actions/setup-java from 2 to 3
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2 to 3.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-11 21:07:58 +02:00
Niels van Velzen
94b2eb9046 Update Kotlin SDK to 1.2.0-beta.2 2022-04-10 13:31:08 +02:00
millallo
063242ab82 Translated using Weblate (Italian)
Currently translated at 25.0% (1 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/it/
2022-04-09 05:13:42 -04:00
naveensrinivasan
f76ad3765e Set permissions for GitHub actions
- Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions

https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs

[Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/)

 Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much.

Signed-off-by: naveensrinivasan <172697+naveensrinivasan@users.noreply.github.com>
2022-04-09 11:07:47 +02:00
David Fairbrother
67bd4db38d Annotate nullability for java classes
Annotate the parameters as @nonnull for our new subscribe method, and
init which is just adjacent too
2022-04-08 12:56:15 +02:00
David Fairbrother
2d9936b02f Extract existing callback logic into interface
Many call-backs already exist between the VideoManager and
PlaybackController. But they are created on an ad-hoc basis in various
methods.

By extracting these out to a method it means we can:
- Remove the boilerplate of @Override methods in PlaybackController
- Easily refactor these into a seperate class long-term
- Add new handlers
- Pass parameters around in the future
- Not have everything dispatch to a simple onEvent.

This also makes extending the interface easier where we have exoplayer
only notifications (such as onPlaybackSpeedChanged). Since the VLC code
can simply call the notifier without going through a PlaybackListener
2022-04-08 12:56:15 +02:00
Oatavandi
4528eefb99 Translated using Weblate (Tamil)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/ta/
2022-04-07 12:13:41 -04:00
Oatavandi
724c91655e Translated using Weblate (Tamil)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2022-04-07 12:13:41 -04:00
millallo
f3721ebc97 Translated using Weblate (Italian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-04-06 05:13:41 -04:00
Renaldo Eduardo Freire
75c339ab1b Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-04-05 09:13:41 -04:00
Niels van Velzen
98aea02244 Remove TvApp.java 2022-04-05 13:14:17 +02:00
Niels van Velzen
846af69cee Use context for ItemRowAdapter in MediaManager 2022-04-05 13:14:17 +02:00
Niels van Velzen
8c2f64a033 Use context in ItemRowAdapter 2022-04-05 13:14:17 +02:00
Niels van Velzen
2eee420449 Use context in MediaManager 2022-04-05 13:14:17 +02:00
David Fairbrother
8dec56659d Remove obsolete annotation from VideoManager
This one was noticed during refactoring and it's fairly free. Now we use
a float (rather than a Float object) the nullable annotation is
incorrect.
2022-04-05 10:11:03 +02:00
David Fairbrother
752fb114e1 Extract getting max bitrate into call param
Since we are doing this three times we can simply move it out of these
methods. This makes it easier for us to calculate a dynamic bitrate
later.
2022-04-05 10:11:03 +02:00
David Fairbrother
431265c81e Extract methods to populate video options for VLC and ExoPlayer
Since we will be touching this code in a later commit it makes sense to
extract these into private methods as-is.
This commit only extracts the options and does not perform any
additional refactoring steps
2022-04-05 10:11:03 +02:00
Wang Xing Kai
3d7edff19d Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hant/
2022-04-04 21:13:43 -04:00
Carlos Perez
8376b09b78 Translated using Weblate (Spanish (Argentina))
Currently translated at 99.1% (482 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_AR/
2022-04-04 21:13:43 -04:00
Wang Xing Kai
0d1f74fae5 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2022-04-04 21:13:42 -04:00
Casper
2fd076b22c Translated using Weblate (Danish)
Currently translated at 69.9% (340 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2022-04-04 08:13:40 -04:00
Niels van Velzen
c18568f315 Update activity lifecycle callbacks to act before activity lifecycle events trigger 2022-04-04 12:51:12 +02:00
Niels van Velzen
c9d6553486 Move lastPlayedItem to DataRefreshService 2022-04-04 12:50:56 +02:00
Niels van Velzen
25ea47962d Remove TvApp.getCurrentUser()
Replaced with direct calls to UserRepository
2022-04-03 13:37:11 +02:00
Niels van Velzen
d7ee86ebb7 Require context in Utils.downMixAudio() 2022-04-03 13:26:33 +02:00
Niels van Velzen
282da7f458 Move LIVE_TV constants to separate file 2022-04-03 13:25:34 +02:00
Niels van Velzen
92b7977657 Add PlaybackControllerContainer to store PlaybackController instance 2022-04-03 13:24:08 +02:00
Niels van Velzen
02e5eeddd1 Fix SessionRepository trying to fetch user data when session is null 2022-04-03 10:44:01 +02:00
Niels van Velzen
7aef63dec8 Remove hotdog theme 2022-04-02 13:55:59 +02:00
Niels van Velzen
171e91914a Add UserRepository to replace TvApp.getCurrentUserLiveData()
Also migrates all usages of getCurrentUser to the UserDto from the SDK
2022-04-02 13:53:58 +02:00
cameron
c79b74dbd8 check item id equality instead of item object equality 2022-04-02 09:32:13 +02:00
Cameron
5fd89ed8c9 fix getSubtitleStreamIndex returning the wrong index (#1594)
* dont use mDefaultSubIndex in getSubtitleStreamIndex

* only set mCurrentOptions SubtitleStreamIndex if subtitles load without error

* clear mDefaultSubIndex in switchSubtitleStream
2022-04-01 19:53:23 +02:00
Niels van Velzen
d5d8229fbb Migrate NextUp code to Kotlin flows 2022-04-01 09:41:36 +02:00
Niels van Velzen
c45733ec22 Migrate SessionRepository to Kotlin flows 2022-04-01 09:41:26 +02:00
Niels van Velzen
427c9f9c96 Migrate LoginViewModel and ServerRepository to Kotlin flow 2022-04-01 09:41:17 +02:00
Niels van Velzen
c66ebcc686 Migrate UserViewsRepository to Kotlin flow 2022-04-01 09:41:08 +02:00
Niels van Velzen
4c50444a2c Remove unnecessary DetailItemLoadResponse 2022-04-01 09:40:12 +02:00
Niels van Velzen
ad259d20b1 Remove unnecessary GotFocusEvent 2022-04-01 09:40:02 +02:00
gradle-update-robot
65ebd3dac8 Update Gradle Wrapper from 7.4.1 to 7.4.2.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2022-04-01 09:39:42 +02:00
Bill Thornton
d890b4477d Merge pull request #1590 from nielsvanvelzen/double-trouble
Fix ASPECT_RATIO_BANNER again
2022-03-31 15:53:34 -04:00
Niels van Velzen
7d1a653c10 Fix ASPECT_RATIO_BANNER again 2022-03-31 21:47:17 +02:00
Oskari Lavinto
cc79497fce Translated using Weblate (Finnish)
Currently translated at 99.1% (482 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-03-30 09:13:39 -04:00
Catto
72128d1fe4 Translated using Weblate (Portuguese (Portugal))
Currently translated at 84.7% (412 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2022-03-30 09:13:38 -04:00
Niels van Velzen
06e286ef22 Move TvApp.canManageRecordings to Utils 2022-03-30 07:32:12 +02:00
Niels van Velzen
5cc2407a9d Remove 10.8 check for HLS support 2022-03-29 14:53:32 +02:00
Niels van Velzen
e2cdab31ea Add appCategory attribute to manifest 2022-03-29 14:52:04 +02:00
Niels van Velzen
6674c0fe63 Fix PreferenceStoreTests location 2022-03-29 08:22:16 +02:00
Niels van Velzen
0a423e8461 Fix MediaManager not checking ContextExtensionsKt.getActivity for null value 2022-03-28 21:44:33 +02:00
Niels van Velzen
b090868222 Remove currentActivity from TvApp 2022-03-28 21:44:33 +02:00
Niels van Velzen
083e7c11ad Migrate WebSocket code to new SocketApi from our SDK 2022-03-28 21:44:33 +02:00
nextlooper42
a39de4e4ef Translated using Weblate (Slovak)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-03-28 14:04:29 -04:00
小造xu_zh
3743c4cac0 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/zh_Hans/
2022-03-28 10:51:08 -04:00
小造xu_zh
633742a709 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-03-28 10:51:08 -04:00
Csaba
36142c504e Translated using Weblate (Hungarian)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/hu/
2022-03-28 02:13:38 -04:00
Csaba
c31adb7b17 Translated using Weblate (Hungarian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-03-28 02:13:37 -04:00
WWWesten
1cb13c8577 Translated using Weblate (Esperanto)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-03-27 21:13:37 -04:00
WWWesten
659dcf00cd Translated using Weblate (Russian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-03-27 21:13:37 -04:00
WWWesten
e1cdd96cb9 Translated using Weblate (Kazakh)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-03-27 21:13:37 -04:00
3ole
60ed8f2543 Translated using Weblate (German)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-03-27 15:13:37 -04:00
Niels van Velzen
db3af65226 Fix ExpandableTextView focusable when text is not ellipsized 2022-03-27 14:09:50 +02:00
Lukáš Kucharczyk
2f9068890e Translated using Weblate (Czech)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-03-27 05:55:21 -04:00
Cameron
7491ed175e fixed playFrom() crash, support queueing entire row (eg: last played) (#1568)
* fixed playFrom() crash, support queueing entire row (eg: last played)

* store MediaManager as a variable for readability
2022-03-27 09:16:32 +00:00
Cameron
df015146e2 fixed subtitles not clearing properly when switching (again) (#1571)
* fixed subtitles not clearing properly when switching (again)

* edited a couple comments so they're clearer
2022-03-27 11:10:52 +02:00
DavidFair
82a935c0f4 Refactor duplicated preferences code (#1341)
* Create abstract base class to move common func into

There's a lot of overlap between both preference stores. Additionally,
long-term it would be good to simply abstract away all the property
handling into one location.

That way each store can handle transactions ...etc. but the boilerplate
is in one place

* Unify common functionality from preference stores

Unifies the common bits, this will make it significantly easier to write
future stores.
It also means the most risky parts (de-serializing enums and dynamic
dispatch) are kept in one place. Making debugging / fixes signficantly
easier.

* Add tests for Preference setter/getters

Adds unit tests for the unified setters and getters.
This replicates the work that would be required to add a new store in
the future too.

* Minor tidy-ups

Minor tidy-ups based on other PR comments
- Don't include duplicate interfaces
- Leave formatting alone

* Revert IPreferenceStore rename

Rename IPreferenceStore to PreferenceStore, to match the other
interfaces in the repo

* Merge IPreferenceStore and BasicPreferenceStore

This merges the two classes into a single abstract class
PreferenceScore

We simplify the inheritance chain, keep the various implementation
details in one place and avoid code churn.

An abstract class has to be used so we can mark internal getT and setT
methods protected, and the enum serialization private. An interface
would require us to mark these methods public, polluting the API.

* Address PR comments

- Rename KeyName -> Key
- Move from method body to statement line

* Refactor enum serialization into impl classes

Since this is an implementation detail not all classes may rely on, we
should shift it into the various stores and only test the bare minimum.

* Switch from Junit to KoTest

Switches PreferenceStore test to use KoTest since JUnit has been
completely dropped from the codebase

* Get enum from string backed store directly where possible

In DisplayPreferencesStore we can directly get this from the store and
check for a null, saving a string allocation.

In SharedPreferenceStore, since we don't have access to the backing
store (which was intentional) we call getString instead. Since this is
the only case where null can appear as an empty string value we will
take the small hit to allocate an empty string. That way other users of
the getString interface don't have to check for null types which is a
store implementation detail.

* Reformat Shared code and tidy up test file

- Reformats the SharedPreferenceStoreCode to use less whitespace
- Tidy up the test file, by moving the test class and enum into their
own private sections rather than inside the test class

* Match FunSpec test style to other tests in project

Rather than use an init block we can simply wrap it in the FunSpec
block. This matches the style of all the other tests and removes some
boilerplate too.
2022-03-27 10:54:35 +02:00
David Fairbrother
cfbadba4e3 Switch to using audio time stretching by default
This matches libVLC's normal default. Looking back in the project
history this was set to no stretching from the very start @commit
9528b9a3ee

Since libVLC use it by default and this wasn't a bug fix I propose we
can opt in the audio stretching by default. This should only trigger when
a user selects a playback speed that isn't 1x anyway.
2022-03-27 10:26:07 +02:00
cameron
079d004f2a center align subtitles 2022-03-27 10:23:57 +02:00
Niels van Velzen
de7ff1c0c5 Update Kotlin SDK to 1.2.0-beta.1 2022-03-27 10:21:45 +02:00
3ole
b63cc26f97 Translated using Weblate (German)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/de/
2022-03-26 19:13:37 -04:00
3ole
ff351d7e3c Translated using Weblate (German)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-03-26 19:13:37 -04:00
Niels van Velzen
808d055c9a Add markdown support for item and server overviews 2022-03-26 14:31:38 +01:00
Niels van Velzen
70dd01c4f3 Use ItemSortBy constants instead of hardcoded strings 2022-03-26 12:22:18 +01:00
Andrea
f1c90445e7 Translated using Weblate (Italian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-03-26 07:13:37 -04:00
Niels van Velzen
988f9209c0 Migrate NumberSpinner to Kotlin 2022-03-26 10:23:35 +01:00
Niels van Velzen
3c97879b0c Migrate ObservableHorizontalScrollView to Kotlin 2022-03-26 10:23:35 +01:00
Niels van Velzen
1f25469a33 Migrate TextUnderButton to Kotlin 2022-03-26 10:23:35 +01:00
Niels van Velzen
7cf815d8c0 Migrate MediaInfoCardView to Kotlin 2022-03-26 10:23:35 +01:00
Niels van Velzen
3028b1e69e Migrate NowPlayingBug to Kotlin 2022-03-26 10:23:35 +01:00
Niels van Velzen
f44a7db3d1 Migrate DetailRowView to Kotlin 2022-03-26 10:23:35 +01:00
Niels van Velzen
5f968b8fe9 Rename .java to .kt 2022-03-26 10:23:35 +01:00
WWWesten
2bb4afbd29 Translated using Weblate (Russian)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/ru/
2022-03-25 17:13:37 -04:00
WWWesten
3f20489e71 Translated using Weblate (Esperanto)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/eo/
2022-03-25 17:13:37 -04:00
Polish Jelly
0c703cf614 Translated using Weblate (Polish)
Currently translated at 50.0% (2 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/pl/
2022-03-25 10:13:36 -04:00
nextlooper42
71afd9637a Translated using Weblate (Slovak)
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/sk/
2022-03-25 00:13:36 -04:00
Oskari Lavinto
26364184e2 Translated using Weblate (Finnish)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/fi/
2022-03-25 00:13:36 -04:00
WWWesten
66597adbec Translated using Weblate (Russian)
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/ru/
2022-03-24 20:13:37 -04:00
WWWesten
68fc7b126b Translated using Weblate (Kazakh)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/kk/
2022-03-24 20:13:37 -04:00
WWWesten
0b0036c7da Translated using Weblate (Esperanto)
Currently translated at 75.0% (3 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/eo/
2022-03-24 20:13:36 -04:00
Weblate
93fdbbcac0 Added translation using Weblate (Thai) 2022-03-24 16:33:50 -04:00
Weblate
24a46d5fd4 Added translation using Weblate (Albanian) 2022-03-24 16:33:46 -04:00
Weblate
1ce9ae5d39 Added translation using Weblate (Punjabi) 2022-03-24 16:33:44 -04:00
Weblate
c6b6573d74 Added translation using Weblate (Kannada) 2022-03-24 16:33:43 -04:00
Bill Thornton
4396fc2f80 Fix crash getting badge image with null base item 2022-03-24 18:43:58 +01:00
wolong gl
f58f8e8e6b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-03-24 01:13:36 -04:00
Rhodri
b7b60d4ee6 Translated using Weblate (Welsh)
Currently translated at 32.0% (156 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cy/
2022-03-23 22:40:00 -04:00
newton181
7220544d88 Translated using Weblate (Spanish)
Currently translated at 98.5% (479 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-03-23 22:40:00 -04:00
newton181
f868491ba2 Translated using Weblate (Spanish)
Currently translated at 100.0% (4 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/es/
2022-03-23 18:13:36 -04:00
newton181
674c8612f2 Translated using Weblate (Spanish)
Currently translated at 89.3% (434 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-03-23 18:13:36 -04:00
Bill Thornton
966ed7f3f9 Merge pull request #1559 from nielsvanvelzen/video-end-crash
Fix player crashing when video ends
2022-03-23 16:02:10 -04:00
Niels van Velzen
ea06fc0319 Fix player crashing when video ends 2022-03-23 20:55:59 +01:00
David Fairbrother
d0fba48aaa Replace deprecated EventListener with Listener
Follows the documentation examples for replacing EventListener. The main
change is dropping the custom logic from "onPlayWhenReadyChanged" to
"onIsPlayingChanged" which handles the pause logic.
This is recommended in
https://exoplayer.dev/listening-to-player-events.html#playback-state-changes
2022-03-23 17:14:11 +01:00
Cameron
92d37dc5b3 only parse exoplayer TracksInfo when needed - instead of once every 0.5-2 seconds (#1556)
* only parse TracksInfo when needed

* only set exoplayerAudioIndex if streamType == MediaStreamType.Audio
2022-03-23 17:06:56 +01:00
David Fairbrother
fa7956721e Add handling for updating end time based on playback speed
Adds handling to update the end time based on the user's current
playback speed.

This is a bit hacky since exoplayer is built on the assumption that we
have bi-directional communication to our UI layer. Instead the
CustomPlaybackTransportControlGlue is uni-directional polling the video
manager.

We unfortunately have to use hacky poll tricks to work-around the fact
we can't wire up on the "onPlaybackParametersChanged" call to notify the
glue class. However, in the short-term a 5s "delay" between setting and
updating is more favourable than setting up reverse listening
support.

Re #1509
2022-03-23 17:05:26 +01:00
Niels van Velzen
2edc47049e Remove server and user ItemType from BaseRowItem 2022-03-23 14:46:08 +01:00
Niels van Velzen
989c78fc65 Reformat menu xml files, remove unused icons 2022-03-23 14:45:53 +01:00
Niels van Velzen
26ac67e302 Add Android 12 backup configuration 2022-03-23 14:45:37 +01:00
Niels van Velzen
56fd1c6e6d Translated using Weblate (Dutch)
Currently translated at 50.0% (2 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv-fastlane/nl/
2022-03-22 11:13:36 -04:00
Renaldo Eduardo Freire
18c1509000 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-03-22 11:13:35 -04:00
Niels van Velzen
edd6033f03 Translated using Weblate (Dutch)
Currently translated at 25.0% (1 of 4 strings)

Translation: Jellyfin Android/Jellyfin Android TV Fastlane
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android-tv-fastlane/nl/
2022-03-22 08:44:29 -04:00
Niels van Velzen
5f1b43c432 Fix ASPECT_RATIO_BANNER 2022-03-22 13:39:53 +01:00
Niels van Velzen
39c21e607a Add fastlane structure to repository 2022-03-22 13:38:31 +01:00
David Fairbrother
ca9c700c16 Modernise with lambdas instead of explicit overrides
This reduces the verbosity and boilerplate around the methods. It makes
sense to do these whilst we're touching the code.
2022-03-22 09:06:24 +01:00
David Fairbrother
855fa1afe3 Select cancel by default on confirmation dialogs
Select cancel so a user doesn't accidentally delete media by hitting
delete twice. Since we ask it's worth adding this extra step, if we need
to remove the extra step it's arguable we can completely remove alert
dialog all-together
2022-03-22 09:06:24 +01:00
Niels van Velzen
5fdffe58c4 Fix preferences crashing 2022-03-22 08:37:14 +01:00
Niels van Velzen
41d7aeb6df Support resume movies in "next up" integration 2022-03-22 08:37:04 +01:00
Niels van Velzen
c90539b4b9 Merge all codec constants into a single object 2022-03-22 08:36:54 +01:00
Niels van Velzen
7172e14b39 Add SubtitleTypes 2022-03-22 08:36:54 +01:00
Niels van Velzen
b17dd5206f Rewrite constants in Kotlin 2022-03-22 08:36:54 +01:00
Niels van Velzen
72125a2dbe Rename .java to .kt 2022-03-22 08:36:54 +01:00
Bill Thornton
038724b7a2 Merge pull request #1542 from nielsvanvelzen/about-version-consistency
Add app name and flavor to version in about section
2022-03-21 15:41:53 -04:00
Bill Thornton
a9c78f401a Merge pull request #1544 from nielsvanvelzen/modelcompat-blurhash-fix
Fix imageBlurHashes must not be null crash
2022-03-21 15:41:36 -04:00
Niels van Velzen
77f31b9893 Fix imageBlurHashes must not be null crash 2022-03-21 20:34:03 +01:00
Oatavandi
64fd4766c8 Translated using Weblate (Tamil)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2022-03-21 14:13:35 -04:00
Niels van Velzen
d8695cb1a2 Add app name and flavor to version in about section 2022-03-21 18:40:32 +01:00
nextlooper42
6a2916ac01 Translated using Weblate (Slovak)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-03-21 08:13:35 -04:00
NunzioArdi
71833d28e1 Translated using Weblate (French)
Currently translated at 99.7% (485 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-03-21 08:13:35 -04:00
Lukáš Kucharczyk
1b04b6fa0c Translated using Weblate (Czech)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-03-21 08:13:35 -04:00
Niels van Velzen
3483876168 Add ripple effect to all buttons (#1522)
* Add ripple effect to all buttons

* Add buttonDefaultHighlightBackground attribute

* Fix some linter warnings in changed files

* Refactor TextUnderButton to support icon tint

* Fix NowPlayingBug not button text color

* Fix item_row not using button text color

* Use setActivated instead of _red icon for TextUnderButton
2022-03-21 10:17:21 +01:00
Niels van Velzen
bd64d144be Use consistent naming & constructors in custom views 2022-03-21 10:13:04 +01:00
Oskari Lavinto
7f77814e75 Translated using Weblate (Finnish)
Currently translated at 98.9% (481 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-03-21 00:13:35 -04:00
WWWesten
562fd770e1 Translated using Weblate (Esperanto)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-03-20 19:13:35 -04:00
WWWesten
0e450f32b0 Translated using Weblate (Russian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-03-20 19:13:35 -04:00
WWWesten
80a5d716b5 Translated using Weblate (Kazakh)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-03-20 19:13:35 -04:00
WWWesten
f7011afb3c Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-03-20 19:13:35 -04:00
Weblate
25745f35ab Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-03-20 06:00:17 -04:00
cameron
19984e1c1d reworked context menu for audio queue
also removed video queue buttons
2022-03-20 11:00:13 +01:00
cameron
f39ba05b38 fix crash from tracepot issue a46fe8ca0001267b
ActionsAdapter.clear() crashes when adapter is already empty
2022-03-20 10:44:57 +01:00
cameron
b1250de574 fix crash from tracepot issue 1d115b860001267b
crash from StreamInfo being null
2022-03-20 10:44:57 +01:00
cameron
a8dea85a1b fix tracepot issue 1a07276a0001267b
fix crash from null leanbackOverlayFragment
2022-03-20 10:44:57 +01:00
Niels van Velzen
f278f4b048 Move AuthenticationSortBy to model package 2022-03-20 10:43:01 +01:00
Niels van Velzen
629dbc9482 Remove LegacyAccountMigration 2022-03-20 10:42:40 +01:00
Niels van Velzen
18aa8c01fd Fully migrate NextUpActivity to SDK 2022-03-20 10:42:20 +01:00
cameron
be89cf276b prefer refresh rates closest to the source refresh rate 2022-03-19 22:47:11 +01:00
cameron
85a49fe757 prefer changing refresh rate without changing resolution 2022-03-19 22:47:11 +01:00
lyaschuchenko
7a6d63984c Translated using Weblate (Ukrainian)
Currently translated at 67.4% (328 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-03-18 12:13:36 -04:00
Weevild
df35a441f4 Translated using Weblate (Swedish)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-03-18 12:13:35 -04:00
TurtleIdiot
6129f90367 Translated using Weblate (Polish)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2022-03-17 20:13:35 -04:00
Oskari Lavinto
767871ff60 Translated using Weblate (Finnish)
Currently translated at 98.3% (478 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-03-16 06:13:37 -04:00
Oskari Lavinto
8b46d3e126 Translated using Weblate (Finnish)
Currently translated at 55.7% (271 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-03-16 01:13:35 -04:00
cameron
b723ddc250 wip fixes 2022-03-14 19:09:38 +01:00
cameron
c721e37988 fixed next item being marked watched, fixed subtitles not clearing from prev episode 2022-03-14 19:09:12 +01:00
wolong gl
e317ce3093 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-03-14 06:13:33 -04:00
Bill Thornton
0c435e4112 Merge pull request #1519 from nielsvanvelzen/change-user-while-listening-to-music-crash 2022-03-13 00:11:26 -05:00
Vardas
1ff9604151 Translated using Weblate (Lithuanian)
Currently translated at 15.8% (77 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2022-03-12 18:13:33 -05:00
Niels van Velzen
970d165b74 Fix app crash when switching users while music is playing 2022-03-12 21:49:18 +01:00
David Fairbrother
2af623ed13 Fix a potential crash in VideoManager with invalid speed
We should never hit this, unless someone is manually tweaking values in
the debugger.... but it still results in a hard crash as %d is for an
int, not a double.
2022-03-12 20:32:00 +01:00
Niels van Velzen
7e038334f8 Add ripple effect to DefaultCardView 2022-03-11 08:51:00 +01:00
Niels van Velzen
dcd8486d6c Fix ripple effect on LegacyImageCardView overflowing 2022-03-11 08:51:00 +01:00
Niels van Velzen
c26ffdfbfa Close ServerFragment when the server is removed from preferences 2022-03-11 08:50:38 +01:00
Niels van Velzen
fac5a7d35e Hide "manage servers" in preferences when there are no servers 2022-03-11 08:50:38 +01:00
WWWesten
7bf1f9b38b Translated using Weblate (Russian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-03-10 06:13:31 -05:00
cameron
42b3d469d1 remove tvapp.getapplication 2022-03-10 09:31:56 +01:00
gradle-update-robot
37315878e2 Update Gradle Wrapper from 7.4 to 7.4.1.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2022-03-10 08:47:48 +01:00
Bill Thornton
64248639a0 Merge pull request #1508 from mueslimak3r/crash-fix 2022-03-09 21:05:57 -05:00
cameron
aa80ca561f crash fix from null item 2022-03-09 14:34:28 -08:00
Ali Dastpour
007fc70a8c Translated using Weblate (Persian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 17:13:31 -05:00
Ali Dastpour
7d3a31b9de Translated using Weblate (Persian)
Currently translated at 98.7% (480 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 13:13:34 -05:00
Ali Dastpour
1a98e41e1e Translated using Weblate (Persian)
Currently translated at 52.2% (254 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 06:46:28 -05:00
Ali Dastpour
a21463fa44 Translated using Weblate (Persian)
Currently translated at 52.0% (253 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 06:37:03 -05:00
Ali Dastpour
69da942ed9 Translated using Weblate (Persian)
Currently translated at 51.2% (249 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 06:24:44 -05:00
Ali Dastpour
0fcfa2028e Translated using Weblate (Persian)
Currently translated at 50.4% (245 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 06:17:56 -05:00
Ali Dastpour
8f23c5975c Translated using Weblate (Persian)
Currently translated at 49.7% (242 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 06:14:41 -05:00
Ali Dastpour
64594dcec3 Translated using Weblate (Persian)
Currently translated at 45.8% (223 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 06:04:01 -05:00
Ali Dastpour
db9cc8a836 Translated using Weblate (Persian)
Currently translated at 41.7% (203 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 05:46:38 -05:00
Ali Dastpour
ffc5da8e6b Translated using Weblate (Persian)
Currently translated at 40.5% (197 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 05:35:24 -05:00
Ali Dastpour
071f0d06d0 Translated using Weblate (Persian)
Currently translated at 39.5% (192 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 05:30:54 -05:00
Ali Dastpour
b3bf36eb43 Translated using Weblate (Persian)
Currently translated at 37.8% (184 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-09 05:23:28 -05:00
Ali Dastpour
b610572f18 Translated using Weblate (Persian)
Currently translated at 35.8% (174 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-08 20:13:32 -05:00
Ali Dastpour
6e99c563cd Translated using Weblate (Persian)
Currently translated at 25.3% (123 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-08 17:16:01 -05:00
Ali Dastpour
86081c03db Translated using Weblate (Persian)
Currently translated at 20.9% (102 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-08 16:58:42 -05:00
Ali Dastpour
08e940dd50 Translated using Weblate (Persian)
Currently translated at 14.4% (70 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-03-08 16:34:25 -05:00
Cameron
e60aba4424 require at least server version 10.8.0 to use HLS (#1501)
* proof of concept

* refactored

* renamed method

* use comparison operator overload, use toString
2022-03-08 16:44:56 +01:00
cameron
36e4e949fe don't use exoplayer track selection if the track ID can't be parsed 2022-03-08 08:50:52 +01:00
cameron
40ac7ac7bf check if subtitle track info is empty 2022-03-08 08:50:52 +01:00
Bill Thornton
0ec0df73a8 Merge pull request #1502 from nielsvanvelzen/leanback-channel-worker-catch-timeout 2022-03-07 22:25:29 -05:00
kazuki ishii
f4afda0766 Translated using Weblate (Japanese)
Currently translated at 71.8% (349 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2022-03-07 18:13:30 -05:00
Thomas Schwery
6e6306f3db Translated using Weblate (French)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-03-07 18:13:30 -05:00
dependabot[bot]
070ef78e22 Bump actions/checkout from 2 to 3
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-07 18:39:49 +01:00
dependabot[bot]
67a8333331 Bump actions/stale from 4.1.0 to 5
Bumps [actions/stale](https://github.com/actions/stale) from 4.1.0 to 5.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v4.1.0...v5)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-07 18:39:40 +01:00
Niels van Velzen
30ab16e11b Catch SDK exceptions in LeanbackChannelWorker 2022-03-07 16:59:16 +01:00
Sayykii
ce03220c29 Translated using Weblate (Bulgarian)
Currently translated at 31.8% (155 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bg/
2022-03-07 07:13:30 -05:00
axel
7f6701d3cf Translated using Weblate (French)
Currently translated at 99.7% (485 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-03-06 19:13:30 -05:00
millallo
3ac6ad9d28 Translated using Weblate (Italian)
Currently translated at 100.0% (486 of 486 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-03-06 04:13:30 -05:00
Weblate
44156ece1e Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-03-05 14:45:23 -05:00
Niels van Velzen
57ec029bd6 Update default home sections and remove rewatching type 2022-03-05 20:45:20 +01:00
Oatavandi
f04adce784 Translated using Weblate (Tamil)
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2022-03-05 13:13:31 -05:00
nextlooper42
346c376408 Translated using Weblate (Slovak)
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-03-05 13:13:30 -05:00
Niels van Velzen
31b30b4b01 Translated using Weblate (Dutch)
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-03-05 13:13:30 -05:00
Niels van Velzen
b2a000251d Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-03-05 13:13:30 -05:00
Lukáš Kucharczyk
cc76f45dc7 Translated using Weblate (Czech)
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-03-05 13:13:29 -05:00
WWWesten
c671ee1229 Translated using Weblate (Esperanto)
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-03-05 07:53:31 -05:00
El Koulali András
67760232a7 Translated using Weblate (Hungarian)
Currently translated at 100.0% (487 of 487 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-03-05 07:53:31 -05:00
Weblate
0f0d2458a7 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-03-05 07:53:31 -05:00
Niels van Velzen
f6274f4549 Lower minimum subtitle size to 10 2022-03-05 13:53:27 +01:00
Niels van Velzen
81b973f6b6 Check mFragment for null value in PlaybackController 2022-03-05 13:53:14 +01:00
Weblate
bc9a7ca585 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-03-04 16:44:52 -05:00
Bill Thornton
955dea63d2 Merge pull request #1491 from nielsvanvelzen/longpress-crash 2022-03-04 16:44:49 -05:00
Niels van Velzen
a7558823bc Fix an issue where long-touching can crash the app 2022-03-04 22:38:28 +01:00
Weblate
41a3334153 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-03-04 16:21:31 -05:00
Bill Thornton
2f16b17a79 Merge pull request #1490 from nielsvanvelzen/dislike
Remove like & dislike
2022-03-04 16:21:28 -05:00
Niels van Velzen
17c45e6145 Remove like & dislike 2022-03-04 22:11:08 +01:00
Bill Thornton
1e39f86801 Merge pull request #1489 from nielsvanvelzen/longpress-menu
Open context menu on long press
2022-03-04 16:09:04 -05:00
Niels van Velzen
0163e00162 Open context menu on long press 2022-03-04 22:01:06 +01:00
Niels van Velzen
de6f84cbe8 Fix various Kotlin warnings 2022-03-03 22:19:31 +01:00
Niels van Velzen
3501038aa9 Explicitly set namespace and application id in build file 2022-03-03 08:41:38 +01:00
Niels van Velzen
9dd2f05ca6 Update AGP to 7.1.2 2022-03-03 08:41:38 +01:00
theGUI001
4fa0228478 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-03-02 14:13:28 -05:00
小造xu_zh
15c1786c6a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-03-02 09:13:28 -05:00
WWWesten
af4652982b Translated using Weblate (Hebrew)
Currently translated at 98.9% (488 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2022-03-01 16:13:28 -05:00
Shahar DynaZor
7ed836de83 Translated using Weblate (Hebrew)
Currently translated at 98.9% (488 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2022-03-01 13:13:30 -05:00
cameron
5f9f984ac2 bumped SLIDESHOW_DURATION to 30 seconds 2022-03-01 16:26:43 +01:00
cameron
aea04dd077 fixed background cycling 2022-03-01 16:26:43 +01:00
nextlooper42
bbd5a7ba7a Translated using Weblate (Slovak)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-02-28 06:13:27 -05:00
nextlooper42
16ecee2245 Translated using Weblate (Slovak)
Currently translated at 99.7% (492 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-02-27 19:13:27 -05:00
Ocuriz
c7ce74d125 Translated using Weblate (French)
Currently translated at 99.5% (491 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-02-26 21:26:00 -05:00
Ali Dastpour
cc44334019 Translated using Weblate (Persian)
Currently translated at 13.5% (67 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fa/
2022-02-26 11:13:28 -05:00
Cameron
320924e4b2 use ts for exoplayer transcodes (#1466)
* use ts for exoplayer

* removed addAc3Streaming helper

* removed findTranscodingProfile
2022-02-26 09:49:58 +00:00
Cameron
8b57f188e2 use track id for exoplayer track selection instead of guessing (#1469)
* fixed exoplayer track selection

* renamed a variable and changed some comments
2022-02-26 10:38:01 +01:00
Niels van Velzen
fa97f4e453 Migrate FullDetailsActivity to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
cf5a65d668 Migrate TextSearchFragment to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
aa138ac8ab Migrate PhotoPlayerActivity to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
5f626359d9 Migrate ItemListActivity and DetailRowView to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
b9027e62c3 Migrate AudioNowPlayingActivity to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
dc5966da1a Migrate TextUnderButton to view binding
Also removed a lot of unused stuff from it
2022-02-26 10:36:22 +01:00
Niels van Velzen
1360632e35 Migrate NumberSpinner to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
710e43002c Migrate NowPlayingBug to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
e203601a9f Migrate MyDetailsOverviewRowPresenter to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
879ff91afc Migrate ItemRowView to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
45c77cb1f5 Migrate ItemListView to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
89c379e19a Migrate HorizontalGridPresenter to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
f0714bb965 Migrate GridFragment to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
6807455e71 Migrate EnhancedBrowseFragment to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
ff1d735579 Migrate AudioDelayPopup to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
cec1e91b5f Migrate StdGridFragment alphapicker to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
12556343da Migrate NextUpButtons to view binding 2022-02-26 10:36:22 +01:00
Niels van Velzen
d978be4bff Update process lifecycle to avoid startup crash 2022-02-26 10:35:10 +01:00
Oatavandi
bcb1d0a271 Translated using Weblate (Tamil)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2022-02-25 16:00:22 -05:00
Lukáš Kucharczyk
5adc74ccda Translated using Weblate (Czech)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-02-25 16:00:22 -05:00
Lukáš Kucharczyk
db9efc9b0a Translated using Weblate (Czech)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-02-24 12:24:16 -05:00
cameron
299d64d4a0 subtitle fixes 2022-02-24 13:36:39 +01:00
Adam Zvolanek
3ef023afac Translated using Weblate (Czech)
Currently translated at 99.7% (492 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-02-23 21:50:57 -05:00
Csaba
1ef034de46 Translated using Weblate (Hungarian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-02-23 11:13:26 -05:00
WWWesten
762279e4d6 Translated using Weblate (Esperanto)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-02-23 08:13:26 -05:00
WWWesten
63968aa201 Translated using Weblate (Russian)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-02-23 08:13:26 -05:00
WWWesten
a431f7b026 Translated using Weblate (Kazakh)
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-02-23 08:13:26 -05:00
WWWesten
54b651c1fa Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (493 of 493 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-02-23 08:13:26 -05:00
Niels van Velzen
bf1ad6d9da Add 10.8 home section types 2022-02-23 11:50:28 +01:00
Niels van Velzen
450d778454 Disable wildcard imports 2022-02-23 11:45:57 +01:00
lyaschuchenko
b3a75867d6 Translated using Weblate (Ukrainian)
Currently translated at 60.8% (299 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-02-22 09:13:28 -05:00
lyaschuchenko
e035aac7bb Translated using Weblate (Ukrainian)
Currently translated at 31.9% (157 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-02-21 03:13:25 -05:00
Jim Ma
e91484d007 Translated using Weblate (Chinese (Traditional))
Currently translated at 69.8% (343 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2022-02-20 07:13:25 -05:00
Jim Ma
5d3cf69a14 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (491 of 491 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-02-20 07:13:24 -05:00
Niels van Velzen
ec8cdedd4f Fix remaining context used before initialization crashes 2022-02-20 12:58:43 +01:00
Cameron
8424e58158 Subtitle rendering optimization (#1455)
* wip render subtitles once per event

* tidied up

* changed wording of debug log

* wip render subtitles once per event

* tidied up

* changed wording of debug log

* added a comment

* hide debug log for the last event unless its useful
2022-02-20 11:39:12 +01:00
Bill Thornton
b23a7bb5e4 Merge pull request #1457 from nielsvanvelzen/context-crash
Fix crash when opening video player
2022-02-19 13:31:09 -05:00
Niels van Velzen
7a605501a9 Fix crash when opening video player 2022-02-19 19:16:23 +01:00
Niels van Velzen
22c50d50f5 Rewrite all unit tests using kotest 2022-02-19 19:01:41 +01:00
Niels van Velzen
2cfd134a83 Remove unused koin-test dependencies 2022-02-19 19:01:41 +01:00
Niels van Velzen
203bcfa13d Move all unit tests to kotlin sourceset, convert TimeUtilsTest.java to TimeUtilsTest.kt 2022-02-19 19:01:41 +01:00
Niels van Velzen
b40efcd845 Receive context in MediaManager.playNowInternal 2022-02-19 11:19:31 +01:00
Weblate
c0875f0717 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-02-19 04:16:13 -05:00
Niels van Velzen
b0c71018f3 Remove some dead code in error handler from ItemRowAdapter 2022-02-19 10:16:09 +01:00
Niels van Velzen
4126f07c6b Close Home and Details activities when no active user found
This prevents the app from crashing after recovering from a crash. It's a temporary solution until the current user data is moved to a repository and the activities are rewritten to make use of that.
2022-02-19 10:16:00 +01:00
Niels van Velzen
8cd28ccf0d Require context for BaseRowItem.getBadgeImage 2022-02-19 10:15:38 +01:00
Niels van Velzen
c6a29166b4 Use closest context instead of TvApp.getApplication in other places 2022-02-19 10:15:38 +01:00
Niels van Velzen
d119261f6c Use getString using closest context
Removes TvApp.getApplication usages when getting strings where possible
2022-02-19 10:15:38 +01:00
Niels van Velzen
d2e09b1d56 Disable blank issues 2022-02-16 21:25:43 +01:00
WWWesten
3347922a7d Translated using Weblate (Esperanto)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-02-16 07:13:23 -05:00
WWWesten
0cc481eb0a Translated using Weblate (Russian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-02-16 07:13:23 -05:00
WWWesten
e8d9b7e725 Translated using Weblate (Kazakh)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-02-16 07:13:23 -05:00
Lukáš Kucharczyk
62b0323f64 Translated using Weblate (Czech)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-02-14 02:13:22 -05:00
Ocuriz
c22a31566d Translated using Weblate (French)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-02-13 11:13:22 -05:00
val
f4527691ec Translated using Weblate (Estonian)
Currently translated at 6.3% (31 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/et/
2022-02-12 10:13:22 -05:00
cameron
694cd02fbf fix subtitle loading when not transcoding, and burnt in subs not turning off 2022-02-12 13:06:10 +01:00
Cameron
ddca2c9813 exoplayer track selection for audio (#1432)
* proof of concept exoplayer track selection for subs and audio

* replaced break with return for clarity - no change in behavior

* fixed translation of stream indexes to handle weird subtitle/audio arrangements

* forgot to add brackets around an if

* removed subtitle specific code

* prevent re-initializing in videoManager, cleaned up, added comments

* reverted subtitle changes in PlaybackController and VideoManager

* styling

* build upon TrackSelectionOverrides in stopPlayback - no functional difference (yet)

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/VideoManager.java

* added annotations and null checks for streamType

* removed a comment
2022-02-12 13:04:44 +01:00
cameron
013c8f6d85 reverted VideoAdapter getDuration 2022-02-12 12:03:59 +01:00
Niels van Velzen
65e53d340a Update AGP to 7.1.1 2022-02-12 12:02:11 +01:00
Cameron
6a0710d85f show buffered position in seekbar for exoplayer (#1435)
* show buffered position in seekbar for exoplayer

* removed debug log

* removed TODO

* reworked getDuration, added utility function for getting a safe seek position

* renamed getSafePosition to getSafeSeekPosition

* removed check for finishedInitialSeek to do mFragment.setCurrentTime
2022-02-12 10:06:28 +01:00
newton181
2df46ff4fc Translated using Weblate (Spanish (Latin America))
Currently translated at 95.7% (471 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2022-02-11 17:13:22 -05:00
Niels van Velzen
09423e29d3 Remove enableFeaturePreview for version catalogs 2022-02-09 19:04:27 +01:00
gradle-update-robot
9b7f6f7236 Update Gradle Wrapper from 7.3.3 to 7.4.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2022-02-09 19:04:27 +01:00
hoanghuy309
ca4f9146f6 Translated using Weblate (Vietnamese)
Currently translated at 98.1% (483 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-02-09 06:13:20 -05:00
siankatabg
a231cc31f3 Translated using Weblate (Bulgarian)
Currently translated at 29.4% (145 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bg/
2022-02-08 12:13:21 -05:00
Oskari Lavinto
10e561c8fe Translated using Weblate (Finnish)
Currently translated at 38.0% (187 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2022-02-08 08:13:20 -05:00
cameron
001706708a reset vlc meta position in clearPlaybackSessionOptions 2022-02-08 08:54:36 +01:00
Andrew Lee
28a99226f2 Translated using Weblate (Chinese (Traditional))
Currently translated at 69.9% (344 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2022-02-08 00:13:20 -05:00
Cameron
e268dbdbb8 fix crashes from changing audio tracks, fix exoplayer not using default audio track (#1409)
* fixed vlc audio track resetting to default, maybe fixed crash when using non default

* fixed audio track issues with libvlc and exo related to transcoding

* typo

* account for equality comparison of non-null obj to null obj

* removed one condition

* wip fixes - libVLC audio stream resetting on seek still broken

* fixed seeking resetting audio index in libVLC - again

* removed some debug logging, fixed libVLC direct play startup

* test

* added back startProgressLoop that was accidentally deleted

* moved debug output inside if so it's clearer whats going on

* cleaned up the code, added comments, removed some debug logs
2022-02-07 17:12:46 +01:00
Niels van Velzen
29623721fa Always use device info from SDK 2022-02-07 07:34:10 +01:00
Niels van Velzen
3c7d6692c4 Fix AutoBitrate causing an app crash when switching users while detecting bitrate 2022-02-07 07:33:49 +01:00
Theofilos Moupasiridis
3e452ba8f3 Translated using Weblate (Greek)
Currently translated at 81.9% (403 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-02-06 08:13:19 -05:00
cameron
24d7196774 revert to player.eventlistener 2022-02-05 22:38:57 +01:00
Niels van Velzen
df4b098861 Use Timber instead of (legacy) apiclient logger in StopTranscodingResponse 2022-02-05 18:15:55 +01:00
Niels van Velzen
2c1ec238a5 Fix opening app via leanback channels not showing item 2022-02-05 14:34:34 +01:00
Niels van Velzen
eed8458f3f Check active user from sessionRepository in AuthenticatedUserCallbacks 2022-02-05 14:34:21 +01:00
Niels van Velzen
8e110fcc05 Prevent DreamActivity (screensaver) from opening login screen 2022-02-05 14:34:21 +01:00
Juanpi Suarez
d25311c5fb Translated using Weblate (Spanish (Argentina))
Currently translated at 86.3% (425 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_AR/
2022-02-05 03:13:19 -05:00
Emil Manea
9a785229fc Translated using Weblate (Romanian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ro/
2022-02-04 15:13:20 -05:00
Cameron
06fe4d2ecc simplified exoplayer code (#1401)
* simplified exoplayer code


replaced TvApp.getApplication(), replaced Player.EventListener()

removed data and media source factories

* reworked configureExoplayerFactory to return the exoplayer builder

* fixed typo
2022-02-04 08:58:55 +01:00
Cameron
2dcd0d1019 bug report template - changed examples to encourage providing more specific info (#1420)
* Update bug-report.yaml

* Update .github/ISSUE_TEMPLATE/bug-report.yaml
2022-02-04 08:56:47 +01:00
Cameron
15fd2466e1 playback bug report template - changed examples to encourage providing more specific info (#1419)
* Update bug-report-playback.yaml

* Update .github/ISSUE_TEMPLATE/bug-report-playback.yaml
2022-02-04 08:56:40 +01:00
DavidFair
9e74f2dc7a Include Jellyfin Exoplayer FFmpeg dep (#1369)
* Include Jellyfin Exoplayer FFmpeg dep

Port the includes from the Android repo as-is into this repo to include
the dependency

Convert our initialisation to prefer the built in extensions. This
should avoid flaky device logic and matches the Android app choice too.

* Drop check for DCS / DCA on firestick gen 1

FFmpeg should handle the decoding on these devices for us natively, and
likely uses the same codepath as libVLC. This should help us stick with
the native player instead of VLC where possible

* Replace TvApp.getApplication with getting context from activity

This removes another deprecated usage of TvApp by the reviewer

* Add new codecs to list of supported profiles

Adds the new codecs to reflect the new capabilities available from our
FFmpeg extensions.

* Refactor duplicated audio codec list into method

Refactor the duplicated audio codecs. Whilst I can't think of a case
where a user might play say DTS / TrueHD audio files, I equally can't
think of a reason why not to support it.

This simplifies the code, whilst allowing us to still extend the list
with some Audio only codecs for audio direct-play

* Lowercase PCM formats

This matches the format found on the server and the Android mobile
implementation to be safe

* AudioDirectPlayProfile: Replace vaarg with Array<String>

This allows us to easily combine two arrays together without having to
create copies with spread operators.
Internally the copies still function the same as we have an interable
type we are applying joinToString(",") with

* Switch to using EXTENSION_RENDERER_MODE_ON

This will use the system core renderers first. To get the fallback
behaviour we simply needed to add `setEnabledDecoderFallback`. This
allows Exoplayer to try the first decoder, then silently fallback on
error to ffmpeg.

Functionally this matches the implementation goals in the Android Mobile where
they will manually fallback instead. Since we can't access / restart the
media queue easily in this repo.

* Code cleanup from PR review

Addresses various comments where we can improve the readability around
the various changes we've made

* Drop ExoPlayerProfileTests

Since it only check hardcoded values which rarely change are there

* Whitespace tidy up + manual reformatting

Some various tidy ups and manual reformatting as pointed out from the
PR. This helps reduce down the amount of empty whitespace in the file

* Formatting fixes

Various hand-fixes where the formatter hasn't quite got it right
2022-02-03 19:37:31 -08:00
edupoma
2132da187f Translated using Weblate (Catalan)
Currently translated at 89.8% (442 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ca/
2022-02-03 20:13:19 -05:00
Emil Manea
c978ee58ae Translated using Weblate (Romanian)
Currently translated at 76.2% (375 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ro/
2022-02-03 20:13:19 -05:00
edupoma
94ccc84083 Translated using Weblate (Spanish)
Currently translated at 89.8% (442 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-02-03 20:13:18 -05:00
Niels van Velzen
f05bf646cc Remove getCurrentActivity usages in VideoManager and PlaybackController 2022-02-03 09:06:12 +01:00
David Fairbrother
490f17019b Move video speed controls to the right of secondary bar
Closed Captions and Subtitles are used far more than this. Especially
since the controller will preserve your speed between videos.
2022-02-03 08:53:26 +01:00
Niels van Velzen
8c01a3d0eb Remove unused codefrom data.compat package (#1417) 2022-02-03 08:43:33 +01:00
Niels van Velzen
fddac39403 Remove "i" prefix from interfaces (#1416)
* Remove "i" prefix from interfaces

* Remove unnecessary GridLoader interface
2022-02-03 08:43:08 +01:00
Bill Thornton
4fa4a18087 Fix default values for library sorting 2022-02-02 22:04:36 +01:00
Bill Thornton
803bf5496c Merge pull request #1412 from nielsvanvelzen/never-call-updatesession-callback-twice
Fix ApiBinder calling callback twice when the success callback fails
2022-02-02 11:13:11 -05:00
Niels van Velzen
fa3a76037f Fix ApiBinder calling callback twice when the success callback fails 2022-02-02 16:54:43 +01:00
Niels van Velzen
ee8dfdb2ee Don't use TextUtilsKt.toHtmlSpanned in ItemRowView.updateWatched 2022-02-02 16:43:49 +01:00
Niels van Velzen
bfd9b58762 Allow HTML in login disclaimer 2022-02-02 16:43:49 +01:00
mortetm
3e64a120c7 Translated using Weblate (Croatian)
Currently translated at 84.3% (415 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hr/
2022-02-01 17:13:18 -05:00
WWWesten
811afdd034 Translated using Weblate (Russian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-01-31 06:13:18 -05:00
WWWesten
e47de9d892 Translated using Weblate (Kazakh)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-31 06:13:18 -05:00
Bill Thornton
e06e7fa4f7 Merge pull request #1399 from nielsvanvelzen/fix-search-provider 2022-01-30 12:34:47 -05:00
Niels van Velzen
6e5919d35a Fix searchable.xml not supporting ${applicationId} 2022-01-30 17:50:40 +01:00
Bill Thornton
4118ec8649 Merge pull request #1398 from nielsvanvelzen/fix-search-provider 2022-01-30 11:30:43 -05:00
Niels van Velzen
58f290f910 Fix MediaContentProvider authority not using ${applicationId} 2022-01-30 17:17:39 +01:00
Niels van Velzen
9a17b8bbfe Migrate NextUpViewModel to use SDK for images 2022-01-29 11:30:56 +01:00
Niels van Velzen
06e695e654 Migrate BaseItemUtils.buildChapterItems to use SDK for images 2022-01-29 11:30:56 +01:00
Niels van Velzen
c5182b34f8 Migrate BackgroundService to use SDK for images 2022-01-29 11:30:56 +01:00
Niels van Velzen
f8c7ba0e83 Add opus as supported audio codec for ExoPlayer 2022-01-29 10:37:25 +01:00
Niels van Velzen
9bcf6f7d20 Suppress RestrictedApi issues for Leanback library in LeanbackChannelWorker 2022-01-29 10:36:24 +01:00
Niels van Velzen
ea080fed7a Upgrade Android Gradle Plugin to 7.1.0 2022-01-29 10:36:24 +01:00
cameron
799201c670 queue row should position itself reliably now 2022-01-29 10:29:41 +01:00
cameron
e484722312 removed shufflequery, removed shuffle from the artist/album query builder 2022-01-29 10:28:52 +01:00
cameron
70227bdf74 shuffle the audio queue locally 2022-01-29 10:28:52 +01:00
cameron
79457860e2 reset lastUniqueProgressEvent and lastReportedPlaybackPosition in stopProgressLoop 2022-01-29 10:26:31 +01:00
cameron
087d99aad4 temporary handler for device going to sleep while playing, release player on complete 2022-01-29 10:26:31 +01:00
cameron
7cd7de4795 handle audio focus loss, set newplaying bug pos to 0 on idle 2022-01-29 10:26:31 +01:00
cameron
e8fed01aa5 fixed buttons not updating onresume when player is not initialized 2022-01-29 10:26:31 +01:00
newton181
f0256613e6 Translated using Weblate (Spanish (Mexico))
Currently translated at 86.7% (427 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2022-01-28 20:13:16 -05:00
Niels van Velzen
452f4d80f3 Fix ImageHelper returning wrong URL when preferParentThumb is true 2022-01-27 19:25:42 +01:00
Niels van Velzen
09013200b0 Initial ImageUtils SDK migration (#1377)
* Send ApiClient instance to ImageUtils.getPrimaryImageUrl

* Add ImageHelper to create image urls using the SDK

* remove apiclient parameter from ImageUtils functions
2022-01-25 15:10:21 +01:00
Cameron
520c1b4951 fix crash from empty or null browsecommand sent from android client (#1385)
* fix crash when remote controlling and quickly press back on android phone

* replaced try catch with guard

* use utils isempty in guard
2022-01-25 14:32:09 +01:00
Thilo Jaeggi
0de3437e4e Translated using Weblate (German)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-01-25 05:13:15 -05:00
Niels van Velzen
ca170a28f8 Add repository condition to stale workflow 2022-01-25 08:36:04 +01:00
K3rnelPan1c
75eb179688 add stale issue check workflow (#1379)
* add stale issue check workflow

this should replace the functionality of the discontinued stale-bot

* change PAT use for stale action

* change to address review comments
2022-01-24 08:56:23 +01:00
Romain Eggermont
a275ad83c0 Translated using Weblate (French)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-01-23 10:29:23 -05:00
Niels van Velzen
014e52d1a8 Fix nullability for UserViewsRepository.isSupported and UserViewsRepository.allowViewSelection 2022-01-23 15:57:34 +01:00
Niels van Velzen
198fd5ae95 Move user view related logic to UserViewsRepository 2022-01-23 08:35:27 +01:00
Niels van Velzen
1c67dff399 Add libraries link to customization preferences
This is a shortcut to open the display preferences for user views
2022-01-23 08:35:27 +01:00
Niels van Velzen
16fc07abc0 Remove unused stuff from MyDetailsOverviewRow 2022-01-22 16:25:55 +01:00
David Fairbrother
7225d0d053 Add check to PlaybackController for LiveTV Case
Since we no longer create a speed controller when viewing live TV
nothing will reset the playback speed.
It's easier (from a bug fixing POV) to know that speed controller is not
involved in live TV at all, even if it adds additional checks to
PlaybackController
2022-01-22 16:01:23 +01:00
David Fairbrother
3c97be93aa Hide speed controls when displaying live TV
Hide the playback speed controls, since this is effectively useless with
the speed being forced to 1x
2022-01-22 16:01:23 +01:00
David Fairbrother
0da44393a0 Cap speed at 1.0 when live TV is on
We could allow various things, like a speed less than 1 or greater than
until we exhaust the buffer.

Unfortunately I don't have the equipment to test more complex
interactions, so lets play it safe and force it always to 1.0
2022-01-22 16:01:23 +01:00
cameron
0bf09f92e0 removed condition that shouldnt have been added 2022-01-22 15:02:49 +01:00
cameron
2bc8fc1df2 dynamically fill button row and hide extra 2022-01-22 14:48:39 +01:00
Niels van Velzen
e1dc58ff16 Remove 1.5 Mbit/s from max streaming bitrate option
The calculated name for it was wrong and removing it was easier then fixing the name.
2022-01-22 14:46:49 +01:00
ValentinChirikov
b7f36b6561 Translated using Weblate (Russian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-01-22 06:13:14 -05:00
nextlooper42
4a56ddab5e Translated using Weblate (Slovak)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-01-21 13:13:14 -05:00
David Fairbrother
4313591525 Replace deprecated SimpleExoPlayer -> ExoPlayer
As per the 2.16.0 release notes:
https://github.com/google/ExoPlayer/blob/release-v2/RELEASENOTES.md#2160-2021-11-04

SimpleExoPlayer is deprecated, and all functionality has been moved to
ExoPlayer. This allows us to replace these calls as-is and future proofs
us too.
2022-01-21 17:16:16 +01:00
Cameron
620c806f6a on resuming fulldetails activity give play button focus if resume button isnt eligible (#1371)
* give play button focus if resume button isnt eligible

* removed unnecessary code
2022-01-21 17:14:03 +01:00
Cameron
3aee08b245 patch bug where video queue can be messed up and item progress is incorrect after playback (#1372)
* check if fragment belongs to curr session, release player in controller

* guard against VideoManager being null
2022-01-21 17:13:40 +01:00
nextlooper42
0da05cc17c Translated using Weblate (Slovak)
Currently translated at 89.8% (442 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-01-21 09:13:13 -05:00
Deleted User
f73c2f2efa Translated using Weblate (Swedish)
Currently translated at 85.5% (421 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-01-20 10:13:13 -05:00
Cameron
29c035e5c8 more playback leak fixes (#1368)
* fixed null reference crashes and improved handling of playing incompatible item

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/PlaybackController.java

* fixed leaks in main player

* fixed leaks in live tv

* removed unused overrides, fixed formatting
2022-01-20 13:48:53 +01:00
Cameron
c85751ed31 Bypass hls seeking behavior for devices not using exoplayerprofile (#1362)
* wip workaround for device that rejects hls

* fixed condition in onprepared, removed condition in seek

* fix for live tv and hls, prevent seeking on starting live tv playback
2022-01-19 19:43:08 +01:00
Cameron
6251ed404b fixed crashes on failing to start playback of an unsupported or unavailable video (#1360)
* fixed null reference crashes and improved handling of playing incompatible item

* added some delay before the activity finished

* fixed null reference crashes and improved handling of playing incompatible item

* added some delay before the activity finished

* a couple additional guards against the player being null

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/PlaybackController.java

* more guards

* fixed activity not finishing on too many errors
2022-01-19 19:31:48 +01:00
David Fairbrother
ccaf86008e Exoplayer: Replace setPlaybackSpeed with setPlaybackParameters
Replace the deprecated / removed method setPlaybackSpeed with the more
modern setPlaybackParameters. This matches the current docs for
exoplayer
2022-01-19 19:09:59 +01:00
Lukáš Kucharczyk
eff21d0fa6 Translated using Weblate (Czech)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-01-19 05:13:13 -05:00
Penguins114
395d384908 Translated using Weblate (Japanese)
Currently translated at 72.3% (356 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2022-01-18 21:13:13 -05:00
Bill Thornton
55517d12d3 Merge pull request #1363 from nielsvanvelzen/stale-is-stale 2022-01-18 18:55:22 -05:00
Niels van Velzen
4709e6f82d Remove stale.yml 2022-01-18 21:44:07 +01:00
Oatavandi
eafd84c2a1 Translated using Weblate (Tamil)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2022-01-18 13:13:13 -05:00
hoanghuy309
d1bc46529e Translated using Weblate (Vietnamese)
Currently translated at 97.5% (480 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-01-18 08:13:13 -05:00
WWWesten
643fda9ed7 Translated using Weblate (Ukrainian)
Currently translated at 31.3% (154 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2022-01-18 08:13:13 -05:00
wolong gl
5f82d12e96 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-01-18 08:13:13 -05:00
Renaldo Eduardo Freire
9d49bad241 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-01-18 08:13:13 -05:00
Niels van Velzen
46d2fbe9a5 Remove unused RemoveCurrentItem and RefreshRows CustomMessage types 2022-01-18 10:16:53 +01:00
Niels van Velzen
0c34e7dea4 Remove unused QueryType values (#1356)
* Remove unused ViewType enum

* Remove unused StaticServers and Users QueryTypes

* Remove unused ContinueWatching QueryType

Continue watching in the home screen uses a different type (probably StaticItems)
2022-01-18 10:16:32 +01:00
Alan Azar
a4b6516e86 Translated using Weblate (Arabic)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2022-01-18 01:13:13 -05:00
WWWesten
050945b6a3 Translated using Weblate (Esperanto)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-01-17 16:00:23 -05:00
WWWesten
f2e2996a32 Translated using Weblate (Kazakh)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-17 16:00:23 -05:00
WWWesten
e86c32bcb0 Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-01-17 16:00:23 -05:00
Niels van Velzen
3809fe6a76 Fix typo "neccesary" > "necessary" 2022-01-17 22:00:18 +01:00
WWWesten
43194095ed Translated using Weblate (Kazakh)
Currently translated at 98.1% (483 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-17 12:13:12 -05:00
Csaba
e2bcecec2b Translated using Weblate (Hungarian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-01-17 09:13:15 -05:00
nextlooper42
b72b6bd60d Translated using Weblate (Slovak)
Currently translated at 89.2% (439 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-01-17 09:13:14 -05:00
Dee
7e02b012c7 Translated using Weblate (Chinese (Simplified))
Currently translated at 91.0% (448 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-01-17 09:13:13 -05:00
WWWesten
984df9c613 Translated using Weblate (Kazakh)
Currently translated at 94.1% (463 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-17 09:13:13 -05:00
Alex Camilleri
a35d16372b Translated using Weblate (Italian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-01-17 09:13:12 -05:00
cameron
9f7478a7f2 fixed a crash caused by the leak fixes pr 2022-01-17 15:10:27 +01:00
hoanghuy309
91c4629d20 Translated using Weblate (Vietnamese)
Currently translated at 97.5% (480 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-01-16 19:13:14 -05:00
WWWesten
8b685aaf8a Translated using Weblate (Russian)
Currently translated at 100.0% (492 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-01-16 19:13:13 -05:00
Niels van Velzen
f1e5f9ebe0 Translated using Weblate (Dutch)
Currently translated at 86.1% (424 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-01-16 19:13:13 -05:00
millallo
e67c2da53c Translated using Weblate (Italian)
Currently translated at 98.7% (486 of 492 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-01-16 19:13:13 -05:00
Weblate
e5e61107ef Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2022-01-16 10:08:11 -05:00
Niels van Velzen
a9845fd3b2 Use slide right animation for preferences theme 2022-01-16 16:08:07 +01:00
Niels van Velzen
d5f85d8015 Merge lazyOptionsScreen and optionsScreen into a single (non-lazy) getter 2022-01-16 16:08:07 +01:00
Niels van Velzen
21d495fdd2 Remove unused strings
Only in main strings.xml - translations will be removed automatically by Weblate
2022-01-16 16:08:07 +01:00
Niels van Velzen
669893be12 Refactor preferences UI
- Use separate screens for a few main categories
- Categorize preferences
- Reorder preferences/categories/screens
- Rename strings to make more sense
- Add missing descriptions
- Rename "settings" to "preferences"
- Rename "user" to "account"
- Use Normal Capitalization Instead Of Title Casing
- Add icons to preference links and about items
- Remove Utils.getVersionString
2022-01-16 16:08:07 +01:00
Niels van Velzen
5545f29119 Fix bad string formatting in server issue strings 2022-01-16 16:08:07 +01:00
Niels van Velzen
8ed44a6200 Use default width for preferences overlay 2022-01-16 16:08:07 +01:00
siankatabg
72ae1d3e3e Fix broken subtitles line wrapping (#1346)
* Fix broken subtitles line wrapping after my last PR

Apparently I did a mistake using the ReplacementSpan for outlining the text as it doesn't support line wrapping, so lets do it with a custom TextView :)

* Code fixes

* Another one...
2022-01-16 16:07:31 +01:00
Cameron
1e8ea6cb5b use HLS for exoplayer with transcoded streams (#1342)
* WIP use hls for transcoded streams


replaced progressive media source, use mediaitem

moved hls stuff to exoplayer profile, revert some playbackcontroller logic so vlc works


hevc support - needs testing

* edited wip profile adder

* removed wip profile adder

* removed debug output

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/VideoManager.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

* Update app/src/main/java/org/jellyfin/androidtv/util/profile/ExoPlayerProfile.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

* resolved merge conflict

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2022-01-16 12:18:28 +01:00
Cameron
2364acfc1b fixed some playback leaks (#1350)
* fixed some playback leaks

fixed leaks in caused by report loop in videomanager

clear references to videomanager and overlay fragment in playbackcontroller when playback ends
restored method accidentally deleted

disabled screensaver

handle home button interrupting playback by ending the playback activity

* added back missing activity finish

* missed a few setKeepScreenOn
2022-01-16 11:41:49 +01:00
nextlooper42
3ff1cd142b Translated using Weblate (Slovak)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-01-15 10:13:11 -05:00
Niels van Velzen
c8cf372301 Translated using Weblate (Dutch)
Currently translated at 98.3% (469 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-01-15 07:13:11 -05:00
WWWesten
b0052caa18 Translated using Weblate (Kazakh)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-15 04:13:11 -05:00
WWWesten
49139a8ee0 Translated using Weblate (Esperanto)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-01-14 19:13:11 -05:00
Zorglube
73bcf64781 Translated using Weblate (French)
Currently translated at 98.7% (471 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-01-14 11:13:11 -05:00
Renaldo Eduardo Freire
545b9f958f Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-01-14 04:13:11 -05:00
Theofilos Moupasiridis
1355f36048 Translated using Weblate (Greek)
Currently translated at 90.3% (431 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2022-01-14 00:13:13 -05:00
Nawaf
f4db105c22 Translated using Weblate (Arabic)
Currently translated at 97.9% (467 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2022-01-13 19:13:11 -05:00
WWWesten
d61e3ec607 Translated using Weblate (Esperanto)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-01-12 16:13:11 -05:00
WWWesten
b201be7840 Translated using Weblate (Russian)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-01-12 16:13:10 -05:00
WWWesten
635f4d3542 Translated using Weblate (Kazakh)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-12 16:13:10 -05:00
WWWesten
61a8799c80 Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-01-12 16:13:10 -05:00
Bill Thornton
e8db923f9c Merge pull request #1343 from nielsvanvelzen/let-me-see-my-shitty-photo-albums-please-you-stupid-app
Fix app crash when opening photo albums
2022-01-12 13:46:28 -05:00
Niels van Velzen
2eb16026b8 Fix app crash when opening photo albums 2022-01-12 19:40:52 +01:00
avicarpio
0ba9530aa6 Translated using Weblate (Catalan)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ca/
2022-01-12 13:13:17 -05:00
Dzonkins
67c59a4041 Translated using Weblate (Serbian)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sr/
2022-01-12 13:13:14 -05:00
Csaba
06f9e026b8 Translated using Weblate (Hungarian)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-01-12 13:13:14 -05:00
小造xu_zh
a5fac70968 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-01-12 13:13:14 -05:00
Alfonso Scarpino
e4ac9e8624 Translated using Weblate (Italian)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-01-12 13:13:14 -05:00
avicarpio
32aa1f60f7 Translated using Weblate (Spanish)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2022-01-12 13:13:13 -05:00
Lukáš Kucharczyk
40043c8b6d Translated using Weblate (Czech)
Currently translated at 100.0% (477 of 477 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-01-12 13:13:10 -05:00
Csaba
6254b8181d Translated using Weblate (Hungarian)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-01-12 02:50:10 -05:00
DavidFair
17ba4828a7 Add Playback speed controls (#1302)
* Add basic mocks to unit test PlaybackController

Adds the various basic mocks required to unit test Playback Controller.

At a high level the steps we perform are:
- Prep mocks for deps injected by constructor
- Prep mocks for Koin, then pass these as singletons
- Patch up various calls out to Android SharedPrefs ...etc.

This allows us to construct a PlaybackController in a JVM context now.
These mechanisms will be useful for later in the patch series too....

* Add setPlayback impl and tests to controller/view

Adds setPlaybackSpeed to the view and controller.
The controller has associated tests which built on the earlier ones.

Unfortunately the view also has logic in it and I've tried to (ab)use
mocks to factor out the ExoPlayer factory. However because it's a static
final the mock will always defer to the real impl.

I could introduce some sort of interface and abstract out the calls to
the underlying players using an adapter pattern so we can test this. But
alas, the player rewrite will obselete this and I'm 8+ hours into
getting tests to work...

* Add VideoSpeedController and tests

Adds a new controller for VideoSpeed, to help encapsulate items
following SRP.
This also adds a mechanism to track the users most recent speed
selection, so switching from videos / to other media and back will
restore the user's selection on the next video.

* Switch to using Enums to representing speed

This makes it much easier to compare for equality and has built in
indexing making the menu much easier to work with.

In comparison using doubles directly would have required us to add a
comparison lambda in the view to correctly detect what was selected /
determine what is selected.

* Wire up view for Playback speed controls

Wires up the view component for playback speed controls, based on the
pattern used in various other action items.

* Preserve playback speed between videos

- Update the PlaybackController to internally track the last playback
speed, but still treat it as a black box from all external callers
- Add a test we don't throw a NPE trying to set it before init
- There's no test for checking this value gets forwarded (see below)
- Change the activity to create the speed controller whilst the
ControlGlue is being created.

This is unfortunately a bit of a hack. There isn't a signal for
onPlaybackStarted or similar we can attach to from the playback
controller so we have to mess with the internals. Something I've tried
to avoid greatly.

I've tried adding a unit test with mocks, which was surprisingly going
well. Until we create LibVLC objects mid-way. These needs some sort of
factory pattern to inject mocks else it will query Android for playback
capabilities failing the test.

I'm going to leave this particular test as a manual case as I extracting
factories out with the pending rewrite is a futile effort.

* Fix various nits / warnings from CI

This includes:
- Using magic values in our enum
- Impliclt Locale issues
- Nullability checks

* Port drawable from Exoplayer into drawables

Ports the playback speed drawable into the projects list of drawable
items, following PR feedback.

The license is preserved (Apache 2.0) and compatible with the GPL
license of this project.

* Apply various code improvements to PlaybackSpeedAction

Includes the following from the PR review:
- Whitespace tidy up
- Implicitly return from lambda instead of explicitly naming it
- Use apply to remove a significant amount of boilerplate

* Add check that setPlaybackSpeed is sane

This will ignore any values that are clearly incorrect i.e. <0.25.

This means the playback controller can still have a sentinel value of
-1.0 to ensure the model controlling speed is in-place correctly. Whilst
not breaking user playback by default if something goes wrong.

As this file directly interfaces with the video manager (which holds
surfaces) we can't easily make a test for it, so leave this block
untested

* DI interface instead of concrete type

Inject the interface for shared preferences rather than the concrete
type.
This avoids Mockk trying to grab the abstract class underneath, which
would run the real impl instead. It also brings our DI in this file more
in-line with the commonly used pattern

* Address PR comments

- Revert some noisy automatic formatting
- Move speed steps out of companion object
- Drop supuerfluous interface

* Tidy up VideoSpeedController from PR review

- Use Kotlin a kotlin setter directly
- Make the variable public
- (Small amount of rewiring to make everything work)

* Drop PlaybackController tests and revert DI

Drop PlaybackController test. We can't simply inject by interface as
this isn't type safe with how it's currently implemented.

Since it's likely PlaybackController is going to undergo a major rework
with pending future work, let's simply drop the tests and revert the
associated changes.
2022-01-12 08:50:06 +01:00
hoanghuy309
483ad96f50 Translated using Weblate (Vietnamese)
Currently translated at 98.5% (469 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-01-12 01:13:10 -05:00
WWWesten
70a33f2aad Translated using Weblate (Esperanto)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2022-01-11 18:13:12 -05:00
Dzonkins
55329048b3 Translated using Weblate (Serbian)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sr/
2022-01-11 18:13:12 -05:00
nextlooper42
7fe910cb08 Translated using Weblate (Slovak)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-01-11 18:13:11 -05:00
WWWesten
35339ec33f Translated using Weblate (Russian)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2022-01-11 18:13:10 -05:00
WWWesten
1d8aaffcb8 Translated using Weblate (Kazakh)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2022-01-11 18:13:10 -05:00
WWWesten
6ae22bbd33 Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-01-11 18:13:10 -05:00
Lukáš Kucharczyk
f14dd1f441 Translated using Weblate (Czech)
Currently translated at 100.0% (476 of 476 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-01-11 10:13:10 -05:00
Niels van Velzen
85321d89b9 Show server connection feedback in UI 2022-01-11 13:17:33 +01:00
Niels van Velzen
7bd92d6b19 Collect server issues in ServerRepository.add 2022-01-11 13:17:33 +01:00
Thomas Schwery
a52ccfd515 Translated using Weblate (French)
Currently translated at 99.1% (464 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-01-10 03:13:09 -05:00
nextlooper42
41c37ffd69 Translated using Weblate (Slovak)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2022-01-09 19:13:09 -05:00
Penguins114
3ff4471e7a Translated using Weblate (Japanese)
Currently translated at 84.8% (397 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2022-01-09 11:13:11 -05:00
Joel Jose
6572ed093a Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2022-01-08 07:13:09 -05:00
Renaldo Eduardo Freire
dab3dfaf42 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2022-01-06 01:13:08 -05:00
Bill Thornton
1f122e862a Merge pull request #1334 from jellyfin/issue-template-typo-1 2022-01-05 23:22:58 -05:00
Cameron
318828ac2e Update bug-report-playback.yaml 2022-01-05 20:17:29 -08:00
Tony
41e43d7b10 Translated using Weblate (Indonesian)
Currently translated at 70.5% (330 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/id/
2022-01-05 14:13:08 -05:00
Csaba
e6ba5d890e Translated using Weblate (Hungarian)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2022-01-05 03:13:07 -05:00
cameron
a481410d6e replaced magic number 2022-01-05 08:36:14 +01:00
mueslimaker
9e41b5e648 added logging for discontinuity and timeline change 2022-01-05 08:36:14 +01:00
Thomas Schwery
f4f3f178a5 Translated using Weblate (French)
Currently translated at 98.7% (462 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2022-01-04 05:05:56 -05:00
dependabot[bot]
a5d72c24bd Bump burnett01/rsync-deployments from 5.1 to 5.2
Bumps [burnett01/rsync-deployments](https://github.com/burnett01/rsync-deployments) from 5.1 to 5.2.
- [Release notes](https://github.com/burnett01/rsync-deployments/releases)
- [Commits](https://github.com/burnett01/rsync-deployments/compare/5.1...5.2)

---
updated-dependencies:
- dependency-name: burnett01/rsync-deployments
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-03 18:07:01 +01:00
hoanghuy309
94a2fd4f38 Translated using Weblate (Vietnamese)
Currently translated at 98.5% (461 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2022-01-03 04:05:56 -05:00
edwardewinter
302e2b6e6e Translated using Weblate (Swedish)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2022-01-03 04:05:56 -05:00
Tim Gaubel
fbc5cc0050 Translated using Weblate (German)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-01-02 15:05:56 -05:00
millallo
1d5f827392 Translated using Weblate (Italian)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2022-01-02 12:05:57 -05:00
Im-Mefju
89ee540fde Translated using Weblate (Polish)
Currently translated at 97.2% (455 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2022-01-02 12:05:57 -05:00
Mark Shui Hu
375c47e733 Translated using Weblate (Dutch)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2022-01-02 12:05:56 -05:00
ldoench
cd1a97a49f Translated using Weblate (German)
Currently translated at 99.7% (467 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2022-01-02 12:05:56 -05:00
David Fairbrother
ef29134163 Run formatter over playback controller
Runs the Android studio formatter over the playback controller. This
should make it easier to use automated tooling and clear up some diffs
which have touched this file too.
2022-01-02 15:59:26 +01:00
bestkayle
2cfeeaf6a2 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2022-01-01 08:05:55 -05:00
Cameron
8001196183 improved skip behavior - especially with repeated button presses (#1325)
* improved skipping behavior

* renamed property to mSeekPosition
2022-01-01 11:38:38 +01:00
Lukáš Kucharczyk
110a353cf6 Translated using Weblate (Czech)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2022-01-01 05:05:56 -05:00
WWWesten
21dce4be19 Translated using Weblate (Esperanto)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-12-31 11:05:57 -05:00
denisplay
c47e94a2a9 Translated using Weblate (Hebrew)
Currently translated at 87.8% (411 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2021-12-31 11:05:56 -05:00
WWWesten
5b55ca7eb9 Translated using Weblate (Russian)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-12-31 11:05:56 -05:00
WWWesten
15c14d92ca Translated using Weblate (Kazakh)
Currently translated at 100.0% (468 of 468 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-12-31 11:05:55 -05:00
Cameron
93b820758f reset player error count if playback stabilizes (#1324)
* reset player error count if stable

* moved retry count reset to more sensible location
2021-12-31 11:46:36 +01:00
WWWesten
cf2cef35f6 Translated using Weblate (Arabic)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-12-31 05:22:19 -05:00
Cameron
05329ff83e allow setting the nextup timer duration to infinite (#1274)
* replaced 0s with infinity character, nextup timer doesnt start if timeout is 0s/infinity

* updated code to reflect actual range of 0 to 30000

* moved preferences outside view, updated pref values

* removed unused variable

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/nextup/NextUpButtons.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/nextup/NextUpButtons.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

* made label an R string, use constant for timer value, inject pref

* val -> const val

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/nextup/NextUpFragment.kt

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2021-12-31 11:22:15 +01:00
Niels van Velzen
3e862b8b82 Translated using Weblate (Arabic)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-12-30 16:45:17 -05:00
Bill Thornton
07e535ead0 Merge pull request #1323 from nielsvanvelzen/slf4j-timber
Replace slf4j-android with slf4j-timber
2021-12-30 13:30:35 -05:00
Niels van Velzen
13b8ce2c5b Replace slf4j-android with slf4j-timber 2021-12-30 19:16:10 +01:00
DavidFair
926a2b7a4b Add Mockk and one test to exercise the new dep (#1312)
* Add Mockk to test framework deps

Add Mockk as this is aware of Kotlin inheritence unlike Mockito.
This primarily shows up where classes are not marked open. We can
either:
- Mark all unit tested classes open (least viable option)
- Add boilerplate to Mockito each time we test a Kotlin class
- Add a mocking framework that is Kotlin aware.

In this case I've opted for the latter, since it also avoids us having
to look up the boilerplate for static mocks...etc.

* Stub out testing Android.utils.log

Slf4j will try to invoke IsLoggable, despite stubbing out everything
else, which is explicitly disabled within the Android SDK.

We could revert to hacks, such as using Android -> returnDefaultValue=true in the
testing options. But according to the docs this should be a last resort.

Instead we can simply stub out the logging to forward calls to println,
allowing us to mock / init anything that uses SLF4J implicitly.

* Add tests and null checks for DeviceUtils

This commit does two things to help testing going forwards:

- It adds a null check for Build.MODEL, typically found in unit tests.
Allowing us to simply avoid having to mock all the various capability
tests which were throwing NPEs in unit tests.

- Adds tests for the existing functionality. This requires Mockk to
easily overwrite static class methods. We also add a small shim method
to make mocking much easier too.

* Run CustomSeekProvider through automatic Java->Kotlin

Convert the file to Kotlin. This means all of our unit tests that use
Mockk will have the same syntax inside, making it much easier for future
developers to reason with.

* Convert Mockito to Mockk

Converts the single usage of Mockito to Mockk, so we can use the same
mocking framework throughout the codebase.

* Drop Mockito in favour of Mockk

Drops Mockito to use Mockk throughout the project.
This is because we have a mix between Java and Kotlin. The latter is
"harder" to mock as classes are not marked open by default.

This means Mockito requires boilerplate in comparison to Mockk.
Additionally, using a single framework lowers the burden on developers
to known multiple tools

* Run Android Studio formatter over code

Despite having format on save enabled, many lines were missed (probably
from the cherry-pick).
Run formatter over the code to address PR reviewer comments.

* Return string instead of null from getBuildModel

This removes a number of null checks from the implementation, and allows
us to mark the method as nonNull too.
2021-12-30 18:44:21 +01:00
Cameron
c38570186b Fix irregular playback overlay showing and hiding (#1321)
* overlay show/hide fixes

* replaced use of setFadingEnabled in hide method to prevent calling show again
2021-12-30 14:01:24 +01:00
Cameron
e68ed8f738 made fullDetails button refresh after playback more reliable (#1320)
* made button updates after playback more reliable

* removed redundant condition
2021-12-30 13:59:54 +01:00
wolong gl
6f39548eaf Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-12-30 06:05:55 -05:00
millallo
3db66ac834 Translated using Weblate (Italian)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-12-30 06:05:55 -05:00
4d1m
a2697e8c8c Translated using Weblate (Romanian)
Currently translated at 89.7% (419 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ro/
2021-12-29 20:05:54 -05:00
Fahad
4c5eb0d02a Translated using Weblate (Arabic)
Currently translated at 99.7% (466 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-12-29 02:05:54 -05:00
WWWesten
ff2fca0d81 Translated using Weblate (Esperanto)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-12-28 17:05:55 -05:00
WWWesten
ca028be237 Translated using Weblate (Russian)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-12-28 17:05:54 -05:00
WWWesten
bd576dfda1 Translated using Weblate (Kazakh)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-12-28 17:05:54 -05:00
Lukáš Kucharczyk
bd7313f05d Translated using Weblate (Czech)
Currently translated at 100.0% (467 of 467 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-12-28 17:05:54 -05:00
siankatabg
eadf7b93df Add subtitles font size and background configurations (#1303)
* Add subtitles font size and background configurations

Added seekbar for choosing subtitles font size (18-38 range, keeping 28 by default)
Added text outlining for better legibility and an option to disable the subtitles black background.

* Fixes
2021-12-28 18:07:36 +00:00
David Fairbrother
480a71d1a6 Emit JUnit output whilst running gradle through CLI
Tweaks the gradle script to forward on test failures in a way that the
stack trace is preserved.

Previously, the stack pointed to a line after the test suite, e.g. line
101 on an 80 line file.
2021-12-28 18:54:17 +01:00
Bill Thornton
c7d8fe09a0 Merge pull request #1316 from nielsvanvelzen/sdk-112
Update SDK to 1.1.2
2021-12-27 11:51:06 -05:00
Niels van Velzen
be9890f5ab Update SDK to 1.1.2
Fixes an crash when using display preferences
2021-12-27 16:34:57 +01:00
Cristian
106039bedc Translated using Weblate (Spanish)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-12-26 10:05:53 -05:00
cameron
6a297ce7dc signal listeners only after playback starts, replace runnables 2021-12-26 11:27:02 +01:00
cameron
7475d196da stop audio before queue is cleared to prevent bad reference 2021-12-26 11:23:26 +01:00
WWWesten
0e892eed1e Translated using Weblate (Kazakh)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-12-25 16:05:53 -05:00
David Fairbrother
2990ffad09 Add Koin unit testing deps implementation
This allows Koin to do DI during unit tests and allows us to establish
Junit rules which involve Koin
This is essential for testing some classes as the playback code, where
DI is used heavily
2021-12-25 12:17:24 +01:00
mueslimaker
6951a7fe26 fixed nowplaying scrolling on queue row gaining focus 2021-12-23 13:59:59 +01:00
gradle-update-robot
8113f01777 Update Gradle Wrapper from 7.3.2 to 7.3.3.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2021-12-22 14:46:59 +01:00
WWWesten
c6850df658 Translated using Weblate (Welsh)
Currently translated at 33.8% (157 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cy/
2021-12-21 11:05:56 -05:00
WWWesten
be2935ee5d Translated using Weblate (Turkish)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2021-12-21 11:05:52 -05:00
WWWesten
8014be1c55 Translated using Weblate (Russian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-12-21 11:05:52 -05:00
Thomas Schwery
798b498417 Translated using Weblate (French)
Currently translated at 98.7% (458 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-12-21 11:05:52 -05:00
WWWesten
ea4d88bdb4 Translated using Weblate (English (United Kingdom))
Currently translated at 96.9% (450 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2021-12-21 11:05:52 -05:00
WWWesten
b21a222f1e Added translation using Weblate (Estonian) 2021-12-21 04:54:37 -05:00
WWWesten
df27e8b937 Added translation using Weblate (Welsh) 2021-12-21 04:52:45 -05:00
Georgios Stamos
a22bdc185b Translated using Weblate (Bulgarian)
Currently translated at 19.1% (89 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bg/
2021-12-20 22:05:53 -05:00
Niels van Velzen
59150dc811 Update all dependencies 2021-12-20 09:33:42 +01:00
Niels van Velzen
cac209f47f Always use version references in version catalog
This makes it easier to update the versions and makes the file more readable
2021-12-20 09:33:42 +01:00
Niels van Velzen
a8564c53aa Target API 31 2021-12-20 09:33:42 +01:00
LowHigh
6be7f34e63 Translated using Weblate (French)
Currently translated at 95.4% (443 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-12-19 21:05:51 -05:00
Niels van Velzen
ced03b82de Move Gradle plugins to plugin catalog (#1296)
* Move Gradle plugins to plugin catalog

* Fix linter config for playback module
2021-12-19 14:44:28 +01:00
mueslimak3r
20138f2d38 fixed a regression in player prepare 2021-12-19 12:22:12 +01:00
Cody Robibero
a66ea7fa79 Merge pull request #1295 from nielsvanvelzen/release-aab 2021-12-18 16:36:48 -07:00
Cameron
defc7af702 prevent unwanted interactions when music player screensaver active (#1290)
* prevent unwanted interactions with screensaver active

* Update app/src/main/java/org/jellyfin/androidtv/util/KeyProcessor.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

* changed popup menu name and removed comment

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2021-12-19 00:10:31 +01:00
Niels van Velzen
8005531831 Also build app bundle for Google Play in CI 2021-12-18 22:54:10 +01:00
mueslimaker
07d8de22cc if an audio queue exists show add to queue instead of play in itemlistactivity 2021-12-18 22:45:02 +01:00
Oatavandi
9af1e232b4 Translated using Weblate (Tamil)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-12-17 13:05:50 -05:00
gradle-update-robot
e3c471e141 Update Gradle Wrapper from 7.3.1 to 7.3.2.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2021-12-16 08:52:15 +01:00
mueslimaker
1771f28012 removed condition that always reports !canSeek when using fire tv 2021-12-15 22:53:23 +01:00
mueslimaker
c7fbb1b3ef bring firetv controls in line with the new player controls 2021-12-15 22:53:23 +01:00
mueslimaker
1741795c89 fixed add artist to queue, added shuffle artist 2021-12-15 08:52:51 +01:00
mueslimaker
85024c7563 audio play from doesnt discard the preceding items in its parent 2021-12-15 08:50:48 +01:00
Cameron
dd368cc703 Fixed some remote play commands (#1273)
* fixed up mediaManager queue and audio reporting

* fixed remote playback commands pt 1/2

* audio pause reports to server sooner now

* separate check for audio focus and player init, stopAudio optionally releases player

* immediate pause reporting, slowed down report loop when paused

* resumeAudio calls reportprogress with paused=false instead of reportStarted

* more strict checks before remote videoplayer interaction, can remote start audio from specific queue index

* missed a curly bracket in the merge conflict resolve tool

* updated comment

* made mainThreadHandler a class property

* mediamanager remakes input items list on ingest to ensure type

also patched an issue where nextup would load the same episode again when playing via remote control

* removed "this"

* fixed div by 0, remote stop discarding progress, remote resume from

* replaced new Long() with Long.valueOf()
2021-12-14 09:07:37 +01:00
Niels van Velzen
61a96d7eea Merge ByLetterActivity and ByGenreActivity into a single activity (#1222)
* Merge ByLetterActivity, BrowsePersonsActivity and ByGenreActivity into a single activity

* Remove unused code from BrowseFolderFragment

* Remove unused BrowsePersonsFragment

* Merge CustomViewFragment into BrowseFolderFragment

* Fix wrong constant used

* Remove unused code from StdBrowseFragment (activity is never BaseActivity)
2021-12-13 16:08:18 +01:00
caesartcs
e059a51032 Translated using Weblate (Romanian)
Currently translated at 89.6% (416 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ro/
2021-12-09 20:05:47 -05:00
WWWesten
f6d023a305 Translated using Weblate (Russian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-12-09 07:05:47 -05:00
Cameron
b762f9c48d new in-place, non-destructive shuffle system (#1276)
* shuffle works now

* fixed autocomplete typo - whoops

* updated comment to remove obsolete details

* removed another obsolete piece of logic - no change in behavior but makes more sense

* removed the need to store a copy of the queue. Now it only saves the indexes
2021-12-08 21:27:33 +01:00
Revertron
11c024ec3c Translated using Weblate (Russian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-12-08 15:05:47 -05:00
Cameron
da609a4574 reworked playbackController position tracking and reporting system (#1261)
* reworked position tracking and reporting system

* adjusted directplay seeking and removed debug printout

* removed use of mSeekedPosition from directplay seeking

* fixed typo in my comment

* formatting fixes
2021-12-08 20:57:34 +01:00
WWWesten
0310dc4863 Translated using Weblate (English (United Kingdom))
Currently translated at 87.9% (408 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2021-12-08 05:05:47 -05:00
newton181
3dca3fd5aa Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-12-07 17:05:46 -05:00
mueslimaker
f52f10b720 fix - removed method argument used in testing branch 2021-12-05 15:26:49 +01:00
mueslimaker
303767f747 fixed crash when playing audio and going from first to last item in repeat mode
-1 index out of bounds on managed audio queue
2021-12-05 15:26:49 +01:00
RTapeLoadingError
27645414e8 Translated using Weblate (Spanish)
Currently translated at 99.5% (462 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-12-04 21:05:45 -05:00
danieladov
060d487004 Translated using Weblate (Spanish)
Currently translated at 99.3% (461 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-12-04 18:05:45 -05:00
Weblate
7f64d4405d Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2021-12-04 03:05:47 -05:00
Weblate
88d582c788 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2021-12-04 03:05:46 -05:00
hoanghuy309
6d99a93218 Translated using Weblate (Vietnamese)
Currently translated at 98.7% (458 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-12-04 03:05:45 -05:00
gradle-update-robot
c33312ca29 Update Gradle Wrapper from 7.3 to 7.3.1.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2021-12-02 08:35:01 +01:00
Diego Massanti
1f5b3c3c88 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-11-30 23:05:44 -05:00
Niels van Velzen
defe097047 Add MigrationContext for improved preference migration behavior 2021-11-30 18:33:45 +01:00
hoanghuy309
8f1e3b7b0a Translated using Weblate (Vietnamese)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-11-30 04:05:43 -05:00
WWWesten
36b86405b6 Translated using Weblate (Arabic)
Currently translated at 96.5% (448 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-11-27 08:05:42 -05:00
WWWesten
72055485bd Translated using Weblate (Mongolian)
Currently translated at 34.6% (161 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/mn/
2021-11-27 08:05:42 -05:00
WWWesten
cbf33dd1c6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.0% (441 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2021-11-27 08:05:42 -05:00
WWWesten
26f97bf531 Translated using Weblate (Vietnamese)
Currently translated at 99.7% (463 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-11-26 20:05:43 -05:00
Weevild
463a5615f4 Translated using Weblate (Swedish)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2021-11-26 20:05:43 -05:00
WWWesten
5bfb277d26 Translated using Weblate (Turkish)
Currently translated at 99.7% (463 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2021-11-26 09:05:42 -05:00
WWWesten
62e255e18a Translated using Weblate (Polish)
Currently translated at 94.3% (438 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2021-11-26 09:05:42 -05:00
WWWesten
b6522a4ba2 Translated using Weblate (Serbian)
Currently translated at 84.0% (390 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sr/
2021-11-26 09:05:42 -05:00
WWWesten
35b1bb1a76 Translated using Weblate (Slovenian)
Currently translated at 73.0% (339 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sl/
2021-11-26 09:05:42 -05:00
WWWesten
858a539596 Translated using Weblate (Italian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-11-26 09:05:42 -05:00
WWWesten
737f3e04b0 Translated using Weblate (German)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-11-26 09:05:42 -05:00
WWWesten
8123312b5d Translated using Weblate (Esperanto)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-11-26 05:05:42 -05:00
WWWesten
1e10644c4c Translated using Weblate (Turkish)
Currently translated at 99.7% (463 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2021-11-26 05:05:42 -05:00
WWWesten
d99fc93214 Translated using Weblate (Russian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-11-26 05:05:42 -05:00
WWWesten
aa68c526ff Translated using Weblate (Kazakh)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-11-26 05:05:42 -05:00
ahmet-dv
ccf6e25018 Translated using Weblate (Turkish)
Currently translated at 99.7% (463 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2021-11-25 22:05:44 -05:00
svenjochems
2629e7fe74 Translated using Weblate (Dutch)
Currently translated at 98.2% (456 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2021-11-22 06:05:41 -05:00
Moritz
bf03d2cf19 Translated using Weblate (German)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-11-22 06:05:41 -05:00
wolong gl
7a083189b9 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-11-22 02:05:40 -05:00
Cameron
267fc2ab16 Fix now-playing row not updating when queue changes (#1258)
* row now updates

* update logic is now self contained

* use replace instead of remove and add

* nowPlayingRow checks hasAudioQueueItems instead of isPlayingAudio

* fixed audio queue not clearing on last song completing

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/MediaManager.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2021-11-21 12:40:34 +00:00
EduGaga
d11ead465d Translated using Weblate (Spanish)
Currently translated at 97.8% (454 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-11-20 19:05:40 -05:00
hoanghuy309
23556ab04d Translated using Weblate (Vietnamese)
Currently translated at 99.7% (463 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-11-20 13:05:40 -05:00
Alfonso Scarpino
f707dc1ede Translated using Weblate (Italian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-11-20 08:05:40 -05:00
nextlooper42
023d61a733 Translated using Weblate (Slovak)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-11-19 22:05:39 -05:00
mueslimaker
102bcef926 keep exo pos reporting accurate when not playing by using saved pos 2021-11-19 19:45:03 +01:00
WWWesten
80ad473dd6 Translated using Weblate (Esperanto)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-11-19 07:05:40 -05:00
Csaba
f4cafb59de Translated using Weblate (Hungarian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-11-19 07:05:40 -05:00
WWWesten
053f7acc47 Translated using Weblate (Russian)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-11-19 07:05:40 -05:00
WWWesten
cdf3c19195 Translated using Weblate (Kazakh)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-11-19 07:05:39 -05:00
Lukáš Kucharczyk
1e07e726db Translated using Weblate (Czech)
Currently translated at 100.0% (464 of 464 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-11-19 07:05:39 -05:00
mueslimaker
916287a142 libvlc playback should now report correct time 2021-11-19 08:58:57 +01:00
hoanghuy309
93d249894d Translated using Weblate (Vietnamese)
Currently translated at 99.1% (458 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-11-19 00:28:52 -05:00
Bill Thornton
ef1a3b830a Merge pull request #900 from koying/addglobalsearch
Implement global search
2021-11-19 00:28:48 -05:00
Cameron
66469dae26 prevent double pausing, allow d-pad center to unpause with overlay hidden (#1252)
* prevent double pausing, allow d-pad center to unpause with overlay hidden

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/PlaybackController.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2021-11-18 19:11:45 +01:00
WWWesten
d282826a0f Translated using Weblate (Mongolian)
Currently translated at 34.8% (161 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/mn/
2021-11-18 07:05:39 -05:00
nextlooper42
5610b3fe1e Translated using Weblate (Slovak)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-11-17 19:05:39 -05:00
Alfonso Scarpino
457f32dcda Translated using Weblate (Italian)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-11-17 16:05:39 -05:00
mueslimaker
3ef4ad2497 reset exoplay position and state on media change 2021-11-17 20:22:09 +01:00
Chris "koying" Browet
eb5b49abb1 ADD: global search 2021-11-17 20:10:19 +01:00
Csaba
cf04edc93c Translated using Weblate (Hungarian)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-11-17 11:05:40 -05:00
WWWesten
d43c8eca33 Translated using Weblate (Mongolian)
Currently translated at 34.8% (161 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/mn/
2021-11-17 11:05:39 -05:00
Lukáš Kucharczyk
e5480205e1 Translated using Weblate (Czech)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-11-17 11:05:39 -05:00
WWWesten
2385dc75dc Translated using Weblate (Esperanto)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-11-17 05:05:40 -05:00
WWWesten
e9f6768080 Translated using Weblate (Russian)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-11-17 05:05:39 -05:00
WWWesten
540ec5e754 Translated using Weblate (Kazakh)
Currently translated at 100.0% (462 of 462 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-11-17 05:05:39 -05:00
Bill Thornton
c995856458 Merge pull request #1213 from nielsvanvelzen/home-options 2021-11-16 17:16:06 -05:00
wolong gl
059e0e40ff Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-11-12 22:05:37 -05:00
Niels van Velzen
427cc2bb6d Use default transition in PhotoPlayer
also removes some unused code
2021-11-12 20:07:22 +01:00
gradle-update-robot
c9cedd26a6 Update Gradle Wrapper from 7.2 to 7.3.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2021-11-10 13:10:51 +01:00
Csaba
ca1e681d14 Translated using Weblate (Hungarian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-11-10 04:05:36 -05:00
Jay Harkess
0f44915452 Translated using Weblate (English (United Kingdom))
Currently translated at 90.6% (408 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2021-11-09 11:05:37 -05:00
WWWesten
0efedee5b5 Translated using Weblate (Russian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-11-09 10:41:19 -05:00
bahaaza
5a22662700 Translated using Weblate (Arabic)
Currently translated at 99.5% (448 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-11-08 22:13:38 -05:00
Niels van Velzen
204663f71f Delay activity lifecycle callback registry slightly to avoid crashes on older platform versions 2021-11-06 21:33:26 +01:00
Niels van Velzen
f5ecbd08ca Move session initialization to androidx.startup 2021-11-06 21:33:26 +01:00
Niels van Velzen
8ad6eb7cb6 Move logging initialization to androidx.startup 2021-11-06 21:33:26 +01:00
Niels van Velzen
79afee7ce6 Move Koin initialization to androidx.startup 2021-11-06 21:33:26 +01:00
Niels van Velzen
afa93d6ab0 Fix race condition in loading async preferences 2021-11-06 21:33:04 +01:00
Alfonso Scarpino
263afb079d Translated using Weblate (Italian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-11-05 09:05:35 -04:00
Niels van Velzen
a6f17e8903 Fix touch support in home/auth screens (#1230)
* Fix touch support for "switch user" button

* Fix touch support for server button
2021-11-04 15:09:19 +01:00
Jellifi007
faf76efdbd H264 52 Level available on NVIDIA Shield but not detected (#1237) 2021-11-04 14:11:42 +01:00
nextlooper42
ec4cf1601b Translated using Weblate (Slovak)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-11-02 21:05:34 -04:00
Pedro Almeida
52b4fa5a7f Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2021-11-01 15:05:34 -04:00
WWWesten
574268857b Translated using Weblate (Esperanto)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-31 10:05:33 -04:00
WWWesten
d602080a30 Translated using Weblate (Malayalam)
Currently translated at 91.1% (410 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ml/
2021-10-29 09:05:36 -04:00
WWWesten
74bbffe110 Translated using Weblate (Catalan)
Currently translated at 78.4% (353 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ca/
2021-10-29 09:05:36 -04:00
WWWesten
a6709cfac8 Translated using Weblate (Turkish)
Currently translated at 76.0% (342 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2021-10-29 09:05:35 -04:00
WWWesten
2e7fb821cf Translated using Weblate (Hebrew)
Currently translated at 86.0% (387 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2021-10-29 09:05:35 -04:00
WWWesten
aaf43d4c0d Translated using Weblate (Croatian)
Currently translated at 96.2% (433 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hr/
2021-10-29 09:05:35 -04:00
WWWesten
bc9a275bed Translated using Weblate (Spanish (Argentina))
Currently translated at 95.1% (428 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_AR/
2021-10-29 09:05:35 -04:00
WWWesten
a53ae38276 Translated using Weblate (Bengali (Bangladesh))
Currently translated at 20.2% (91 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bn_BD/
2021-10-29 09:05:35 -04:00
WWWesten
664ba0aba4 Translated using Weblate (Ukrainian)
Currently translated at 38.6% (174 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2021-10-29 09:05:35 -04:00
WWWesten
4331a771f1 Translated using Weblate (Finnish)
Currently translated at 45.5% (205 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2021-10-29 09:05:35 -04:00
WWWesten
77b3c214b2 Translated using Weblate (Lithuanian)
Currently translated at 10.2% (46 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2021-10-29 09:05:34 -04:00
WWWesten
9b3d595066 Translated using Weblate (Latvian)
Currently translated at 65.5% (295 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lv/
2021-10-29 09:05:34 -04:00
WWWesten
628d6662cc Translated using Weblate (Macedonian)
Currently translated at 20.0% (90 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/mk/
2021-10-29 09:05:34 -04:00
WWWesten
d972bd3cf1 Translated using Weblate (Polish)
Currently translated at 97.3% (438 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2021-10-29 09:05:34 -04:00
WWWesten
e0f1b15453 Translated using Weblate (Serbian)
Currently translated at 86.6% (390 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sr/
2021-10-29 09:05:34 -04:00
WWWesten
1e121f8891 Translated using Weblate (Slovenian)
Currently translated at 75.3% (339 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sl/
2021-10-29 09:05:34 -04:00
WWWesten
e1be2d5847 Translated using Weblate (Indonesian)
Currently translated at 65.7% (296 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/id/
2021-10-29 09:05:34 -04:00
WWWesten
1b0d3f9a6a Translated using Weblate (Slovak)
Currently translated at 97.5% (439 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-10-29 09:05:33 -04:00
WWWesten
b949380148 Translated using Weblate (Japanese)
Currently translated at 55.7% (251 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2021-10-29 09:05:33 -04:00
WWWesten
23a72aa020 Translated using Weblate (Korean)
Currently translated at 74.2% (334 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ko/
2021-10-29 09:05:33 -04:00
WWWesten
0bba0125ea Translated using Weblate (Chinese (Traditional))
Currently translated at 84.6% (381 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2021-10-29 09:05:33 -04:00
WWWesten
19cdc1e9c9 Translated using Weblate (Romanian)
Currently translated at 86.6% (390 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ro/
2021-10-29 09:05:33 -04:00
WWWesten
b6b7c4a0ec Translated using Weblate (Portuguese (Portugal))
Currently translated at 86.6% (390 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2021-10-29 09:05:33 -04:00
WWWesten
f98552eb28 Translated using Weblate (Norwegian Bokmål)
Currently translated at 94.2% (424 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nb_NO/
2021-10-29 09:05:32 -04:00
WWWesten
76965b4027 Translated using Weblate (Italian)
Currently translated at 95.5% (430 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-10-29 09:05:32 -04:00
WWWesten
7ba3a06347 Translated using Weblate (English (United Kingdom))
Currently translated at 87.3% (393 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2021-10-29 09:05:32 -04:00
WWWesten
5b13228a68 Translated using Weblate (Greek)
Currently translated at 69.5% (313 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2021-10-29 09:05:32 -04:00
WWWesten
776f532103 Translated using Weblate (Danish)
Currently translated at 87.3% (393 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2021-10-29 09:05:32 -04:00
Alan Azar
8f4fbeeafc Translated using Weblate (Arabic)
Currently translated at 98.4% (443 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-10-29 03:05:32 -04:00
WWWesten
341c53c0d9 Translated using Weblate (Esperanto)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-28 08:05:32 -04:00
WWWesten
0b242a7f1d Translated using Weblate (Russian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-28 08:05:31 -04:00
WWWesten
5845f9597f Translated using Weblate (Esperanto)
Currently translated at 93.5% (421 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-27 19:05:32 -04:00
WWWesten
b1a5fbfc4f Translated using Weblate (Russian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-27 19:05:31 -04:00
WWWesten
61b7550c59 Translated using Weblate (Esperanto)
Currently translated at 84.0% (378 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-27 16:05:32 -04:00
Alan Azar
23028ca72b Translated using Weblate (Norwegian Bokmål)
Currently translated at 94.4% (425 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nb_NO/
2021-10-27 10:05:38 -04:00
Alan Azar
90024accd8 Translated using Weblate (Hebrew)
Currently translated at 85.5% (385 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/he/
2021-10-27 10:05:38 -04:00
Alan Azar
33f8dafbe7 Translated using Weblate (Turkish)
Currently translated at 76.2% (343 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/tr/
2021-10-27 10:05:38 -04:00
Alan Azar
8a218de4a0 Translated using Weblate (Finnish)
Currently translated at 45.7% (206 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fi/
2021-10-27 10:05:38 -04:00
Alan Azar
d9e30ac378 Translated using Weblate (Japanese)
Currently translated at 56.0% (252 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ja/
2021-10-27 10:05:37 -04:00
Alan Azar
13cbcc9155 Translated using Weblate (Indonesian)
Currently translated at 66.0% (297 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/id/
2021-10-27 10:05:37 -04:00
Alan Azar
1e920acb11 Translated using Weblate (Macedonian)
Currently translated at 20.2% (91 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/mk/
2021-10-27 10:05:37 -04:00
Alan Azar
bbbeb777c9 Translated using Weblate (Greek)
Currently translated at 69.5% (313 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2021-10-27 10:05:37 -04:00
Alan Azar
717c26e551 Translated using Weblate (Chinese (Traditional))
Currently translated at 84.8% (382 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hant/
2021-10-27 10:05:37 -04:00
Alan Azar
dcc018033a Translated using Weblate (Mongolian)
Currently translated at 35.3% (159 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/mn/
2021-10-27 10:05:37 -04:00
Andreas
6eff855bcc Translated using Weblate (German)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-10-27 10:05:36 -04:00
Alan Azar
3ee701a615 Translated using Weblate (Latvian)
Currently translated at 65.7% (296 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lv/
2021-10-27 10:05:36 -04:00
Alan Azar
64b7a56cd0 Translated using Weblate (English (United Kingdom))
Currently translated at 87.3% (393 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en_GB/
2021-10-27 10:05:36 -04:00
Alan Azar
074fa61bd0 Translated using Weblate (Croatian)
Currently translated at 96.4% (434 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hr/
2021-10-27 10:05:36 -04:00
Alan Azar
22be739d0b Translated using Weblate (Korean)
Currently translated at 74.4% (335 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ko/
2021-10-27 10:05:36 -04:00
Alan Azar
5bef216608 Translated using Weblate (Danish)
Currently translated at 87.3% (393 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/da/
2021-10-27 10:05:35 -04:00
Alan Azar
f9e4a0ac8d Translated using Weblate (Italian)
Currently translated at 95.7% (431 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-10-27 10:05:35 -04:00
Alan Azar
fc645e5ad5 Translated using Weblate (Portuguese (Portugal))
Currently translated at 86.8% (391 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_PT/
2021-10-27 10:05:35 -04:00
WWWesten
3c015489b2 Translated using Weblate (Russian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-27 10:05:35 -04:00
Alan Azar
d25f91bc49 Translated using Weblate (Slovenian)
Currently translated at 75.5% (340 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sl/
2021-10-27 10:05:34 -04:00
Alan Azar
c7692a64dd Translated using Weblate (Spanish (Argentina))
Currently translated at 95.1% (428 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_AR/
2021-10-27 10:05:34 -04:00
Alan Azar
bf765e36a1 Translated using Weblate (Slovak)
Currently translated at 97.5% (439 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-10-27 10:05:34 -04:00
Alan Azar
a25066a032 Translated using Weblate (Serbian)
Currently translated at 86.8% (391 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sr/
2021-10-27 10:05:34 -04:00
Alan Azar
f540cc2deb Translated using Weblate (Polish)
Currently translated at 97.5% (439 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2021-10-27 10:05:34 -04:00
Alan Azar
db4b312e57 Translated using Weblate (Romanian)
Currently translated at 86.8% (391 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ro/
2021-10-27 10:05:34 -04:00
WWWesten
3b70d734b7 Translated using Weblate (Esperanto)
Currently translated at 78.0% (351 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-27 10:05:33 -04:00
Alan Azar
2f163f481a Translated using Weblate (Catalan)
Currently translated at 78.2% (352 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ca/
2021-10-26 15:05:32 -04:00
Alan Azar
43644aa9b7 Translated using Weblate (French)
Currently translated at 98.0% (441 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-10-26 15:05:32 -04:00
Alan Azar
6484e247d6 Translated using Weblate (Bengali (Bangladesh))
Currently translated at 20.2% (91 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bn_BD/
2021-10-26 15:05:32 -04:00
Alan Azar
4b5efa75e0 Translated using Weblate (Hungarian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-10-26 15:05:32 -04:00
Oatavandi
127ef380e8 Translated using Weblate (Tamil)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-10-26 15:05:32 -04:00
Alan Azar
01cc2ca3b3 Translated using Weblate (Arabic)
Currently translated at 98.4% (443 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-10-26 15:05:31 -04:00
Lukáš Kucharczyk
65a11a7378 Translated using Weblate (Czech)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-10-25 17:05:32 -04:00
WWWesten
3449d0ab8e Translated using Weblate (Esperanto)
Currently translated at 51.5% (232 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-25 17:05:32 -04:00
WWWesten
716e313da8 Translated using Weblate (Kazakh)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-10-25 07:05:31 -04:00
WWWesten
08d44adcab Translated using Weblate (Esperanto)
Currently translated at 31.5% (142 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-25 07:05:31 -04:00
WWWesten
0e4ad3b410 Translated using Weblate (Russian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-25 07:05:30 -04:00
WWWesten
32131f2f2e Translated using Weblate (Esperanto)
Currently translated at 21.5% (97 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/eo/
2021-10-24 17:05:32 -04:00
WWWesten
786b14f4c1 Added translation using Weblate (Esperanto) 2021-10-24 14:16:05 -04:00
Bill Thornton
5114834210 Merge pull request #1228 from nielsvanvelzen/refresh-server-after-migrate 2021-10-24 11:34:31 -04:00
Niels van Velzen
3ea6bf1293 Refresh server infor after migration 2021-10-24 13:45:09 +02:00
Cameron
3025ed115f fixed playback controls and seeking causing erroneous timestamp updates (#1219)
* removed calls to skip when dpad left/right is called

the new player scrubs seekbar when these dpad buttons are called. Continuing to call seek appears to cause issues with the timestamps

* update playback controller position with seek pos

* dpad no longer calls skip. seek updates current pos

the new player scrubs seekbar when these dpad buttons are called. Continuing to call seek appears to cause issues with the timestamps

update playback controller position with seek pos

* mCurrentPosition is now updated on seeking in direct play

* added changes suggested by nielsvanvelzen
2021-10-24 10:20:33 +02:00
hoanghuy309
4d8244319a Translated using Weblate (Vietnamese)
Currently translated at 99.7% (449 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-10-23 07:05:30 -04:00
Niels van Velzen
453403376a Add preferences for home sections 2021-10-22 22:04:29 +02:00
Niels van Velzen
3cb5f2068d Fix "screen saver" not showing in AudioNowPlayingActivity 2021-10-22 19:23:43 +02:00
Csaba
f4cd8275bc Translated using Weblate (Hungarian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-10-22 07:05:30 -04:00
WWWesten
6409e34244 Translated using Weblate (Kazakh)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-10-21 20:05:31 -04:00
newton181
151d6b3f7d Translated using Weblate (Spanish)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-10-21 20:05:31 -04:00
newton181
a1e3a33c28 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-10-21 20:05:30 -04:00
WWWesten
225ab16182 Translated using Weblate (Russian)
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-21 20:05:30 -04:00
newton181
bc63337f15 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (450 of 450 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-10-21 20:05:30 -04:00
Bill Thornton
7f72ceb6b4 Merge pull request #1216 from nielsvanvelzen/photalbumcrash
Fix app crash when opening photo album
2021-10-21 13:42:18 -04:00
Niels van Velzen
b98b33d0d2 Fix app crash when opening photo album 2021-10-21 19:31:23 +02:00
Niels van Velzen
8cbbff03da Show about section on AuthPreferences launched from login UI 2021-10-21 17:43:12 +02:00
Niels van Velzen
885f277b25 Use link in about section 2021-10-21 17:43:12 +02:00
Niels van Velzen
a292045091 Show licenses from used libraries 2021-10-21 17:43:12 +02:00
Niels van Velzen
add71ce23d Don't load multiple display preferences at once 2021-10-21 15:20:00 +02:00
Niels van Velzen
365457dd54 Add a daydream that shows random movies and series 2021-10-21 13:17:48 +02:00
Niels van Velzen
1975d26f7c Remove broken RemoteControlReceiver 2021-10-21 08:58:04 +02:00
Niels van Velzen
eedfc89998 Remove MusicOnly argument from search 2021-10-21 08:57:41 +02:00
Niels van Velzen
4779f4141a Remove search shortcut when it doesn't make sense 2021-10-21 08:57:41 +02:00
Niels van Velzen
436f317361 Use UserSettingPreferences in HomeFragment 2021-10-21 08:57:25 +02:00
Niels van Velzen
6c34edd7f8 Add PreferenceEnum interface to add different string representation for enums 2021-10-21 08:57:25 +02:00
Niels van Velzen
af114b20e0 Use context instead of activity in InfoLayoutHelper 2021-10-21 08:56:20 +02:00
Niels van Velzen
f239616ef0 Add ModelCompat to convert apiclient types to SDK types 2021-10-21 08:56:03 +02:00
Dominik
bb52fe3746 Translated using Weblate (German)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-10-20 20:05:29 -04:00
BacalhauSalgado
5ee3fe2b4c Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2021-10-20 20:05:29 -04:00
Csaba
c9f7c9f665 Translated using Weblate (Hungarian)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-10-20 03:05:29 -04:00
Bill Thornton
4d501fee4c Merge pull request #1211 from nielsvanvelzen/async-auto-bitrate
Don't wait for bitrate detection on launch
2021-10-19 16:35:36 -04:00
Bill Thornton
48cb855e4b Merge pull request #1212 from nielsvanvelzen/exo-default
Change default video player to ExoPlayer instead of auto detect
2021-10-19 16:33:56 -04:00
Niels van Velzen
65f4b75673 Change default video player to ExoPlayer instead of auto detect 2021-10-19 22:27:31 +02:00
Niels van Velzen
7fc63f56d8 Don't wait for bitrate detection on launch
Also catch errors
2021-10-19 22:23:02 +02:00
newton181
496b067e14 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-10-19 16:05:29 -04:00
newton181
badc038af5 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-10-19 16:05:29 -04:00
newton181
d0e24171a1 Translated using Weblate (Spanish)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-10-19 16:05:29 -04:00
Bill Thornton
ee922ac7ec Merge pull request #1197 from nielsvanvelzen/sdk-1.1
Migrate to Jellyfin Kotlin SDK v1.1
2021-10-19 11:13:38 -04:00
Matthieu
23f90f626f Translated using Weblate (French)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-10-19 09:05:28 -04:00
Niels van Velzen
960212b832 Migrate to Jellyfin Kotlin SDK v1.1 2021-10-18 19:08:14 +02:00
Cameron
b59543c05e "select" button on controller can now pause/unpause without extra navigation (#1207)
* fixed issue #1101

overrides PlaybackTransportRowPresenter's onProgressBarClicked to use CustomPlaybackTransportControlGlue's playPauseAction. Perhaps the lowercase 'p' is to blame for the default implementation not working.

* Update app/src/main/java/org/jellyfin/androidtv/ui/playback/overlay/CustomPlaybackTransportControlGlue.java

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>

Co-authored-by: Niels van Velzen <nielsvanvelzen@users.noreply.github.com>
2021-10-18 19:00:19 +02:00
WWWesten
a632cc1356 Translated using Weblate (Russian)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-18 09:05:28 -04:00
wolong gl
21855f5179 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-10-18 04:05:28 -04:00
Bill Thornton
0d94b187c5 Merge pull request #1203 from nielsvanvelzen/nowplayingbug-context 2021-10-17 11:28:33 -04:00
Bill Thornton
e21fca973d Merge pull request #1204 from nielsvanvelzen/apibinder-trailing-slash 2021-10-17 11:27:12 -04:00
Bill Thornton
05ff681cc8 Merge pull request #1188 from nielsvanvelzen/handle-setActiveSession
Act when setActiveSession returns false during login
2021-10-17 01:05:54 -04:00
Bill Thornton
65d00ef0ac Merge pull request #1011 from nielsvanvelzen/displaypreferences-sdk
Use DisplayPreferences via SDK via preferences code
2021-10-17 01:03:00 -04:00
Niels van Velzen
cb43e9024b Fix trailing slashes causing connection issues in apiclient 2021-10-16 17:33:59 +02:00
WWWesten
d236a263b7 Translated using Weblate (Russian)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-16 11:05:28 -04:00
WWWesten
c017076500 Translated using Weblate (Kazakh)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-10-16 11:05:28 -04:00
Lukáš Kucharczyk
d4ccdb8660 Translated using Weblate (Czech)
Currently translated at 100.0% (441 of 441 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-10-16 11:05:27 -04:00
Daniel
826e1eddc9 Add multiple versions support (#1155)
* Add multiple versions support

* Fix code format

* Fix import

* change button name

* Move function

* remove unnecessary api call

* Update formatting, rename a few variables, fix popup theme

Co-authored-by: Niels van Velzen <git@ndat.nl>
2021-10-16 10:16:56 +00:00
Niels van Velzen
3f94e31bae Use context.startActivity in NowPlayingBug 2021-10-16 11:29:16 +02:00
newton181
f062ca5637 Translated using Weblate (Spanish)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-10-14 17:05:27 -04:00
newton181
0312fe83e7 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-10-14 17:05:27 -04:00
newton181
4756cf3606 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-10-14 17:05:27 -04:00
ElegyD
37750df511 Fix several lint issues (#1180)
* Fix several lint issues

* Added more missing annotations
2021-10-14 13:15:47 +02:00
Hítalo Ramon
07d04f00b2 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2021-10-13 22:05:26 -04:00
Hítalo Ramon
a35b90b26d Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.3% (437 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pt_BR/
2021-10-13 19:50:19 -04:00
ButterflyOfFire
bc878e6fab Translated using Weblate (Arabic)
Currently translated at 93.4% (411 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-10-12 08:05:26 -04:00
Herman Andgart
037a52a4f0 Translated using Weblate (Swedish)
Currently translated at 99.7% (439 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2021-10-10 18:05:25 -04:00
Niels van Velzen
283f75f5c7 Act when setActiveSession returns false during login 2021-10-09 11:22:24 +02:00
hoanghuy309
69a64f1efb Translated using Weblate (Vietnamese)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-10-08 17:05:25 -04:00
Robert
878fa31b88 Translated using Weblate (German)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-10-07 23:05:25 -04:00
Bill Thornton
fe2dc0873c Merge pull request #1173 from nielsvanvelzen/apiclient-extensions
Remove unused LoadingState class
2021-10-06 23:40:30 -04:00
Bill Thornton
3e446b605d Merge pull request #1142 from nielsvanvelzen/resume-in-watch-next 2021-10-05 16:47:47 -04:00
Niels van Velzen
340188a1a1 Add enum names 2021-10-05 22:04:35 +02:00
Niels van Velzen
25f6c308ff Rename .java to .kt 2021-10-05 22:04:34 +02:00
Niels van Velzen
b37751a3e6 Add UserSettingPreferences for forward/backward speed. Fix livetv preferences not populated. 2021-10-05 21:52:13 +02:00
Niels van Velzen
2696f910b6 Fix rebase issues 2021-10-05 21:52:03 +02:00
Niels van Velzen
b5a653fd69 Fix cached preferences when user changes 2021-10-05 21:51:49 +02:00
Niels van Velzen
b5d52dbbf2 Migrate LiveTvPrefs to new display preference code 2021-10-05 21:51:48 +02:00
Niels van Velzen
c3749039db Move blocking functions 2021-10-05 21:51:47 +02:00
Niels van Velzen
a1360b4c82 Remove displayPrefsCache and deprecate TvApp DisplayPrefs methods 2021-10-05 21:51:46 +02:00
Niels van Velzen
a1f69be48f Remove now unused display preference preloading for libraries 2021-10-05 21:51:45 +02:00
Niels van Velzen
e5409713b2 Rename LibraryDisplayPreferences to shorter LibraryDisplayPreferences 2021-10-05 21:51:44 +02:00
Niels van Velzen
cb9e2352f8 Move filter and sort options to LibraryDisplayPreferences 2021-10-05 21:51:43 +02:00
Niels van Velzen
91f96a56fc Support async stores automatically in OptionsFragment 2021-10-05 21:51:42 +02:00
Niels van Velzen
c72e68da7e Add LibraryDisplayPreferences and use it 2021-10-05 21:51:41 +02:00
Niels van Velzen
fa458b328b Retrieve display preferences directly in HomeFragment 2021-10-05 21:51:40 +02:00
Niels van Velzen
33d8b81a8e Add AsyncPreferenceStore and DisplayPreferencesStore to asynchronously store preferences using the DisplayPreferences API 2021-10-05 21:51:39 +02:00
Niels van Velzen
f7bb0d183a Move getDefaultValue and reset function implementations to PreferenceStore interface 2021-10-05 21:51:36 +02:00
Niels van Velzen
379e3e7c2c Fix skipBackwardLength instead of skipBackLength (#1182) 2021-10-05 20:31:05 +02:00
Oatavandi
6c8d71b2b5 Translated using Weblate (Tamil)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-10-05 11:05:24 -04:00
Niels van Velzen
2cccc53462 Remove unused ApiClient extensions 2021-10-05 09:20:06 +02:00
Bill Thornton
c6b40ec71d Merge pull request #1172 from nielsvanvelzen/sdk-uuid-serializer 2021-10-04 17:31:24 -04:00
Bill Thornton
c76a5c9681 Merge pull request #1022 from nielsvanvelzen/no-tvapp
Remove TvApp.getApplication usages in util package
2021-10-04 17:27:39 -04:00
DanielPikilidis
c2214b4fca Translated using Weblate (Greek)
Currently translated at 71.1% (313 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/el/
2021-10-04 15:05:24 -04:00
Niels van Velzen
c3785fe433 Fix imports from bad rebase 2021-10-04 21:01:52 +02:00
Bill Thornton
a9bde16949 Merge pull request #1053 from nielsvanvelzen/baseitemdto-extras
Remove GSON usages when (de)serializing activity extras
2021-10-04 13:28:36 -04:00
ElegyD
bb7319db0c Explicitly specify android:exported (#1178) 2021-10-04 18:45:39 +02:00
Niels van Velzen
11428fa19e Java shenanigans 2021-10-04 17:00:41 +02:00
Bill Thornton
cb0fa6f31d Merge pull request #1166 from nielsvanvelzen/issue-template
Refactor issue templates to use forms
2021-10-04 10:16:17 -04:00
Csaba
26082c9a9b Translated using Weblate (Hungarian)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-10-04 04:05:23 -04:00
Bill Thornton
16a5eeb460 Merge pull request #1174 from nielsvanvelzen/player-fragment-nullable
Check nullability for mFragment in PlaybackController
2021-10-03 23:48:23 -04:00
wolong gl
57bba26420 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-10-03 14:05:23 -04:00
Niels van Velzen
f9fa23953f Check nullability for mFragment in PlaybackController 2021-10-03 16:32:18 +02:00
WWWesten
06d5a88d07 Translated using Weblate (Russian)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-03 09:05:23 -04:00
WWWesten
de2531d07c Translated using Weblate (Kazakh)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-10-03 09:05:23 -04:00
Niels van Velzen
468d4985e7 Replace UUIDSerializer with SDK provided version 2021-10-03 12:18:44 +02:00
Niels van Velzen
467f1f2b7a Translated using Weblate (Dutch)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2021-10-03 06:08:37 -04:00
Niels van Velzen
928ca45698 Translated using Weblate (Dutch)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2021-10-03 06:06:30 -04:00
Niels van Velzen
fd812d0a11 Translated using Weblate (English)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en/
2021-10-03 06:01:31 -04:00
Niels van Velzen
dd61f75827 Translated using Weblate (Dutch)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2021-10-03 05:57:43 -04:00
Weblate
35ee15fe3d Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2021-10-02 16:15:41 -04:00
Bill Thornton
9c16681127 Merge pull request #1165 from nielsvanvelzen/version-build-str 2021-10-02 16:15:37 -04:00
Weblate
f341431d4e Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2021-10-02 16:00:09 -04:00
Niels van Velzen
a4b9d397a4 Remove two unused strings and two unused icons (#1169) 2021-10-02 22:00:04 +02:00
Oatavandi
b08abc7356 Translated using Weblate (Tamil)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-10-02 13:05:23 -04:00
WWWesten
1df5672629 Translated using Weblate (Russian)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-10-02 13:05:23 -04:00
WWWesten
ffc005b92f Translated using Weblate (Kazakh)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-10-02 13:05:23 -04:00
Niels van Velzen
8a148398cd Add media playback bug report form template 2021-10-01 22:03:11 +02:00
Niels van Velzen
d3e1dbe775 Add feature request form template 2021-10-01 22:03:11 +02:00
Niels van Velzen
f404443ff1 Add bug report form template 2021-10-01 21:49:25 +02:00
Niels van Velzen
9e48578366 Remove build number from internal version reference
This fixes the "server version not supported" toast from showing the build number. 10.7.7.0 now shows as 10.7.7
2021-10-01 21:36:37 +02:00
Bartłomiej Ruk
6f626ef608 Translated using Weblate (Polish)
Currently translated at 99.7% (443 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2021-10-01 15:05:22 -04:00
Niels van Velzen
e3c25dc2fe Remove TvApp.getApplication usages in util package 2021-10-01 19:06:38 +02:00
Niels van Velzen
326845abff Remove GSON usages when (de)serializing for extras 2021-10-01 18:50:02 +02:00
Bill Thornton
e4815bc003 Merge pull request #1023 from nielsvanvelzen/koin-3
Migrate to Koin 3
2021-09-30 23:38:03 -04:00
Niels van Velzen
2826a4f6ba Translated using Weblate (Bengali (Bangladesh))
Currently translated at 20.4% (91 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/bn_BD/
2021-09-30 13:30:08 -04:00
Niels van Velzen
04cc64249a Translated using Weblate (Lithuanian)
Currently translated at 10.5% (47 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/lt/
2021-09-30 13:30:08 -04:00
sephrat
c82644ed2e Translated using Weblate (French)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-09-30 13:30:06 -04:00
Lukáš Kucharczyk
52caf6734d Translated using Weblate (Czech)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-09-30 13:30:05 -04:00
Niels van Velzen
500cd55e23 Migrate to Koin 3 2021-09-30 14:35:53 +02:00
Niels van Velzen
fb3863dc2e Translated using Weblate (English)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en/
2021-09-30 08:21:43 -04:00
Bill Thornton
5f58651670 Merge pull request #1050 from nielsvanvelzen/agp-700 2021-09-30 08:13:57 -04:00
Niels van Velzen
214be75044 Translated using Weblate (English)
Currently translated at 93.6% (416 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/en/
2021-09-30 08:08:16 -04:00
Niels van Velzen
2859b7f2b6 Update Android Gradle Plugin to 7.0.2 2021-09-30 13:42:23 +02:00
Chikku Cheriyan
445a964935 Translated using Weblate (Malayalam)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ml/
2021-09-30 00:30:05 -04:00
Tim040
3e6eb12178 Translated using Weblate (Dutch)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2021-09-29 13:30:05 -04:00
Tim040
8c5e85e088 Translated using Weblate (Dutch)
Currently translated at 98.8% (439 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nl/
2021-09-28 18:30:05 -04:00
nextlooper42
4e427f2bc9 Translated using Weblate (Slovak)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-09-28 07:30:04 -04:00
Tomislav
907e2f23fc Translated using Weblate (Croatian)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hr/
2021-09-27 22:30:06 -04:00
millallo
ac48af7cce Translated using Weblate (Italian)
Currently translated at 98.1% (436 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-09-27 09:30:04 -04:00
Ouail Ouazani
dfdfd2182d Translated using Weblate (Arabic)
Currently translated at 97.9% (435 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-09-23 23:30:06 -04:00
Moritz
5aca9345a7 Translated using Weblate (German)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-09-23 09:30:03 -04:00
newton181
9aeb72a809 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-09-22 15:30:03 -04:00
wolong gl
86633bd766 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-09-21 06:30:03 -04:00
Bartłomiej Ruk
e2e0e12bf8 Translated using Weblate (Polish)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2021-09-20 10:30:03 -04:00
meehel
9865da06de Translated using Weblate (Ukrainian)
Currently translated at 45.0% (200 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2021-09-16 07:30:03 -04:00
meehel
2d05594b2b Translated using Weblate (Ukrainian)
Currently translated at 35.1% (156 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/uk/
2021-09-15 14:30:03 -04:00
danieladov
dfbc4c91a8 Translated using Weblate (Spanish)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-09-15 14:30:00 -04:00
newton181
ebb3e3adf5 Translated using Weblate (Spanish)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-09-14 19:30:00 -04:00
newton181
21e0c13fe5 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-09-14 19:30:00 -04:00
hoanghuy309
9460d3e7a2 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-09-14 13:30:01 -04:00
Csaba
a5876b1631 Translated using Weblate (Hungarian)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-09-13 04:30:00 -04:00
WWWesten
0c7641c51b Translated using Weblate (Russian)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-09-12 09:29:59 -04:00
WWWesten
b5686ead4f Translated using Weblate (Kazakh)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-09-12 09:29:59 -04:00
cocool97
d3cd7ca111 Translated using Weblate (French)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-09-12 06:30:00 -04:00
Lukáš Kucharczyk
9d11062e90 Translated using Weblate (Czech)
Currently translated at 100.0% (444 of 444 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-09-12 06:29:59 -04:00
Bill Thornton
5e9a8b74f8 Merge pull request #1140 from JannikHoelling/add-star-rating-sort-to-grid
add star rating sort to grid view
2021-09-12 00:24:21 -04:00
Bill Thornton
cb3c0d0748 Merge pull request #1145 from nielsvanvelzen/autologin-fix
Fix crash when autologin is off
2021-09-12 00:20:23 -04:00
Niels van Velzen
eb170f8a28 Fix crash when autologin is off
- Use `destroyCurrentSession` instead of `setCurrentSession` with null value
- Change `destroyCurrentSession` to set api etc. to null in a **synchronous** way instead of calling `setCurrentSession`
2021-09-11 23:40:36 +02:00
cocool97
890d5753d0 Translated using Weblate (French)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-09-11 05:29:59 -04:00
Niels van Velzen
4c5fec38cb Set "my media" row as a default row 2021-09-10 21:56:36 +02:00
Niels van Velzen
1f1628bc50 Add resume episodes to watch next row 2021-09-10 21:53:54 +02:00
lojden
a6a40dff7e Translated using Weblate (Swedish)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2021-09-10 15:29:59 -04:00
Jannik Hoelling
490dd45ecb rename sorting from Stars to Community Rating 2021-09-10 19:05:35 +02:00
Bill Thornton
43b7d52efd Remove unused tile colors and update default theme (#1138)
* Remove unused tile colors and update default theme

* Fix tile_land_series_timer_bg not being used correctly
2021-09-10 08:48:15 +02:00
Bill Thornton
4f456088f8 Merge pull request #1139 from nielsvanvelzen/no-offline
Remove isOffline from PlaybackManager (always false)
2021-09-10 00:34:06 -04:00
Jannik Hoelling
8636533a06 add star rating sort to grid view 2021-09-10 01:14:08 +02:00
Niels van Velzen
4a6aaf537f Remove isOffline from PlaybackManager (always false) 2021-09-08 09:14:19 +02:00
millallo
0eecf3c8e4 Translated using Weblate (Italian)
Currently translated at 98.1% (435 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-09-06 10:29:57 -04:00
millallo
cd13dcee9b Translated using Weblate (Italian)
Currently translated at 98.1% (435 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-09-05 12:29:57 -04:00
Maxim Mironyuk
976fe6ecf2 Translated using Weblate (Russian)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-09-04 19:29:57 -04:00
cocool97
83aa6dc21f Translated using Weblate (French)
Currently translated at 99.7% (442 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-09-04 16:29:57 -04:00
Bill Thornton
42558dbd54 Fix now playing bug layout (#1125)
* Fix now playing bug layout

* Add max width to now playing bug

* Fix low resolution art in now playing bug
2021-09-02 20:16:26 +02:00
Bill Thornton
1c854f4212 Merge pull request #1114 from nielsvanvelzen/playback-audio-intercept
Forward audio play requests to playback module
2021-09-02 09:46:03 -07:00
nextlooper42
24824d9e18 Translated using Weblate (Slovak)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-09-01 09:29:56 -04:00
Bill Thornton
885f511944 Merge pull request #1123 from nielsvanvelzen/gh-gradle-cache
Use actions/setup-java caching
2021-08-31 13:38:54 -07:00
linetrimmer
06ea7c4094 Use parentThumbItemId in LeanbackChannelWorker (#1119)
* Use parentThumbItemId

* Fallback to parentThumb
2021-08-31 18:41:09 +02:00
Niels van Velzen
a31da7afc8 Use caching via actions/setup-java 2021-08-31 18:36:20 +02:00
Moritz
1be253e69a Translated using Weblate (German)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-08-30 08:29:55 -04:00
Niels van Velzen
5b6527bd4a Forward audio play requests to playback module 2021-08-27 21:14:14 +02:00
Bill Thornton
56f3211eed Merge pull request #1099 from linetrimmer/grid-adjustments
Adjust positions of grid UI elements
2021-08-27 06:51:34 -07:00
Bill Thornton
aef0abc16c Merge pull request #1112 from linetrimmer/pbssub 2021-08-26 19:20:39 -07:00
linetrimmer
c0677e6f28 Fix tyop 2021-08-26 19:12:08 -04:00
linetrimmer
27d7a4bde4 Move down toolBar and infoRow 2021-08-26 16:05:17 -04:00
Bill Thornton
21591a7ac1 Remove useless check method (#1111) 2021-08-26 18:22:35 +00:00
Bill Thornton
98f870da86 Downmix audio by default on Chromecast with Google TV (#1110) 2021-08-26 20:01:40 +02:00
Bill Thornton
ea6aba6196 Merge pull request #1109 from nielsvanvelzen/android-opaque
Add android-opaque to supported as supported VLC video output
2021-08-26 08:11:15 -07:00
Bill Thornton
f5208a1663 Add guide card to live tv library views (#1108) 2021-08-26 13:37:46 +02:00
Niels van Velzen
49a7541d76 Add android-opaque to supported as supported VLC video output 2021-08-26 13:33:29 +02:00
Bill Thornton
55dcb95f13 Merge pull request #1105 from nielsvanvelzen/hardware-marquee
Use hardware layer for text views with marquee ellipsize
2021-08-25 12:51:30 -07:00
Bill Thornton
f4882779c4 Merge pull request #1104 from nielsvanvelzen/dts-always-true
Remove isDtsEnabled from ExoPlayerProfile (always true)
2021-08-25 12:46:36 -07:00
Niels van Velzen
2b3ecf735c Use hardware layer for text views with marquee ellipsize 2021-08-25 20:16:06 +02:00
Niels van Velzen
465270ec11 Remove isDtsEnabled from ExoPlayerProfile (always true) 2021-08-25 19:52:19 +02:00
linetrimmer
9d5d56da57 Adjust person/user card colors and non-active button color for Muted Purple theme (#1100)
* Separate person and user cards, change colors for Muted Purple

* Theme button_default_normal background color

* Use camelCase and reorder
2021-08-25 19:46:23 +02:00
Bill Thornton
524eb3ef56 Restore direct play support for avi with libvlc (#1102) 2021-08-25 18:21:25 +02:00
Bill Thornton
e86540e0ef Enable multichannel audio support for Fire TVs (#1103) 2021-08-25 18:20:42 +02:00
Bill Thornton
4268c54e35 Merge pull request #1096 from nielsvanvelzen/vlc-misc-fix
Fix VLC error reporting and black screens
2021-08-25 07:00:37 -07:00
Niels van Velzen
29479b7ea9 Add missing break 2021-08-25 08:49:15 +02:00
linetrimmer
d10ae09a7a Swap toolBar and npBug positions, revert toolBar size change 2021-08-25 00:50:21 -04:00
Bill Thornton
076aef64bb Merge pull request #1087 from MrChip53/revert-ff-rw
Revert FF and RW
2021-08-24 20:43:33 -07:00
Weevild
661d119c30 Translated using Weblate (Swedish)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2021-08-24 18:29:53 -04:00
Oatavandi
515b15be0a Translated using Weblate (Malayalam)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ml/
2021-08-23 13:29:53 -04:00
Oatavandi
c05af8333b Translated using Weblate (Tamil)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-08-23 13:29:52 -04:00
Csaba
2afb99bec5 Translated using Weblate (Hungarian)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-08-23 03:29:52 -04:00
linetrimmer
7d5e26a713 Match counter and statusText margins 2021-08-23 00:25:13 -04:00
linetrimmer
2de4f02602 Reposition toolBar and npBug 2021-08-22 23:49:14 -04:00
Niels van Velzen
b3319e8850 Fix VLC output not using android-display
The onNewVideoLayout function we use to scale the video view does not work on the opengl video output from LibVLC
2021-08-22 16:50:21 +02:00
Niels van Velzen
f7d3c7154d Fix VLC error reporting 2021-08-22 16:49:49 +02:00
hoanghuy309
03afa8fa27 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-08-22 06:29:52 -04:00
Niels van Velzen
b64c5efed2 Add PlaybackForwardingActivity for bridging to new playback module (#1092) 2021-08-22 09:55:01 +02:00
Rober Molina
da14ac9f3d Translated using Weblate (Spanish (Latin America))
Currently translated at 99.7% (442 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-08-21 17:29:52 -04:00
Christopher Tam
5cf569bc1c Remove vpx (unused) as a CodecType (#1095) 2021-08-21 10:32:36 +02:00
MrChip53
d5fd21b935 Revert FF and RW; pull values from user settings 2021-08-18 19:51:11 -05:00
jellyfin-bot
49748457bb Update Gradle Wrapper from 7.1.1 to 7.2. (#1093)
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>

Co-authored-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2021-08-18 17:39:42 +02:00
newton181
7109a88e27 Translated using Weblate (Spanish)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-08-17 15:29:51 -04:00
newton181
944340eff7 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-08-17 15:29:51 -04:00
wolong gl
47f506efec Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-08-17 05:29:50 -04:00
WWWesten
ac0ced7ac1 Translated using Weblate (Kazakh)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-08-16 18:29:51 -04:00
Lukáš Kucharczyk
5a9bcd2fa0 Translated using Weblate (Czech)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-08-16 18:29:51 -04:00
WWWesten
3263b7bb44 Translated using Weblate (Russian)
Currently translated at 100.0% (443 of 443 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-08-16 18:29:50 -04:00
dependabot[bot]
c5d848b285 Bump burnett01/rsync-deployments from 5.0 to 5.1 (#1091)
Bumps [burnett01/rsync-deployments](https://github.com/burnett01/rsync-deployments) from 5.0 to 5.1.
- [Release notes](https://github.com/burnett01/rsync-deployments/releases)
- [Commits](https://github.com/burnett01/rsync-deployments/compare/5.0...5.1)

---
updated-dependencies:
- dependency-name: burnett01/rsync-deployments
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-16 17:11:12 +00:00
hoanghuy309
c40f9bb7d5 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-08-16 12:41:58 -04:00
Niels van Velzen
5a0127f472 Add option to always require authentication (#1084) 2021-08-16 18:41:54 +02:00
Lukáš Kucharczyk
ed9cf9e09d Translated using Weblate (Czech)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-08-16 04:29:50 -04:00
Gubb Jonas
4310bc46c8 Translated using Weblate (Swedish)
Currently translated at 93.6% (412 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sv/
2021-08-14 21:29:51 -04:00
WWWesten
066898c422 Translated using Weblate (Kazakh)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-08-14 21:29:50 -04:00
lautundobszoen
59a0ffdda0 Translated using Weblate (German)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-08-14 21:29:50 -04:00
WWWesten
3d3edea350 Translated using Weblate (Russian)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-08-14 21:29:50 -04:00
Oatavandi
3b1f2f7e3e Translated using Weblate (Malayalam)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ml/
2021-08-14 14:29:50 -04:00
Oatavandi
6be83fe940 Translated using Weblate (Tamil)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-08-14 14:29:50 -04:00
nextlooper42
cc80a79531 Translated using Weblate (Slovak)
Currently translated at 100.0% (440 of 440 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sk/
2021-08-14 10:29:50 -04:00
Bill Thornton
e8fd0d76d9 Merge pull request #1082 from nielsvanvelzen/fix-double-session-load
Fix session loading twice on app startup
2021-08-13 10:46:26 -07:00
Bill Thornton
2bf877143e Merge pull request #1079 from nielsvanvelzen/auth-sort-by
Add preference to change user sort order in login screen
2021-08-13 10:20:53 -07:00
newton181
d3e2c6e498 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_419/
2021-08-11 19:29:50 -04:00
volumeinspection
2137a7ccc2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.1% (430 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nb_NO/
2021-08-11 19:29:49 -04:00
newton181
8db9c7e60c Translated using Weblate (Spanish)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es/
2021-08-11 19:29:49 -04:00
newton181
5592809f91 Translated using Weblate (Spanish (Mexico))
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/es_MX/
2021-08-11 19:29:49 -04:00
Niels van Velzen
cbcf2c9b7c Use the process lifecycle to (re)load user sessions
This simplifies our code as there is now only a single place to restore the session. This automatically supports opening the app after putting it in the background.
2021-08-11 23:00:15 +02:00
Oatavandi
672201e86b Translated using Weblate (Malayalam)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ml/
2021-08-11 14:29:50 -04:00
hoanghuy309
7590ace5c9 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/vi/
2021-08-11 14:29:49 -04:00
Oatavandi
9d2b2da60d Translated using Weblate (Tamil)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ta/
2021-08-11 14:29:49 -04:00
Moritz
0b7659786c Translated using Weblate (German)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/de/
2021-08-11 14:29:49 -04:00
Niels van Velzen
1ab524cf08 Add preference to change user sort order in login screen 2021-08-10 20:47:24 +02:00
wolong gl
d8c57dc0e8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-08-10 03:29:48 -04:00
Anthony Lavado
12e0014c8a Merge pull request #1076 from thornbill/fix-setting-null-sessions 2021-08-10 02:49:00 -04:00
Bill Thornton
edc615aba9 Allow user sessions to be set to null again 2021-08-10 00:16:21 -04:00
dependabot[bot]
ddfd98a26f Bump burnett01/rsync-deployments from 4.1 to 5.0 (#1075)
Bumps [burnett01/rsync-deployments](https://github.com/burnett01/rsync-deployments) from 4.1 to 5.0.
- [Release notes](https://github.com/burnett01/rsync-deployments/releases)
- [Commits](https://github.com/burnett01/rsync-deployments/compare/4.1...5.0)

---
updated-dependencies:
- dependency-name: burnett01/rsync-deployments
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-09 21:42:25 +02:00
Niels van Velzen
1c4e76a934 Fix going back from home screen (#1074) 2021-08-09 16:34:01 +02:00
Csaba
9532805990 Translated using Weblate (Hungarian)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/hu/
2021-08-09 03:29:48 -04:00
Lukáš Kucharczyk
c013ae1acd Translated using Weblate (Czech)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/cs/
2021-08-08 20:29:48 -04:00
WWWesten
c85b8d01f1 Translated using Weblate (Russian)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-08-08 17:29:48 -04:00
WWWesten
88f1308e94 Translated using Weblate (Kazakh)
Currently translated at 100.0% (438 of 438 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/kk/
2021-08-08 17:29:48 -04:00
Weblate
8351bd1558 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2021-08-08 13:05:06 -04:00
Niels van Velzen
fe75e4ba5b Move useExternalPlayer and getPlaybackActivityClass functions to new PlaybackLauncher interface (#1064)
* Move useExternalPlayer and getPlaybackActivityClass functions to new PlaybackLauncher interface

* Add toggle to enable new playback module

* Add BuildConfig.DEVELOPMENT
2021-08-08 19:04:58 +02:00
Weblate
5177800be4 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/
2021-08-08 13:03:33 -04:00
jakeapp
14a3a815b1 Move from 4 zoom options to 3 (#1062)
* Update VideoManager.java

* Update VideoManager.java

* Update ZoomAction.java

* Update strings.xml
2021-08-08 19:03:29 +02:00
Niels van Velzen
510a3c4901 Fix wrong supported commands reported (#1073) 2021-08-08 17:29:13 +02:00
Niels van Velzen
6f3943cdb5 Add (empty) playback module and CODEOWNERS (#1072)
* Add (empty) playback module

* Add CODEOWNERS file
2021-08-08 17:28:56 +02:00
Matt
4e9a239b2c Translated using Weblate (Italian)
Currently translated at 98.1% (428 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/it/
2021-08-06 14:29:49 -04:00
Bill Thornton
90b5ef4c9f Merge pull request #1068 from nielsvanvelzen/1065-check-intent
Fix being unable to switch users
2021-08-05 10:22:03 -07:00
Niels van Velzen
8f1584d648 Fix being unable to switch users
StartupActivity now checks if the action in the launch intent is ACTION_MAIN (opened from launcher)
2021-08-05 19:14:53 +02:00
Bill Thornton
ad89c30b79 Merge pull request #1059 from nielsvanvelzen/always-restore-session 2021-08-01 08:03:43 -07:00
Niels van Velzen
b417be554a Restore user session when starting after soft-closing the app 2021-08-01 15:02:19 +02:00
Ali Amer
24ef2cf3e8 Translated using Weblate (Arabic)
Currently translated at 76.6% (334 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-07-30 16:29:48 -04:00
Bill Thornton
cba34da68b Merge pull request #1052 from nielsvanvelzen/unused-funcs
Remove utility functions only used by tests
2021-07-29 06:46:50 -07:00
Bill Thornton
bf63a07713 Merge pull request #1051 from nielsvanvelzen/useless-sdk-check
Remove is50 check (always true)
2021-07-29 06:42:23 -07:00
Bill Thornton
8a4e0b3afc Merge pull request #1033 from nielsvanvelzen/acra-update
Update ACRA to 5.8.x
2021-07-29 06:39:18 -07:00
Niels van Velzen
e44a7490a7 Remove utility functions only used by tests 2021-07-29 14:26:27 +02:00
Niels van Velzen
7f85107160 Remove is50 check (always true)
The app only supports Android API 21 and up, the check would always return true.
2021-07-29 14:21:31 +02:00
Niels van Velzen
818784635f Hide system bars during video playback (#1047) 2021-07-28 19:38:55 +02:00
Niels van Velzen
f1414902f8 Update androidx.window to alpha09 (#1042) 2021-07-28 19:38:40 +02:00
wolong gl
6d45d4d353 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (436 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/zh_Hans/
2021-07-28 11:29:44 -04:00
WWWesten
f5e81099af Translated using Weblate (Russian)
Currently translated at 100.0% (436 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ru/
2021-07-28 07:29:45 -04:00
Sverre
e0ee7f190f Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.7% (422 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/nb_NO/
2021-07-28 07:29:45 -04:00
linetrimmer
146d8dd847 Round up runtime calculation and match server resolution text in InfoLayoutHelper (#1036)
* Round up runtime calculation

* Match server resolution text
2021-07-26 17:37:26 +02:00
Niels van Velzen
33bfb43253 Update ACRA to 5.8.x 2021-07-25 11:09:15 +02:00
Adrian Borowski
03a155f098 Translated using Weblate (Polish)
Currently translated at 100.0% (436 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/pl/
2021-07-24 17:29:44 -04:00
SaddFox
ba658e0f7a Translated using Weblate (Slovenian)
Currently translated at 80.2% (350 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sl/
2021-07-24 17:29:43 -04:00
SaddFox
5689a79aa6 Translated using Weblate (Slovenian)
Currently translated at 79.8% (348 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/sl/
2021-07-24 11:29:43 -04:00
Bill Thornton
60fd6e3fb9 Merge pull request #1031 from nielsvanvelzen/fix-credential-migration 2021-07-24 07:24:26 -07:00
Niels van Velzen
a09abd9869 Fix legacy credential migration not working as expected 2021-07-24 10:38:02 +02:00
Sam
bff2638d0c Translated using Weblate (Arabic)
Currently translated at 44.4% (194 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/ar/
2021-07-23 23:29:43 -04:00
Nico83500
ac1c74bb9c Translated using Weblate (French)
Currently translated at 100.0% (436 of 436 strings)

Translation: Jellyfin Android/Jellyfin Android TV
Translate-URL: https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/fr/
2021-07-23 19:29:42 -04:00
816 changed files with 32290 additions and 24662 deletions

View File

@@ -2,8 +2,16 @@ root = true
[*]
insert_final_newline = true
trim_trailing_whitespace = true
[{*.kts, *.kt}]
charset = utf-8
indent_style = tab
tab_width = 4
# Disable wildcard imports in IntelliJ/Android Studio
ij_kotlin_name_count_to_use_star_import = 1000
ij_kotlin_name_count_to_use_star_import_for_members = 1000
ij_kotlin_packages_to_use_import_on_demand =
[*.md]
trim_trailing_whitespace = false

View File

@@ -0,0 +1,82 @@
name: Media playback bug report
description: Create a bug report related to media playback
labels:
- bug
- playback
body:
- type: textarea
id: description
attributes:
label: Describe the bug
description: |
A clear and concise description of the bug, including steps to reproduce it and the normally expected behavior.
You can also attach screenshots or screen recordings to help explain your issue.
placeholder: |
1. Go to …
2. Click on …
3. Scroll down to …
4. See error / the app crashes
Instead, I expect …
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs
description: |
Please paste your crash logs here if applicable. You can find these in your servers dashboard under "logs".
The file name should start with "upload_org.jellyfin.androidtv".
Make sure that they don't contain any sensitive information like server URL, auth tokens or passwords.
placeholder: Paste logs…
- type: textarea
id: logs-ffmpeg
attributes:
label: FFmpeg logs
description: |
Please paste your FFmpeg logs here. You can find these in your servers dashboard under "logs".
placeholder: Paste logs…
render: shell
- type: textarea
id: mediainfo
attributes:
label: Media info of the file
description: |
Please share the media information for the file causing issues. You can use a variety of tools to retrieve this information.
- Use ffprobe (`ffprobe ./file.mp4`)
- Use the Media Info tool (set to text format, download here: https://mediaarea.net/en/MediaInfo)
- Copy the media info from the web interface
placeholder: Paste media info…
render: shell
- type: input
id: app-version
attributes:
label: Application version
description: The version of the installed Jellyfin Android TV app.
placeholder: 0.14.0
validations:
required: true
- type: input
id: device-info
attributes:
label: Device information
description: Manufacturer and model
placeholder: Nvidia Shield Pro (2017), Amazon Fire TV Stick v1 (2014)
validations:
required: true
- type: input
id: android-version
attributes:
label: Android version
description: Version of the OS and other information (e.g. custom ROM / OEM skin)
placeholder: Android 9, Fire OS 7
validations:
required: true
- type: input
id: server-version
attributes:
label: Jellyfin server version
description: If on unstable, please specify the commit hash.
placeholder: 10.8.1
validations:
required: true

71
.github/ISSUE_TEMPLATE/bug-report.yaml vendored Normal file
View File

@@ -0,0 +1,71 @@
name: Bug report
description: Create a bug report
labels:
- bug
body:
- type: textarea
id: description
attributes:
label: Describe the bug
description: |
A clear and concise description of the bug, including steps to reproduce it and the normally expected behavior.
You can also attach screenshots or screen recordings to help explain your issue.
placeholder: |
1. Go to …
2. Click on …
3. Scroll down to …
4. See error / the app crashes
Instead, I expect …
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs
description: |
Please paste your crash logs here if applicable. You can find these in your servers dashboard under "logs".
The file name should start with "upload_org.jellyfin.androidtv".
Make sure that they don't contain any sensitive information like server URL, auth tokens or passwords.
placeholder: Paste logs…
- type: input
id: app-version
attributes:
label: Application version
description: The version of the installed Jellyfin Android TV app.
placeholder: 0.14.0
validations:
required: true
- type: dropdown
id: installation-source
attributes:
label: Where did you install the app from?
description: Choose the appropriate app store or installation method.
options:
- Google Play
- Amazon Appstore
- Sideloaded APK
- type: input
id: device-info
attributes:
label: Device information
description: Manufacturer and model
placeholder: Nvidia Shield Pro (2017), Amazon Fire TV Stick v1 (2014)
validations:
required: true
- type: input
id: android-version
attributes:
label: Android version
description: Version of the OS and other information (e.g. custom ROM / OEM skin)
placeholder: Android 9, Fire OS 7
validations:
required: true
- type: input
id: server-version
attributes:
label: Jellyfin server version
description: If on unstable, please specify the commit hash.
placeholder: 10.8.1
validations:
required: true

View File

@@ -1,36 +0,0 @@
---
name: Bug report
about: Create a bug report
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
<!-- A clear and concise description of what the bug is. -->
**To Reproduce**
<!-- Steps to reproduce the behavior: -->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Logs**
<!-- Please paste any log errors. -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
**System (please complete the following information):**
- Android TV or Fire TV version: [e.g. Android 9 or Fire OS 7]
- Device manufacturer: [e.g. Amazon, Nvidia, Sony]
- Device model: [e.g. Fire TV Stick (2nd Gen) or Shield TV]
- Jellyfin server version: [e.g. 10.5.4]
**Additional context**
<!-- Add any other context about the problem here. -->

View File

@@ -1,4 +1,4 @@
blank_issues_enabled: true
blank_issues_enabled: false
contact_links:
- name: Jellyfin documentation
url: https://jellyfin.org/docs/general/getting-help.html

View File

@@ -0,0 +1,14 @@
name: Feature request
description: Request a new feature
labels:
- enhancement
body:
- type: textarea
id: description
attributes:
label: Describe the feature you'd like
description: |
A clear and concise description of what you want to request.
You can also attach screenshots or screen recordings to help explain your request.
validations:
required: true

View File

@@ -1,14 +0,0 @@
---
name: Feature Request
about: Request a new feature
title: ''
labels: enhancement
assignees: ''
---
**Describe the feature you'd like**
<!-- A clear and concise description of what you want to happen. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->

View File

@@ -1,29 +0,0 @@
---
name: Media playback issue
about: Create a media playback issue report
title: ''
labels: playback
assignees: ''
---
**Checks**
- [ ] Issue does not happen in the browser (jellyfin-web)
**Media Info of the file**
<!-- Use the Media Info tool (set to text format, download here: https://mediaarea.net/en/MediaInfo) or copy the info from the web ui for the file with the playback issue. -->
**Logs**
<!-- Please paste any log messages from during the playback issue. -->
**FFmpeg Logs**
<!-- Please paste any FFmpeg logs if remuxing or transcoding appears to be part of the issue. -->
**System (please complete the following information):**
- Android TV or Fire TV version: [e.g. Android 9 or Fire OS 7]
- Device manufacturer: [e.g. Amazon, Nvidia, Sony]
- Device model: [e.g. Fire TV Stick (2nd Gen) or Shield TV]
- Jellyfin server version: [e.g. 10.5.4]
**Additional context**
<!-- Add any other context about the problem here. -->

View File

@@ -1,10 +0,0 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
labels:
- ci
- github-actions
- dependencies

19
.github/stale.yml vendored
View File

@@ -1,19 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 120
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 21
# Issues with these labels will never be considered stale
exemptLabels:
- enhancement
- confirmed
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has gone 120 days without comment. To avoid abandoned issues, it will be closed in 21 days if there are no new comments.
If you're the original submitter of this issue, please comment confirming if this issue still affects you in the latest release or master branch, or close the issue if it has been fixed. If you're another user also affected by this bug, please comment confirming so. Either action will remove the stale label.
This bot exists to prevent issues from becoming stale and forgotten. Jellyfin is always moving forward, and bugs are often fixed as side effects of other changes. We therefore ask that bug report authors remain vigilant about their issues to ensure they are closed if fixed, or re-confirmed - perhaps with fresh logs or reproduction examples - regularly. If you have any questions you can reach us on [Matrix or Social Media](https://docs.jellyfin.org/general/getting-help.html).
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

View File

@@ -1,4 +1,4 @@
name: App Build
name: App / Build
on:
push:
@@ -6,32 +6,31 @@ on:
- master
pull_request:
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-20.04
name: Build
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Setup Java
uses: actions/setup-java@v2
uses: actions/setup-java@de1bb2b0c5634f0fc4438d7aa9944e68f9bf86cc # tag=v3
with:
distribution: adopt
java-version: 11
- name: Setup Gradle cache
uses: actions/cache@v2.1.6
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/gradle-build-action@3fbe033aaae657f011f88f29be9e65ed26bd29ef # tag=v2
- name: Assemble debug APKs
run: ./gradlew --build-cache --no-daemon --info assembleDebug
run: ./gradlew assembleDebug
- name: Create publish bundle
run: mkdir -p build/gh-app-publish/; find app/build/ -iname "*.apk" -exec mv "{}" build/gh-app-publish/ \;
- name: Upload artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # tag=v3
with:
name: build-artifacts
retention-days: 14
if-no-files-found: error
path: app/build/outputs/apk/debug/*.apk
path: build/gh-app-publish/

View File

@@ -1,4 +1,4 @@
name: App Lint
name: App / Lint
on:
push:
@@ -7,30 +7,28 @@ on:
- release-*
pull_request:
permissions:
contents: read
security-events: write
jobs:
lint:
runs-on: ubuntu-20.04
name: Lint
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Setup Java
uses: actions/setup-java@v2
uses: actions/setup-java@de1bb2b0c5634f0fc4438d7aa9944e68f9bf86cc # tag=v3
with:
distribution: adopt
java-version: 11
- name: Setup Gradle cache
uses: actions/cache@v2.1.6
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Run detekt and lint task
run: ./gradlew --build-cache --no-daemon --info detekt lint
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/gradle-build-action@3fbe033aaae657f011f88f29be9e65ed26bd29ef # tag=v2
- name: Run detekt and lint tasks
run: ./gradlew detekt lint
- name: Upload SARIF files
uses: github/codeql-action/upload-sarif@v1
uses: github/codeql-action/upload-sarif@678fc3afe258fb2e0cdc165ccf77b85719de7b3c # v2
if: ${{ always() }}
with:
sarif_file: .

View File

@@ -1,4 +1,4 @@
name: App Publish
name: App / Publish
on:
push:
@@ -6,45 +6,58 @@ on:
- v*
jobs:
build:
runs-on: ubuntu-20.04
if: ${{ github.repository == 'jellyfin/jellyfin-androidtv' }}
publish:
name: Publish
runs-on: ubuntu-22.04
if: ${{ contains(github.repository_owner, 'jellyfin') }}
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Setup Java
uses: actions/setup-java@v2
uses: actions/setup-java@de1bb2b0c5634f0fc4438d7aa9944e68f9bf86cc # tag=v3
with:
distribution: adopt
java-version: 11
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/gradle-build-action@3fbe033aaae657f011f88f29be9e65ed26bd29ef # tag=v2
- name: Set JELLYFIN_VERSION
run: echo "JELLYFIN_VERSION=$(echo ${GITHUB_REF#refs/tags/v} | tr / -)" >> $GITHUB_ENV
- name: Assemble release files
run: ./gradlew --no-daemon --info assemble versionTxt
- name: Sign proprietary APK
id: sign
uses: r0adkll/sign-android-release@v1
run: ./gradlew assemble bundleRelease versionTxt
- name: Sign APK
id: signApk
uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # tag=v1
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.KEYSTORE }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
alias: ${{ secrets.KEY_ALIAS }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Sign app bundle
id: signAab
uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # tag=v1
with:
releaseDirectory: app/build/outputs/bundle/release
signingKeyBase64: ${{ secrets.KEYSTORE }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
alias: ${{ secrets.KEY_ALIAS }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Prepare release archive
run: |
mkdir -p build/jellyfin-publish
mv app/build/outputs/apk/*/jellyfin-androidtv-*-debug.apk build/jellyfin-publish/
mv app/build/outputs/apk/*/jellyfin-androidtv-*-release-unsigned.apk build/jellyfin-publish/
mv ${{ steps.sign.outputs.signedReleaseFile }} build/jellyfin-publish/jellyfin-androidtv-v${{ env.JELLYFIN_VERSION }}-release.apk
mv ${{ steps.signApk.outputs.signedReleaseFile }} build/jellyfin-publish/jellyfin-androidtv-v${{ env.JELLYFIN_VERSION }}-release.apk
mv ${{ steps.signAab.outputs.signedReleaseFile }} build/jellyfin-publish/jellyfin-androidtv-v${{ env.JELLYFIN_VERSION }}-release.aab
mv app/build/version.txt build/jellyfin-publish/
- name: Upload release archive to GitHub release
uses: alexellis/upload-assets@0.3.0
uses: alexellis/upload-assets@259de5111cb56966d046ced998941e93f91d2c93 # tag=0.4.0
env:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
with:
asset_paths: '["build/jellyfin-publish/*"]'
- name: Upload release archive to repo.jellyfin.org
uses: burnett01/rsync-deployments@4.1
uses: burnett01/rsync-deployments@0dc935cdecc5f5e571865e60d2a6cdc673704823 # tag=5.2
with:
switches: -vrptz
path: build/jellyfin-publish/
@@ -53,7 +66,7 @@ jobs:
remote_user: ${{ secrets.DEPLOY_USER }}
remote_key: ${{ secrets.DEPLOY_KEY }}
- name: Update repo.jellyfin.org symlinks
uses: appleboy/ssh-action@v0.1.4
uses: appleboy/ssh-action@f9010ff7f1bbd7db1a0b4bab661437550cea20c0 # tag=v0.1.5
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}

View File

@@ -1,4 +1,4 @@
name: App Test
name: App / Test
on:
push:
@@ -7,25 +7,22 @@ on:
- release-*
pull_request:
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-20.04
name: Test
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Setup Java
uses: actions/setup-java@v2
uses: actions/setup-java@de1bb2b0c5634f0fc4438d7aa9944e68f9bf86cc # tag=v3
with:
distribution: adopt
java-version: 11
- name: Setup Gradle cache
uses: actions/cache@v2.1.6
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
distribution: temurin
java-version: 17
- name: Setup Gradle
uses: gradle/gradle-build-action@3fbe033aaae657f011f88f29be9e65ed26bd29ef # tag=v2
- name: Run test task
run: ./gradlew --build-cache --no-daemon --info test
run: ./gradlew test

View File

@@ -1,4 +1,4 @@
name: Gradle update
name: Gradle / Update wrapper
on:
schedule:
@@ -6,12 +6,13 @@ on:
jobs:
update:
runs-on: ubuntu-latest
if: github.repository == 'jellyfin/jellyfin-androidtv'
name: Update
runs-on: ubuntu-22.04
if: ${{ contains(github.repository_owner, 'jellyfin') }}
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Update Gradle Wrapper
uses: gradle-update/update-gradle-wrapper-action@v1
uses: gradle-update/update-gradle-wrapper-action@981c551b17dbcf1940b1b4435afdb79babb7c13a # tag=v1
with:
repo-token: ${{ secrets.JF_BOT_TOKEN }}

View File

@@ -1,4 +1,4 @@
name: Gradle validate
name: Gradle / Validate wrapper
on:
push:
@@ -8,11 +8,15 @@ on:
paths:
- '**/gradlе-wrapper.jar'
permissions:
contents: read
jobs:
validate:
runs-on: ubuntu-latest
name: Validate
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
uses: gradle/wrapper-validation-action@55e685c48d84285a5b0418cd094606e199cca3b6 # tag=v1

View File

@@ -1,17 +0,0 @@
name: Merge conflict labeler
on:
push:
pull_request_target:
types:
- synchronize
jobs:
triage:
runs-on: ubuntu-20.04
if: github.repository == 'jellyfin/jellyfin-androidtv'
steps:
- uses: eps1lon/actions-label-merge-conflict@v2.0.1
with:
dirtyLabel: merge conflict
repoToken: ${{ secrets.JF_BOT_TOKEN }}

View File

@@ -0,0 +1,18 @@
name: Repo / Label merge conflict
on:
push:
pull_request_target:
types:
- synchronize
jobs:
triage:
name: Triage
runs-on: ubuntu-22.04
if: ${{ contains(github.repository_owner, 'jellyfin') }}
steps:
- uses: eps1lon/actions-label-merge-conflict@fd1f295ee7443d13745804bc49fe158e240f6c6e # tag=v2.1.0
with:
dirtyLabel: merge conflict
repoToken: ${{ secrets.JF_BOT_TOKEN }}

32
.github/workflows/repo-stale.yaml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: Repo / Reply stale issue
on:
schedule:
- cron: '30 3 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
jobs:
triage:
name: Triage
runs-on: ubuntu-22.04
if: ${{ contains(github.repository_owner, 'jellyfin') }}
steps:
- uses: actions/stale@5ebf00ea0e4c1561e9b43a292ed34424fb1d4578 # tag=v6
with:
repo-token: ${{ secrets.JF_BOT_TOKEN }}
days-before-stale: 120
days-before-pr-stale: -1
days-before-close: 21
days-before-pr-close: -1
exempt-issue-labels: enhancement,confirmed
stale-issue-label: stale
stale-issue-message: |-
This issue has gone 120 days without comment. To avoid abandoned issues, it will be closed in 21 days if there are no new comments.
If you're the original submitter of this issue, please comment confirming if this issue still affects you in the latest release or master branch, or close the issue if it has been fixed. If you're another user also affected by this bug, please comment confirming so. Either action will remove the stale label.
This bot exists to prevent issues from becoming stale and forgotten. Jellyfin is always moving forward, and bugs are often fixed as side effects of other changes. We therefore ask that bug report authors remain vigilant about their issues to ensure they are closed if fixed, or re-confirmed - perhaps with fresh logs or reproduction examples - regularly. If you have any questions you can reach us on [Matrix or Social Media](https://docs.jellyfin.org/general/getting-help.html).

15
CODEOWNERS Normal file
View File

@@ -0,0 +1,15 @@
# Build files
/.github/workflows/ @nielsvanvelzen
/.github/dependabot.yml @nielsvanvelzen
/gradle/ @nielsvanvelzen
/buildSrc/ @nielsvanvelzen
settings.gradle.ts @nielsvanvelzen
build.gradle.kts @nielsvanvelzen
gradle.properties @nielsvanvelzen
# Linting
android-lint.xml @nielsvanvelzen
detekt.yaml @nielsvanvelzen
# Playback code
/playback/ @nielsvanvelzen

View File

@@ -9,6 +9,8 @@
- [AndreasGB](https://github.com/andreasgb)
- [joern-h](https://github.com/joern-h)
- [Niels van Velzen](https://github.com/nielsvanvelzen)
- [GodTamIt](https://github.com/GodTamIt)
- [sparky3387](https://github.com/sparky3387)
# Emby Contributors

View File

@@ -35,6 +35,9 @@
<a href="https://www.amazon.com/gp/aw/d/B07TX7Z725">
<img width="153" alt="Jellyfin on Amazon Appstore" src="https://jellyfin.org/images/store-icons/amazon.png"/>
</a>
<a href="https://f-droid.org/en/packages/org.jellyfin.androidtv/">
<img width="153" alt="Jellyfin on F-Droid" src="https://jellyfin.org/images/store-icons/fdroid.png"/>
</a>
<br/>
<a href="https://repo.jellyfin.org/releases/client/androidtv/">Download archive</a>
</p>
@@ -74,7 +77,7 @@ Look through the following graphic to see if your native language could use some
./gradlew assembleDebug
```
Add the Android SDK to you PATH environment variable or create the ANDROID_SDK_ROOT variable for
Add the Android SDK to your PATH environment variable or create the ANDROID_SDK_ROOT variable for
this to work.
### Deploy to device/emulator

View File

@@ -0,0 +1,39 @@
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath libs.android.gradle
}
}
import com.android.tools.profgen.ArtProfileKt
import com.android.tools.profgen.ArtProfileSerializer
import com.android.tools.profgen.DexFile
/**
* This is a temporary workaround for https://issuetracker.google.com/issues/231837768
* which will be fixed in AGP 8.1.0, at which point the workaround may be deleted.
*/
project.afterEvaluate {
tasks.compileReleaseArtProfile.doLast {
outputs.files.each { file ->
if (file.toString().endsWith(".profm")) {
println("Sorting ${file}")
def version = ArtProfileSerializer.valueOf("METADATA_0_0_2")
def profile = ArtProfileKt.ArtProfile(file)
def keys = new ArrayList(profile.profileData.keySet())
def sortedData = new LinkedHashMap()
Collections.sort keys, new DexFile.Companion()
keys.each { key -> sortedData[key] = profile.profileData[key] }
new FileOutputStream(file).with {
write(version.magicBytes$profgen)
write(version.versionBytes$profgen)
version.write$profgen(it, sortedData, "")
}
}
}
}
}

View File

@@ -1,63 +1,88 @@
plugins {
id("com.android.application")
kotlin("android")
kotlin("plugin.serialization") version Plugins.Versions.kotlin
kotlin("kapt")
alias(libs.plugins.kotlin.ksp)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.aboutlibraries)
}
// Apply workaround
apply("baselineWorkaround.gradle")
android {
compileSdkVersion(30)
namespace = "org.jellyfin.androidtv"
compileSdk = 33
defaultConfig {
// Android version targets
minSdkVersion(21)
targetSdkVersion(30)
minSdk = 21
targetSdk = 33
// Release version
applicationId = namespace
versionName = project.getVersionName()
versionCode = getVersionCode(versionName!!)
setProperty("archivesBaseName", "jellyfin-androidtv-v$versionName")
}
sourceSets["main"].java.srcDirs("src/main/kotlin")
sourceSets["test"].java.srcDirs("src/test/kotlin")
buildFeatures {
viewBinding = true
compose = true
}
compileOptions {
isCoreLibraryDesugaringEnabled = true
}
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
}
buildTypes {
val release by getting {
isMinifyEnabled = false
// Add applicationId as string for XML resources
resValue("string", "app_id", "org.jellyfin.androidtv")
// Set package names used in various XML files
resValue("string", "app_id", namespace!!)
resValue("string", "app_search_suggest_authority", "${namespace}.content")
resValue("string", "app_search_suggest_intent_data", "content://${namespace}.content/intent")
// Set flavored application name
resValue("string", "app_name", "@string/app_name_release")
buildConfigField("boolean", "DEVELOPMENT", "false")
}
val debug by getting {
// Use different application id to run release and debug at the same time
applicationIdSuffix = ".debug"
// Add applicationId as string for XML resources
resValue("string", "app_id", "org.jellyfin.androidtv.debug")
// Set package names used in various XML files
resValue("string", "app_id", namespace + applicationIdSuffix)
resValue("string", "app_search_suggest_authority", "${namespace + applicationIdSuffix}.content")
resValue("string", "app_search_suggest_intent_data", "content://${namespace + applicationIdSuffix}.content/intent")
// Set flavored application name
resValue("string", "app_name", "@string/app_name_debug")
buildConfigField("boolean", "DEVELOPMENT", (defaultConfig.versionCode!! < 100).toString())
}
}
lintOptions {
lint {
lintConfig = file("$rootDir/android-lint.xml")
isAbortOnError = false
abortOnError = false
sarifReport = true
checkDependencies = true
}
testOptions.unitTests.all {
it.useJUnitPlatform()
}
}
aboutLibraries {
// Remove the "generated" timestamp to allow for reproducible builds
excludeFields = arrayOf("generated")
}
val versionTxt by tasks.registering {
@@ -71,7 +96,12 @@ val versionTxt by tasks.registering {
}
dependencies {
// Jellyfin apiclient & SDK
// Jellyfin
implementation(projects.playback.core)
implementation(projects.playback.exoplayer)
implementation(projects.playback.jellyfin)
implementation(projects.playback.ui)
implementation(projects.preference)
implementation(libs.jellyfin.apiclient)
implementation(libs.jellyfin.sdk) {
// Change version if desired
@@ -102,28 +132,35 @@ dependencies {
implementation(libs.bundles.androidx.lifecycle)
implementation(libs.androidx.window)
implementation(libs.androidx.cardview)
implementation(libs.androidx.startup)
implementation(libs.bundles.androidx.compose)
// Dependency Injection
implementation(libs.bundles.koin)
// GSON
implementation(libs.gson)
// Media players
implementation(libs.exoplayer)
implementation(libs.jellyfin.exoplayer.ffmpegextension)
implementation(libs.libvlc)
// Markdown
implementation(libs.bundles.markwon)
// Image utility
implementation(libs.blurhash)
implementation(libs.glide.core)
kapt(libs.glide.compiler)
ksp(libs.glide.ksp)
implementation(libs.kenburnsview)
// Crash Reporting
implementation(libs.bundles.acra)
// Licenses
implementation(libs.aboutlibraries)
// Logging
implementation(libs.timber)
implementation(libs.slf4j.android)
implementation(libs.slf4j.timber)
// Debugging
if (getProperty("leakcanary.enable")?.toBoolean() == true)
@@ -133,6 +170,7 @@ dependencies {
coreLibraryDesugaring(libs.android.desugar)
// Testing
testImplementation(libs.junit)
testImplementation(libs.mockito)
testImplementation(libs.kotest.runner.junit5)
testImplementation(libs.kotest.assertions)
testImplementation(libs.mockk)
}

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.jellyfin.androidtv">
android:installLocation="auto">
<!-- Android TV Integration -->
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
@@ -20,14 +20,17 @@
<!-- Generic permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"
tools:ignore="LeanbackUsesWifi" />
<!-- Search permissions (voice to text) -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Device feature requirements -->
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
@@ -38,18 +41,19 @@
<application
android:name=".JellyfinApplication"
android:allowBackup="true"
android:appCategory="video"
android:banner="@drawable/app_banner"
android:dataExtractionRules="@xml/backup_rules"
android:fullBackupContent="@xml/backup_content"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:largeHeap="true"
android:roundIcon="@drawable/app_icon_round"
android:supportsRtl="true"
android:theme="@style/Theme.Jellyfin"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
android:usesCleartextTraffic="true">
<service
android:name=".auth.AuthenticatorService"
android:name=".auth.service.AuthenticatorService"
android:exported="false">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
@@ -59,106 +63,87 @@
android:resource="@xml/authenticator" />
</service>
<receiver android:name=".util.RemoteControlReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<!-- Screensaver -->
<service
android:name=".integration.dream.LibraryDreamService"
android:exported="true"
android:permission="android.permission.BIND_DREAM_SERVICE">
<activity
android:name=".ui.browsing.MainActivity"
android:screenOrientation="landscape" />
<intent-filter>
<action android:name="android.service.dreams.DreamService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
android:initOrder="1000"
tools:node="merge">
<meta-data
android:name="org.jellyfin.androidtv.LogInitializer"
android:value="androidx.startup" />
<meta-data
android:name="org.jellyfin.androidtv.di.KoinInitializer"
android:value="androidx.startup" />
<meta-data
android:name="org.jellyfin.androidtv.SessionInitializer"
android:value="androidx.startup" />
<meta-data
android:name="org.jellyfin.androidtv.ProcessLifecycleInitializer"
android:value="androidx.startup" />
</provider>
<provider
android:name=".integration.MediaContentProvider"
android:authorities="${applicationId}.content"
android:exported="true"
android:initOrder="10" />
<provider
android:name=".integration.provider.ImageProvider"
android:authorities="${applicationId}.integration.provider.ImageProvider"
android:exported="true"
android:initOrder="10" />
<!-- Authentication -->
<activity
android:name=".ui.startup.StartupActivity"
android:exported="true"
android:noHistory="true"
android:screenOrientation="landscape"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="adjustNothing">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity-alias
android:name=".startup.StartupActivity"
android:targetActivity=".ui.startup.StartupActivity" />
<!-- Main application -->
<activity
android:name=".ui.playback.PlaybackOverlayActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.GenericFolderActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.UserViewActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.CollectionActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.ByLetterActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.ByGenreActivity"
android:screenOrientation="landscape" />
android:name=".ui.browsing.MainActivity"
android:screenOrientation="landscape"
android:windowSoftInputMode="adjustNothing" />
<activity
android:name=".ui.preference.PreferencesActivity"
android:screenOrientation="behind"
android:theme="@style/Theme.Jellyfin.Preferences" />
<!-- Playback related activities -->
<activity
android:name=".ui.browsing.SuggestedMoviesActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.BrowsePersonsActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.search.SearchActivity"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
<activity
android:name=".ui.itemdetail.FullDetailsActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.livetv.LiveTvGuideActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.GenericGridActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.BrowseRecordingsActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.browsing.BrowseScheduleActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.itemdetail.PhotoPlayerActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.itemdetail.ItemListActivity"
android:screenOrientation="landscape" />
<activity
android:name=".ui.playback.AudioNowPlayingActivity"
android:name=".ui.playback.PlaybackOverlayActivity"
android:screenOrientation="landscape" />
<activity android:name=".ui.playback.ExternalPlayerActivity" />
@@ -167,5 +152,8 @@
android:name=".ui.playback.nextup.NextUpActivity"
android:noHistory="true"
android:screenOrientation="landscape" />
<!-- Playback Rewrite - Temporary -->
<activity android:name=".ui.playback.rewrite.PlaybackForwardingActivity" />
</application>
</manifest>

View File

@@ -1,117 +1,87 @@
package org.jellyfin.androidtv
import android.app.Application
import android.content.Context
import androidx.work.*
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.work.BackoffPolicy
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.await
import com.bumptech.glide.Glide
import com.vanniktech.blurhash.BlurHash
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.acra.ACRA
import org.acra.annotation.AcraCore
import org.acra.annotation.AcraDialog
import org.acra.annotation.AcraHttpSender
import org.acra.annotation.AcraLimiter
import org.acra.sender.HttpSender
import org.jellyfin.androidtv.auth.SessionRepository
import org.jellyfin.androidtv.di.*
import org.jellyfin.androidtv.data.eventhandling.SocketHandler
import org.jellyfin.androidtv.data.repository.NotificationsRepository
import org.jellyfin.androidtv.integration.LeanbackChannelWorker
import org.jellyfin.androidtv.telemetry.TelemetryService
import org.jellyfin.androidtv.util.AutoBitrate
import org.koin.android.ext.android.get
import org.koin.android.ext.android.getKoin
import org.koin.android.ext.android.inject
import org.koin.android.ext.koin.androidContext
import org.koin.core.KoinExperimentalAPI
import org.koin.core.context.startKoin
import timber.log.Timber
import timber.log.Timber.DebugTree
import java.util.concurrent.TimeUnit
@AcraCore(
buildConfigClass = BuildConfig::class
)
@AcraHttpSender(
uri = "https://collector.tracepot.com/a2eda9d9",
httpMethod = HttpSender.Method.POST
)
@AcraDialog(
resTitle = R.string.acra_dialog_title,
resText = R.string.acra_dialog_text,
resTheme = R.style.Theme_Jellyfin
)
@AcraLimiter
@Suppress("unused")
class JellyfinApplication : TvApp() {
@OptIn(KoinExperimentalAPI::class)
class JellyfinApplication : Application() {
override fun onCreate() {
super.onCreate()
// Enable improved logging for leaking resources
// https://wh0.github.io/2020/08/12/closeguard.html
if (BuildConfig.DEBUG) {
try {
Class.forName("dalvik.system.CloseGuard")
.getMethod("setEnabled", Boolean::class.javaPrimitiveType)
.invoke(null, true)
} catch (e: ReflectiveOperationException) {
@Suppress("TooGenericExceptionThrown")
throw RuntimeException(e)
}
}
// Don't run in ACRA service
if (ACRA.isACRASenderServiceProcess()) return
// Initialize the logging library
Timber.plant(DebugTree())
Timber.i("Application object created")
// Dependency Injection
startKoin {
androidContext(this@JellyfinApplication)
modules(
appModule,
authModule,
activityLifecycleCallbacksModule,
playbackModule,
preferenceModule,
utilsModule
)
}
// Register lifecycle callbacks
getKoin().getAll<ActivityLifecycleCallbacks>().forEach(::registerActivityLifecycleCallbacks)
// Restore session
get<SessionRepository>().apply {
restoreDefaultSession()
restoreDefaultSystemSession()
}
val notificationsRepository by inject<NotificationsRepository>()
notificationsRepository.addDefaultNotifications()
}
/**
* Called from the StartupActivity when the user session is started.
*/
suspend fun onSessionStart() {
suspend fun onSessionStart() = withContext(Dispatchers.IO) {
val workManager by inject<WorkManager>()
val autoBitrate by inject<AutoBitrate>()
val socketListener by inject<SocketHandler>()
// Cancel all current workers
workManager.cancelAllWork().await()
// Update background worker
launch {
// Cancel all current workers
workManager.cancelAllWork().await()
// Recreate periodic workers
workManager.enqueueUniquePeriodicWork(
LeanbackChannelWorker.PERIODIC_UPDATE_REQUEST_NAME,
ExistingPeriodicWorkPolicy.REPLACE,
PeriodicWorkRequestBuilder<LeanbackChannelWorker>(1, TimeUnit.HOURS)
.setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.MINUTES)
.build()
).await()
// Recreate periodic workers
workManager.enqueueUniquePeriodicWork(
LeanbackChannelWorker.PERIODIC_UPDATE_REQUEST_NAME,
ExistingPeriodicWorkPolicy.REPLACE,
PeriodicWorkRequestBuilder<LeanbackChannelWorker>(1, TimeUnit.HOURS)
.setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.MINUTES)
.build()
).await()
}
// Update WebSockets
launch { socketListener.updateSession() }
// Detect auto bitrate
withContext(Dispatchers.IO) {
autoBitrate.detect()
}
// running in a different scope to prevent slow startups
ProcessLifecycleOwner.get().lifecycleScope.launch { autoBitrate.detect() }
}
override fun onLowMemory() {
super.onLowMemory()
BlurHash.clearCache()
Glide.with(this).onLowMemory()
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
Glide.with(this).onTrimMemory(level)
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
ACRA.init(this)
TelemetryService.init(this)
}
}

View File

@@ -0,0 +1,28 @@
package org.jellyfin.androidtv
import android.content.Context
import androidx.startup.Initializer
import timber.log.Timber
class LogInitializer : Initializer<Unit> {
override fun create(context: Context) {
// Enable improved logging for leaking resources
// https://wh0.github.io/2020/08/12/closeguard.html
if (BuildConfig.DEBUG) {
try {
Class.forName("dalvik.system.CloseGuard")
.getMethod("setEnabled", Boolean::class.javaPrimitiveType)
.invoke(null, true)
} catch (e: ReflectiveOperationException) {
@Suppress("TooGenericExceptionThrown")
throw RuntimeException(e)
}
}
// Initialize the logging library
Timber.plant(Timber.DebugTree())
Timber.i("Debug tree planted")
}
override fun dependencies() = emptyList<Class<out Initializer<*>>>()
}

View File

@@ -0,0 +1,50 @@
package org.jellyfin.androidtv
import android.app.Application
import android.content.Context
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.startup.AppInitializer
import androidx.startup.Initializer
import kotlinx.coroutines.launch
import org.jellyfin.androidtv.auth.repository.SessionRepository
import org.jellyfin.androidtv.di.KoinInitializer
import timber.log.Timber
@Suppress("unused")
class ProcessLifecycleInitializer : Initializer<Unit> {
override fun create(context: Context) {
val koin = AppInitializer.getInstance(context)
.initializeComponent(KoinInitializer::class.java)
.koin
// Register application lifecycle events
ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver {
/**
* Called by the Process Lifecycle when the app is created. It is called after [onCreate].
*/
override fun onCreate(owner: LifecycleOwner) {
// Register activity lifecycle callbacks
val callbacks = koin.getAll<Application.ActivityLifecycleCallbacks>()
Timber.i("Registering ${callbacks.size} ActivityLifecycleCallbacks")
val app = context.applicationContext as Application
callbacks.forEach { callback -> app.registerActivityLifecycleCallbacks(callback) }
}
/**
* Called by the Process Lifecycle when the app is activated in the foreground (activity opened).
*/
override fun onStart(owner: LifecycleOwner) {
Timber.i("Process lifecycle started")
owner.lifecycleScope.launch {
koin.get<SessionRepository>().restoreSession()
}
}
})
}
override fun dependencies() = listOf(KoinInitializer::class.java)
}

View File

@@ -0,0 +1,26 @@
package org.jellyfin.androidtv
import android.content.Context
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.startup.AppInitializer
import androidx.startup.Initializer
import kotlinx.coroutines.launch
import org.jellyfin.androidtv.auth.repository.SessionRepository
import org.jellyfin.androidtv.di.KoinInitializer
@Suppress("unused")
class SessionInitializer : Initializer<Unit> {
override fun create(context: Context) {
val koin = AppInitializer.getInstance(context)
.initializeComponent(KoinInitializer::class.java)
.koin
// Restore system session
ProcessLifecycleOwner.get().lifecycleScope.launch {
koin.get<SessionRepository>().restoreSession()
}
}
override fun dependencies() = listOf(KoinInitializer::class.java)
}

View File

@@ -1,190 +0,0 @@
package org.jellyfin.androidtv;
import android.app.Activity;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MediatorLiveData;
import org.jellyfin.androidtv.preference.UserPreferences;
import org.jellyfin.androidtv.preference.constant.PreferredVideoPlayer;
import org.jellyfin.androidtv.ui.livetv.TvManager;
import org.jellyfin.androidtv.ui.playback.ExternalPlayerActivity;
import org.jellyfin.androidtv.ui.playback.PlaybackController;
import org.jellyfin.androidtv.ui.playback.PlaybackOverlayActivity;
import org.jellyfin.apiclient.interaction.ApiClient;
import org.jellyfin.apiclient.interaction.EmptyResponse;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.dto.BaseItemType;
import org.jellyfin.apiclient.model.dto.UserDto;
import org.jellyfin.apiclient.model.entities.DisplayPreferences;
import java.util.HashMap;
import kotlin.Lazy;
import timber.log.Timber;
import static org.koin.java.KoinJavaComponent.inject;
public class TvApp extends Application {
public static final String DISPLAY_PREFS_APP_NAME = "ATV";
public static final int LIVE_TV_GUIDE_OPTION_ID = 1000;
public static final int LIVE_TV_RECORDINGS_OPTION_ID = 2000;
public static final int VIDEO_QUEUE_OPTION_ID = 3000;
public static final int LIVE_TV_SCHEDULE_OPTION_ID = 4000;
public static final int LIVE_TV_SERIES_OPTION_ID = 5000;
private static TvApp app;
private MediatorLiveData<UserDto> currentUser = new MediatorLiveData<UserDto>();
private BaseItemDto lastPlayedItem;
private PlaybackController playbackController;
private HashMap<String, DisplayPreferences> displayPrefsCache = new HashMap<>();
private Activity currentActivity;
private Lazy<ApiClient> apiClient = inject(ApiClient.class);
private Lazy<UserPreferences> userPreferences = inject(UserPreferences.class);
@Override
public void onCreate() {
super.onCreate();
app = this;
}
@Nullable
public static TvApp getApplication() {
return app;
}
@Deprecated
@Nullable
public UserDto getCurrentUser() {
return currentUser.getValue();
}
@Deprecated
public LiveData<UserDto> getCurrentUserLiveData() {
return currentUser;
}
@Deprecated
public void setCurrentUser(UserDto currentUser) {
this.currentUser.postValue(currentUser);
TvManager.clearCache();
this.displayPrefsCache = new HashMap<>();
}
/**
* @deprecated This function is causing a **lot** of issues because not all activities will set their self as "currentactivity". Try to receive a Context instance instead.
*/
@Deprecated
@Nullable
public Activity getCurrentActivity() {
return currentActivity;
}
public void setCurrentActivity(Activity activity) {
currentActivity = activity;
}
@Nullable
public PlaybackController getPlaybackController() {
return playbackController;
}
public void setPlaybackController(PlaybackController playbackController) {
this.playbackController = playbackController;
}
public boolean useExternalPlayer(BaseItemType itemType) {
switch (itemType) {
case Movie:
case Episode:
case Video:
case Series:
case Recording:
return userPreferences.getValue().get(UserPreferences.Companion.getVideoPlayer()) == PreferredVideoPlayer.EXTERNAL;
case TvChannel:
case Program:
return userPreferences.getValue().get(UserPreferences.Companion.getLiveTvVideoPlayer()) == PreferredVideoPlayer.EXTERNAL;
default:
return false;
}
}
@NonNull
public Class<? extends Activity> getPlaybackActivityClass(BaseItemType itemType) {
return useExternalPlayer(itemType) ? ExternalPlayerActivity.class : PlaybackOverlayActivity.class;
}
@NonNull
public boolean canManageRecordings() {
UserDto currentUser = getCurrentUser();
return currentUser != null && currentUser.getPolicy().getEnableLiveTvManagement();
}
@NonNull
public DisplayPreferences getCachedDisplayPrefs(String key) {
return displayPrefsCache.containsKey(key) ? displayPrefsCache.get(key) : new DisplayPreferences();
}
public void updateDisplayPrefs(DisplayPreferences preferences) {
updateDisplayPrefs("ATV", preferences);
}
public void updateDisplayPrefs(String app, DisplayPreferences preferences) {
displayPrefsCache.put(preferences.getId(), preferences);
apiClient.getValue().UpdateDisplayPreferencesAsync(preferences, getCurrentUser().getId(), app, new EmptyResponse());
Timber.d("Display prefs updated for %s isFavorite: %s", preferences.getId(), preferences.getCustomPrefs().get("FavoriteOnly"));
}
public void getDisplayPrefsAsync(String key, Response<DisplayPreferences> response) {
getDisplayPrefsAsync(key, DISPLAY_PREFS_APP_NAME, response);
}
public void getDisplayPrefsAsync(final String key, String app, final Response<DisplayPreferences> outerResponse) {
if (displayPrefsCache.containsKey(key)) {
Timber.d("Display prefs loaded from cache %s", key);
outerResponse.onResponse(displayPrefsCache.get(key));
} else {
apiClient.getValue().GetDisplayPreferencesAsync(key, getCurrentUser().getId(), app, new Response<DisplayPreferences>() {
@Override
public void onResponse(DisplayPreferences response) {
if (response.getSortBy() == null) response.setSortBy("SortName");
if (response.getCustomPrefs() == null)
response.setCustomPrefs(new HashMap<String, String>());
if (app.equals(TvApp.DISPLAY_PREFS_APP_NAME))
displayPrefsCache.put(key, response);
Timber.d("Display prefs loaded and saved in cache %s", key);
outerResponse.onResponse(response);
}
@Override
public void onError(Exception exception) {
//Continue with defaults
Timber.e(exception, "Unable to load display prefs ");
DisplayPreferences prefs = new DisplayPreferences();
prefs.setId(key);
prefs.setSortBy("SortName");
prefs.setCustomPrefs(new HashMap<String, String>());
outerResponse.onResponse(prefs);
}
});
}
}
@Nullable
public BaseItemDto getLastPlayedItem() {
return lastPlayedItem;
}
public void setLastPlayedItem(BaseItemDto lastPlayedItem) {
this.lastPlayedItem = lastPlayedItem;
}
}

View File

@@ -1,83 +0,0 @@
package org.jellyfin.androidtv.auth
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.jellyfin.androidtv.JellyfinApplication
import org.jellyfin.androidtv.util.apiclient.callApi
import org.jellyfin.androidtv.util.apiclient.callApiEmpty
import org.jellyfin.apiclient.interaction.ApiClient
import org.jellyfin.apiclient.interaction.device.IDevice
import org.jellyfin.apiclient.model.apiclient.ServerInfo
import org.jellyfin.apiclient.model.dto.UserDto
import org.jellyfin.apiclient.model.entities.MediaType
import org.jellyfin.apiclient.model.session.ClientCapabilities
import org.jellyfin.apiclient.model.session.GeneralCommandType
import timber.log.Timber
class ApiBinder(
private val application: JellyfinApplication,
private val api: ApiClient,
private val device: IDevice,
private val authenticationStore: AuthenticationStore,
) {
fun updateSession(session: Session?, resultCallback: (Boolean) -> Unit) {
GlobalScope.launch(Dispatchers.IO) {
@Suppress("TooGenericExceptionCaught")
try {
val success = updateSessionInternal(session)
resultCallback(success)
} catch (throwable: Throwable) {
Timber.e(throwable, "Unable to update legacy API session.")
resultCallback(false)
}
}
}
private suspend fun updateSessionInternal(session: Session?): Boolean {
if (session == null) {
application.currentUser = null
return true
}
val server = authenticationStore.getServer(session.serverId)
if (server == null) {
Timber.e("Could not bind API because server ${session.serverId} was not found in the store.")
return false
}
api.setDevice(AuthenticationDevice(device, session.userId.toString()))
api.SetAuthenticationInfo(session.accessToken, session.userId.toString())
api.EnableAutomaticNetworking(ServerInfo().apply {
id = session.serverId.toString()
name = server.name
address = server.address
userId = session.userId.toString()
accessToken = session.accessToken
})
// Update currentUser DTO
val user = callApi<UserDto> { callback -> api.GetUserAsync(session.userId.toString(), callback) }
application.currentUser = user
callApiEmpty { callback ->
api.ReportCapabilities(ClientCapabilities().apply {
setPlayableMediaTypes(arrayListOf(MediaType.Video.toString(), MediaType.Audio.toString()));
setSupportsMediaControl(true);
setSupportedCommands(arrayListOf(
GeneralCommandType.DisplayContent.toString(),
GeneralCommandType.Mute.toString(),
GeneralCommandType.Unmute.toString(),
GeneralCommandType.ToggleMute.toString(),
GeneralCommandType.DisplayContent.toString(),
));
}, callback)
}
// Connect to WebSocket AFTER HTTP connection confirmed working
// to catch exceptions not catchable with the legacy websocket client
api.ensureWebSocket()
return true
}
}

View File

@@ -1,29 +0,0 @@
package org.jellyfin.androidtv.auth
import org.jellyfin.apiclient.interaction.device.IDevice
import org.jellyfin.sdk.model.DeviceInfo
import java.security.MessageDigest
/**
* Wrapper for [IDevice] that changes the device id to a combination of the original device id
* and the username. This is neccasary to prevent the server from trashing other sessions with
* the same device id.
*/
class AuthenticationDevice(
private val parent: IDevice,
private val username: String
) : IDevice {
// Hash the deviceId because we can't use special characters as the device id is send
// via HTTP headers
override val deviceId = MessageDigest.getInstance("SHA-1").run {
update("${parent.deviceId}+${username}".toByteArray())
digest().joinToString("") { "%02x".format(it) }
}
override val deviceName = parent.deviceName
fun toDeviceInfo() = DeviceInfo(
id = deviceId,
name = deviceName
)
}

View File

@@ -1,258 +0,0 @@
package org.jellyfin.androidtv.auth
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.flow
import org.jellyfin.androidtv.auth.model.*
import org.jellyfin.androidtv.util.ImageUtils
import org.jellyfin.apiclient.interaction.device.IDevice
import org.jellyfin.sdk.Jellyfin
import org.jellyfin.sdk.api.client.KtorClient
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.extensions.authenticateUserByName;
import org.jellyfin.sdk.api.operations.ImageApi
import org.jellyfin.sdk.api.operations.UserApi
import org.jellyfin.sdk.model.api.ImageType
import org.jellyfin.sdk.model.api.UserDto
import timber.log.Timber
import java.util.*
interface AuthenticationRepository {
fun getServers(): List<Server>
fun getUsers(server: UUID): List<PrivateUser>?
fun getUser(server: UUID, user: UUID): PrivateUser?
fun saveServer(id: UUID, name: String, address: String, version: String?, loginDisclaimer: String?)
fun authenticateUser(user: User): Flow<LoginState>
fun authenticateUser(user: User, server: Server): Flow<LoginState>
fun login(server: Server, username: String, password: String = ""): Flow<LoginState>
fun logout(user: User)
fun removeUser(user: User)
fun getUserImageUrl(server: Server, user: User): String?
}
class AuthenticationRepositoryImpl(
private val jellyfin: Jellyfin,
private val sessionRepository: SessionRepository,
private val device: IDevice,
private val accountManagerHelper: AccountManagerHelper,
private val authenticationStore: AuthenticationStore,
private val userApiClient: KtorClient,
) : AuthenticationRepository {
private val serverComparator = compareByDescending<Server> { it.dateLastAccessed }.thenBy { it.name }
private val userComparator = compareByDescending<PrivateUser> { it.lastUsed }.thenBy { it.name }
override fun getServers() = authenticationStore.getServers().map { (id, info) ->
Server(
id = id,
name = info.name,
address = info.address,
version = info.version,
loginDisclaimer = info.loginDisclaimer,
dateLastAccessed = Date(info.lastUsed),
)
}.sortedWith(serverComparator)
private fun mapUser(
serverId: UUID,
userId: UUID,
userInfo: AuthenticationStoreUser,
authInfo: AccountManagerAccount?,
) = PrivateUser(
id = authInfo?.id ?: userId,
serverId = authInfo?.server ?: serverId,
name = userInfo.name,
accessToken = authInfo?.accessToken,
requirePassword = userInfo.requirePassword,
imageTag = userInfo.imageTag,
lastUsed = userInfo.lastUsed,
)
override fun getUsers(server: UUID): List<PrivateUser>? =
authenticationStore.getUsers(server)?.mapNotNull { (userId, userInfo) ->
accountManagerHelper.getAccount(userId).let { authInfo ->
mapUser(server, userId, userInfo, authInfo)
}
}?.sortedWith(userComparator)
override fun getUser(server: UUID, user: UUID): PrivateUser? {
val userInfo = authenticationStore.getUser(server, user) ?: return null
val authInfo = accountManagerHelper.getAccount(user) ?: return null
return mapUser(server, user, userInfo, authInfo)
}
override fun saveServer(id: UUID, name: String, address: String, version: String?, loginDisclaimer: String?) {
val current = authenticationStore.getServer(id)
val server = if (current != null) current.copy(name = name, address = address, version = version, loginDisclaimer = loginDisclaimer, lastUsed = Date().time)
else AuthenticationStoreServer(name, address, version, loginDisclaimer)
authenticationStore.putServer(id, server)
}
/**
* Set the active session to the information in [user] and [server].
* Connects to the server and requests the info of the currently authenticated user.
*
* @return Whether the user information can be retrieved.
*/
private suspend fun setActiveSession(user: User, server: Server): Boolean {
val authenticated = sessionRepository.switchCurrentSession(user.id)
if (authenticated) {
// Update last use in store
authenticationStore.getServer(server.id)?.let { storedServer ->
authenticationStore.putServer(server.id, storedServer.copy(lastUsed = Date().time))
}
authenticationStore.getUser(server.id, user.id)?.let { storedUser ->
authenticationStore.putUser(server.id, user.id, storedUser.copy(lastUsed = Date().time))
}
}
return authenticated
}
@OptIn(ExperimentalCoroutinesApi::class)
override fun authenticateUser(user: User): Flow<LoginState> = flow {
Timber.d("Authenticating serverless user %s", user)
emit(AuthenticatingState)
val server = authenticationStore.getServer(user.serverId)?.let {
Server(
id = user.serverId,
name = it.name,
address = it.address,
version = it.version,
loginDisclaimer = it.loginDisclaimer,
dateLastAccessed = Date(it.lastUsed),
)
}
if (server == null) emit(RequireSignInState)
else if (!server.versionSupported) emit(ServerVersionNotSupported(server))
else emitAll(authenticateUser(user, server))
}
@OptIn(ExperimentalCoroutinesApi::class)
override fun authenticateUser(user: User, server: Server): Flow<LoginState> = flow {
Timber.d("Authenticating user %s", user)
emit(AuthenticatingState)
val account = accountManagerHelper.getAccount(user.id)
when {
!server.versionSupported -> emit(ServerVersionNotSupported(server))
// Access token found, proceed with sign in
account?.accessToken != null -> when {
// Update session
setActiveSession(user, server) -> {
// Update stored user
try {
val userInfo by UserApi(userApiClient).getCurrentUser()
val currentUser = authenticationStore.getUser(server.id, user.id)
val updatedUser = currentUser?.copy(
name = userInfo.name!!,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag
) ?: AuthenticationStoreUser(
name = userInfo.name!!,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag
)
authenticationStore.putUser(server.id, user.id, updatedUser)
accountManagerHelper.putAccount(AccountManagerAccount(user.id, server.id, updatedUser.name, account.accessToken))
emit(AuthenticatedState)
} catch(err: ApiClientException) {
Timber.e(err, "Unable to get current user data")
emit(RequireSignInState)
}
}
// Login failed
else -> when {
// No password required - try login
!user.requirePassword -> emitAll(login(server, user.name))
// Require new sign in
else -> emit(RequireSignInState)
}
}
// User is known to not require a password, try a sign in
!user.requirePassword -> emitAll(login(server, user.name))
// Account found without access token, require sign in
else -> emit(RequireSignInState)
}
}
@OptIn(ExperimentalCoroutinesApi::class)
override fun login(server: Server, username: String, password: String) = flow {
if (!server.versionSupported) {
emit(ServerVersionNotSupported(server))
return@flow
}
val api = jellyfin.createApi(server.address, deviceInfo = AuthenticationDevice(device, username).toDeviceInfo())
val userApi = UserApi(api)
val result = try {
val response = userApi.authenticateUserByName(username, password)
response.content
} catch (err: ApiClientException) {
Timber.e(err, "Unable to sign in as $username")
emit(RequireSignInState)
return@flow
}
val userInfo = result.user ?: return@flow emit(RequireSignInState)
val userId = userInfo.id
val currentUser = authenticationStore.getUser(server.id, userId)
val updatedUser = currentUser?.copy(
name = userInfo.name!!,
lastUsed = Date().time,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag
) ?: AuthenticationStoreUser(
name = userInfo.name!!,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag
)
authenticationStore.putUser(server.id, userId, updatedUser)
accountManagerHelper.putAccount(AccountManagerAccount(userId, server.id, updatedUser.name, result.accessToken))
val user = PrivateUser(
id = userId,
serverId = server.id,
name = updatedUser.name,
accessToken = result.accessToken,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag,
lastUsed = Date().time,
)
setActiveSession(user, server)
emit(AuthenticatedState)
}
override fun logout(user: User) {
accountManagerHelper.getAccount(user.id)?.let(accountManagerHelper::removeAccount)
}
override fun removeUser(user: User) {
authenticationStore.removeUser(user.serverId, user.id)
logout(user)
}
override fun getUserImageUrl(server: Server, user: User): String? {
val api = jellyfin.createApi(baseUrl = server.address)
val imageApi = ImageApi(api)
return user.imageTag?.let { imageTag ->
imageApi.getUserImageUrl(
userId = user.id,
tag = imageTag,
imageType = ImageType.PRIMARY,
maxHeight = ImageUtils.MAX_PRIMARY_IMAGE_HEIGHT
)
}
}
}

View File

@@ -1,49 +0,0 @@
package org.jellyfin.androidtv.auth
import android.accounts.AbstractAccountAuthenticator
import android.accounts.Account
import android.accounts.AccountAuthenticatorResponse
import android.accounts.AccountManager
import android.app.Service
import android.content.Intent
import android.os.Bundle
import android.os.IBinder
import androidx.core.os.bundleOf
import org.jellyfin.androidtv.ui.preference.PreferencesActivity
class AuthenticatorService : Service() {
private val authenticator by lazy {
Authenticator(this)
}
override fun onBind(intent: Intent): IBinder? = authenticator.iBinder
private inner class Authenticator(
private val service: AuthenticatorService
) : AbstractAccountAuthenticator(service) {
private val unsupportedOperationBundle = bundleOf(
AccountManager.KEY_ERROR_CODE to 1,
AccountManager.KEY_ERROR_MESSAGE to "Unsupported operation"
)
override fun addAccount(response: AccountAuthenticatorResponse, accountType: String, authTokenType: String?, requiredFeatures: Array<String>?, options: Bundle): Bundle = unsupportedOperationBundle
override fun confirmCredentials(response: AccountAuthenticatorResponse, account: Account, options: Bundle?): Bundle = unsupportedOperationBundle
override fun editProperties(response: AccountAuthenticatorResponse, accountType: String): Bundle = bundleOf(
AccountManager.KEY_INTENT to Intent(service, PreferencesActivity::class.java)
)
override fun getAccountRemovalAllowed(response: AccountAuthenticatorResponse, account: Account): Bundle = bundleOf(
AccountManager.KEY_BOOLEAN_RESULT to true
)
override fun getAuthToken(response: AccountAuthenticatorResponse, account: Account, authTokenType: String, options: Bundle): Bundle = unsupportedOperationBundle
override fun getAuthTokenLabel(authTokenType: String): String? = null
override fun hasFeatures(response: AccountAuthenticatorResponse, account: Account, features: Array<String>): Bundle = unsupportedOperationBundle
override fun updateCredentials(response: AccountAuthenticatorResponse, account: Account, authTokenType: String?, options: Bundle?): Bundle = unsupportedOperationBundle
}
}

View File

@@ -1,91 +0,0 @@
package org.jellyfin.androidtv.auth
import android.content.Context
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.booleanOrNull
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.contextual
import org.jellyfin.androidtv.auth.model.AccountManagerAccount
import org.jellyfin.androidtv.auth.model.AuthenticationStoreServer
import org.jellyfin.androidtv.auth.model.AuthenticationStoreUser
import org.jellyfin.androidtv.util.serializer.UUIDSerializer
import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import timber.log.Timber
class LegacyAccountMigration(
private val context: Context,
private val authenticationStore: AuthenticationStore,
private val accountManagerHelper: AccountManagerHelper
) {
companion object {
const val LEGACY_CREDENTIAL_FILE = "org.jellyfin.androidtv.login.json"
}
suspend fun migrate() {
val path = context.filesDir.resolve(LEGACY_CREDENTIAL_FILE)
if (path.exists()) {
Timber.d("Starting migration of legacy credentials from $path")
val json = Json {
serializersModule = SerializersModule {
contextual(UUIDSerializer)
}
ignoreUnknownKeys = true
}
val root = json.parseToJsonElement(path.readText()).jsonObject
val server = root["serverInfo"]?.jsonObject
val user = root["userDto"]?.jsonObject
val serverId = server?.get("Id")?.jsonPrimitive?.content?.toUUIDOrNull()
if (serverId != null) {
val serverName = server["Name"]?.jsonPrimitive?.content
val serverAddress = server["Address"]?.jsonPrimitive?.content
if (!authenticationStore.containsServer(serverId)) {
Timber.i("Migrating server $serverId")
authenticationStore.putServer(
id = serverId,
server = AuthenticationStoreServer(
name = serverName ?: "",
address = serverAddress ?: "",
loginDisclaimer = null,
version = null,
)
)
}
val userId = user?.get("Id")?.jsonPrimitive?.content?.toUUIDOrNull()
if (userId != null && !authenticationStore.containsUser(serverId, userId)) {
Timber.i("Migrating user $userId")
val name = user["Name"]?.jsonPrimitive?.content ?: userId.toString()
val requirePassword = user["HasPassword"]?.jsonPrimitive?.booleanOrNull ?: true
val imageTag = user["PrimaryImageTag"]?.jsonPrimitive?.content
authenticationStore.putUser(
server = serverId,
userId = userId,
userInfo = AuthenticationStoreUser(
name = name,
requirePassword = requirePassword,
imageTag = imageTag
)
)
accountManagerHelper.putAccount(AccountManagerAccount(
id = userId,
server = serverId,
name = name,
accessToken = user["AccessToken"]?.jsonPrimitive?.content?.let {
// Convert empty string to null
if (it.isBlank()) null
else it
}
))
}
}
} else {
Timber.d("Skipping migration of legacy credentials from $path (file does not exist)")
}
}
}

View File

@@ -1,186 +0,0 @@
package org.jellyfin.androidtv.auth
import androidx.lifecycle.LiveData
import androidx.lifecycle.liveData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import org.jellyfin.androidtv.auth.model.*
import org.jellyfin.androidtv.util.sdk.toPublicUser
import org.jellyfin.androidtv.util.sdk.toServer
import org.jellyfin.sdk.Jellyfin
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.operations.BrandingApi
import org.jellyfin.sdk.api.operations.SystemApi
import org.jellyfin.sdk.api.operations.UserApi
import org.jellyfin.sdk.discovery.RecommendedServerInfo
import org.jellyfin.sdk.discovery.RecommendedServerInfoScore
import org.jellyfin.sdk.model.api.ServerDiscoveryInfo
import org.jellyfin.sdk.model.api.UserDto
import org.jellyfin.sdk.model.serializer.toUUID
import timber.log.Timber
import java.util.*
interface ServerRepository {
fun getStoredServers(): List<Server>
fun getDiscoveryServers(): Flow<Server>
suspend fun migrateLegacyCredentials()
fun getServerUsers(server: Server): LiveData<List<User>>
fun removeServer(serverId: UUID): Boolean
fun addServer(address: String): Flow<ServerAdditionState>
suspend fun refreshServerInfo(server: Server): Boolean
companion object {
val minimumServerVersion = Jellyfin.minimumVersion
}
}
class ServerRepositoryImpl(
private val jellyfin: Jellyfin,
private val authenticationRepository: AuthenticationRepository,
private val authenticationStore: AuthenticationStore,
private val legacyAccountMigration: LegacyAccountMigration,
) : ServerRepository {
override fun getStoredServers() = authenticationRepository.getServers()
override fun getDiscoveryServers() = flow {
val servers = jellyfin.discovery.discoverLocalServers().mapNotNull(ServerDiscoveryInfo::toServer)
emitAll(servers)
}.flowOn(Dispatchers.IO)
private suspend fun getServerPublicUsers(server: Server): List<PublicUser> {
val client = jellyfin.createApi(server.address)
val userApi = UserApi(client)
return try {
val users by userApi.getPublicUsers()
users.mapNotNull(UserDto::toPublicUser)
} catch (err: ApiClientException) {
Timber.e(err, "Unable to retrieve public users")
emptyList()
}
}
public override suspend fun refreshServerInfo(server: Server): Boolean {
// Only update existing servers
val serverInfo = authenticationStore.getServer(server.id) ?: return false
val now = Date().time
// Only update every 10 minutes
if (now - serverInfo.lastRefreshed < 600000) return false
return try {
val client = jellyfin.createApi(server.address)
// Get login disclaimer
val branding by BrandingApi(client).getBrandingOptions()
val systemInfo by SystemApi(client).getPublicSystemInfo()
authenticationStore.putServer(server.id, serverInfo.copy(
name = systemInfo.serverName ?: serverInfo.name,
version = systemInfo.version ?: serverInfo.version,
loginDisclaimer = branding.loginDisclaimer ?: serverInfo.loginDisclaimer,
lastRefreshed = now
))
} catch (err: ApiClientException) {
Timber.e(err, "Unable to update server")
false
}
}
private fun getServerStoredUsers(server: Server): List<PrivateUser> = authenticationRepository
.getUsers(server.id)
.orEmpty()
override fun getServerUsers(server: Server): LiveData<List<User>> = liveData {
val users = mutableListOf<User>()
users.addAll(getServerStoredUsers(server))
emit(users.toList())
getServerPublicUsers(server)
.sortedBy { it.name }
.forEach { user ->
val index = users.indexOfFirst { it.id == user.id }
if (index == -1) users.add(user)
else {
users[index] = when(val currentUser = users[index]) {
is PublicUser -> user
is PrivateUser -> currentUser.copy(
name = user.name,
requirePassword = user.requirePassword,
imageTag = user.imageTag
)
}
}
}
emit(users.toList())
}
override suspend fun migrateLegacyCredentials() = legacyAccountMigration.migrate()
override fun removeServer(serverId: UUID) = authenticationStore.removeServer(serverId)
override fun addServer(address: String): Flow<ServerAdditionState> = flow {
Timber.d("Adding server %s", address)
emit(ConnectingState(address))
val addressCandidates = jellyfin.discovery.getAddressCandidates(address)
Timber.d("Found ${addressCandidates.size} candidates")
val goodRecommendations = mutableListOf<RecommendedServerInfo>()
val badRecommendations = mutableListOf<RecommendedServerInfo>()
val greatRecommendaton = jellyfin.discovery.getRecommendedServers(addressCandidates)
.firstOrNull { recommendedServer ->
when (recommendedServer.score) {
RecommendedServerInfoScore.GREAT -> true
RecommendedServerInfoScore.GOOD -> {
goodRecommendations += recommendedServer
false
}
else -> {
badRecommendations += recommendedServer
false
}
}
}
Timber.d(buildString {
append("Recommendations: ")
if (greatRecommendaton == null) append(0)
else append(1)
append(" great, ")
append(goodRecommendations.size)
append(" good, ")
append(badRecommendations.size)
append(" bad")
})
val chosenRecommendation = greatRecommendaton ?: goodRecommendations.firstOrNull()
if (chosenRecommendation != null) {
// Get system info
val systemInfo = chosenRecommendation.systemInfo!!
// Get branding info
val api = BrandingApi(jellyfin.createApi(chosenRecommendation.address))
val branding by api.getBrandingOptions()
val id = systemInfo.id!!.toUUID()
authenticationRepository.saveServer(
id = id,
name = systemInfo.serverName ?: "Jellyfin Server",
address = chosenRecommendation.address,
version = systemInfo.version,
loginDisclaimer = branding.loginDisclaimer,
)
emit(ConnectedState(id, systemInfo))
} else {
// No great or good recommendations, only add bad recommendations
emit(UnableToConnectState(addressCandidates))
}
}
}

View File

@@ -1,152 +0,0 @@
package org.jellyfin.androidtv.auth
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import org.jellyfin.androidtv.preference.AuthenticationPreferences
import org.jellyfin.androidtv.preference.constant.UserSelectBehavior.*
import org.jellyfin.sdk.api.client.KtorClient
import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import timber.log.Timber
import java.util.*
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
data class Session(
val userId: UUID,
val serverId: UUID,
val accessToken: String,
)
interface SessionRepository {
val currentSession: LiveData<Session?>
val currentSystemSession: LiveData<Session?>
fun restoreDefaultSession()
fun restoreDefaultSystemSession()
suspend fun switchCurrentSession(userId: UUID): Boolean
fun destroyCurrentSession()
}
class SessionRepositoryImpl(
private val authenticationPreferences: AuthenticationPreferences,
private val accountManagerHelper: AccountManagerHelper,
private val apiBinder: ApiBinder,
private val authenticationStore: AuthenticationStore,
private val userApiClient: KtorClient,
private val systemApiClient: KtorClient,
) : SessionRepository {
private val _currentSession = MutableLiveData<Session?>()
override val currentSession: LiveData<Session?> get() = _currentSession
private val _currentSystemSession = MutableLiveData<Session?>()
override val currentSystemSession: LiveData<Session?> get() = _currentSystemSession
override fun restoreDefaultSession() {
Timber.d("Restoring default session")
val behavior = authenticationPreferences[AuthenticationPreferences.autoLoginUserBehavior]
val userId = authenticationPreferences[AuthenticationPreferences.autoLoginUserId].toUUIDOrNull()
when (behavior) {
DISABLED -> setCurrentSession(null, false)
LAST_USER -> setCurrentSession(createLastUserSession(), false)
SPECIFIC_USER -> setCurrentSession(createUserSession(userId), false)
}
}
override fun restoreDefaultSystemSession() {
Timber.d("Restoring default system session")
val behavior = authenticationPreferences[AuthenticationPreferences.systemUserBehavior]
val userId = authenticationPreferences[AuthenticationPreferences.systemUserId].toUUIDOrNull()
when (behavior) {
DISABLED -> setCurrentSystemSession(null)
LAST_USER -> setCurrentSystemSession(createLastUserSession())
SPECIFIC_USER -> setCurrentSystemSession(createUserSession(userId))
}
}
override suspend fun switchCurrentSession(userId: UUID): Boolean {
Timber.d("Switching current session to user ${userId}")
val session = createUserSession(userId)
if (session == null) {
Timber.d("Could not switch to non-existing session for user ${userId}")
return false
}
return suspendCoroutine<Boolean> { continuation ->
setCurrentSession(session, true) { success ->
continuation.resume(success)
}
}
}
override fun destroyCurrentSession() {
Timber.d("Destroying current session")
setCurrentSession(null, false)
}
private fun setCurrentSession(session: Session?, includeSystemUser: Boolean, callback: ((Boolean) -> Unit)? = null) {
if (session != null) authenticationPreferences[AuthenticationPreferences.lastUserId] = session.userId.toString()
val systemUserBehavior = authenticationPreferences[AuthenticationPreferences.systemUserBehavior]
if (includeSystemUser && systemUserBehavior == LAST_USER) setCurrentSystemSession(session)
// Update session after binding the apiclient settings
apiBinder.updateSession(session) { success ->
Timber.d("Updating current session. userId=${session?.userId} apiBindingSuccess=${success}")
if (success) {
userApiClient.applySession(session)
_currentSession.postValue(session)
} else {
userApiClient.applySession(null)
_currentSession.postValue(null)
}
callback?.invoke(success)
}
}
private fun setCurrentSystemSession(session: Session?) {
_currentSystemSession.postValue(session)
systemApiClient.applySession(session)
}
private fun createLastUserSession(): Session? {
val lastUserId = authenticationPreferences[AuthenticationPreferences.lastUserId].toUUIDOrNull()
return createUserSession(lastUserId)
}
private fun createUserSession(userId: UUID?): Session? {
if (userId == null) return null
val account = accountManagerHelper.getAccount(userId)
if (account == null || account.accessToken == null) return null
return Session(
userId = account.id,
serverId = account.server,
accessToken = account.accessToken
)
}
private fun KtorClient.applySession(session: Session?) {
if (session == null) {
baseUrl = null
accessToken = null
userId = null
} else {
val server = authenticationStore.getServer(session.serverId)
?: return applySession(null)
baseUrl = server.address
accessToken = session.accessToken
userId = session.userId
}
}
}

View File

@@ -0,0 +1,48 @@
package org.jellyfin.androidtv.auth.apiclient
import org.jellyfin.androidtv.auth.repository.Session
import org.jellyfin.androidtv.auth.store.AuthenticationStore
import org.jellyfin.androidtv.util.sdk.legacy
import org.jellyfin.apiclient.interaction.ApiClient
import org.jellyfin.apiclient.model.apiclient.ServerInfo
import org.jellyfin.sdk.model.DeviceInfo
import timber.log.Timber
class ApiBinder(
private val api: ApiClient,
private val authenticationStore: AuthenticationStore,
) {
fun updateSession(session: Session?, deviceInfo: DeviceInfo): Boolean {
@Suppress("TooGenericExceptionCaught")
val success = try {
updateSessionInternal(session, deviceInfo)
} catch (throwable: Throwable) {
Timber.e(throwable, "Unable to update legacy API session.")
false
}
return success
}
private fun updateSessionInternal(session: Session?, deviceInfo: DeviceInfo): Boolean {
if (session == null) return true
val server = authenticationStore.getServer(session.serverId)
if (server == null) {
Timber.e("Could not bind API because server ${session.serverId} was not found in the store.")
return false
}
api.device = deviceInfo.legacy()
api.SetAuthenticationInfo(session.accessToken, session.userId.toString())
api.EnableAutomaticNetworking(ServerInfo().apply {
id = session.serverId.toString()
name = server.name
address = server.address.removeSuffix("/")
userId = session.userId.toString()
accessToken = session.accessToken
})
return true
}
}

View File

@@ -1,9 +1,10 @@
package org.jellyfin.androidtv.auth.model
import java.util.*
import java.util.UUID
data class AccountManagerAccount(
val id: UUID,
val address: String,
val server: UUID,
val name: String,
val accessToken: String? = null,

View File

@@ -0,0 +1,6 @@
package org.jellyfin.androidtv.auth.model
sealed class AuthenticateMethod
data class AutomaticAuthenticateMethod(val user: User) : AuthenticateMethod()
data class CredentialAuthenticateMethod(val username: String, val password: String = "") : AuthenticateMethod()
data class QuickConnectAuthenticateMethod(val secret: String) : AuthenticateMethod()

View File

@@ -0,0 +1,11 @@
package org.jellyfin.androidtv.auth.model
import org.jellyfin.androidtv.R
import org.jellyfin.androidtv.ui.preference.dsl.EnumDisplayOptions
enum class AuthenticationSortBy {
@EnumDisplayOptions(name = R.string.last_use)
LAST_USE,
@EnumDisplayOptions(name = R.string.alphabetical)
ALPHABETICAL
}

View File

@@ -5,8 +5,9 @@ package org.jellyfin.androidtv.auth.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
import org.jellyfin.androidtv.util.serializer.UUIDSerializer
import java.util.*
import org.jellyfin.sdk.model.serializer.UUIDSerializer
import java.util.Date
import java.util.UUID
/**
* Locally stored server information. New properties require default values or deserialization will fail.
@@ -17,6 +18,8 @@ data class AuthenticationStoreServer(
val address: String,
val version: String? = null,
@SerialName("login_disclaimer") val loginDisclaimer: String? = null,
@SerialName("splashscreen_enabled") val splashscreenEnabled: Boolean = false,
@SerialName("setup_completed") val setupCompleted: Boolean = true,
@SerialName("last_used") val lastUsed: Long = Date().time,
@SerialName("last_refreshed") val lastRefreshed: Long = Date().time,
val users: Map<UUID, AuthenticationStoreUser> = emptyMap(),

View File

@@ -2,7 +2,7 @@ package org.jellyfin.androidtv.auth.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import java.util.*
import java.util.Date
/**
* Locally stored user information. New properties require default values or deserialization will fail.

View File

@@ -1,23 +0,0 @@
package org.jellyfin.androidtv.auth.model
import androidx.annotation.StringRes
data class LoadingState(
val status: Status,
@StringRes val messageRes: Int? = null
) {
companion object {
val PENDING = LoadingState(Status.PENDING)
val LOADING = LoadingState(Status.LOADING)
val SUCCESS = LoadingState(Status.SUCCESS)
val ERROR = LoadingState(Status.ERROR)
fun error(@StringRes messageRes: Int? = null) = LoadingState(Status.ERROR, messageRes)
}
enum class Status {
PENDING,
LOADING,
SUCCESS,
ERROR
}
}

View File

@@ -1,8 +1,11 @@
package org.jellyfin.androidtv.auth.model
import org.jellyfin.sdk.api.client.exception.ApiClientException
sealed class LoginState
object AuthenticatingState : LoginState()
object RequireSignInState : LoginState()
object ServerUnavailableState : LoginState()
data class ServerVersionNotSupported(val server: Server) : LoginState()
data class ApiClientErrorLoginState(val error: ApiClientException) : LoginState()
object AuthenticatedState : LoginState()

View File

@@ -0,0 +1,23 @@
package org.jellyfin.androidtv.auth.model
sealed class QuickConnectState
/**
* State unknown untill first poll completed.
*/
object UnknownQuickConnectState : QuickConnectState()
/**
* Server does not have QuickConnect enabled.
*/
object UnavailableQuickConnectState : QuickConnectState()
/**
* Connection is pending.
*/
data class PendingQuickConnectState(val code: String) : QuickConnectState()
/**
* User connected.
*/
object ConnectedQuickConnectState : QuickConnectState()

View File

@@ -1,8 +1,9 @@
package org.jellyfin.androidtv.auth.model
import org.jellyfin.androidtv.auth.ServerRepository
import org.jellyfin.androidtv.auth.repository.ServerRepository
import org.jellyfin.sdk.model.ServerVersion
import java.util.*
import java.util.Date
import java.util.UUID
/**
* Server model to use locally in place of ServerInfo model in ApiClient.
@@ -13,11 +14,15 @@ data class Server(
var address: String,
val version: String? = null,
val loginDisclaimer: String? = null,
val splashscreenEnabled: Boolean = false,
val setupCompleted: Boolean = true,
var dateLastAccessed: Date = Date(0),
) {
private val serverVersion = version?.let(ServerVersion::fromString)
val versionSupported = serverVersion != null && serverVersion >= ServerRepository.minimumServerVersion
operator fun compareTo(other: ServerVersion): Int = serverVersion?.compareTo(other) ?: -1
override fun equals(other: Any?) = other is Server
&& id == other.id
&& address == other.address

View File

@@ -1,9 +1,10 @@
package org.jellyfin.androidtv.auth.model
import org.jellyfin.sdk.discovery.RecommendedServerIssue
import org.jellyfin.sdk.model.api.PublicSystemInfo
import java.util.*
import java.util.UUID
sealed class ServerAdditionState
data class ConnectingState(val address: String) : ServerAdditionState()
data class UnableToConnectState(val addressCandidates: List<String>) : ServerAdditionState()
data class UnableToConnectState(val addressCandidates: Map<String, Collection<RecommendedServerIssue>>) : ServerAdditionState()
data class ConnectedState(val id: UUID, val publicInfo: PublicSystemInfo) : ServerAdditionState()

View File

@@ -1,6 +1,6 @@
package org.jellyfin.androidtv.auth.model
import java.util.*
import java.util.UUID
/**
* User model used locally.
@@ -13,6 +13,8 @@ sealed class User {
abstract val requirePassword: Boolean
abstract val imageTag: String?
abstract fun withToken(accessToken: String): User
override fun equals(other: Any?) = other is User
&& serverId == other.serverId
&& id == other.id
@@ -35,7 +37,9 @@ data class PrivateUser(
override val requirePassword: Boolean,
override val imageTag: String?,
val lastUsed: Long,
) : User()
) : User() {
override fun withToken(accessToken: String) = copy(accessToken = accessToken)
}
/**
* Represents a user stored server side. Found using the Public User endpoint.
@@ -47,4 +51,6 @@ data class PublicUser(
override val accessToken: String?,
override val requirePassword: Boolean,
override val imageTag: String?,
) : User()
) : User() {
override fun withToken(accessToken: String) = copy(accessToken = accessToken)
}

View File

@@ -0,0 +1,222 @@
package org.jellyfin.androidtv.auth.repository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import org.jellyfin.androidtv.auth.model.AccountManagerAccount
import org.jellyfin.androidtv.auth.model.ApiClientErrorLoginState
import org.jellyfin.androidtv.auth.model.AuthenticateMethod
import org.jellyfin.androidtv.auth.model.AuthenticatedState
import org.jellyfin.androidtv.auth.model.AuthenticatingState
import org.jellyfin.androidtv.auth.model.AuthenticationStoreUser
import org.jellyfin.androidtv.auth.model.AutomaticAuthenticateMethod
import org.jellyfin.androidtv.auth.model.CredentialAuthenticateMethod
import org.jellyfin.androidtv.auth.model.LoginState
import org.jellyfin.androidtv.auth.model.PrivateUser
import org.jellyfin.androidtv.auth.model.QuickConnectAuthenticateMethod
import org.jellyfin.androidtv.auth.model.RequireSignInState
import org.jellyfin.androidtv.auth.model.Server
import org.jellyfin.androidtv.auth.model.ServerUnavailableState
import org.jellyfin.androidtv.auth.model.ServerVersionNotSupported
import org.jellyfin.androidtv.auth.model.User
import org.jellyfin.androidtv.auth.store.AccountManagerStore
import org.jellyfin.androidtv.auth.store.AuthenticationPreferences
import org.jellyfin.androidtv.auth.store.AuthenticationStore
import org.jellyfin.androidtv.util.ImageUtils
import org.jellyfin.androidtv.util.sdk.forUser
import org.jellyfin.sdk.Jellyfin
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.exception.TimeoutException
import org.jellyfin.sdk.api.client.extensions.authenticateUserByName
import org.jellyfin.sdk.api.client.extensions.authenticateWithQuickConnect
import org.jellyfin.sdk.api.client.extensions.imageApi
import org.jellyfin.sdk.api.client.extensions.userApi
import org.jellyfin.sdk.model.DeviceInfo
import org.jellyfin.sdk.model.api.AuthenticationResult
import org.jellyfin.sdk.model.api.ImageType
import org.jellyfin.sdk.model.api.UserDto
import timber.log.Timber
import java.util.Date
/**
* Repository to manage authentication of the user in the app.
*/
interface AuthenticationRepository {
fun authenticate(server: Server, method: AuthenticateMethod): Flow<LoginState>
fun logout(user: User): Boolean
fun getUserImageUrl(server: Server, user: User): String?
}
class AuthenticationRepositoryImpl(
private val jellyfin: Jellyfin,
private val sessionRepository: SessionRepository,
private val accountManagerStore: AccountManagerStore,
private val authenticationStore: AuthenticationStore,
private val userApiClient: ApiClient,
private val authenticationPreferences: AuthenticationPreferences,
private val defaultDeviceInfo: DeviceInfo,
) : AuthenticationRepository {
override fun authenticate(server: Server, method: AuthenticateMethod): Flow<LoginState> {
// Check server version first
if (!server.versionSupported) return flowOf(ServerVersionNotSupported(server))
return when (method) {
is AutomaticAuthenticateMethod -> authenticateAutomatic(server, method.user)
is CredentialAuthenticateMethod -> authenticateCredential(server, method.username, method.password)
is QuickConnectAuthenticateMethod -> authenticateQuickConnect(server, method.secret)
}
}
private fun authenticateAutomatic(server: Server, user: User): Flow<LoginState> {
Timber.i("Authenticating user %s", user)
// Automatic logic is disabled when the always authenticate preference is enabled
if (authenticationPreferences[AuthenticationPreferences.alwaysAuthenticate]) return flowOf(RequireSignInState)
val account = accountManagerStore.getAccount(server.id, user.id)
// Try login with access token
return if (account?.accessToken != null) authenticateToken(server, user.withToken(account.accessToken))
// Try login without password
else if (!user.requirePassword) authenticateCredential(server, user.name, "")
// Require login
else flowOf(RequireSignInState)
}
private fun authenticateCredential(server: Server, username: String, password: String) = flow {
val api = jellyfin.createApi(server.address, deviceInfo = defaultDeviceInfo.forUser(username))
val result = try {
val response = api.userApi.authenticateUserByName(username, password)
response.content
} catch (err: TimeoutException) {
Timber.e(err, "Failed to connect to server trying to sign in $username")
emit(ServerUnavailableState)
return@flow
} catch (err: ApiClientException) {
Timber.e(err, "Unable to sign in as $username")
emit(ApiClientErrorLoginState(err))
return@flow
}
emitAll(authenticateAuthenticationResult(server, result))
}
private fun authenticateQuickConnect(server: Server, secret: String) = flow {
val api = jellyfin.createApi(server.address, deviceInfo = defaultDeviceInfo)
val result = try {
val response = api.userApi.authenticateWithQuickConnect(secret)
response.content
} catch (err: TimeoutException) {
Timber.e(err, "Failed to connect to server")
emit(ServerUnavailableState)
return@flow
} catch (err: ApiClientException) {
Timber.e(err, "Unable to sign in with Quick Connect secret")
emit(ApiClientErrorLoginState(err))
return@flow
}
emitAll(authenticateAuthenticationResult(server, result))
}
private fun authenticateAuthenticationResult(server: Server, result: AuthenticationResult) = flow {
val accessToken = result.accessToken ?: return@flow emit(RequireSignInState)
val userInfo = result.user ?: return@flow emit(RequireSignInState)
val user = PrivateUser(
id = userInfo.id,
serverId = server.id,
name = userInfo.name!!,
accessToken = result.accessToken,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag,
lastUsed = Date().time,
)
authenticateFinish(server, userInfo, accessToken)
val success = setActiveSession(user, server)
if (success) {
emit(AuthenticatedState)
} else {
Timber.w("Failed to set active session after authenticating")
emit(RequireSignInState)
}
}
private fun authenticateToken(server: Server, user: User) = flow {
emit(AuthenticatingState)
val success = setActiveSession(user, server)
if (!success) {
emit(RequireSignInState)
} else try {
// Update user info
val userInfo by userApiClient.userApi.getCurrentUser()
authenticateFinish(server, userInfo, user.accessToken.orEmpty())
emit(AuthenticatedState)
} catch (err: TimeoutException) {
Timber.e(err, "Failed to connect to server")
emit(ServerUnavailableState)
return@flow
} catch (err: ApiClientException) {
Timber.e(err, "Unable to get current user data")
emit(ApiClientErrorLoginState(err))
}
}
private suspend fun authenticateFinish(server: Server, userInfo: UserDto, accessToken: String) {
val currentUser = authenticationStore.getUser(server.id, userInfo.id)
val updatedUser = currentUser?.copy(
name = userInfo.name!!,
lastUsed = Date().time,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag
) ?: AuthenticationStoreUser(
name = userInfo.name!!,
requirePassword = userInfo.hasPassword,
imageTag = userInfo.primaryImageTag
)
authenticationStore.putUser(server.id, userInfo.id, updatedUser)
val accountManagerAccount = AccountManagerAccount(
id = userInfo.id,
address = "${updatedUser.name}@${server.address}",
server = server.id,
name = updatedUser.name,
accessToken = accessToken,
)
accountManagerStore.putAccount(accountManagerAccount)
}
private suspend fun setActiveSession(user: User, server: Server): Boolean {
val authenticated = sessionRepository.switchCurrentSession(server.id, user.id)
if (authenticated) {
// Update last use in store
authenticationStore.getServer(server.id)?.let { storedServer ->
authenticationStore.putServer(server.id, storedServer.copy(lastUsed = Date().time))
}
authenticationStore.getUser(server.id, user.id)?.let { storedUser ->
authenticationStore.putUser(server.id, user.id, storedUser.copy(lastUsed = Date().time))
}
}
return authenticated
}
override fun logout(user: User): Boolean {
val authInfo = accountManagerStore.getAccount(user.serverId, user.id) ?: return false
return accountManagerStore.removeAccount(authInfo)
}
override fun getUserImageUrl(server: Server, user: User): String? = user.imageTag?.let { tag ->
jellyfin.createApi(server.address).imageApi.getUserImageUrl(
userId = user.id,
tag = tag,
imageType = ImageType.PRIMARY,
maxHeight = ImageUtils.MAX_PRIMARY_IMAGE_HEIGHT
)
}
}

View File

@@ -0,0 +1,243 @@
package org.jellyfin.androidtv.auth.repository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import org.jellyfin.androidtv.auth.model.AuthenticationStoreServer
import org.jellyfin.androidtv.auth.model.ConnectedState
import org.jellyfin.androidtv.auth.model.ConnectingState
import org.jellyfin.androidtv.auth.model.Server
import org.jellyfin.androidtv.auth.model.ServerAdditionState
import org.jellyfin.androidtv.auth.model.UnableToConnectState
import org.jellyfin.androidtv.auth.store.AuthenticationStore
import org.jellyfin.androidtv.util.sdk.toServer
import org.jellyfin.sdk.Jellyfin
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.exception.InvalidContentException
import org.jellyfin.sdk.api.client.extensions.brandingApi
import org.jellyfin.sdk.api.client.extensions.systemApi
import org.jellyfin.sdk.discovery.RecommendedServerInfo
import org.jellyfin.sdk.discovery.RecommendedServerInfoScore
import org.jellyfin.sdk.model.api.BrandingOptions
import org.jellyfin.sdk.model.api.ServerDiscoveryInfo
import org.jellyfin.sdk.model.serializer.toUUID
import timber.log.Timber
import java.util.Date
import java.util.UUID
/**
* Repository to maintain servers.
*/
interface ServerRepository {
val storedServers: StateFlow<List<Server>>
val discoveredServers: StateFlow<List<Server>>
suspend fun loadStoredServers()
suspend fun loadDiscoveryServers()
fun addServer(address: String): Flow<ServerAdditionState>
suspend fun getServer(id: UUID): Server?
suspend fun updateServer(server: Server): Boolean
suspend fun deleteServer(server: UUID): Boolean
companion object {
val minimumServerVersion = Jellyfin.minimumVersion.copy(build = null)
}
}
class ServerRepositoryImpl(
private val jellyfin: Jellyfin,
private val authenticationStore: AuthenticationStore,
) : ServerRepository {
// State
private val _storedServers = MutableStateFlow(emptyList<Server>())
override val storedServers = _storedServers.asStateFlow()
private val _discoveredServers = MutableStateFlow(emptyList<Server>())
override val discoveredServers = _discoveredServers.asStateFlow()
// Loading data
override suspend fun loadStoredServers() {
authenticationStore.getServers()
.map { (id, entry) -> entry.asServer(id) }
.sortedWith(compareByDescending<Server> { it.dateLastAccessed }.thenBy { it.name })
.let { _storedServers.emit(it) }
}
override suspend fun loadDiscoveryServers() {
val servers = mutableListOf<Server>()
jellyfin.discovery
.discoverLocalServers()
.map(ServerDiscoveryInfo::toServer)
.collect { server ->
servers += server
_discoveredServers.emit(servers.toList())
}
}
// Mutating data
override fun addServer(address: String): Flow<ServerAdditionState> = flow {
Timber.i("Adding server %s", address)
emit(ConnectingState(address))
val addressCandidates = jellyfin.discovery.getAddressCandidates(address)
Timber.i("Found ${addressCandidates.size} candidates")
val goodRecommendations = mutableListOf<RecommendedServerInfo>()
val badRecommendations = mutableListOf<RecommendedServerInfo>()
val greatRecommendaton = jellyfin.discovery.getRecommendedServers(addressCandidates).firstOrNull { recommendedServer ->
when (recommendedServer.score) {
RecommendedServerInfoScore.GREAT -> true
RecommendedServerInfoScore.GOOD -> {
goodRecommendations += recommendedServer
false
}
else -> {
badRecommendations += recommendedServer
false
}
}
}
Timber.d(buildString {
append("Recommendations: ")
if (greatRecommendaton == null) append(0)
else append(1)
append(" great, ")
append(goodRecommendations.size)
append(" good, ")
append(badRecommendations.size)
append(" bad")
})
val chosenRecommendation = greatRecommendaton ?: goodRecommendations.firstOrNull()
if (chosenRecommendation != null && chosenRecommendation.systemInfo.isSuccess) {
// Get system info
val systemInfo = chosenRecommendation.systemInfo.getOrThrow()
// Get branding info
val api = jellyfin.createApi(chosenRecommendation.address)
val branding = api.getBrandingOptionsOrDefault()
val id = systemInfo.id!!.toUUID()
val server = authenticationStore.getServer(id)?.copy(
name = systemInfo.serverName ?: "Jellyfin Server",
address = chosenRecommendation.address,
version = systemInfo.version,
loginDisclaimer = branding.loginDisclaimer,
splashscreenEnabled = branding.splashscreenEnabled,
setupCompleted = systemInfo.startupWizardCompleted ?: true,
lastUsed = Date().time
) ?: AuthenticationStoreServer(
name = systemInfo.serverName ?: "Jellyfin Server",
address = chosenRecommendation.address,
version = systemInfo.version,
loginDisclaimer = branding.loginDisclaimer,
splashscreenEnabled = branding.splashscreenEnabled,
setupCompleted = systemInfo.startupWizardCompleted ?: true,
)
authenticationStore.putServer(id, server)
loadStoredServers()
emit(ConnectedState(id, systemInfo))
} else {
// No great or good recommendations, only add bad recommendations
val addressCandidatesWithIssues = (badRecommendations + goodRecommendations)
.groupBy { it.address }
.mapValues { (_, entry) -> entry.flatMap { server -> server.issues } }
emit(UnableToConnectState(addressCandidatesWithIssues))
}
}
override suspend fun getServer(id: UUID): Server? {
val server = authenticationStore.getServer(id) ?: return null
val updatedServer = try {
updateServerInternal(id, server)
} catch (err: ApiClientException) {
Timber.e(err, "Unable to update server")
null
}
return (updatedServer ?: server).asServer(id)
}
override suspend fun updateServer(server: Server): Boolean {
// Only update existing servers
val serverInfo = authenticationStore.getServer(server.id) ?: return false
return try {
updateServerInternal(server.id, serverInfo) != null
} catch (err: ApiClientException) {
Timber.e(err, "Unable to update server")
false
}
}
private suspend fun updateServerInternal(id: UUID, server: AuthenticationStoreServer): AuthenticationStoreServer? {
val now = Date().time
// Only update every 10 minutes
if (now - server.lastRefreshed < 600000 && server.version != null) return null
val api = jellyfin.createApi(server.address)
// Get login disclaimer
val branding = api.getBrandingOptionsOrDefault()
val systemInfo by api.systemApi.getPublicSystemInfo()
val newServer = server.copy(
name = systemInfo.serverName ?: server.name,
version = systemInfo.version ?: server.version,
loginDisclaimer = branding.loginDisclaimer ?: server.loginDisclaimer,
splashscreenEnabled = branding.splashscreenEnabled,
setupCompleted = systemInfo.startupWizardCompleted ?: server.setupCompleted,
lastRefreshed = now
)
authenticationStore.putServer(id, newServer)
return newServer
}
override suspend fun deleteServer(server: UUID): Boolean {
val success = authenticationStore.removeServer(server)
if (success) loadStoredServers()
return success
}
// Helper functions
private fun AuthenticationStoreServer.asServer(id: UUID) = Server(
id = id,
name = name,
address = address,
version = version,
loginDisclaimer = loginDisclaimer,
splashscreenEnabled = splashscreenEnabled,
setupCompleted = setupCompleted,
dateLastAccessed = Date(lastUsed),
)
/**
* Try to retrieve the branding options. If the response JSON is invalid it will return a default value.
* This makes sure we can still work with older Jellyfin versions.
*/
private suspend fun ApiClient.getBrandingOptionsOrDefault() = try {
brandingApi.getBrandingOptions().content
} catch (exception: InvalidContentException) {
Timber.w(exception, "Invalid branding options response, using default value")
BrandingOptions(
loginDisclaimer = null,
customCss = null,
splashscreenEnabled = false,
)
}
}

View File

@@ -0,0 +1,71 @@
package org.jellyfin.androidtv.auth.repository
import org.jellyfin.androidtv.auth.model.PrivateUser
import org.jellyfin.androidtv.auth.model.PublicUser
import org.jellyfin.androidtv.auth.model.Server
import org.jellyfin.androidtv.auth.store.AccountManagerStore
import org.jellyfin.androidtv.auth.store.AuthenticationStore
import org.jellyfin.androidtv.util.sdk.toPublicUser
import org.jellyfin.sdk.Jellyfin
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.extensions.userApi
import org.jellyfin.sdk.model.api.UserDto
import timber.log.Timber
/**
* Repository to maintain users for servers.
* Authentication is done using the [AuthenticationRepository].
*/
interface ServerUserRepository {
//server
fun getStoredServerUsers(server: Server): List<PrivateUser>
suspend fun getPublicServerUsers(server: Server): List<PublicUser>
fun deleteStoredUser(user: PrivateUser)
}
class ServerUserRepositoryImpl(
private val jellyfin: Jellyfin,
private val authenticationStore: AuthenticationStore,
private val accountManagerStore: AccountManagerStore,
) : ServerUserRepository {
override fun getStoredServerUsers(server: Server) = authenticationStore.getUsers(server.id)
?.mapNotNull { (userId, userInfo) ->
val authInfo = accountManagerStore.getAccount(server.id, userId)
PrivateUser(
id = authInfo?.id ?: userId,
serverId = authInfo?.server ?: server.id,
name = userInfo.name,
accessToken = authInfo?.accessToken,
requirePassword = userInfo.requirePassword,
imageTag = userInfo.imageTag,
lastUsed = userInfo.lastUsed,
)
}
?.sortedWith(compareByDescending<PrivateUser> { it.lastUsed }.thenBy { it.name })
.orEmpty()
override suspend fun getPublicServerUsers(server: Server): List<PublicUser> {
// Create a fresh API because the shared one might be authenticated for a different server
val api = jellyfin.createApi(server.address)
return try {
val users by api.userApi.getPublicUsers()
users.mapNotNull(UserDto::toPublicUser)
} catch (err: ApiClientException) {
Timber.e(err, "Unable to retrieve public users")
emptyList()
}
}
override fun deleteStoredUser(user: PrivateUser) {
// Remove user info from store
authenticationStore.removeUser(user.serverId, user.id)
// Remove authentication info from system account manager
accountManagerStore.getAccount(user.serverId, user.id)?.let { accountManagerAccount ->
accountManagerStore.removeAccount(accountManagerAccount)
}
}
}

View File

@@ -0,0 +1,196 @@
package org.jellyfin.androidtv.auth.repository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.jellyfin.androidtv.auth.apiclient.ApiBinder
import org.jellyfin.androidtv.auth.store.AccountManagerStore
import org.jellyfin.androidtv.auth.store.AuthenticationPreferences
import org.jellyfin.androidtv.auth.store.AuthenticationStore
import org.jellyfin.androidtv.preference.PreferencesRepository
import org.jellyfin.androidtv.preference.TelemetryPreferences
import org.jellyfin.androidtv.preference.constant.UserSelectBehavior.DISABLED
import org.jellyfin.androidtv.preference.constant.UserSelectBehavior.LAST_USER
import org.jellyfin.androidtv.preference.constant.UserSelectBehavior.SPECIFIC_USER
import org.jellyfin.androidtv.util.sdk.forUser
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.extensions.clientLogApi
import org.jellyfin.sdk.api.client.extensions.userApi
import org.jellyfin.sdk.model.DeviceInfo
import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import timber.log.Timber
import java.util.UUID
data class Session(
val userId: UUID,
val serverId: UUID,
val accessToken: String,
)
enum class SessionRepositoryState {
READY,
RESTORING_SESSION,
SWITCHING_SESSION,
}
interface SessionRepository {
val currentSession: StateFlow<Session?>
val state: StateFlow<SessionRepositoryState>
suspend fun restoreSession()
suspend fun switchCurrentSession(serverId: UUID, userId: UUID): Boolean
fun destroyCurrentSession()
}
class SessionRepositoryImpl(
private val authenticationPreferences: AuthenticationPreferences,
private val accountManagerStore: AccountManagerStore,
private val apiBinder: ApiBinder,
private val authenticationStore: AuthenticationStore,
private val userApiClient: ApiClient,
private val preferencesRepository: PreferencesRepository,
private val defaultDeviceInfo: DeviceInfo,
private val userRepository: UserRepository,
private val serverRepository: ServerRepository,
private val telemetryPreferences: TelemetryPreferences,
) : SessionRepository {
private val currentSessionMutex = Mutex()
private val _currentSession = MutableStateFlow<Session?>(null)
override val currentSession = _currentSession.asStateFlow()
private val _state = MutableStateFlow(SessionRepositoryState.READY)
override val state = _state.asStateFlow()
override suspend fun restoreSession(): Unit = currentSessionMutex.withLock {
Timber.i("Restoring session")
_state.value = SessionRepositoryState.RESTORING_SESSION
if (authenticationPreferences[AuthenticationPreferences.alwaysAuthenticate]) return destroyCurrentSession()
when (authenticationPreferences[AuthenticationPreferences.autoLoginUserBehavior]) {
DISABLED -> destroyCurrentSession()
LAST_USER -> setCurrentSession(createLastUserSession())
SPECIFIC_USER -> {
val serverId = authenticationPreferences[AuthenticationPreferences.autoLoginServerId].toUUIDOrNull()
val userId = authenticationPreferences[AuthenticationPreferences.autoLoginUserId].toUUIDOrNull()
if (serverId != null && userId != null) setCurrentSession(createUserSession(serverId, userId))
}
}
_state.value = SessionRepositoryState.READY
}
override suspend fun switchCurrentSession(serverId: UUID, userId: UUID): Boolean {
// No change in user - don't switch
if (currentSession.value?.userId == userId) {
Timber.d("Current session user is the same as the requested user")
return false
}
_state.value = SessionRepositoryState.SWITCHING_SESSION
Timber.i("Switching current session to user $userId")
val session = createUserSession(serverId, userId)
if (session == null) {
Timber.w("Could not switch to non-existing session for user $userId")
return false
}
val switched = setCurrentSession(session)
_state.value = SessionRepositoryState.READY
return switched
}
override fun destroyCurrentSession() {
Timber.i("Destroying current session")
userRepository.updateCurrentUser(null)
_currentSession.value = null
userApiClient.applySession(null)
apiBinder.updateSession(null, userApiClient.deviceInfo)
_state.value = SessionRepositoryState.READY
}
private suspend fun setCurrentSession(session: Session?): Boolean {
if (session != null) {
// No change in session - don't switch
if (currentSession.value?.userId == session.userId) return true
// Update last active user
authenticationPreferences[AuthenticationPreferences.lastServerId] = session.serverId.toString()
authenticationPreferences[AuthenticationPreferences.lastUserId] = session.userId.toString()
// Check if server version is supported
val server = serverRepository.getServer(session.serverId)
if (server == null || !server.versionSupported) return false
}
// Update session after binding the apiclient settings
val deviceInfo = session?.let { defaultDeviceInfo.forUser(it.userId) } ?: defaultDeviceInfo
val success = apiBinder.updateSession(session, deviceInfo)
Timber.i("Updating current session. userId=${session?.userId} apiBindingSuccess=${success}")
if (success) {
userApiClient.applySession(session, deviceInfo)
if (session != null) {
// Update crash reporting URL
val crashReportUrl = userApiClient.clientLogApi.logFileUrl(includeCredentials = false)
telemetryPreferences[TelemetryPreferences.crashReportUrl] = crashReportUrl
telemetryPreferences[TelemetryPreferences.crashReportToken] = session.accessToken
try {
val user by userApiClient.userApi.getCurrentUser()
userRepository.updateCurrentUser(user)
} catch (err: ApiClientException) {
Timber.e(err, "Unable to authenticate: bad response when getting user info")
destroyCurrentSession()
return false
}
} else {
userRepository.updateCurrentUser(null)
}
preferencesRepository.onSessionChanged()
_currentSession.value = session
} else destroyCurrentSession()
return success
}
private fun createLastUserSession(): Session? {
val lastUserId = authenticationPreferences[AuthenticationPreferences.lastUserId].toUUIDOrNull()
val lastServerId = authenticationPreferences[AuthenticationPreferences.lastServerId].toUUIDOrNull()
return if (lastUserId != null && lastServerId != null) createUserSession(lastServerId, lastUserId)
else null
}
private fun createUserSession(serverId: UUID, userId: UUID): Session? {
val account = accountManagerStore.getAccount(serverId, userId)
if (account?.accessToken == null) return null
return Session(
userId = account.id,
serverId = account.server,
accessToken = account.accessToken
)
}
private fun ApiClient.applySession(session: Session?, newDeviceInfo: DeviceInfo = defaultDeviceInfo) {
deviceInfo = newDeviceInfo
if (session == null) {
baseUrl = null
accessToken = null
userId = null
} else {
val server = authenticationStore.getServer(session.serverId)
?: return applySession(null)
baseUrl = server.address
accessToken = session.accessToken
userId = session.userId
}
}
}

View File

@@ -0,0 +1,22 @@
package org.jellyfin.androidtv.auth.repository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import org.jellyfin.sdk.model.api.UserDto
/**
* Repository to get the current authenticated user.
*/
interface UserRepository {
val currentUser: StateFlow<UserDto?>
fun updateCurrentUser(user: UserDto?)
}
class UserRepositoryImpl : UserRepository {
override val currentUser = MutableStateFlow<UserDto?>(null)
override fun updateCurrentUser(user: UserDto?) {
if (currentUser.value !== user) currentUser.value = user
}
}

View File

@@ -0,0 +1,79 @@
package org.jellyfin.androidtv.auth.service
import android.accounts.AbstractAccountAuthenticator
import android.accounts.Account
import android.accounts.AccountAuthenticatorResponse
import android.accounts.AccountManager
import android.app.Service
import android.content.Intent
import android.os.Bundle
import android.os.IBinder
import androidx.core.os.bundleOf
import org.jellyfin.androidtv.ui.preference.PreferencesActivity
class AuthenticatorService : Service() {
private val authenticator by lazy {
Authenticator(this)
}
override fun onBind(intent: Intent): IBinder? = authenticator.iBinder
private inner class Authenticator(
private val service: AuthenticatorService
) : AbstractAccountAuthenticator(service) {
private val unsupportedOperationBundle = bundleOf(
AccountManager.KEY_ERROR_CODE to AccountManager.ERROR_CODE_REMOTE_EXCEPTION,
AccountManager.KEY_ERROR_MESSAGE to "Unsupported operation"
)
override fun addAccount(
response: AccountAuthenticatorResponse,
accountType: String,
authTokenType: String?,
requiredFeatures: Array<String>?,
options: Bundle,
): Bundle = unsupportedOperationBundle
override fun confirmCredentials(
response: AccountAuthenticatorResponse,
account: Account,
options: Bundle?,
): Bundle = unsupportedOperationBundle
override fun editProperties(
response: AccountAuthenticatorResponse,
accountType: String,
): Bundle = bundleOf(
AccountManager.KEY_INTENT to Intent(service, PreferencesActivity::class.java)
)
override fun getAccountRemovalAllowed(
response: AccountAuthenticatorResponse,
account: Account,
): Bundle = bundleOf(
AccountManager.KEY_BOOLEAN_RESULT to true
)
override fun getAuthToken(
response: AccountAuthenticatorResponse,
account: Account,
authTokenType: String,
options: Bundle,
): Bundle = unsupportedOperationBundle
override fun getAuthTokenLabel(authTokenType: String): String? = null
override fun hasFeatures(
response: AccountAuthenticatorResponse,
account: Account,
features: Array<String>,
): Bundle = unsupportedOperationBundle
override fun updateCredentials(
response: AccountAuthenticatorResponse,
account: Account,
authTokenType: String?,
options: Bundle?,
): Bundle = unsupportedOperationBundle
}
}

View File

@@ -1,17 +1,18 @@
package org.jellyfin.androidtv.auth
package org.jellyfin.androidtv.auth.store
import android.accounts.Account
import android.accounts.AccountManager
import android.os.Build
import android.os.Bundle
import org.jellyfin.androidtv.BuildConfig
import org.jellyfin.androidtv.auth.model.AccountManagerAccount
import org.jellyfin.sdk.model.serializer.toUUID
import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import java.util.*
import java.util.UUID
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
class AccountManagerHelper(
class AccountManagerStore(
private val accountManager: AccountManager
) {
companion object {
@@ -22,8 +23,16 @@ class AccountManagerHelper(
const val ACCOUNT_ACCESS_TOKEN_TYPE = "$ACCOUNT_TYPE.access_token"
}
private fun Array<Account>.filterServerAccount(server: UUID, account: UUID? = null) = filter {
val validServerId = accountManager.getUserData(it, ACCOUNT_DATA_SERVER)?.toUUIDOrNull() == server
val validUserId = account == null || accountManager.getUserData(it, ACCOUNT_DATA_ID)?.toUUIDOrNull() == account
validServerId && validUserId
}
private fun getAccountData(account: Account): AccountManagerAccount = AccountManagerAccount(
id = accountManager.getUserData(account, ACCOUNT_DATA_ID).toUUID(),
address = account.name,
server = accountManager.getUserData(account, ACCOUNT_DATA_SERVER).toUUID(),
name = accountManager.getUserData(account, ACCOUNT_DATA_NAME),
accessToken = accountManager.peekAuthToken(account, ACCOUNT_ACCESS_TOKEN_TYPE)
@@ -31,11 +40,12 @@ class AccountManagerHelper(
suspend fun putAccount(accountManagerAccount: AccountManagerAccount) {
var androidAccount = accountManager.getAccountsByType(ACCOUNT_TYPE)
.firstOrNull { accountManager.getUserData(it, ACCOUNT_DATA_ID)?.toUUIDOrNull() == accountManagerAccount.id }
.filterServerAccount(accountManagerAccount.server, accountManagerAccount.id)
.firstOrNull()
// Update credentials
if (androidAccount == null) {
androidAccount = Account(accountManagerAccount.name, ACCOUNT_TYPE)
androidAccount = Account(accountManagerAccount.address, ACCOUNT_TYPE)
accountManager.addAccountExplicitly(
androidAccount,
@@ -46,9 +56,14 @@ class AccountManagerHelper(
}
// Update name
if (androidAccount.name != accountManagerAccount.name) {
if (androidAccount.name != accountManagerAccount.address) {
androidAccount = suspendCoroutine { continuation ->
accountManager.renameAccount(androidAccount, accountManagerAccount.name, { continuation.resume(it.result) }, null)
accountManager.renameAccount(
androidAccount,
accountManagerAccount.address,
{ continuation.resume(it.result) },
null,
)
}
}
@@ -57,25 +72,28 @@ class AccountManagerHelper(
accountManager.setAuthToken(androidAccount, ACCOUNT_ACCESS_TOKEN_TYPE, accountManagerAccount.accessToken)
}
fun removeAccount(accountManagerAccount: AccountManagerAccount) {
fun removeAccount(accountManagerAccount: AccountManagerAccount): Boolean {
val androidAccount = accountManager.getAccountsByType(ACCOUNT_TYPE)
.first { accountManager.getUserData(it, ACCOUNT_DATA_ID)?.toUUIDOrNull() == accountManagerAccount.id }
.filterServerAccount(accountManagerAccount.server, accountManagerAccount.id)
.firstOrNull()
?: return false
// Remove current account info
@Suppress("DEPRECATION")
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1)
accountManager.removeAccountExplicitly(androidAccount)
else
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
accountManager.removeAccount(androidAccount, null, null)
true
} else accountManager.removeAccountExplicitly(androidAccount)
}
fun getAccounts() = accountManager.getAccountsByType(ACCOUNT_TYPE).map(::getAccountData)
fun getAccountsByServer(server: UUID) = accountManager.getAccountsByType(ACCOUNT_TYPE).filter { account ->
accountManager.getUserData(account, ACCOUNT_DATA_SERVER)?.toUUIDOrNull() == server
}.map(::getAccountData)
fun getAccountsByServer(server: UUID) = accountManager.getAccountsByType(ACCOUNT_TYPE)
.filterServerAccount(server)
.map(::getAccountData)
fun getAccount(id: UUID) = accountManager.getAccountsByType(ACCOUNT_TYPE).firstOrNull { account ->
accountManager.getUserData(account, ACCOUNT_DATA_ID)?.toUUIDOrNull() == id
}?.let(::getAccountData)
fun getAccount(server: UUID, account: UUID) = accountManager.getAccountsByType(ACCOUNT_TYPE)
.filterServerAccount(server, account)
.firstOrNull()
?.let(::getAccountData)
}

View File

@@ -0,0 +1,43 @@
package org.jellyfin.androidtv.auth.store
import android.content.Context
import org.jellyfin.androidtv.auth.model.AuthenticationSortBy
import org.jellyfin.androidtv.preference.constant.UserSelectBehavior
import org.jellyfin.preference.booleanPreference
import org.jellyfin.preference.enumPreference
import org.jellyfin.preference.store.SharedPreferenceStore
import org.jellyfin.preference.stringPreference
class AuthenticationPreferences(context: Context) : SharedPreferenceStore(
sharedPreferences = context.getSharedPreferences("authentication", Context.MODE_PRIVATE)
) {
companion object {
// Preferences
val autoLoginUserBehavior = enumPreference("auto_login_user_behavior", UserSelectBehavior.LAST_USER)
val autoLoginServerId = stringPreference("auto_login_server_id", "")
val autoLoginUserId = stringPreference("auto_login_user_id", "")
val sortBy = enumPreference("sort_by", AuthenticationSortBy.LAST_USE)
val alwaysAuthenticate = booleanPreference("always_authenticate", false)
// Persistent state
val lastServerId = stringPreference("last_server_id", "")
val lastUserId = stringPreference("last_user_id", "")
}
init {
runMigrations {
// v0.15.4 to v0.15.5
migration(toVersion = 2) {
// Unfortunately we cannot migrate the "specific user" login option
// so we'll reset the preference to disabled if it was used
if (it.getString("auto_login_user_behavior", null) === UserSelectBehavior.SPECIFIC_USER.name) {
putString("auto_login_user_id", "")
putString("auto_login_user_behavior", UserSelectBehavior.DISABLED.name)
}
putString("last_user_id", "")
}
}
}
}

View File

@@ -1,19 +1,27 @@
package org.jellyfin.androidtv.auth
package org.jellyfin.androidtv.auth.store
import android.content.Context
import kotlinx.serialization.SerializationException
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.*
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.decodeFromJsonElement
import kotlinx.serialization.json.encodeToJsonElement
import kotlinx.serialization.json.intOrNull
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.contextual
import org.jellyfin.androidtv.auth.model.AuthenticationStoreServer
import org.jellyfin.androidtv.auth.model.AuthenticationStoreUser
import org.jellyfin.androidtv.util.serializer.UUIDSerializer
import org.jellyfin.sdk.model.serializer.UUIDSerializer
import timber.log.Timber
import java.util.*
import java.util.UUID
/**
* Storage for authentication related entities. Stores servers with users inside. Should be used in
* combination with the [AccountManagerHelper] to store access tokens and integrate with the
* combination with the [AccountManagerStore] to store access tokens and integrate with the
* operating system.
*
* The data is stored in a JSON file located in the applications data directory.
@@ -27,7 +35,7 @@ class AuthenticationStore(
private val json = Json {
encodeDefaults = true
serializersModule = SerializersModule {
contextual(UUIDSerializer)
contextual(UUIDSerializer())
}
ignoreUnknownKeys = true
}
@@ -40,8 +48,15 @@ class AuthenticationStore(
// No store found
if (!storePath.exists()) return emptyMap()
// Parse JSON document
val root = try {
json.parseToJsonElement(storePath.readText()).jsonObject
} catch (e: SerializationException) {
Timber.e(e, "Unable to read JSON")
JsonObject(emptyMap())
}
// Check for version
val root = json.parseToJsonElement(storePath.readText()).jsonObject
return when (root["version"]?.jsonPrimitive?.intOrNull) {
1 -> json.decodeFromJsonElement<Map<UUID, AuthenticationStoreServer>>(root["servers"]!!)
null -> {
@@ -87,10 +102,6 @@ class AuthenticationStore(
return save()
}
fun containsServer(server: UUID): Boolean = server in store
fun containsUser(server: UUID, user: UUID): Boolean = server in store && user in store[server]!!.users
/**
* Removes the server and stored users from the credential store.
*/

View File

@@ -0,0 +1,31 @@
package org.jellyfin.androidtv.auth.ui
import android.content.Intent
import androidx.fragment.app.FragmentActivity
import org.jellyfin.androidtv.auth.repository.SessionRepository
import org.jellyfin.androidtv.auth.repository.UserRepository
import org.jellyfin.androidtv.ui.startup.StartupActivity
import org.koin.android.ext.android.inject
import timber.log.Timber
/**
* Extension function to check authentication. Should be called in [FragmentActivity.onCreate] and
* [FragmentActivity.onResume]. It validates the current session and opens the authentication screen
* when no session is found.
*
* @return whether to proceed creating the activity or not. When `false` is returned the
* [FragmentActivity.finish] function is automatically called.
*/
fun FragmentActivity.validateAuthentication(): Boolean {
val sessionRepository by inject<SessionRepository>()
val userRepository by inject<UserRepository>()
if (sessionRepository.currentSession.value == null || userRepository.currentUser.value == null) {
Timber.w("Activity ${this::class.qualifiedName} started without a session, bouncing to StartupActivity")
startActivity(Intent(this, StartupActivity::class.java))
finish()
return false
}
return true
}

View File

@@ -1,12 +0,0 @@
package org.jellyfin.androidtv.constant;
public enum ChangeTriggerType {
LibraryUpdated,
MoviePlayback,
TvPlayback,
GuideNeedsLoad,
MusicPlayback,
Always,
VideoQueueChange,
FavoriteUpdate
}

View File

@@ -0,0 +1,12 @@
package org.jellyfin.androidtv.constant
enum class ChangeTriggerType {
LibraryUpdated,
MoviePlayback,
TvPlayback,
GuideNeedsLoad,
MusicPlayback,
Always,
VideoQueueChange,
FavoriteUpdate,
}

View File

@@ -0,0 +1,84 @@
package org.jellyfin.androidtv.constant
object Codec {
object Container {
@Suppress("ObjectPropertyName", "ObjectPropertyNaming")
const val `3GP` = "3gp"
const val ASF = "asf"
const val AVI = "avi"
const val DVR_MS = "dvr-ms"
const val M2V = "m2v"
const val M4V = "m4v"
const val MKV = "mkv"
const val MOV = "mov"
const val MP3 = "mp3"
const val MP4 = "mp4"
const val MPEG = "mpeg"
const val MPEGTS = "mpegts"
const val MPG = "mpg"
const val OGM = "ogm"
const val OGV = "ogv"
const val TS = "ts"
const val VOB = "vob"
const val WEBM = "webm"
const val WMV = "wmv"
const val WTV = "wtv"
const val XVID = "xvid"
}
object Audio {
const val AAC = "aac"
const val AAC_LATM = "aac_latm"
const val AC3 = "ac3"
const val ALAC = "alac"
const val APE = "ape"
const val DCA = "dca"
const val DTS = "dts"
const val EAC3 = "eac3"
const val FLAC = "flac"
const val MLP = "mlp"
const val MP2 = "mp2"
const val MP3 = "mp3"
const val MPA = "mpa"
const val OGA = "oga"
const val OGG = "ogg"
const val OPUS = "opus"
const val PCM = "pcm"
const val PCM_ALAW = "pcm_alaw"
const val PCM_MULAW = "pcm_mulaw"
const val PCM_S16LE = "pcm_s16le"
const val PCM_S24LE = "pcm_s24le"
const val TRUEHD = "truehd"
const val WAV = "wav"
const val WEBMA = "webma"
const val WMA = "wma"
const val WMAV2 = "wmav2"
}
object Video {
const val H264 = "h264"
const val HEVC = "hevc"
const val MPEG = "mpeg"
const val MPEG2VIDEO = "mpeg2video"
const val VP8 = "vp8"
const val VP9 = "vp9"
}
object Subtitle {
const val ASS = "ass"
const val DVBSUB = "dvbsub"
const val DVDSUB = "dvdsub"
const val IDX = "idx"
const val PGS = "pgs"
const val PGSSUB = "pgssub"
const val SMI = "smi"
const val SRT = "srt"
const val SSA = "ssa"
const val SUB = "sub"
const val SUBRIP = "subrip"
const val VTT = "vtt"
const val SMIL = "smil"
const val TTML = "ttml"
const val WEBVTT = "webvtt"
}
}

View File

@@ -1,37 +0,0 @@
package org.jellyfin.androidtv.constant;
public class CodecTypes {
/* Audio Codec Types */
public static final String AAC = "aac";
public static final String AAC_LATM = "aac_latm";
public static final String AC3 = "ac3";
public static final String APE = "ape";
public static final String DCA = "dca";
public static final String DTS = "dts";
public static final String EAC3 = "eac3";
public static final String FLAC = "flac";
public static final String MP2 = "mp2";
public static final String MP3 = "mp3";
public static final String MPA = "mpa";
public static final String OPUS = "opus";
public static final String PCM = "pcm";
public static final String PCM_S16LE = "PCM_S16LE";
public static final String PCM_S24LE = "PCM_S24LE";
public static final String TRUEHD = "truehd";
public static final String VORBIS = "vorbis";
public static final String WAV = "wav";
public static final String WMA = "wma";
public static final String WMAV2 = "wmav2";
/* Video Codec Types */
public static final String AVC = "avc";
public static final String H264 = "h264";
public static final String H265 = "h265";
public static final String HEVC = "hevc";
public static final String MPEG2 = "mpeg2";
public static final String MPEG2VIDEO = "mpeg2video";
public static final String MPEG4 = "mpeg4";
public static final String VP8 = "vp8";
public static final String VP9 = "vp9";
public static final String VPX = "vpx";
}

View File

@@ -1,29 +0,0 @@
package org.jellyfin.androidtv.constant;
public class ContainerTypes {
public static final String _3GP = "3gp";
public static final String _3GPP = "3gpp";
public static final String ASF = "asf";
public static final String AVI = "avi";
public static final String DVR_MS = "dvr-ms";
public static final String M2TS = "m2ts";
public static final String M2V = "m2v";
public static final String M4V = "m4v";
public static final String MKV = "mkv";
public static final String MOV = "mov";
public static final String MP4 = "mp4";
public static final String MPEG = "mpeg";
public static final String MPEGTS = "mpegts";
public static final String MPG = "mpg";
public static final String OGA = "oga";
public static final String OGG = "ogg";
public static final String OGM = "ogm";
public static final String OGV = "ogv";
public static final String TS = "ts";
public static final String VOB = "vob";
public static final String WEBM = "webm";
public static final String WEBMA = "webma";
public static final String WMV = "wmv";
public static final String WTV = "wtv";
public static final String XVID = "xvid";
}

View File

@@ -1,8 +0,0 @@
package org.jellyfin.androidtv.constant;
public enum CustomMessage {
RefreshCurrentItem,
RemoveCurrentItem,
ActionComplete,
RefreshRows
}

View File

@@ -0,0 +1,6 @@
package org.jellyfin.androidtv.constant
sealed interface CustomMessage {
object RefreshCurrentItem : CustomMessage
object ActionComplete : CustomMessage
}

View File

@@ -1,6 +1,6 @@
package org.jellyfin.androidtv.constant
object Extras {
const val Folder = "Folder"
const val IncludeType = "IncludeType"
const val Folder = "folder"
const val IncludeType = "type_include"
}

View File

@@ -14,9 +14,5 @@ enum class GridDirection {
* Vertical.
*/
@EnumDisplayOptions(R.string.grid_direction_vertical)
VERTICAL;
companion object {
fun getGridDirection(direction: String?) = values().firstOrNull { it.name == direction }
}
VERTICAL,
}

View File

@@ -1,22 +1,44 @@
package org.jellyfin.androidtv.constant
import org.jellyfin.androidtv.R
import org.jellyfin.androidtv.ui.preference.dsl.EnumDisplayOptions
import org.jellyfin.preference.PreferenceEnum
/**
* All possible homesections, synced with jellyfin-web
* All possible homesections, "synced" with jellyfin-web.
*
* https://github.com/jellyfin/jellyfin-web/blob/master/src/components/homesections/homesections.js
*/
enum class HomeSectionType(
val id: String
) {
override val serializedName: String
) : PreferenceEnum {
@EnumDisplayOptions(R.string.home_section_latest_media)
LATEST_MEDIA("latestmedia"),
LIBRARY_TILES_SMALL("smalllibrarytiles"),
LIBRARY_BUTTONS("librarybuttons"),
RESUME("resume"),
RESUME_AUDIO("resumeaudio"),
ACTIVE_RECORDINGS("activerecordings"),
NEXT_UP("nextup"),
LIVE_TV("livetv"),
NONE("none");
companion object {
fun getById(id: String) = values().firstOrNull { it.id == id }
}
@EnumDisplayOptions(R.string.home_section_library)
LIBRARY_TILES_SMALL("smalllibrarytiles"),
@EnumDisplayOptions(R.string.home_section_library_small)
LIBRARY_BUTTONS("librarybuttons"),
@EnumDisplayOptions(R.string.home_section_resume)
RESUME("resume"),
@EnumDisplayOptions(R.string.home_section_resume_audio)
RESUME_AUDIO("resumeaudio"),
@EnumDisplayOptions(R.string.home_section_resume_book)
RESUME_BOOK("resumebook"),
@EnumDisplayOptions(R.string.home_section_active_recordings)
ACTIVE_RECORDINGS("activerecordings"),
@EnumDisplayOptions(R.string.home_section_next_up)
NEXT_UP("nextup"),
@EnumDisplayOptions(R.string.home_section_livetv)
LIVE_TV("livetv"),
@EnumDisplayOptions(R.string.home_section_none)
NONE("none"),
}

View File

@@ -1,7 +0,0 @@
package org.jellyfin.androidtv.constant;
public class ImageType {
public static final String DEFAULT = "0";
public static final String THUMB = "1";
public static final String BANNER = "2";
}

View File

@@ -0,0 +1,24 @@
package org.jellyfin.androidtv.constant
import org.jellyfin.androidtv.R
import org.jellyfin.androidtv.ui.preference.dsl.EnumDisplayOptions
enum class ImageType {
/**
* Poster.
*/
@EnumDisplayOptions(R.string.image_type_poster)
POSTER,
/**
* Thumbnail.
*/
@EnumDisplayOptions(R.string.image_type_thumbnail)
THUMB,
/**
* Banner.
*/
@EnumDisplayOptions(R.string.image_type_banner)
BANNER
}

View File

@@ -0,0 +1,8 @@
package org.jellyfin.androidtv.constant
object LiveTvOption {
const val LIVE_TV_GUIDE_OPTION_ID = 1000
const val LIVE_TV_RECORDINGS_OPTION_ID = 2000
const val LIVE_TV_SCHEDULE_OPTION_ID = 4000
const val LIVE_TV_SERIES_OPTION_ID = 5000
}

View File

@@ -1,5 +0,0 @@
package org.jellyfin.androidtv.constant;
public class MediaTypes {
public static final String HLS = "hls";
}

View File

@@ -1,8 +0,0 @@
package org.jellyfin.androidtv.constant;
public class PosterSize {
public static final String AUTO = "0";
public static final String SMALL = "1";
public static final String MED = "2";
public static final String LARGE = "3";
}

View File

@@ -0,0 +1,35 @@
package org.jellyfin.androidtv.constant
import org.jellyfin.androidtv.R
import org.jellyfin.androidtv.ui.preference.dsl.EnumDisplayOptions
enum class PosterSize {
/**
* Smallest.
*/
@EnumDisplayOptions(R.string.image_size_smallest)
SMALLEST,
/**
* Small.
*/
@EnumDisplayOptions(R.string.image_size_small)
SMALL,
/**
* Medium.
*/
@EnumDisplayOptions(R.string.image_size_medium)
MED,
/**
* Large.
*/
@EnumDisplayOptions(R.string.image_size_large)
LARGE,
/**
* Extra Large.
*/
@EnumDisplayOptions(R.string.image_size_xlarge)
X_LARGE
}

View File

@@ -0,0 +1,27 @@
package org.jellyfin.androidtv.constant
import android.content.Context
import org.jellyfin.androidtv.R
@Suppress("MagicNumber")
private val qualityOptions = setOf(
0.0, // auto
120.0, 110.0, 100.0, // 100 >=
90.0, 80.0, 70.0, 60.0, 50.0, 40.0, 30.0, 20.0, 15.0, 10.0, // 10 >=
5.0, 3.0, 2.0, 1.0, // 1 >=
0.72, 0.42 // 0 >=
)
@Suppress("MagicNumber")
fun getQualityProfiles(
context: Context
): Map<String, String> = qualityOptions.associate {
val value = when {
it == 0.0 -> context.getString(R.string.bitrate_auto)
it >= 1.0 -> context.getString(R.string.bitrate_mbit, it)
else -> context.getString(R.string.bitrate_kbit, it * 1000.0)
}
it.toString().removeSuffix(".0") to value
}

View File

@@ -1,31 +0,0 @@
package org.jellyfin.androidtv.constant;
public enum QueryType {
Items,
NextUp,
Views,
Season,
Upcoming,
SimilarSeries,
SimilarMovies,
StaticPeople,
StaticChapters,
StaticServers,
Users,
Search,
Specials,
Trailers,
LiveTvChannel,
LiveTvProgram,
LiveTvRecording,
LiveTvRecordingGroup,
StaticItems,
Persons,
StaticAudioQueueItems,
AlbumArtists,
AudioPlaylists,
ContinueWatching,
LatestItems,
SeriesTimer,
Premieres
}

View File

@@ -0,0 +1,29 @@
package org.jellyfin.androidtv.constant
enum class QueryType {
Items,
NextUp,
Views,
Season,
Upcoming,
SimilarSeries,
SimilarMovies,
StaticPeople,
StaticChapters,
Search,
Specials,
AdditionalParts,
Trailers,
LiveTvChannel,
LiveTvProgram,
LiveTvRecording,
StaticItems,
Persons,
StaticAudioQueueItems,
AlbumArtists,
AudioPlaylists,
LatestItems,
SeriesTimer,
Premieres,
Resume,
}

View File

@@ -1,6 +0,0 @@
package org.jellyfin.androidtv.constant;
public class ViewType {
public static final String SMART = "0";
public static final String GRID = "1";
}

View File

@@ -1,196 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import java.util.ArrayList;
import org.jellyfin.apiclient.model.dlna.DeviceProfile;
import org.jellyfin.apiclient.model.dlna.EncodingContext;
import org.jellyfin.apiclient.model.dto.MediaSourceInfo;
/**
* Class AudioOptions.
*
* @deprecated
*/
@Deprecated
public class AudioOptions {
public AudioOptions() {
setContext(EncodingContext.Streaming);
setEnableDirectPlay(true);
setEnableDirectStream(true);
}
private boolean EnableDirectPlay;
public final boolean getEnableDirectPlay() {
return EnableDirectPlay;
}
public final void setEnableDirectPlay(boolean value) {
EnableDirectPlay = value;
}
private boolean EnableDirectStream;
public final boolean getEnableDirectStream() {
return EnableDirectStream;
}
public final void setEnableDirectStream(boolean value) {
EnableDirectStream = value;
}
private boolean ForceDirectPlay;
public final boolean getForceDirectPlay() {
return ForceDirectPlay;
}
public final void setForceDirectPlay(boolean value) {
ForceDirectPlay = value;
}
private boolean ForceDirectStream;
public final boolean getForceDirectStream() {
return ForceDirectStream;
}
public final void setForceDirectStream(boolean value) {
ForceDirectStream = value;
}
private String ItemId;
public final String getItemId() {
return ItemId;
}
public final void setItemId(String value) {
ItemId = value;
}
private ArrayList<MediaSourceInfo> MediaSources;
public final ArrayList<MediaSourceInfo> getMediaSources() {
return MediaSources;
}
public final void setMediaSources(ArrayList<MediaSourceInfo> value) {
MediaSources = value;
}
private DeviceProfile Profile;
public final DeviceProfile getProfile() {
return Profile;
}
public final void setProfile(DeviceProfile value) {
Profile = value;
}
/**
* Optional. Only needed if a specific AudioStreamIndex or SubtitleStreamIndex are requested.
*/
private String MediaSourceId;
public final String getMediaSourceId() {
return MediaSourceId;
}
public final void setMediaSourceId(String value) {
MediaSourceId = value;
}
private String DeviceId;
public final String getDeviceId() {
return DeviceId;
}
public final void setDeviceId(String value) {
DeviceId = value;
}
/**
* Allows an override of supported number of audio channels
* Example: DeviceProfile supports five channel, but user only has stereo speakers
*/
private Integer MaxAudioChannels = null;
public final Integer getMaxAudioChannels() {
return MaxAudioChannels;
}
public final void setMaxAudioChannels(Integer value) {
MaxAudioChannels = value;
}
/**
* The application's configured quality setting
*/
private Integer MaxBitrate = null;
public final Integer getMaxBitrate() {
return MaxBitrate;
}
public final void setMaxBitrate(Integer value) {
MaxBitrate = value;
}
/**
* Gets or sets the context.
*
* <value>The context.</value>
*/
private EncodingContext Context = EncodingContext.values()[0];
public final EncodingContext getContext() {
return Context;
}
public final void setContext(EncodingContext value) {
Context = value;
}
/**
* Gets or sets the audio transcoding bitrate.
*
* <value>The audio transcoding bitrate.</value>
*/
private Integer AudioTranscodingBitrate = null;
public final Integer getAudioTranscodingBitrate() {
return AudioTranscodingBitrate;
}
public final void setAudioTranscodingBitrate(Integer value) {
AudioTranscodingBitrate = value;
}
/**
* Gets the maximum bitrate.
*
* @return System.Nullable&lt;System.Int32&gt;.
*/
public final Integer GetMaxBitrate(boolean isAudio) {
if (getMaxBitrate() != null) {
return getMaxBitrate();
}
if (getProfile() != null) {
if (getContext() == EncodingContext.Static) {
if (isAudio && getProfile().getMaxStaticMusicBitrate() != null) {
return getProfile().getMaxStaticMusicBitrate();
}
return getProfile().getMaxStaticBitrate();
}
return getProfile().getMaxStreamingBitrate();
}
return null;
}
}

View File

@@ -0,0 +1,31 @@
package org.jellyfin.androidtv.data.compat
import org.jellyfin.apiclient.model.dlna.DeviceProfile
import org.jellyfin.apiclient.model.dlna.EncodingContext
import org.jellyfin.sdk.model.api.MediaSourceInfo
open class AudioOptions {
var enableDirectPlay = true
var enableDirectStream = true
var itemId: String? = null
var mediaSources: List<MediaSourceInfo>? = null
var profile: DeviceProfile? = null
/**
* Optional. Only needed if a specific AudioStreamIndex or SubtitleStreamIndex are requested.
*/
var mediaSourceId: String? = null
/**
* Allows an override of supported number of audio channels
* Example: DeviceProfile supports five channel, but user only has stereo speakers
*/
var maxAudioChannels: Int? = null
/**
* The application's configured quality setting
*/
var maxBitrate: Int? = null
var context = EncodingContext.Streaming
}

View File

@@ -1,13 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import java.util.Comparator;
@Deprecated
public abstract class BaseStreamInfoSorter implements Comparator<StreamInfo> {
protected abstract int getValue(StreamInfo info);
@Override
public int compare(StreamInfo lhs, StreamInfo rhs) {
return Integer.compare(getValue(lhs), getValue(rhs));
}
}

View File

@@ -1,30 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@Deprecated
public class ChainedComparator<T> implements Comparator<T> {
private List<Comparator<T>> simpleComparators;
public ChainedComparator(Comparator<T>... simpleComparators) {
List<Comparator<T>> list = new ArrayList<>();
for (Comparator<T> comparator : simpleComparators) {
list.add(comparator);
}
this.simpleComparators = list;
}
public int compare(T o1, T o2) {
for (Comparator<T> comparator : simpleComparators) {
int result = comparator.compare(o1, o2);
if (result != 0) {
return result;
}
}
return 0;
}
}

View File

@@ -1,82 +0,0 @@
package org.jellyfin.androidtv.data.compat;
/**
* Class DrawingUtils
*
* @deprecated
*/
@Deprecated
public final class DrawingUtils {
/**
* Resizes a set of dimensions
*
* @param size The original size object
* @param width A new fixed width, if desired
* @param height A new fixed height, if desired
* @param maxWidth A max fixed width, if desired
* @param maxHeight A max fixed height, if desired
* @return A new size object
*/
public static ImageSize Resize(ImageSize size, Double width, Double height, Double maxWidth, Double maxHeight) {
double newWidth = size.getWidth();
double newHeight = size.getHeight();
if (width != null && height != null) {
newWidth = width;
newHeight = height;
} else if (height != null) {
newWidth = GetNewWidth(newHeight, newWidth, height);
newHeight = height;
} else if (width != null) {
newHeight = GetNewHeight(newHeight, newWidth, width);
newWidth = width;
}
if (maxHeight != null && maxHeight < newHeight) {
newWidth = GetNewWidth(newHeight, newWidth, maxHeight);
newHeight = maxHeight;
}
if (maxWidth != null && maxWidth < newWidth) {
newHeight = GetNewHeight(newHeight, newWidth, maxWidth);
newWidth = maxWidth;
}
ImageSize tempVar = new ImageSize();
tempVar.setWidth(newWidth);
tempVar.setHeight(newHeight);
return tempVar;
}
/**
* Gets the new width.
*
* @param currentHeight Height of the current.
* @param currentWidth Width of the current.
* @param newHeight The new height.
* @return System.Double.
*/
private static double GetNewWidth(double currentHeight, double currentWidth, double newHeight) {
double scaleFactor = newHeight;
scaleFactor /= currentHeight;
scaleFactor *= currentWidth;
return scaleFactor;
}
/**
* Gets the new height.
*
* @param currentHeight Height of the current.
* @param currentWidth Width of the current.
* @param newWidth The new width.
* @return System.Double.
*/
private static double GetNewHeight(double currentHeight, double currentWidth, double newWidth) {
double scaleFactor = newWidth;
scaleFactor /= currentWidth;
scaleFactor *= currentHeight;
return scaleFactor;
}
}

View File

@@ -1,93 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import org.jellyfin.androidtv.util.Utils;
import timber.log.Timber;
/**
* Struct ImageSize
*
* @deprecated
*/
//C# TO JAVA CONVERTER WARNING: Java does not allow user-defined value types. The behavior of this class will differ from the original:
//ORIGINAL LINE: public struct ImageSize
@Deprecated
public final class ImageSize {
private double _height;
private double _width;
/**
* Gets or sets the height.
*
* <value>The height.</value>
*/
public double getHeight() {
return _height;
}
public void setHeight(double value) {
_height = value;
}
/**
* Gets or sets the width.
*
* <value>The width.</value>
*/
public double getWidth() {
return _width;
}
public void setWidth(double value) {
_width = value;
}
public boolean equals(ImageSize size) {
return (Double.valueOf(getWidth())).equals(size.getWidth()) && (Double.valueOf(getHeight())).equals(size.getHeight());
}
@Override
public String toString() {
return String.format("%1$s-%2$s", getWidth(), getHeight());
}
public ImageSize() {
}
public ImageSize(String value) {
_width = 0;
_height = 0;
ParseValue(value);
}
public ImageSize(int width, int height) {
_width = width;
_height = height;
}
private void ParseValue(String value) {
if (Utils.isNonEmpty(value)) {
String[] parts = value.split("[-]", -1);
if (parts.length == 2) {
try {
_width = Double.parseDouble(parts[0]);
_height = Double.parseDouble(parts[1]);
} catch (NumberFormatException ex) {
Timber.e(ex, "Could not parse width and height");
}
}
}
}
public ImageSize clone() {
ImageSize varCopy = new ImageSize();
varCopy._height = this._height;
varCopy._width = this._width;
return varCopy;
}
}

View File

@@ -1,16 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import org.jellyfin.apiclient.model.dlna.PlaybackErrorCode;
@Deprecated
public class PlaybackException extends RuntimeException {
private PlaybackErrorCode ErrorCode = PlaybackErrorCode.values()[0];
public final PlaybackErrorCode getErrorCode() {
return ErrorCode;
}
public final void setErrorCode(PlaybackErrorCode value) {
ErrorCode = value;
}
}

View File

@@ -0,0 +1,7 @@
package org.jellyfin.androidtv.data.compat
import org.jellyfin.apiclient.model.dlna.PlaybackErrorCode
class PlaybackException : RuntimeException() {
var errorCode = PlaybackErrorCode.NotAllowed
}

View File

@@ -1,31 +1,21 @@
package org.jellyfin.androidtv.data.compat;
import org.jellyfin.androidtv.constant.ContainerTypes;
import org.jellyfin.androidtv.constant.MediaTypes;
import org.jellyfin.androidtv.util.Utils;
import java.util.ArrayList;
import org.jellyfin.apiclient.model.dlna.DeviceProfile;
import org.jellyfin.apiclient.model.dlna.DlnaProfileType;
import org.jellyfin.apiclient.model.dlna.EncodingContext;
import org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod;
import org.jellyfin.apiclient.model.dlna.SubtitleProfile;
import org.jellyfin.apiclient.model.dlna.TranscodeSeekInfo;
import org.jellyfin.apiclient.model.dto.MediaSourceInfo;
import org.jellyfin.apiclient.model.dto.NameValuePair;
import org.jellyfin.apiclient.model.entities.MediaStream;
import org.jellyfin.apiclient.model.entities.MediaStreamType;
import org.jellyfin.apiclient.model.mediainfo.MediaProtocol;
import org.jellyfin.apiclient.model.mediainfo.TransportStreamTimestamp;
import org.jellyfin.apiclient.model.session.PlayMethod;
import org.jellyfin.sdk.model.api.MediaProtocol;
import org.jellyfin.sdk.model.api.MediaSourceInfo;
import org.jellyfin.sdk.model.api.MediaStream;
import org.jellyfin.sdk.model.api.MediaStreamType;
import java.util.ArrayList;
/**
* Class StreamInfo.
*
* @deprecated
*/
@Deprecated
public class StreamInfo {
private static final String START_TIME_TICKS = "StartTimeTicks";
private static final String SUBTITLE_STREAM_INDEX = "SubtitleStreamIndex";
@@ -95,16 +85,6 @@ public class StreamInfo {
Container = value;
}
private String SubProtocol;
public final String getSubProtocol() {
return SubProtocol;
}
public final void setSubProtocol(String value) {
SubProtocol = value;
}
private long StartPositionTicks;
public final long getStartPositionTicks() {
@@ -115,56 +95,6 @@ public class StreamInfo {
StartPositionTicks = value;
}
private String VideoCodec;
public final String getVideoCodec() {
return VideoCodec;
}
public final void setVideoCodec(String value) {
VideoCodec = value;
}
private String VideoProfile;
public final String getVideoProfile() {
return VideoProfile;
}
public final void setVideoProfile(String value) {
VideoProfile = value;
}
private boolean CopyTimestamps;
public final boolean getCopyTimestamps() {
return CopyTimestamps;
}
public final void setCopyTimestamps(boolean value) {
CopyTimestamps = value;
}
private boolean ForceLiveStream;
public final boolean getForceLiveStream() {
return ForceLiveStream;
}
public final void setForceLiveStream(boolean value) {
ForceLiveStream = value;
}
private boolean EnableSubtitlesInManifest;
public final boolean getEnableSubtitlesInManifest() {
return EnableSubtitlesInManifest;
}
public final void setEnableSubtitlesInManifest(boolean value) {
EnableSubtitlesInManifest = value;
}
private String[] AudioCodecs;
public final String[] getAudioCodecs() {
@@ -175,126 +105,6 @@ public class StreamInfo {
AudioCodecs = value;
}
private Integer AudioStreamIndex = null;
public final Integer getAudioStreamIndex() {
return AudioStreamIndex;
}
public final void setAudioStreamIndex(Integer value) {
AudioStreamIndex = value;
}
private Integer SubtitleStreamIndex = null;
public final Integer getSubtitleStreamIndex() {
return SubtitleStreamIndex;
}
public final void setSubtitleStreamIndex(Integer value) {
SubtitleStreamIndex = value;
}
private Integer TranscodingMaxAudioChannels = null;
public final Integer getTranscodingMaxAudioChannels() {
return TranscodingMaxAudioChannels;
}
public final void setTranscodingMaxAudioChannels(Integer value) {
TranscodingMaxAudioChannels = value;
}
private Integer MaxAudioChannels = null;
public final Integer getMaxAudioChannels() {
return MaxAudioChannels;
}
public final void setMaxAudioChannels(Integer value) {
MaxAudioChannels = value;
}
private Integer AudioBitrate = null;
public final Integer getAudioBitrate() {
return AudioBitrate;
}
public final void setAudioBitrate(Integer value) {
AudioBitrate = value;
}
private Integer VideoBitrate = null;
public final Integer getVideoBitrate() {
return VideoBitrate;
}
public final void setVideoBitrate(Integer value) {
VideoBitrate = value;
}
private Integer VideoLevel = null;
public final Integer getVideoLevel() {
return VideoLevel;
}
public final void setVideoLevel(Integer value) {
VideoLevel = value;
}
private Integer MaxWidth = null;
public final Integer getMaxWidth() {
return MaxWidth;
}
public final void setMaxWidth(Integer value) {
MaxWidth = value;
}
private Integer MaxHeight = null;
public final Integer getMaxHeight() {
return MaxHeight;
}
public final void setMaxHeight(Integer value) {
MaxHeight = value;
}
private Integer MaxVideoBitDepth = null;
public final Integer getMaxVideoBitDepth() {
return MaxVideoBitDepth;
}
public final void setMaxVideoBitDepth(Integer value) {
MaxVideoBitDepth = value;
}
private Integer MaxRefFrames = null;
public final Integer getMaxRefFrames() {
return MaxRefFrames;
}
public final void setMaxRefFrames(Integer value) {
MaxRefFrames = value;
}
private Float MaxFramerate = null;
public final Float getMaxFramerate() {
return MaxFramerate;
}
public final void setMaxFramerate(Float value) {
MaxFramerate = value;
}
private DeviceProfile DeviceProfile;
public final DeviceProfile getDeviceProfile() {
@@ -305,16 +115,6 @@ public class StreamInfo {
DeviceProfile = value;
}
private String DeviceProfileId;
public final String getDeviceProfileId() {
return DeviceProfileId;
}
public final void setDeviceProfileId(String value) {
DeviceProfileId = value;
}
private String DeviceId;
public final String getDeviceId() {
@@ -341,20 +141,6 @@ public class StreamInfo {
return TranscodeSeekInfo;
}
public final void setTranscodeSeekInfo(TranscodeSeekInfo value) {
TranscodeSeekInfo = value;
}
private boolean EstimateContentLength;
public final boolean getEstimateContentLength() {
return EstimateContentLength;
}
public final void setEstimateContentLength(boolean value) {
EstimateContentLength = value;
}
private MediaSourceInfo MediaSource;
public final MediaSourceInfo getMediaSource() {
@@ -371,20 +157,6 @@ public class StreamInfo {
return SubtitleDeliveryMethod;
}
public final void setSubtitleDeliveryMethod(SubtitleDeliveryMethod value) {
SubtitleDeliveryMethod = value;
}
private String SubtitleFormat;
public final String getSubtitleFormat() {
return SubtitleFormat;
}
public final void setSubtitleFormat(String value) {
SubtitleFormat = value;
}
private String PlaySessionId;
public final String getPlaySessionId() {
@@ -395,16 +167,6 @@ public class StreamInfo {
PlaySessionId = value;
}
private ArrayList<MediaSourceInfo> AllMediaSources;
public final ArrayList<MediaSourceInfo> getAllMediaSources() {
return AllMediaSources;
}
public final void setAllMediaSources(ArrayList<MediaSourceInfo> value) {
AllMediaSources = value;
}
public final String getMediaSourceId() {
return getMediaSource() == null ? null : getMediaSource().getId();
}
@@ -413,7 +175,7 @@ public class StreamInfo {
return getPlayMethod() == PlayMethod.DirectStream || getPlayMethod() == PlayMethod.DirectPlay;
}
public final String ToUrl(String baseUrl, String accessToken) {
public final String toUrl(String baseUrl, String accessToken) {
if (!Utils.isEmpty(getMediaUrl())) {
return getMediaUrl();
}
@@ -427,7 +189,7 @@ public class StreamInfo {
}
ArrayList<String> list = new ArrayList<String>();
for (NameValuePair pair : BuildParams(this, accessToken, false)) {
for (NameValuePair pair : buildParams(this, accessToken, false)) {
if (Utils.isEmpty(pair.getValue())) {
continue;
}
@@ -448,19 +210,10 @@ public class StreamInfo {
String queryString = Utils.join("&", list);
return GetUrl(baseUrl, queryString);
return getUrl(baseUrl, queryString);
}
public final String ToDlnaUrl(String baseUrl, String accessToken) {
if (getPlayMethod() == PlayMethod.DirectPlay) {
return getMediaSource().getPath();
}
String dlnaCommand = BuildDlnaParam(this, accessToken);
return GetUrl(baseUrl, dlnaCommand);
}
private String GetUrl(String baseUrl, String queryString) {
private String getUrl(String baseUrl, String queryString) {
if (Utils.isEmpty(baseUrl)) {
throw new IllegalArgumentException(baseUrl);
}
@@ -471,66 +224,41 @@ public class StreamInfo {
baseUrl = baseUrl.replaceAll("[/]+$", "");
if (getMediaType() == DlnaProfileType.Audio) {
if (MediaTypes.HLS.equalsIgnoreCase(getSubProtocol())) {
return String.format("%1$s/audio/%2$s/master.m3u8?%3$s", baseUrl, getItemId(), queryString);
}
return String.format("%1$s/audio/%2$s/stream%3$s?%4$s", baseUrl, getItemId(), extension, queryString);
}
if (MediaTypes.HLS.equalsIgnoreCase(getSubProtocol())) {
return String.format("%1$s/videos/%2$s/master.m3u8?%3$s", baseUrl, getItemId(), queryString);
}
return String.format("%1$s/videos/%2$s/stream%3$s?%4$s", baseUrl, getItemId(), extension, queryString);
}
private static String BuildDlnaParam(StreamInfo item, String accessToken) {
ArrayList<String> list = new ArrayList<String>();
for (NameValuePair pair : BuildParams(item, accessToken, true)) {
list.add(pair.getValue());
}
return String.format("Params=%1$s", Utils.join(";", list));
}
private static ArrayList<NameValuePair> BuildParams(StreamInfo item, String accessToken, boolean isDlna) {
private static ArrayList<NameValuePair> buildParams(StreamInfo item, String accessToken, boolean isDlna) {
ArrayList<NameValuePair> list = new ArrayList<NameValuePair>();
String audioCodecs = item.getAudioCodecs().length == 0 ? "" : Utils.join(",", item.getAudioCodecs());
String tempVar = item.getDeviceProfileId();
list.add(new NameValuePair("DeviceProfileId", (tempVar != null) ? tempVar : ""));
list.add(new NameValuePair("DeviceProfileId", ""));
String tempVar2 = item.getDeviceId();
list.add(new NameValuePair("DeviceId", (tempVar2 != null) ? tempVar2 : ""));
String tempVar3 = item.getMediaSourceId();
list.add(new NameValuePair("MediaSourceId", (tempVar3 != null) ? tempVar3 : ""));
list.add(new NameValuePair(STATIC, Boolean.valueOf(item.getIsDirectStream()).toString().toLowerCase()));
String tempVar4 = item.getVideoCodec();
list.add(new NameValuePair("VideoCodec", (tempVar4 != null) ? tempVar4 : ""));
list.add(new NameValuePair("VideoCodec", ""));
list.add(new NameValuePair("AudioCodec", audioCodecs));
list.add(new NameValuePair("AudioStreamIndex", item.getAudioStreamIndex() != null ? String.valueOf(item.getAudioStreamIndex()) : ""));
list.add(new NameValuePair("SubtitleStreamIndex", item.getSubtitleStreamIndex() != null && item.getSubtitleDeliveryMethod() != org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod.External ? String.valueOf(item.getSubtitleStreamIndex()) : ""));
list.add(new NameValuePair("VideoBitrate", item.getVideoBitrate() != null ? String.valueOf(item.getVideoBitrate()) : ""));
list.add(new NameValuePair("AudioBitrate", item.getAudioBitrate() != null ? String.valueOf(item.getAudioBitrate()) : ""));
list.add(new NameValuePair("MaxAudioChannels", item.getMaxAudioChannels() != null ? String.valueOf(item.getMaxAudioChannels()) : ""));
list.add(new NameValuePair("MaxFramerate", item.getMaxFramerate() != null ? String.valueOf(item.getMaxFramerate()) : ""));
list.add(new NameValuePair("MaxWidth", item.getMaxWidth() != null ? String.valueOf(item.getMaxWidth()) : ""));
list.add(new NameValuePair("MaxHeight", item.getMaxHeight() != null ? String.valueOf(item.getMaxHeight()) : ""));
list.add(new NameValuePair("AudioStreamIndex", ""));
list.add(new NameValuePair("SubtitleStreamIndex", ""));
list.add(new NameValuePair("VideoBitrate", ""));
list.add(new NameValuePair("AudioBitrate", ""));
list.add(new NameValuePair("MaxAudioChannels", ""));
list.add(new NameValuePair("MaxFramerate", ""));
list.add(new NameValuePair("MaxWidth", ""));
list.add(new NameValuePair("MaxHeight", ""));
if (MediaTypes.HLS.equalsIgnoreCase(item.getSubProtocol()) && !item.getForceLiveStream()) {
list.add(new NameValuePair(START_TIME_TICKS, ""));
} else {
list.add(new NameValuePair(START_TIME_TICKS, String.valueOf(item.getStartPositionTicks())));
}
list.add(new NameValuePair(START_TIME_TICKS, String.valueOf(item.getStartPositionTicks())));
list.add(new NameValuePair("Level", item.getVideoLevel() != null ? String.valueOf(item.getVideoLevel()) : ""));
list.add(new NameValuePair("Level", ""));
list.add(new NameValuePair("MaxRefFrames", item.getMaxRefFrames() != null ? String.valueOf(item.getMaxRefFrames()) : ""));
list.add(new NameValuePair("MaxVideoBitDepth", item.getMaxVideoBitDepth() != null ? String.valueOf(item.getMaxVideoBitDepth()) : ""));
String tempVar5 = item.getVideoProfile();
list.add(new NameValuePair("Profile", (tempVar5 != null) ? tempVar5 : ""));
list.add(new NameValuePair("MaxRefFrames", ""));
list.add(new NameValuePair("MaxVideoBitDepth", ""));
list.add(new NameValuePair("Profile", ""));
// no longer used
list.add(new NameValuePair("Cabac", ""));
@@ -546,12 +274,12 @@ public class StreamInfo {
list.add(new NameValuePair("ItemId", item.getItemId()));
}
list.add(new NameValuePair("CopyTimestamps", Boolean.valueOf(item.getCopyTimestamps()).toString().toLowerCase()));
list.add(new NameValuePair("ForceLiveStream", Boolean.valueOf(item.getForceLiveStream()).toString().toLowerCase()));
list.add(new NameValuePair("SubtitleMethod", item.getSubtitleStreamIndex() != null && item.getSubtitleDeliveryMethod() != org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod.External ? item.getSubtitleDeliveryMethod().toString() : ""));
list.add(new NameValuePair("CopyTimestamps", "false"));
list.add(new NameValuePair("ForceLiveStream", "false"));
list.add(new NameValuePair("SubtitleMethod", ""));
list.add(new NameValuePair("TranscodingMaxAudioChannels", item.getTranscodingMaxAudioChannels() != null ? String.valueOf(item.getTranscodingMaxAudioChannels()) : ""));
list.add(new NameValuePair("EnableSubtitlesInManifest", Boolean.valueOf(item.getEnableSubtitlesInManifest()).toString().toLowerCase()));
list.add(new NameValuePair("TranscodingMaxAudioChannels", ""));
list.add(new NameValuePair("EnableSubtitlesInManifest", "false"));
String tempVar7 = item.getMediaSource().getETag();
list.add(new NameValuePair("Tag", (tempVar7 != null) ? tempVar7 : ""));
@@ -559,47 +287,22 @@ public class StreamInfo {
return list;
}
public final ArrayList<SubtitleStreamInfo> GetExternalSubtitles(boolean includeSelectedTrackOnly, String baseUrl, String accessToken) {
return GetExternalSubtitles(includeSelectedTrackOnly, false, baseUrl, accessToken);
public final ArrayList<SubtitleStreamInfo> getSubtitleProfiles(boolean includeSelectedTrackOnly, String baseUrl, String accessToken) {
return getSubtitleProfiles(includeSelectedTrackOnly, false, baseUrl, accessToken);
}
public final ArrayList<SubtitleStreamInfo> GetExternalSubtitles(boolean includeSelectedTrackOnly, boolean enableAllProfiles, String baseUrl, String accessToken) {
ArrayList<SubtitleStreamInfo> list = GetSubtitleProfiles(includeSelectedTrackOnly, enableAllProfiles, baseUrl, accessToken);
ArrayList<SubtitleStreamInfo> newList = new ArrayList<SubtitleStreamInfo>();
// First add the selected track
for (SubtitleStreamInfo stream : list) {
if (stream.getDeliveryMethod() == SubtitleDeliveryMethod.External) {
newList.add(stream);
}
}
return newList;
}
public final ArrayList<SubtitleStreamInfo> GetSubtitleProfiles(boolean includeSelectedTrackOnly, String baseUrl, String accessToken) {
return GetSubtitleProfiles(includeSelectedTrackOnly, false, baseUrl, accessToken);
}
public final ArrayList<SubtitleStreamInfo> GetSubtitleProfiles(boolean includeSelectedTrackOnly, boolean enableAllProfiles, String baseUrl, String accessToken) {
public final ArrayList<SubtitleStreamInfo> getSubtitleProfiles(boolean includeSelectedTrackOnly, boolean enableAllProfiles, String baseUrl, String accessToken) {
ArrayList<SubtitleStreamInfo> list = new ArrayList<SubtitleStreamInfo>();
// HLS will preserve timestamps so we can just grab the full subtitle stream
long startPositionTicks = MediaTypes.HLS.equalsIgnoreCase(getSubProtocol()) ? 0 : (getPlayMethod() == PlayMethod.Transcode && !getCopyTimestamps() ? getStartPositionTicks() : 0);
// First add the selected track
if (getSubtitleStreamIndex() != null) {
for (MediaStream stream : getMediaSource().getMediaStreams()) {
if (stream.getType() == MediaStreamType.Subtitle && stream.getIndex() == getSubtitleStreamIndex()) {
AddSubtitleProfiles(list, stream, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
}
}
}
long startPositionTicks = getPlayMethod() == PlayMethod.Transcode ? getStartPositionTicks() : 0;
if (!includeSelectedTrackOnly) {
for (MediaStream stream : getMediaSource().getMediaStreams()) {
if (stream.getType() == MediaStreamType.Subtitle && (getSubtitleStreamIndex() == null || stream.getIndex() != getSubtitleStreamIndex())) {
AddSubtitleProfiles(list, stream, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
if (getMediaSource() == null) return list;
for (org.jellyfin.sdk.model.api.MediaStream stream : getMediaSource().getMediaStreams()) {
if (stream.getType() == org.jellyfin.sdk.model.api.MediaStreamType.SUBTITLE) {
addSubtitleProfiles(list, stream, enableAllProfiles, baseUrl, accessToken, startPositionTicks);
}
}
}
@@ -607,25 +310,23 @@ public class StreamInfo {
return list;
}
private void AddSubtitleProfiles(ArrayList<SubtitleStreamInfo> list, MediaStream stream, boolean enableAllProfiles, String baseUrl, String accessToken, long startPositionTicks) {
private void addSubtitleProfiles(ArrayList<SubtitleStreamInfo> list, org.jellyfin.sdk.model.api.MediaStream stream, boolean enableAllProfiles, String baseUrl, String accessToken, long startPositionTicks) {
if (enableAllProfiles) {
for (SubtitleProfile profile : getDeviceProfile().getSubtitleProfiles()) {
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, new SubtitleProfile[]{profile});
SubtitleStreamInfo info = getSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, new SubtitleProfile[]{profile});
list.add(info);
}
} else {
SubtitleStreamInfo info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, getDeviceProfile().getSubtitleProfiles());
SubtitleStreamInfo info = getSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, getDeviceProfile().getSubtitleProfiles());
list.add(info);
}
}
private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, String baseUrl, String accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles) {
SubtitleProfile subtitleProfile = StreamBuilder.GetSubtitleProfile(stream, subtitleProfiles, getPlayMethod());
private SubtitleStreamInfo getSubtitleStreamInfo(org.jellyfin.sdk.model.api.MediaStream stream, String baseUrl, String accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles) {
SubtitleProfile subtitleProfile = StreamBuilder.getSubtitleProfile(stream, subtitleProfiles, getPlayMethod());
SubtitleStreamInfo tempVar = new SubtitleStreamInfo();
tempVar.setIsForced(stream.getIsForced());
tempVar.setLanguage(stream.getLanguage());
String tempVar2 = stream.getLanguage();
tempVar.setName((tempVar2 != null) ? tempVar2 : "Unknown");
tempVar.setFormat(subtitleProfile.getFormat());
@@ -635,286 +336,28 @@ public class StreamInfo {
SubtitleStreamInfo info = tempVar;
if (info.getDeliveryMethod() == SubtitleDeliveryMethod.External) {
if (getMediaSource().getProtocol() == MediaProtocol.File || !stream.getCodec().equalsIgnoreCase(subtitleProfile.getFormat())) {
if (getMediaSource().getProtocol() == MediaProtocol.FILE || !stream.getCodec().equalsIgnoreCase(subtitleProfile.getFormat())) {
info.setUrl(String.format("%1$s/Videos/%2$s/%3$s/Subtitles/%4$s/%5$s/Stream.%6$s", baseUrl, getItemId(), getMediaSourceId(), String.valueOf(stream.getIndex()), String.valueOf(startPositionTicks), subtitleProfile.getFormat()));
if (!Utils.isEmpty(accessToken)) {
info.setUrl(info.getUrl() + "?api_key=" + accessToken);
}
info.setIsExternalUrl(false);
} else {
info.setUrl(stream.getPath());
info.setIsExternalUrl(true);
}
}
return info;
}
/**
* Returns the audio stream that will be used
*/
public final MediaStream getTargetAudioStream() {
if (getMediaSource() != null) {
return getMediaSource().GetDefaultAudioStream(getAudioStreamIndex());
}
return null;
public final ArrayList<MediaStream> getSelectableAudioStreams() {
return getSelectableStreams(MediaStreamType.AUDIO);
}
/**
* Returns the video stream that will be used
*/
public final MediaStream getTargetVideoStream() {
if (getMediaSource() != null) {
return getMediaSource().getVideoStream();
}
public final ArrayList<org.jellyfin.sdk.model.api.MediaStream> getSelectableStreams(MediaStreamType type) {
ArrayList<org.jellyfin.sdk.model.api.MediaStream> list = new ArrayList<org.jellyfin.sdk.model.api.MediaStream>();
return null;
}
/**
* Predicts the audio sample rate that will be in the output stream
*/
public final Integer getTargetAudioSampleRate() {
MediaStream stream = getTargetAudioStream();
return stream == null ? null : stream.getSampleRate();
}
/**
* Predicts the audio sample rate that will be in the output stream
*/
public final Integer getTargetVideoBitDepth() {
MediaStream stream = getTargetVideoStream();
return stream == null || !getIsDirectStream() ? null : stream.getBitDepth();
}
/**
* Gets the target reference frames.
*
* <value>The target reference frames.</value>
*/
public final Integer getTargetRefFrames() {
MediaStream stream = getTargetVideoStream();
return stream == null || !getIsDirectStream() ? null : stream.getRefFrames();
}
/**
* Predicts the audio sample rate that will be in the output stream
*/
public final Float getTargetFramerate() {
MediaStream stream = getTargetVideoStream();
Float tempVar = stream.getAverageFrameRate();
return getMaxFramerate() != null && !getIsDirectStream() ? getMaxFramerate() : stream == null ? null : (tempVar != null) ? tempVar : stream.getRealFrameRate();
}
/**
* Predicts the audio sample rate that will be in the output stream
*/
public final Double getTargetVideoLevel() {
MediaStream stream = getTargetVideoStream();
return getVideoLevel() != null && !getIsDirectStream() ? getVideoLevel() : stream == null ? null : stream.getLevel();
}
/**
* Predicts the audio sample rate that will be in the output stream
*/
public final Integer getTargetPacketLength() {
MediaStream stream = getTargetVideoStream();
return !getIsDirectStream() ? null : stream == null ? null : stream.getPacketLength();
}
/**
* Predicts the audio sample rate that will be in the output stream
*/
public final String getTargetVideoProfile() {
MediaStream stream = getTargetVideoStream();
return !Utils.isEmpty(getVideoProfile()) && !getIsDirectStream() ? getVideoProfile() : stream == null ? null : stream.getProfile();
}
/**
* Gets the target video codec tag.
*
* <value>The target video codec tag.</value>
*/
public final String getTargetVideoCodecTag() {
MediaStream stream = getTargetVideoStream();
return !getIsDirectStream() ? null : stream == null ? null : stream.getCodecTag();
}
/**
* Predicts the audio bitrate that will be in the output stream
*/
public final Integer getTargetAudioBitrate() {
MediaStream stream = getTargetAudioStream();
return getAudioBitrate() != null && !getIsDirectStream() ? getAudioBitrate() : stream == null ? null : stream.getBitRate();
}
/**
* Predicts the audio channels that will be in the output stream
*/
public final Integer getTargetAudioChannels() {
MediaStream stream = getTargetAudioStream();
Integer streamChannels = stream == null ? null : stream.getChannels();
if (getMaxAudioChannels() != null && !getIsDirectStream()) {
if (streamChannels != null) {
return Math.min(getMaxAudioChannels(), streamChannels);
}
return getMaxAudioChannels();
}
return streamChannels;
}
/**
* Predicts the audio codec that will be in the output stream
*/
public final String getTargetAudioCodec() {
MediaStream stream = getTargetAudioStream();
String inputCodec = stream == null ? null : stream.getCodec();
if (getIsDirectStream()) {
return inputCodec;
}
for (String codec : getAudioCodecs()) {
if (codec.equalsIgnoreCase(inputCodec)) {
return codec;
}
}
return getAudioCodecs().length == 0 ? null : getAudioCodecs()[0];
}
/**
* Predicts the audio channels that will be in the output stream
*/
public final Long getTargetSize() {
if (getIsDirectStream()) {
return getMediaSource().getSize();
}
if (getRunTimeTicks() != null) {
Integer totalBitrate = getTargetTotalBitrate();
double totalSeconds = getRunTimeTicks();
// Convert to ms
totalSeconds /= 10000;
// Convert to seconds
totalSeconds /= 1000;
return totalBitrate != null ? java.lang.Math.round(totalBitrate * totalSeconds) : (Long) null;
}
return null;
}
public final Integer getTargetVideoBitrate() {
MediaStream stream = getTargetVideoStream();
return getVideoBitrate() != null && !getIsDirectStream() ? getVideoBitrate() : stream == null ? null : stream.getBitRate();
}
public final TransportStreamTimestamp getTargetTimestamp() {
TransportStreamTimestamp defaultValue = ContainerTypes.M2TS.equalsIgnoreCase(getContainer()) ? TransportStreamTimestamp.Valid : TransportStreamTimestamp.None;
TransportStreamTimestamp tempVar = getMediaSource().getTimestamp();
return !getIsDirectStream() ? defaultValue : getMediaSource() == null ? defaultValue : (tempVar != null) ? tempVar : TransportStreamTimestamp.None;
}
public final Integer getTargetTotalBitrate() {
Integer tempVar = getTargetAudioBitrate();
Integer tempVar2 = getTargetVideoBitrate();
return ((tempVar != null) ? tempVar : 0) + ((tempVar2 != null) ? tempVar2 : 0);
}
public final Boolean getIsTargetAnamorphic() {
if (getIsDirectStream()) {
return getTargetVideoStream() == null ? null : getTargetVideoStream().getIsAnamorphic();
}
return false;
}
public final Integer getTargetWidth() {
MediaStream videoStream = getTargetVideoStream();
if (videoStream != null && videoStream.getWidth() != null && videoStream.getHeight() != null) {
ImageSize tempVar = new ImageSize();
tempVar.setWidth(videoStream.getWidth());
tempVar.setHeight(videoStream.getHeight());
ImageSize size = tempVar.clone();
Double maxWidth = getMaxWidth() != null ? (double) getMaxWidth() : (Double) null;
Double maxHeight = getMaxHeight() != null ? (double) getMaxHeight() : (Double) null;
ImageSize newSize = DrawingUtils.Resize(size.clone(), null, null, maxWidth, maxHeight);
return (int) newSize.getWidth();
}
return getMaxWidth();
}
public final Integer getTargetHeight() {
MediaStream videoStream = getTargetVideoStream();
if (videoStream != null && videoStream.getWidth() != null && videoStream.getHeight() != null) {
ImageSize tempVar = new ImageSize();
tempVar.setWidth(videoStream.getWidth());
tempVar.setHeight(videoStream.getHeight());
ImageSize size = tempVar.clone();
Double maxWidth = getMaxWidth() != null ? (double) getMaxWidth() : (Double) null;
Double maxHeight = getMaxHeight() != null ? (double) getMaxHeight() : (Double) null;
ImageSize newSize = DrawingUtils.Resize(size.clone(), null, null, maxWidth, maxHeight);
return (int) newSize.getHeight();
}
return getMaxHeight();
}
public final Integer getTargetVideoStreamCount() {
if (getIsDirectStream()) {
return GetMediaStreamCount(MediaStreamType.Video, Integer.MAX_VALUE);
}
return GetMediaStreamCount(MediaStreamType.Video, 1);
}
public final Integer getTargetAudioStreamCount() {
if (getIsDirectStream()) {
return GetMediaStreamCount(MediaStreamType.Audio, Integer.MAX_VALUE);
}
return GetMediaStreamCount(MediaStreamType.Audio, 1);
}
private Integer GetMediaStreamCount(MediaStreamType type, int limit) {
Integer count = getMediaSource().GetStreamCount(type);
if (count != null) {
count = Math.min(count, limit);
}
return count;
}
public final ArrayList<MediaStream> GetSelectableAudioStreams() {
return GetSelectableStreams(MediaStreamType.Audio);
}
public final ArrayList<MediaStream> GetSelectableSubtitleStreams() {
return GetSelectableStreams(MediaStreamType.Subtitle);
}
public final ArrayList<MediaStream> GetSelectableStreams(MediaStreamType type) {
ArrayList<MediaStream> list = new ArrayList<MediaStream>();
for (MediaStream stream : getMediaSource().getMediaStreams()) {
for (org.jellyfin.sdk.model.api.MediaStream stream : getMediaSource().getMediaStreams()) {
if (type == stream.getType()) {
list.add(stream);
}

View File

@@ -1,20 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import java.util.ArrayList;
import java.util.Collections;
@Deprecated
public class StreamInfoSorter
{
public static ArrayList<StreamInfo> SortMediaSources(ArrayList<StreamInfo> streams, Integer maxBitrate)
{
ChainedComparator<StreamInfo> comparator = new ChainedComparator<>(
new StreamInfoSorterComparator(0),
new StreamInfoSorterComparator(1),
new StreamInfoSorterComparator(2)
);
Collections.sort(streams, comparator);
return streams;
}
}

View File

@@ -1,47 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import org.jellyfin.apiclient.model.mediainfo.MediaProtocol;
import org.jellyfin.apiclient.model.session.PlayMethod;
@Deprecated
public class StreamInfoSorterComparator extends BaseStreamInfoSorter {
private int level;
public StreamInfoSorterComparator(int level) {
this.level = level;
}
@Override
protected int getValue(StreamInfo info) {
switch (level) {
case 0: {
// Nothing beats direct playing a file
if (info.getPlayMethod() == PlayMethod.DirectPlay && info.getMediaSource().getProtocol() == MediaProtocol.File) {
return 0;
}
return 1;
}
case 1: {
switch (info.getPlayMethod()) {
// Let's assume direct streaming a file is just as desirable as direct playing a remote url
case DirectStream:
case DirectPlay:
return 0;
default:
return 1;
}
}
case 2: {
switch (info.getMediaSource().getProtocol()) {
case File:
return 0;
default:
return 1;
}
}
}
throw new IllegalArgumentException("Unrecognized level");
}
}

View File

@@ -1,96 +0,0 @@
package org.jellyfin.androidtv.data.compat;
import org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod;
@Deprecated
public class SubtitleStreamInfo {
private String Url;
public final String getUrl() {
return Url;
}
public final void setUrl(String value) {
Url = value;
}
private String Language;
public final String getLanguage() {
return Language;
}
public final void setLanguage(String value) {
Language = value;
}
private String Name;
public final String getName() {
return Name;
}
public final void setName(String value) {
Name = value;
}
private boolean IsForced;
public final boolean getIsForced() {
return IsForced;
}
public final void setIsForced(boolean value) {
IsForced = value;
}
private String Format;
public final String getFormat() {
return Format;
}
public final void setFormat(String value) {
Format = value;
}
private String DisplayTitle;
public final String getDisplayTitle() {
return DisplayTitle;
}
public final void setDisplayTitle(String value) {
DisplayTitle = value;
}
private int Index;
public final int getIndex() {
return Index;
}
public final void setIndex(int value) {
Index = value;
}
private SubtitleDeliveryMethod DeliveryMethod = SubtitleDeliveryMethod.values()[0];
public final SubtitleDeliveryMethod getDeliveryMethod() {
return DeliveryMethod;
}
public final void setDeliveryMethod(SubtitleDeliveryMethod value) {
DeliveryMethod = value;
}
private boolean IsExternalUrl;
public final boolean getIsExternalUrl() {
return IsExternalUrl;
}
public final void setIsExternalUrl(boolean value) {
IsExternalUrl = value;
}
}

View File

@@ -0,0 +1,12 @@
package org.jellyfin.androidtv.data.compat
import org.jellyfin.apiclient.model.dlna.SubtitleDeliveryMethod
class SubtitleStreamInfo {
var url: String? = null
var name: String? = null
var format: String? = null
var displayTitle: String? = null
var index = 0
var deliveryMethod = SubtitleDeliveryMethod.Encode
}

View File

@@ -1,28 +0,0 @@
package org.jellyfin.androidtv.data.compat;
/**
* Class VideoOptions.
*
* @deprecated
*/
@Deprecated
public class VideoOptions extends AudioOptions {
private Integer AudioStreamIndex;
private Integer SubtitleStreamIndex;
public final Integer getAudioStreamIndex() {
return AudioStreamIndex;
}
public final void setAudioStreamIndex(Integer value) {
AudioStreamIndex = value;
}
public final Integer getSubtitleStreamIndex() {
return SubtitleStreamIndex;
}
public final void setSubtitleStreamIndex(Integer value) {
SubtitleStreamIndex = value;
}
}

View File

@@ -0,0 +1,6 @@
package org.jellyfin.androidtv.data.compat
class VideoOptions : AudioOptions() {
var audioStreamIndex: Int? = null
var subtitleStreamIndex: Int? = null
}

View File

@@ -0,0 +1,186 @@
package org.jellyfin.androidtv.data.eventhandling
import android.content.Context
import android.widget.Toast
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.jellyfin.androidtv.data.model.DataRefreshService
import org.jellyfin.androidtv.ui.itemhandling.ItemLauncher
import org.jellyfin.androidtv.ui.navigation.Destinations
import org.jellyfin.androidtv.ui.navigation.NavigationRepository
import org.jellyfin.androidtv.ui.playback.MediaManager
import org.jellyfin.androidtv.ui.playback.PlaybackControllerContainer
import org.jellyfin.androidtv.util.apiclient.PlaybackHelper
import org.jellyfin.sdk.api.client.ApiClient
import org.jellyfin.sdk.api.client.exception.ApiClientException
import org.jellyfin.sdk.api.client.extensions.sessionApi
import org.jellyfin.sdk.api.client.extensions.userLibraryApi
import org.jellyfin.sdk.api.sockets.SocketInstance
import org.jellyfin.sdk.api.sockets.SocketInstanceState
import org.jellyfin.sdk.api.sockets.addGeneralCommandsListener
import org.jellyfin.sdk.api.sockets.addListener
import org.jellyfin.sdk.model.api.BaseItemKind
import org.jellyfin.sdk.model.api.GeneralCommandType
import org.jellyfin.sdk.model.api.LibraryUpdateInfo
import org.jellyfin.sdk.model.api.PlaystateCommand
import org.jellyfin.sdk.model.constant.MediaType
import org.jellyfin.sdk.model.extensions.getValue
import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import org.jellyfin.sdk.model.socket.LibraryChangedMessage
import org.jellyfin.sdk.model.socket.PlayMessage
import org.jellyfin.sdk.model.socket.PlayStateMessage
import timber.log.Timber
import java.util.UUID
class SocketHandler(
private val context: Context,
private val api: ApiClient,
private val socketInstance: SocketInstance,
private val dataRefreshService: DataRefreshService,
private val mediaManager: MediaManager,
private val playbackControllerContainer: PlaybackControllerContainer,
private val navigationRepository: NavigationRepository,
) {
private val coroutineScope = CoroutineScope(Dispatchers.IO)
val state = socketInstance.state
suspend fun updateSession() {
try {
api.sessionApi.postCapabilities(
playableMediaTypes = listOf(MediaType.Video, MediaType.Audio),
supportsMediaControl = true,
supportedCommands = listOf(
GeneralCommandType.DISPLAY_MESSAGE,
GeneralCommandType.SEND_STRING,
GeneralCommandType.DISPLAY_CONTENT,
),
)
} catch (err: ApiClientException) {
Timber.e(err, "Unable to update capabilities")
return
}
val isOffline = state.value == SocketInstanceState.DISCONNECTED || state.value == SocketInstanceState.ERROR
if (isOffline) socketInstance.reconnect()
else socketInstance.updateCredentials()
}
init {
socketInstance.apply {
// Library
addListener<LibraryChangedMessage> { message -> onLibraryChanged(message.info) }
// Media playback
addListener<PlayMessage> { message -> onPlayMessage(message) }
addListener<PlayStateMessage> { message -> onPlayStateMessage(message) }
// General commands
addGeneralCommandsListener(setOf(GeneralCommandType.DISPLAY_CONTENT)) { message ->
val itemId by message
val itemType by message
val itemUuid = itemId?.toUUIDOrNull()
val itemKind = itemType?.let { type -> BaseItemKind.values().find { value -> value.serialName.equals(type, true) } }
if (itemUuid != null && itemKind != null) onDisplayContent(itemUuid, itemKind)
}
addGeneralCommandsListener(setOf(GeneralCommandType.DISPLAY_MESSAGE, GeneralCommandType.SEND_STRING)) { message ->
val header by message
val text by message
val string by message
onDisplayMessage(header, text ?: string)
}
}
}
private fun onLibraryChanged(info: LibraryUpdateInfo) {
Timber.d(buildString {
appendLine("Library changed.")
appendLine("Added ${info.itemsAdded.size} items")
appendLine("Removed ${info.itemsRemoved.size} items")
appendLine("Updated ${info.itemsUpdated.size} items")
})
if (info.itemsAdded.any() || info.itemsRemoved.any())
dataRefreshService.lastLibraryChange = System.currentTimeMillis()
}
private fun onPlayMessage(message: PlayMessage) {
val itemId = message.request.itemIds?.firstOrNull() ?: return
PlaybackHelper.retrieveAndPlay(
itemId.toString(),
false,
message.request.startPositionTicks,
context
)
}
@Suppress("ComplexMethod")
private fun onPlayStateMessage(message: PlayStateMessage) = coroutineScope.launch(Dispatchers.Main) {
Timber.i("Received PlayStateMessage with command ${message.request.command}")
val playbackController = playbackControllerContainer.playbackController
// Audio playback uses the mediaManager, video playback and live tv use the playbackController
if (mediaManager.isAudioPlayerInitialized) when (message.request.command) {
PlaystateCommand.STOP -> mediaManager.stopAudio(true)
PlaystateCommand.PAUSE, PlaystateCommand.UNPAUSE, PlaystateCommand.PLAY_PAUSE -> mediaManager.playPauseAudio()
PlaystateCommand.NEXT_TRACK -> mediaManager.nextAudioItem()
PlaystateCommand.PREVIOUS_TRACK -> mediaManager.prevAudioItem()
// Not implemented
PlaystateCommand.SEEK,
PlaystateCommand.REWIND,
PlaystateCommand.FAST_FORWARD -> Unit
} else when (message.request.command) {
PlaystateCommand.STOP -> playbackController?.endPlayback(true)
PlaystateCommand.PAUSE, PlaystateCommand.UNPAUSE, PlaystateCommand.PLAY_PAUSE -> playbackController?.playPause()
PlaystateCommand.NEXT_TRACK -> playbackController?.next()
PlaystateCommand.PREVIOUS_TRACK -> playbackController?.prev()
PlaystateCommand.SEEK -> playbackController?.seek(
(message.request.seekPositionTicks ?: 0) / TICKS_TO_MS
)
// FIXME get rewind/forward amount from displayprefs
PlaystateCommand.REWIND -> playbackController?.skip(REWIND_MS)
PlaystateCommand.FAST_FORWARD -> playbackController?.skip(FORWARD_MS)
}
}
private fun onDisplayContent(itemId: UUID, itemKind: BaseItemKind) {
val playbackController = playbackControllerContainer.playbackController
if (playbackController?.isPlaying == true || playbackController?.isPaused == true) {
Timber.i("Not launching $itemId: playback in progress")
return
}
Timber.i("Launching $itemId")
when (itemKind) {
BaseItemKind.USER_VIEW,
BaseItemKind.COLLECTION_FOLDER -> coroutineScope.launch {
val item by api.userLibraryApi.getItem(itemId = itemId)
ItemLauncher.launchUserView(item)
}
else -> navigationRepository.navigate(Destinations.itemDetails(itemId))
}
}
private fun onDisplayMessage(header: String?, text: String?) {
val toastMessage = buildString {
if (!header.isNullOrBlank()) append(header, ": ")
append(text)
}
runBlocking(Dispatchers.Main) {
Toast.makeText(context, toastMessage, Toast.LENGTH_LONG).show()
}
}
companion object {
const val TICKS_TO_MS = 10000L
const val REWIND_MS = -11000
const val FORWARD_MS = 30000
}
}

View File

@@ -1,208 +0,0 @@
package org.jellyfin.androidtv.data.eventhandling;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.widget.Toast;
import org.jellyfin.androidtv.R;
import org.jellyfin.androidtv.TvApp;
import org.jellyfin.androidtv.data.model.DataRefreshService;
import org.jellyfin.androidtv.data.querying.StdItemQuery;
import org.jellyfin.androidtv.ui.itemhandling.BaseRowItem;
import org.jellyfin.androidtv.ui.itemhandling.ItemLauncher;
import org.jellyfin.androidtv.ui.playback.MediaManager;
import org.jellyfin.androidtv.ui.playback.PlaybackController;
import org.jellyfin.androidtv.ui.playback.PlaybackOverlayActivity;
import org.jellyfin.androidtv.util.Utils;
import org.jellyfin.androidtv.util.apiclient.PlaybackHelper;
import org.jellyfin.apiclient.interaction.ApiClient;
import org.jellyfin.apiclient.interaction.ApiEventListener;
import org.jellyfin.apiclient.interaction.Response;
import org.jellyfin.apiclient.model.dto.BaseItemDto;
import org.jellyfin.apiclient.model.entities.LibraryUpdateInfo;
import org.jellyfin.apiclient.model.querying.ItemFields;
import org.jellyfin.apiclient.model.querying.ItemsResult;
import org.jellyfin.apiclient.model.session.BrowseRequest;
import org.jellyfin.apiclient.model.session.MessageCommand;
import org.jellyfin.apiclient.model.session.PlayRequest;
import org.jellyfin.apiclient.model.session.PlaystateRequest;
import org.jellyfin.apiclient.model.session.SessionInfoDto;
import java.util.Arrays;
import timber.log.Timber;
import static org.koin.java.KoinJavaComponent.get;
public class TvApiEventListener extends ApiEventListener {
private final DataRefreshService dataRefreshService;
private final MediaManager mediaManager;
public TvApiEventListener(DataRefreshService dataRefreshService, MediaManager mediaManager) {
this.dataRefreshService = dataRefreshService;
this.mediaManager = mediaManager;
}
@Override
public void onPlaybackStopped(ApiClient client, SessionInfoDto info) {
TvApp app = TvApp.getApplication();
Timber.d("Got Playback stopped message from server");
if (info.getUserId().equals(app.getCurrentUser().getId())) {
dataRefreshService.setLastPlayback(System.currentTimeMillis());
if (info.getNowPlayingItem() == null) return;
switch (info.getNowPlayingItem().getType()) {
case "Movie":
dataRefreshService.setLastMoviePlayback(System.currentTimeMillis());
break;
case "Episode":
dataRefreshService.setLastTvPlayback(System.currentTimeMillis());
break;
}
}
}
@Override
public void onLibraryChanged(ApiClient client, LibraryUpdateInfo info) {
Timber.d("Library Changed. Added %o items. Removed %o items. Changed %o items.", info.getItemsAdded().size(), info.getItemsRemoved().size(), info.getItemsUpdated().size());
if (info.getItemsAdded().size() > 0 || info.getItemsRemoved().size() > 0)
dataRefreshService.setLastLibraryChange(System.currentTimeMillis());
}
@Override
public void onPlaystateCommand(ApiClient client, PlaystateRequest command) {
PlaybackController playbackController = TvApp.getApplication().getPlaybackController();
switch (command.getCommand()) {
case Stop:
if (mediaManager.isPlayingAudio())
mediaManager.stopAudio();
else {
Activity currentActivity = TvApp.getApplication().getCurrentActivity();
if(currentActivity instanceof PlaybackOverlayActivity)
currentActivity.finish();
}
break;
case Pause:
if (mediaManager.isPlayingAudio())
mediaManager.pauseAudio();
else if(playbackController != null)
playbackController.playPause();
break;
case Unpause:
if (mediaManager.hasAudioQueueItems())
mediaManager.resumeAudio();
else if(playbackController != null)
playbackController.playPause();
break;
case NextTrack:
if (mediaManager.hasAudioQueueItems())
mediaManager.nextAudioItem();
else if(playbackController != null)
playbackController.next();
break;
case PreviousTrack:
if (mediaManager.hasAudioQueueItems())
mediaManager.prevAudioItem();
else if(playbackController != null)
playbackController.prev();
break;
case Seek:
if (playbackController == null) break;
long pos = command.getSeekPositionTicks() / 10000;
playbackController.seek(pos);
break;
case Rewind:
if (playbackController == null) break;
playbackController.skip(-11000);
break;
case FastForward:
if (playbackController == null) break;
playbackController.skip(30000);
break;
}
}
@Override
public void onBrowseCommand(ApiClient client, BrowseRequest command) {
Timber.d("Browse command received");
if (TvApp.getApplication().getCurrentActivity() == null || videoPlaying()) {
Timber.i("Command ignored due to no activity or playback in progress");
return;
}
client.GetItemAsync(command.getItemId(), TvApp.getApplication().getCurrentUser().getId(), new Response<BaseItemDto>() {
@Override
public void onResponse(BaseItemDto response) {
//Create a rowItem and pass to our handler
ItemLauncher.launch(new BaseRowItem(0, response), null, -1, TvApp.getApplication().getCurrentActivity(), true);
}
});
}
private boolean videoPlaying() {
return (TvApp.getApplication().getPlaybackController() != null && (TvApp.getApplication().getPlaybackController().isPlaying() || TvApp.getApplication().getPlaybackController().isPaused()));
}
@Override
public void onPlayCommand(ApiClient client, PlayRequest command) {
if (videoPlaying()) {
TvApp.getApplication().getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Utils.showToast(TvApp.getApplication().getCurrentActivity(), TvApp.getApplication().getString(R.string.msg_remote_already_playing));
}
});
return;
}
if (command.getItemIds().length > 1) {
Timber.i("Playing multiple items by remote request");
if (TvApp.getApplication().getCurrentActivity() == null) {
Timber.e("No current activity. Cannot play");
return;
}
StdItemQuery query = new StdItemQuery(new ItemFields[]{
ItemFields.MediaSources,
ItemFields.ChildCount
});
query.setIds(command.getItemIds());
get(ApiClient.class).GetItemsAsync(query, new Response<ItemsResult>() {
@Override
public void onResponse(ItemsResult response) {
if (response.getItems() != null && response.getItems().length > 0) {
//peek at first item to see what type it is
switch (response.getItems()[0].getMediaType()) {
case "Video":
mediaManager.setCurrentVideoQueue(Arrays.asList(response.getItems()));
Intent intent = new Intent(TvApp.getApplication().getCurrentActivity(), TvApp.getApplication().getPlaybackActivityClass(response.getItems()[0].getBaseItemType()));
TvApp.getApplication().getCurrentActivity().startActivity(intent);
break;
case "Audio":
mediaManager.playNow(Arrays.asList(response.getItems()));
break;
}
}
}
});
} else {
if (command.getItemIds().length > 0) {
Timber.i("Playing single item by remote request");
Context context = TvApp.getApplication().getCurrentActivity() != null ? TvApp.getApplication().getCurrentActivity() : TvApp.getApplication();
PlaybackHelper.retrieveAndPlay(command.getItemIds()[0], false, command.getStartPositionTicks() != null ? command.getStartPositionTicks() : 0, context);
}
}
}
@Override
public void onMessageCommand(ApiClient client, MessageCommand command) {
new Handler(TvApp.getApplication().getMainLooper()).post(() -> Toast.makeText(TvApp.getApplication(), command.getText(), Toast.LENGTH_LONG).show());
}
}

View File

@@ -0,0 +1,7 @@
package org.jellyfin.androidtv.data.model
data class AppNotification(
val message: String,
val dismiss: () -> Unit,
val public: Boolean,
)

View File

@@ -1,15 +0,0 @@
package org.jellyfin.androidtv.data.model;
import org.jellyfin.apiclient.model.entities.ChapterInfo;
public class ChapterItemInfo extends ChapterInfo {
private String itemId;
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
}

View File

@@ -0,0 +1,10 @@
package org.jellyfin.androidtv.data.model
import java.util.UUID
data class ChapterItemInfo(
val itemId: UUID,
val name: String?,
val startPositionTicks: Long,
val imagePath: String?,
)

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