Showing with 10,479 additions and 4,615 deletions.
  1. +2 −0 .gitignore
  2. +82 −85 README.md
  3. +58 −9 app/build.gradle.kts
  4. +10 −5 app/src/main/AndroidManifest.xml
  5. +28 −2 app/src/main/java/org/jellyfin/androidtv/JellyfinApplication.kt
  6. +38 −2 app/src/main/java/org/jellyfin/androidtv/JellyfinGlideModule.kt
  7. +1 −0 app/src/main/java/org/jellyfin/androidtv/auth/apiclient/ApiBinder.kt
  8. +4 −18 app/src/main/java/org/jellyfin/androidtv/auth/repository/AuthenticationRepository.kt
  9. +18 −0 app/src/main/java/org/jellyfin/androidtv/constant/BackgroundType.kt
  10. +21 −0 app/src/main/java/org/jellyfin/androidtv/constant/CardInfoType.kt
  11. +24 −0 app/src/main/java/org/jellyfin/androidtv/constant/CardSpacing.kt
  12. +9 −0 app/src/main/java/org/jellyfin/androidtv/constant/Codec.kt
  13. +18 −0 app/src/main/java/org/jellyfin/androidtv/constant/ColorSelection.kt
  14. +15 −0 app/src/main/java/org/jellyfin/androidtv/constant/ColorSelectionBG.kt
  15. +21 −0 app/src/main/java/org/jellyfin/androidtv/constant/FocusBorderSize.kt
  16. +18 −0 app/src/main/java/org/jellyfin/androidtv/constant/FocusIconSize.kt
  17. +34 −0 app/src/main/java/org/jellyfin/androidtv/constant/FocusZoomSize.kt
  18. +15 −0 app/src/main/java/org/jellyfin/androidtv/constant/HomeSize.kt
  19. +8 −1 app/src/main/java/org/jellyfin/androidtv/constant/ImageType.kt
  20. +0 −1 app/src/main/java/org/jellyfin/androidtv/constant/LiveTvOption.kt
  21. +24 −22 app/src/main/java/org/jellyfin/androidtv/data/eventhandling/SocketHandler.kt
  22. +9 −0 app/src/main/java/org/jellyfin/androidtv/data/model/FilterOptions.java
  23. +52 −16 app/src/main/java/org/jellyfin/androidtv/data/service/BackgroundService.kt
  24. +6 −3 app/src/main/java/org/jellyfin/androidtv/di/AppModule.kt
  25. +5 −4 app/src/main/java/org/jellyfin/androidtv/integration/LeanbackChannelWorker.kt
  26. +39 −3 app/src/main/java/org/jellyfin/androidtv/preference/LibraryPreferences.kt
  27. +126 −65 app/src/main/java/org/jellyfin/androidtv/preference/UserPreferences.kt
  28. +22 −5 app/src/main/java/org/jellyfin/androidtv/preference/UserSettingPreferences.kt
  29. +13 −0 app/src/main/java/org/jellyfin/androidtv/preference/constant/AudioCodecOut.kt
  30. +68 −0 app/src/main/java/org/jellyfin/androidtv/preference/constant/Languages.kt
  31. +1 −1 app/src/main/java/org/jellyfin/androidtv/telemetry/TelemetryService.kt
  32. +114 −36 app/src/main/java/org/jellyfin/androidtv/ui/AsyncImageView.kt
  33. +31 −15 app/src/main/java/org/jellyfin/androidtv/ui/ClockUserView.kt
  34. +6 −1 app/src/main/java/org/jellyfin/androidtv/ui/DetailRowView.kt
  35. +2 −3 app/src/main/java/org/jellyfin/androidtv/ui/FadeViewSwitcherLayout.kt
  36. +41 −0 app/src/main/java/org/jellyfin/androidtv/ui/FrameLayoutAbs.kt
  37. +544 −0 app/src/main/java/org/jellyfin/androidtv/ui/InfoRowView.kt
  38. +54 −0 app/src/main/java/org/jellyfin/androidtv/ui/LinearLayoutAbs.kt
  39. +1 −4 app/src/main/java/org/jellyfin/androidtv/ui/NowPlayingView.kt
  40. +6 −2 app/src/main/java/org/jellyfin/androidtv/ui/ProgramGridCell.java
  41. +41 −0 app/src/main/java/org/jellyfin/androidtv/ui/RelativeLayoutAbs.kt
  42. +0 −4 app/src/main/java/org/jellyfin/androidtv/ui/ServerButtonView.kt
  43. +79 −0 app/src/main/java/org/jellyfin/androidtv/ui/SpaceAbs.kt
  44. +16 −10 app/src/main/java/org/jellyfin/androidtv/ui/{shared → }/StrokeTextView.kt
  45. +6 −1 app/src/main/java/org/jellyfin/androidtv/ui/TextUnderButton.kt
  46. +40 −0 app/src/main/java/org/jellyfin/androidtv/ui/TextViewAbs.kt
  47. +45 −0 app/src/main/java/org/jellyfin/androidtv/ui/ToolbarView.kt
  48. +0 −1 app/src/main/java/org/jellyfin/androidtv/ui/browsing/BrowseFolderFragment.java
  49. +239 −470 app/src/main/java/org/jellyfin/androidtv/ui/browsing/BrowseGridFragment.java
  50. +7 −6 app/src/main/java/org/jellyfin/androidtv/ui/browsing/BrowseRecordingsFragment.java
  51. +19 −49 app/src/main/java/org/jellyfin/androidtv/ui/browsing/BrowseRowDef.java
  52. +28 −16 app/src/main/java/org/jellyfin/androidtv/ui/browsing/BrowseViewFragment.java
  53. +1 −1 app/src/main/java/org/jellyfin/androidtv/ui/browsing/ByGenreFragment.java
  54. +2 −2 app/src/main/java/org/jellyfin/androidtv/ui/browsing/ByLetterFragment.java
  55. +3 −3 app/src/main/java/org/jellyfin/androidtv/ui/browsing/CollectionFragment.java
  56. +64 −16 app/src/main/java/org/jellyfin/androidtv/ui/browsing/DisplayPreferencesScreen.kt
  57. +47 −66 app/src/main/java/org/jellyfin/androidtv/ui/browsing/EnhancedBrowseFragment.java
  58. +3 −3 app/src/main/java/org/jellyfin/androidtv/ui/browsing/GenericFolderFragment.java
  59. +2 −2 app/src/main/java/org/jellyfin/androidtv/ui/browsing/GenericGridActivity.kt
  60. +2 −2 app/src/main/java/org/jellyfin/androidtv/ui/browsing/GroupedItemsActivity.kt
  61. +24 −0 app/src/main/java/org/jellyfin/androidtv/ui/browsing/MainActivity.kt
  62. +18 −91 app/src/main/java/org/jellyfin/androidtv/ui/browsing/StdBrowseFragment.java
  63. +32 −53 app/src/main/java/org/jellyfin/androidtv/ui/browsing/StdRowsFragment.java
  64. +12 −8 app/src/main/java/org/jellyfin/androidtv/ui/card/DefaultCardView.kt
  65. +357 −166 app/src/main/java/org/jellyfin/androidtv/ui/card/LegacyImageCardView.java
  66. +61 −13 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragment.kt
  67. +26 −25 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragmentBrowseRowDefRow.kt
  68. +15 −7 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragmentHelper.kt
  69. +24 −7 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragmentLatestRow.kt
  70. +3 −9 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragmentLiveTVRow.kt
  71. +6 −3 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragmentNowPlayingRow.kt
  72. +1 −1 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeFragmentRow.kt
  73. +12 −67 app/src/main/java/org/jellyfin/androidtv/ui/home/HomeToolbarFragment.kt
  74. +4 −8 app/src/main/java/org/jellyfin/androidtv/ui/home/NotificationsHomeFragmentRow.kt
  75. +179 −139 app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/FullDetailsActivity.java
  76. +41 −134 app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/ItemListActivity.java
  77. +3 −1 app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/MyDetailsOverviewRow.java
  78. +1 −1 app/src/main/java/org/jellyfin/androidtv/ui/itemdetail/PhotoPlayerActivity.java
  79. +0 −1 app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/AudioQueueItem.java
  80. +112 −113 app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/BaseRowItem.java
  81. +5 −19 app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemLauncher.java
  82. +269 −118 app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemRowAdapter.java
  83. +8 −4 app/src/main/java/org/jellyfin/androidtv/ui/livetv/LiveTvGuideActivity.java
  84. +2 −1 app/src/main/java/org/jellyfin/androidtv/ui/livetv/TvManager.java
  85. +1 −1 app/src/main/java/org/jellyfin/androidtv/ui/picture/PictureViewerFragment.kt
  86. +32 −53 app/src/main/java/org/jellyfin/androidtv/ui/playback/AudioNowPlayingActivity.java
  87. +5 −6 app/src/main/java/org/jellyfin/androidtv/ui/playback/CustomPlaybackOverlayFragment.java
  88. +754 −204 app/src/main/java/org/jellyfin/androidtv/ui/playback/ExternalPlayerActivity.java
  89. +19 −1 app/src/main/java/org/jellyfin/androidtv/ui/playback/GetPlaybackInfoResponse.java
  90. +34 −5 app/src/main/java/org/jellyfin/androidtv/ui/playback/MediaManager.java
  91. +44 −24 app/src/main/java/org/jellyfin/androidtv/ui/playback/PlaybackController.java
  92. +1 −0 app/src/main/java/org/jellyfin/androidtv/ui/playback/PlaybackLauncher.kt
  93. +295 −0 app/src/main/java/org/jellyfin/androidtv/ui/playback/PlayerApiHelpers.java
  94. +647 −0 app/src/main/java/org/jellyfin/androidtv/ui/playback/PlayerTask.java
  95. +106 −0 app/src/main/java/org/jellyfin/androidtv/ui/playback/ZEMountManage.java
  96. +2 −2 app/src/main/java/org/jellyfin/androidtv/ui/playback/nextup/NextUpFragment.kt
  97. +1 −1 app/src/main/java/org/jellyfin/androidtv/ui/playback/nextup/NextUpViewModel.kt
  98. +2 −2 app/src/main/java/org/jellyfin/androidtv/ui/preference/PreferencesActivity.kt
  99. +9 −1 app/src/main/java/org/jellyfin/androidtv/ui/preference/category/about.kt
  100. +83 −32 app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/CustomizationPreferencesScreen.kt
  101. +26 −0 app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/HomePreferencesScreen.kt
  102. +124 −72 app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/PlaybackPreferencesScreen.kt
  103. +46 −0 app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/TranscodePreferenceScreen.kt
  104. +13 −6 app/src/main/java/org/jellyfin/androidtv/ui/preference/screen/UserPreferencesScreen.kt
  105. +386 −309 app/src/main/java/org/jellyfin/androidtv/ui/presentation/CardPresenter.java
  106. +65 −22 app/src/main/java/org/jellyfin/androidtv/ui/presentation/CustomListRowPresenter.java
  107. +19 −3 app/src/main/java/org/jellyfin/androidtv/ui/presentation/CustomRowHeaderPresenter.kt
  108. +13 −29 app/src/main/java/org/jellyfin/androidtv/ui/presentation/GridButtonPresenter.java
  109. +146 −72 app/src/main/java/org/jellyfin/androidtv/ui/presentation/HorizontalGridPresenter.java
  110. +41 −97 app/src/main/java/org/jellyfin/androidtv/ui/presentation/MyDetailsOverviewRowPresenter.java
  111. +9 −25 app/src/main/java/org/jellyfin/androidtv/ui/presentation/PositionableListRowPresenter.java
  112. +2 −2 app/src/main/java/org/jellyfin/androidtv/ui/search/SearchActivity.kt
  113. +3 −6 app/src/main/java/org/jellyfin/androidtv/ui/shared/BaseActivity.java
  114. +0 −56 app/src/main/java/org/jellyfin/androidtv/ui/shared/ToolbarView.kt
  115. +3 −3 app/src/main/java/org/jellyfin/androidtv/ui/startup/StartupActivity.kt
  116. +4 −0 app/src/main/java/org/jellyfin/androidtv/ui/startup/UserLoginViewModel.kt
  117. +16 −17 app/src/main/java/org/jellyfin/androidtv/ui/startup/fragment/StartupToolbarFragment.kt
  118. +623 −0 app/src/main/java/org/jellyfin/androidtv/util/AudioSubtitleHelper.java
  119. +0 −198 app/src/main/java/org/jellyfin/androidtv/util/BlurHashDecoder.kt
  120. +0 −27 app/src/main/java/org/jellyfin/androidtv/util/BlurHashUtils.kt
  121. +140 −0 app/src/main/java/org/jellyfin/androidtv/util/ContextExtensions.kt
  122. +85 −1 app/src/main/java/org/jellyfin/androidtv/util/DeviceUtils.java
  123. +56 −0 app/src/main/java/org/jellyfin/androidtv/util/DrawableBuilder.kt
  124. +176 −86 app/src/main/java/org/jellyfin/androidtv/util/ImageHelper.kt
  125. +54 −57 app/src/main/java/org/jellyfin/androidtv/util/ImageUtils.java
  126. +9 −7 app/src/main/java/org/jellyfin/androidtv/util/InfoLayoutHelper.java
  127. +15 −17 app/src/main/java/org/jellyfin/androidtv/util/KeyProcessor.java
  128. +147 −0 app/src/main/java/org/jellyfin/androidtv/util/LayoutHelper.kt
  129. +31 −2 app/src/main/java/org/jellyfin/androidtv/util/NumberExtensions.kt
  130. +9 −0 app/src/main/java/org/jellyfin/androidtv/util/SmallListRow.kt
  131. +9 −0 app/src/main/java/org/jellyfin/androidtv/util/SmallListRowAbs.kt
  132. +25 −0 app/src/main/java/org/jellyfin/androidtv/util/TextViewExtension.kt
  133. +9 −0 app/src/main/java/org/jellyfin/androidtv/util/ThumbListRow.kt
  134. +25 −0 app/src/main/java/org/jellyfin/androidtv/util/TimeUtils.java
  135. +264 −5 app/src/main/java/org/jellyfin/androidtv/util/Utils.java
  136. +74 −0 app/src/main/java/org/jellyfin/androidtv/util/ViewLayoutExtension.kt
  137. +51 −15 app/src/main/java/org/jellyfin/androidtv/util/apiclient/BaseItemUtils.kt
  138. +66 −11 app/src/main/java/org/jellyfin/androidtv/util/apiclient/PlaybackHelper.java
  139. +2 −2 app/src/main/java/org/jellyfin/androidtv/util/apiclient/ReportingHelper.java
  140. +4 −4 app/src/main/java/org/jellyfin/androidtv/util/profile/ExoPlayerProfile.kt
  141. +32 −15 app/src/main/java/org/jellyfin/androidtv/util/profile/LibVlcProfile.kt
  142. +19 −3 app/src/main/java/org/jellyfin/androidtv/util/profile/MediaCodecCapabilitiesTest.java
  143. +80 −40 app/src/main/java/org/jellyfin/androidtv/util/profile/ProfileHelper.kt
  144. +241 −0 app/src/main/java/org/jellyfin/androidtv/util/profile/ZidooPlayerProfile.kt
  145. +3 −1 app/src/main/java/org/jellyfin/androidtv/util/sdk/compat/ModelCompat.kt
  146. +8 −1 app/src/main/res/drawable-v26/app_icon_foreground_padded.xml
  147. +7 −0 app/src/main/res/drawable/app_icon.xml
  148. +7 −0 app/src/main/res/drawable/app_icon_round.xml
  149. +3 −6 app/src/main/res/drawable/block_text_bg.xml
  150. +7 −0 app/src/main/res/drawable/block_text_bg_audio.xml
  151. +7 −0 app/src/main/res/drawable/block_text_bg_golden.xml
  152. +21 −0 app/src/main/res/drawable/block_text_bg_rainbow.xml
  153. +7 −0 app/src/main/res/drawable/block_text_bg_video.xml
  154. +2 −7 app/src/main/res/drawable/button_default_ripple.xml
  155. +7 −0 app/src/main/res/drawable/button_icon_tint_toolbar.xml
  156. +5 −0 app/src/main/res/drawable/card_color_states.xml
  157. +12 −0 app/src/main/res/drawable/card_focus_border.xml
  158. +13 −0 app/src/main/res/drawable/card_focus_border_thin.xml
  159. +4 −5 app/src/main/res/drawable/ic_folder.xml
  160. +11 −0 app/src/main/res/drawable/ic_folder_stroke_accent.xml
  161. +11 −0 app/src/main/res/drawable/ic_heart_red_stroke.xml
  162. +2 −1 app/src/main/res/drawable/ic_settings.xml
  163. +12 −0 app/src/main/res/drawable/ic_star_stroke.xml
  164. +22 −0 app/src/main/res/drawable/progress_bar_card.xml
  165. +26 −0 app/src/main/res/drawable/progress_bar_card_focus.xml
  166. +32 −0 app/src/main/res/drawable/progress_bar_card_round.xml
  167. +4 −0 app/src/main/res/drawable/square_bg.xml
  168. +8 −0 app/src/main/res/drawable/square_bg_bottom_corners.xml
  169. +5 −0 app/src/main/res/drawable/square_bg_corners.xml
  170. +6 −0 app/src/main/res/drawable/square_bg_stroke.xml
  171. +3 −2 app/src/main/res/drawable/tile_port_video.xml
  172. +1 −1 app/src/main/res/drawable/tile_port_video_queue.xml
  173. +45 −0 app/src/main/res/drawable/zidoologo.xml
  174. +182 −196 app/src/main/res/layout/activity_audio_now_playing.xml
  175. +0 −21 app/src/main/res/layout/activity_full_details.xml
  176. +21 −48 app/src/main/res/layout/activity_item_list.xml
  177. +16 −12 app/src/main/res/layout/clock_user_bug.xml
  178. +64 −60 app/src/main/res/layout/enhanced_detail_browse.xml
  179. +2 −1 app/src/main/res/layout/fragment_content_view.xml
  180. +2 −2 app/src/main/res/layout/fragment_select_server.xml
  181. +1 −1 app/src/main/res/layout/fragment_server.xml
  182. +12 −4 app/src/main/res/layout/fragment_splash.xml
  183. +0 −47 app/src/main/res/layout/fragment_toolbar_home.xml
  184. +29 −28 app/src/main/res/layout/fragment_toolbar_startup.xml
  185. +16 −6 app/src/main/res/layout/horizontal_grid.xml
  186. +110 −87 app/src/main/res/layout/horizontal_grid_browse.xml
  187. +2 −1 app/src/main/res/layout/horizontal_scroll_pane.xml
  188. +8 −7 app/src/main/res/layout/live_tv_guide.xml
  189. +41 −26 app/src/main/res/layout/text_under_button.xml
  190. +5 −4 app/src/main/res/layout/view_button_server.xml
  191. +299 −229 app/src/main/res/layout/view_card_legacy_image.xml
  192. +9 −0 app/src/main/res/layout/view_dream_library_item.xml
  193. +60 −38 app/src/main/res/layout/view_now_playing.xml
  194. +119 −119 app/src/main/res/layout/view_row_details.xml
  195. +35 −54 app/src/main/res/layout/view_toolbar.xml
  196. +7 −3 app/src/main/res/layout/vlc_player_interface.xml
  197. +54 −2 app/src/main/res/values/attrs.xml
  198. +0 −1 app/src/main/res/values/attrs_tiles.xml
  199. +25 −3 app/src/main/res/values/colors.xml
  200. +62 −8 app/src/main/res/values/dimens.xml
  201. +4 −0 app/src/main/res/values/integers.xml
  202. +108 −15 app/src/main/res/values/strings.xml
  203. +64 −7 app/src/main/res/values/styles.xml
  204. +2 −3 app/src/main/res/values/theme_emerald.xml
  205. +38 −12 app/src/main/res/values/theme_jellyfin.xml
  206. +16 −13 app/src/main/res/values/theme_mutedpurple.xml
  207. +12 −0 build.gradle.kts
  208. +7 −0 gradle.properties
  209. +41 −30 gradle/libs.versions.toml
  210. +2 −2 gradle/wrapper/gradle-wrapper.properties
  211. +27 −6 playback/build.gradle.kts
  212. +1 −2 playback/src/main/AndroidManifest.xml
  213. +27 −6 preference/build.gradle.kts
  214. +1 −2 preference/src/main/AndroidManifest.xml
  215. +3 −0 settings.gradle.kts
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ local.properties
.gradle
build/
captures/
output-metadata.json
*.apk
167 changes: 82 additions & 85 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,86 +1,83 @@
<h1 align="center">Jellyfin Android TV</h1>
<h3 align="center">Part of the <a href="https://jellyfin.org">Jellyfin Project</a></h3>

---

<p align="center">
<img alt="Logo banner" src="https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/banner-logo-solid.svg?sanitize=true"/>
<br/><br/>
<a href="https://github.com/jellyfin/jellyfin-androidtv">
<img alt="GPL 2.0 License" src="https://img.shields.io/github/license/jellyfin/jellyfin-androidtv.svg"/>
</a>
<a href="https://github.com/jellyfin/jellyfin-androidtv/releases">
<img alt="Current Release" src="https://img.shields.io/github/release/jellyfin/jellyfin-androidtv.svg"/>
</a>
<a href="https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv/">
<img alt="Translation Status" src="https://translate.jellyfin.org/widgets/jellyfin-android/-/jellyfin-androidtv/svg-badge.svg"/>
</a>
<br/>
<a href="https://opencollective.com/jellyfin">
<img alt="Donate" src="https://img.shields.io/opencollective/all/jellyfin.svg?label=backers"/>
</a>
<a href="https://features.jellyfin.org">
<img alt="Feature Requests" src="https://img.shields.io/badge/fider-vote%20on%20features-success.svg"/>
</a>
<a href="https://matrix.to/#/+jellyfin:matrix.org">
<img alt="Chat on Matrix" src="https://img.shields.io/matrix/jellyfin:matrix.org.svg?logo=matrix"/>
</a>
<a href="https://www.reddit.com/r/jellyfin">
<img alt="Join our Subreddit" src="https://img.shields.io/badge/reddit-r%2Fjellyfin-%23FF5700.svg"/>
</a>
<br/>
<a href="https://play.google.com/store/apps/details?id=org.jellyfin.androidtv">
<img width="153" alt="Jellyfin on Google Play" src="https://jellyfin.org/images/store-icons/google-play.png"/>
</a>
<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>
<br/>
<a href="https://repo.jellyfin.org/releases/client/androidtv/">Download archive</a>
</p>

Jellyfin Android TV is a Jellyfin client for Android TV, Nvidia Shield, and Amazon Fire TV devices.
We welcome all contributions and pull requests! If you have a larger feature in mind please open an
issue so we can discuss the implementation before you start.

## Translating

Translations can be improved very easily from our
[Weblate](https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-androidtv) instance.
Look through the following graphic to see if your native language could use some work!

<a href="https://translate.jellyfin.org/engage/jellyfin-android/">
<img alt="Detailed Translation Status" src="https://translate.jellyfin.org/widgets/jellyfin-android/-/jellyfin-androidtv/multi-auto.svg"/>
</a>

## Build Process

### Dependencies

- Android Studio

### Build

1. Clone or download this repository

```sh
git clone https://github.com/jellyfin/jellyfin-androidtv.git
cd jellyfin-androidtv
```

2. Open the project in Android Studio and run it from there or build an APK directly through Gradle:

```sh
./gradlew assembleDebug
```

Add the Android SDK to your PATH environment variable or create the ANDROID_SDK_ROOT variable for
this to work.

### Deploy to device/emulator

```sh
./gradlew installDebug
```

*You can also replace the "Debug" with "Release" to get an optimized release binary.*
<h1 align="center">a Jellyfin TV Client, optimized for Zidoo media players aka "Zidoo Edition"</h1>
<h3 align="center">based on the <a href="https://github.com/jellyfin/jellyfin-androidtv">official Jellyfin TV Client</a></h3>

---

<p align="center">
<a href="https://github.com/jellyfin/jellyfin-androidtv">
<img alt="GPL 2.0 License" src="https://img.shields.io/github/license/jellyfin/jellyfin-androidtv.svg"/>
</a>
<a href="https://opencollective.com/jellyfin">
<img alt="Donate" src="https://img.shields.io/opencollective/all/jellyfin.svg?label=backers"/>
</a>
<a href="https://features.jellyfin.org">
<img alt="Feature Requests" src="https://img.shields.io/badge/fider-vote%20on%20features-success.svg"/>
</a>
<a href="https://matrix.to/#/+jellyfin:matrix.org">
<img alt="Chat on Matrix" src="https://img.shields.io/matrix/jellyfin:matrix.org.svg?logo=matrix"/>
</a>
<a href="https://www.reddit.com/r/jellyfin">
<img alt="Join our Subreddit" src="https://img.shields.io/badge/reddit-r%2Fjellyfin-%23FF5700.svg"/>
</a>

<h1 align="center">Update: Development of this fork has stopped!</h1>

### I moved to CoreElec + Amlogic + Jellyfin for Kodi plugin
- main issue is time to merge all the upstream changes and motivation to work on the fork while not using Zidoo devices anymore
- there are issues/bug's that also will probably never fixed by Zidoo via there API
- seeking for transcodes (multisegmented http stream issue)
- proper enabled subtitles on play (always need to seek-back at least once until ASS show-up)
- so far everything still works with JF 10.9.11
- need to edit/add path data to \jellyfin\root\default\options.xml for new direct-path libs, since the Ui option was removed, yet direct-path still works

---
"Zidoo-Edition" is a unofficial community fork, based on the official Jellyfin Android TV client, adapted to better run on [Zidoo media players](https://www.zidoo.tv).
### Release [downloads here](https://github.com/Andy2244/jellyfin-androidtv-zidoo/releases)
TIP: you can directly install from your browser via `http://zidoo_ip:18888` web interface
### App ONLY works with latest 10.8.1+ JF server's.
### Firmware 6.(4/7).40+ is also recommended, but not required.
- feature roadmap
- ~add smart "original language" audio selection logic based on tmdb id's~ _done_
- ~add better transcoding support and fallback's for unsupported codecs~ _done_
- ~add more audio-only transcoding options (DD only, PCM 5.1 -> DD5.1)~ _done_
- seekable transcode playback (not possible, wont be fixed by Zidoo)
- ~improve layouts~ _done_
- ~small useability improvements _(smart screen views)_~ _done
- ~focus selection border~ _done_
- ~add missing vertical-grid features _(genre)_~ _done_
- ~use new Android API from latest beta FW~ _done_
- script hotkey action's _(xml kodi compatible)_
- ~fix all NFS mount cases~ _done_
### Added Features/Fixes:
- Playback integration with the internal Zidoo player
- working resume, seek, watched states and server playback reporting
- http streaming support
- smb, nfs support via `Direct Path` option
- "smart" audio/subtitle selection logic
- working tarnscoding for unsupported formats/codec's
- UI layout fixes, changes
- cutoff grids, ui scaling fixed
### How to use with "Direct Path" option (smb/nfs):
- setup your Jellyfin server [library's](https://jellyfin.org/docs/general/server/libraries.html) with network paths or path substitution via `Shared network folder:` option
- Formats
- `smb://smb_user:smb_password@server_ip/share/folder`
- `smb://smb_user@server_ip/share/folder`
- `nfs://server_ip/nfs_export/:`
- `nfs://server_ip/nfs_export/:/tv`
- nfs needs the `/:` special marker right after the actual nfs export name/path portion!
- Examples:
- `smb://andy:123456@192.168.1.101/htpc-share/series`
- `smb://andy@192.168.1.101/htpc-share/series`
- `nfs://192.168.1.101/mnt/media/movies/:` -> with nfs export `/mnt/media/movies`
- `nfs://192.168.1.101/mnt/media/:/movies` -> with nfs export `/mnt/media`
![setting](https://user-images.githubusercontent.com/5340247/174437861-c1db621a-d4b2-4696-b33c-5152c0c67fb6.png)
- enable the `Direct Path` option in the JellyfinTv client
### NOTE: starting with firmware 6.(4/7).30+ you dont need the special `/:` NFS root-marker anymore!
### Community
- **for major bugs/issues regarding the Zidoo-Edition, please open a github issue**
- for questions, suggestions or help use the [Zidoo forum](http://forum.zidoo.tv/index.php)
- [Support Post](http://forum.zidoo.tv/index.php?threads/jellyfintv-zidoo-edition-support-post.93902/) for JellyfinTv Zidoo-Edition
- german Community [Zidoo forum](https://www.android-mediaplayer.de/forum/index.php?board/82-zidoo-player-x6-pro-x8-x9s-z9s-z9x-x10-z10-z10pro-x20-x20pro-z1000-z1000pro-uhd2/)
- AVS forum [Zidoo Post](https://www.avsforum.com/threads/zidoo-z9x-rtd1619-thread.3140924/page-999)
- Zidoo Community software site www.mcbluna.net
67 changes: 58 additions & 9 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,48 +1,89 @@
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import org.jetbrains.kotlin.cli.common.toBooleanLenient

plugins {
id("com.android.application")
kotlin("android")
kotlin("kapt")
alias(libs.plugins.kotlin.ksp)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.aboutlibraries)
}

android {
namespace = "org.jellyfin.androidtv"
compileSdk = 32
compileSdk = gradleLocalProperties(rootDir).getProperty("COMPILE_SDK_NR", "32").toInt()
ndkVersion = "26.1.10909125"

defaultConfig {
minSdk = 21
targetSdk = 32
minSdk = gradleLocalProperties(rootDir).getProperty("MIN_SDK_NR", "23").toInt()
targetSdk = gradleLocalProperties(rootDir).getProperty("TARGET_SDK_NR", "32").toInt()

// Release version
applicationId = namespace
versionName = project.getVersionName()
versionCode = getVersionCode(versionName!!)
setProperty("archivesBaseName", "jellyfin-androidtv-v$versionName")

ndk.abiFilters.addAll(setOf("armeabi-v7a","x86"))
}

sourceSets["main"].java.srcDirs("src/main/kotlin")
sourceSets["test"].java.srcDirs("src/test/kotlin")

buildFeatures {
viewBinding = true
viewBinding = gradleLocalProperties(rootDir).getProperty("BUILD_VIEW_BINDING", "true").toBooleanLenient()
dataBinding = gradleLocalProperties(rootDir).getProperty("BUILD_DATA_BINDING", "false").toBooleanLenient()
mlModelBinding = gradleLocalProperties(rootDir).getProperty("BUILD_MODEL_BINDING", "false").toBooleanLenient()
}

compileOptions {
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.valueOf(gradleLocalProperties(rootDir).getProperty("JAVA_VERSION", "VERSION_1_8"))
targetCompatibility = JavaVersion.valueOf(gradleLocalProperties(rootDir).getProperty("JAVA_VERSION", "VERSION_1_8"))
}

kotlinOptions {
jvmTarget = gradleLocalProperties(rootDir).getProperty("KOTLIN_JVM_TARGET", "1.8")
}

kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(gradleLocalProperties(rootDir).getProperty("JAVA_VERSION_NR", "8")))
}
}

// bundle {
// abi {
// enableSplit = true
// }
// }

signingConfigs {
create("release") {
storeFile = file(gradleLocalProperties(rootDir).getProperty("STOREFILE"))
keyAlias = gradleLocalProperties(rootDir).getProperty("KEYALIAS")
keyPassword = gradleLocalProperties(rootDir).getProperty("KEYPASSWORD")
storePassword = gradleLocalProperties(rootDir).getProperty("STOREPASSWORD")
}
}

buildTypes {
getByName("release") {
matchingFallbacks += listOf()
signingConfig = signingConfigs.getByName("release")
}

val release by getting {
isMinifyEnabled = false

isShrinkResources = false
// isJniDebuggable = false
// 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")
resValue("string", "app_name", "Jellyfin")

buildConfigField("boolean", "DEVELOPMENT", "false")
}
Expand All @@ -57,7 +98,7 @@ android {
resValue("string", "app_search_suggest_intent_data", "content://${namespace + applicationIdSuffix}.content/intent")

// Set flavored application name
resValue("string", "app_name", "@string/app_name_debug")
resValue("string", "app_name", "Jellyfin Debug")

buildConfigField("boolean", "DEVELOPMENT", (defaultConfig.versionCode!! < 100).toString())
}
Expand Down Expand Up @@ -125,6 +166,7 @@ dependencies {
implementation(libs.androidx.window)
implementation(libs.androidx.cardview)
implementation(libs.androidx.startup)
implementation(libs.androidx.compose.ui)

// Dependency Injection
implementation(libs.bundles.koin)
Expand All @@ -137,12 +179,19 @@ dependencies {
implementation(libs.jellyfin.exoplayer.ffmpegextension)
implementation(libs.libvlc)

// Apfloat
implementation(libs.apfloat)

// kotlin-extensions
implementation(libs.carleslc)

// 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
Expand Down
15 changes: 10 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?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 -->
Expand All @@ -21,22 +20,22 @@
<!-- 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"
tools:ignore="LeanbackUsesWifi" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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" />
<uses-feature
android:name="android.hardware.microphone"
android:required="false" />
<uses-feature
android:name="android.hardware.wifi"
android:required="false" />

<application
android:name=".JellyfinApplication"
Expand Down Expand Up @@ -103,12 +102,16 @@

<activity
android:name=".ui.browsing.MainActivity"
android:clearTaskOnLaunch="true"
android:launchMode="singleTask"
android:screenOrientation="landscape" />

<activity
android:name=".ui.startup.StartupActivity"
android:exported="true"
android:noHistory="true"
android:clearTaskOnLaunch="true"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="adjustNothing">
<intent-filter>
Expand Down Expand Up @@ -150,6 +153,8 @@

<activity
android:name=".ui.preference.PreferencesActivity"
android:clearTaskOnLaunch="true"
android:launchMode="singleTask"
android:theme="@style/Theme.Jellyfin.Preferences" />

<activity
Expand Down
Loading