diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt index ffed0d1e..5096d4fc 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt @@ -11,8 +11,8 @@ import coil.disk.DiskCache import coil.request.CachePolicy import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp -import javax.inject.Inject import timber.log.Timber +import javax.inject.Inject @HiltAndroidApp class BaseApplication : Application(), Configuration.Provider, ImageLoaderFactory { diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt index 1c5c6416..144efc6c 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt @@ -59,7 +59,7 @@ abstract class BasePlayerActivity : AppCompatActivity() { protected fun isRendererType( mappedTrackInfo: MappingTrackSelector.MappedTrackInfo, rendererIndex: Int, - type: Int + type: Int, ): Boolean { val trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex) if (trackGroupArray.length == 0) { diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt index d386e894..1e29edbf 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt @@ -10,17 +10,17 @@ import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter import dev.jdtech.jellyfin.adapters.ServerGridAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.api.JellyfinApi -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.Server import dev.jdtech.jellyfin.models.User -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.BaseItemPerson import org.jellyfin.sdk.model.api.ImageType +import java.util.UUID +import dev.jdtech.jellyfin.core.R as CoreR @BindingAdapter("servers") fun bindServers(recyclerView: RecyclerView, data: List?) { @@ -109,7 +109,7 @@ fun bindUserImage(imageView: ImageView, user: User) { private fun ImageView.loadImage( url: String, - @DrawableRes placeholderId: Int = CoreR.color.neutral_800 + @DrawableRes placeholderId: Int = CoreR.color.neutral_800, ): View { val api = JellyfinApi.getInstance(context.applicationContext) diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt index 603e03b5..2491ef20 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt @@ -20,13 +20,13 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import com.google.android.material.navigation.NavigationBarView import dagger.hilt.android.AndroidEntryPoint -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.databinding.ActivityMainBinding import dev.jdtech.jellyfin.viewmodels.MainViewModel import dev.jdtech.jellyfin.work.SyncWorker -import javax.inject.Inject import kotlinx.coroutines.launch +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class MainActivity : AppCompatActivity() { @@ -53,9 +53,9 @@ class MainActivity : AppCompatActivity() { .setConstraints( Constraints.Builder() .setRequiredNetworkType( - NetworkType.CONNECTED + NetworkType.CONNECTED, ) - .build() + .build(), ) .build() @@ -105,7 +105,7 @@ class MainActivity : AppCompatActivity() { R.id.mediaFragment, R.id.favoriteFragment, R.id.downloadsFragment, - ) + ), ) setupActionBarWithNavController(navController, appBarConfiguration) @@ -118,8 +118,10 @@ class MainActivity : AppCompatActivity() { R.id.twoPaneSettingsFragment, R.id.serverSelectFragment, R.id.addServerFragment, R.id.loginFragment, com.mikepenz.aboutlibraries.R.id.about_libraries_dest, R.id.usersFragment, R.id.serverAddressesFragment -> View.GONE else -> View.VISIBLE } - if (destination.id == com.mikepenz.aboutlibraries.R.id.about_libraries_dest) binding.mainToolbar.title = - getString(CoreR.string.app_info) + if (destination.id == com.mikepenz.aboutlibraries.R.id.about_libraries_dest) { + binding.mainToolbar.title = + getString(CoreR.string.app_info) + } } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 41dac23e..143e80d9 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -24,12 +24,12 @@ import dev.jdtech.jellyfin.dialogs.SpeedSelectionDialogFragment import dev.jdtech.jellyfin.dialogs.TrackSelectionDialogFragment import dev.jdtech.jellyfin.mpv.MPVPlayer import dev.jdtech.jellyfin.mpv.TrackType -import dev.jdtech.jellyfin.player.video.R as PlayerVideoR import dev.jdtech.jellyfin.utils.PlayerGestureHelper import dev.jdtech.jellyfin.utils.PreviewScrubListener import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel -import javax.inject.Inject import timber.log.Timber +import javax.inject.Inject +import dev.jdtech.jellyfin.player.video.R as PlayerVideoR var isControlsLocked: Boolean = false @@ -63,7 +63,7 @@ class PlayerActivity : BasePlayerActivity() { appPreferences, this, binding.playerView, - getSystemService(Context.AUDIO_SERVICE) as AudioManager + getSystemService(Context.AUDIO_SERVICE) as AudioManager, ) } @@ -106,7 +106,7 @@ class PlayerActivity : BasePlayerActivity() { is MPVPlayer -> { TrackSelectionDialogFragment(TrackType.AUDIO, viewModel).show( supportFragmentManager, - "trackselectiondialog" + "trackselectiondialog", ) } is ExoPlayer -> { @@ -126,7 +126,7 @@ class PlayerActivity : BasePlayerActivity() { this, resources.getString(PlayerVideoR.string.select_audio_track), viewModel.player, - C.TRACK_TYPE_AUDIO + C.TRACK_TYPE_AUDIO, ) val trackSelectionDialog = trackSelectionDialogBuilder.build() trackSelectionDialog.show() @@ -156,7 +156,7 @@ class PlayerActivity : BasePlayerActivity() { is MPVPlayer -> { TrackSelectionDialogFragment(TrackType.SUBTITLE, viewModel).show( supportFragmentManager, - "trackselectiondialog" + "trackselectiondialog", ) } is ExoPlayer -> { @@ -176,7 +176,7 @@ class PlayerActivity : BasePlayerActivity() { this, resources.getString(PlayerVideoR.string.select_subtile_track), viewModel.player, - C.TRACK_TYPE_TEXT + C.TRACK_TYPE_TEXT, ) trackSelectionDialogBuilder.setShowDisableOption(true) @@ -189,7 +189,7 @@ class PlayerActivity : BasePlayerActivity() { speedButton.setOnClickListener { SpeedSelectionDialogFragment(viewModel).show( supportFragmentManager, - "speedselectiondialog" + "speedselectiondialog", ) } @@ -210,7 +210,7 @@ class PlayerActivity : BasePlayerActivity() { imagePreview, timeBar, viewModel.player, - viewModel.currentTrickPlay + viewModel.currentTrickPlay, ) timeBar.addListener(previewScrubListener) diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt index b9553773..71b30d82 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt @@ -9,7 +9,7 @@ import dev.jdtech.jellyfin.databinding.CollectionItemBinding import dev.jdtech.jellyfin.models.FindroidCollection class CollectionListAdapter( - private val onClickListener: OnClickListener + private val onClickListener: OnClickListener, ) : ListAdapter(DiffCallback) { class CollectionViewHolder(private var binding: CollectionItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -34,8 +34,8 @@ class CollectionListAdapter( CollectionItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt index bce7eaf3..251eff1d 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt @@ -9,10 +9,10 @@ import dev.jdtech.jellyfin.databinding.DiscoveredServerItemBinding import dev.jdtech.jellyfin.models.DiscoveredServer class DiscoveredServerListAdapter( - private val clickListener: (server: DiscoveredServer) -> Unit + private val clickListener: (server: DiscoveredServer) -> Unit, ) : ListAdapter( - DiffCallback + DiffCallback, ) { class DiscoveredServerViewHolder(private var binding: DiscoveredServerItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -25,14 +25,14 @@ class DiscoveredServerListAdapter( companion object DiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame( oldItem: DiscoveredServer, - newItem: DiscoveredServer + newItem: DiscoveredServer, ): Boolean { return oldItem.id == newItem.id } override fun areContentsTheSame( oldItem: DiscoveredServer, - newItem: DiscoveredServer + newItem: DiscoveredServer, ): Boolean { return oldItem == newItem } @@ -40,14 +40,14 @@ class DiscoveredServerListAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): DiscoveredServerViewHolder { return DiscoveredServerViewHolder( DiscoveredServerItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt index cc46b57b..b7d37e60 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt @@ -8,12 +8,12 @@ import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.EpisodeItemBinding import dev.jdtech.jellyfin.databinding.SeasonHeaderBinding import dev.jdtech.jellyfin.models.EpisodeItem import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.isDownloaded +import dev.jdtech.jellyfin.core.R as CoreR private const val ITEM_VIEW_TYPE_HEADER = 0 private const val ITEM_VIEW_TYPE_EPISODE = 1 @@ -49,7 +49,7 @@ class EpisodeListAdapter( binding.progressBar.layoutParams.width = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, (episode.playbackPositionTicks.div(episode.runtimeTicks.toFloat()).times(84)), - binding.progressBar.context.resources.displayMetrics + binding.progressBar.context.resources.displayMetrics, ).toInt() binding.progressBar.visibility = View.VISIBLE } else { @@ -79,8 +79,8 @@ class EpisodeListAdapter( SeasonHeaderBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } ITEM_VIEW_TYPE_EPISODE -> { @@ -88,8 +88,8 @@ class EpisodeListAdapter( EpisodeItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } else -> throw ClassCastException("Unknown viewType $viewType") diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt index 9a131aaf..ff85370b 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt @@ -11,14 +11,14 @@ import dev.jdtech.jellyfin.models.FavoriteSection class FavoritesListAdapter( private val onClickListener: ViewItemListAdapter.OnClickListener, - private val onEpisodeClickListener: HomeEpisodeListAdapter.OnClickListener + private val onEpisodeClickListener: HomeEpisodeListAdapter.OnClickListener, ) : ListAdapter(DiffCallback) { class SectionViewHolder(private var binding: FavoriteSectionBinding) : RecyclerView.ViewHolder(binding.root) { fun bind( section: FavoriteSection, onClickListener: ViewItemListAdapter.OnClickListener, - onEpisodeClickListener: HomeEpisodeListAdapter.OnClickListener + onEpisodeClickListener: HomeEpisodeListAdapter.OnClickListener, ) { binding.section = section if (section.id == Constants.FAVORITE_TYPE_MOVIES || section.id == Constants.FAVORITE_TYPE_SHOWS) { @@ -42,7 +42,7 @@ class FavoritesListAdapter( override fun areContentsTheSame( oldItem: FavoriteSection, - newItem: FavoriteSection + newItem: FavoriteSection, ): Boolean { return oldItem == newItem } @@ -53,8 +53,8 @@ class FavoritesListAdapter( FavoriteSectionBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt index 3265ae8c..19945ea0 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt @@ -8,17 +8,17 @@ import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.HomeEpisodeItemBinding import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.isDownloaded +import dev.jdtech.jellyfin.core.R as CoreR class HomeEpisodeListAdapter(private val onClickListener: OnClickListener) : ListAdapter(DiffCallback) { class EpisodeViewHolder( private var binding: HomeEpisodeItemBinding, - private val parent: ViewGroup + private val parent: ViewGroup, ) : RecyclerView.ViewHolder(binding.root) { fun bind(item: FindroidItem) { @@ -26,7 +26,8 @@ class HomeEpisodeListAdapter(private val onClickListener: OnClickListener) : Lis if (item.playbackPositionTicks > 0) { binding.progressBar.layoutParams.width = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, - (item.playbackPositionTicks.div(item.runtimeTicks.toFloat()).times(224)), binding.progressBar.context.resources.displayMetrics + (item.playbackPositionTicks.div(item.runtimeTicks.toFloat()).times(224)), + binding.progressBar.context.resources.displayMetrics, ).toInt() binding.progressBar.visibility = View.VISIBLE } @@ -67,9 +68,9 @@ class HomeEpisodeListAdapter(private val onClickListener: OnClickListener) : Lis HomeEpisodeItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false + false, ), - parent + parent, ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt index 31ca9a53..76339602 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt @@ -33,8 +33,8 @@ class PersonListAdapter(private val clickListener: (item: BaseItemPerson) -> Uni PersonItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt index 763729a2..dc78ef39 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt @@ -10,7 +10,7 @@ import dev.jdtech.jellyfin.models.ServerAddress class ServerAddressAdapter( private val clickListener: (address: ServerAddress) -> Unit, - private val longClickListener: (address: ServerAddress) -> Boolean + private val longClickListener: (address: ServerAddress) -> Boolean, ) : ListAdapter(DiffCallback) { class ServerAddressViewHolder(private var binding: ServerAddressListItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -32,14 +32,14 @@ class ServerAddressAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): ServerAddressViewHolder { return ServerAddressViewHolder( ServerAddressListItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt index 4065d086..9761da07 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt @@ -10,7 +10,7 @@ import dev.jdtech.jellyfin.models.Server class ServerGridAdapter( private val onClickListener: OnClickListener, - private val onLongClickListener: OnLongClickListener + private val onLongClickListener: OnLongClickListener, ) : ListAdapter(DiffCallback) { class ServerViewHolder(private var binding: ServerItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -32,7 +32,7 @@ class ServerGridAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): ServerViewHolder { return ServerViewHolder(ServerItemBinding.inflate(LayoutInflater.from(parent.context))) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt index b7d35173..d9f0f24d 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt @@ -10,7 +10,7 @@ import dev.jdtech.jellyfin.models.User class UserListAdapter( private val clickListener: (user: User) -> Unit, - private val longClickListener: (user: User) -> Boolean + private val longClickListener: (user: User) -> Boolean, ) : ListAdapter(DiffCallback) { class UserViewHolder(private var binding: UserListItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -32,14 +32,14 @@ class UserListAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): UserViewHolder { return UserViewHolder( UserListItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt index d28eedbb..5c0280e3 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt @@ -9,7 +9,7 @@ import dev.jdtech.jellyfin.databinding.UserItemBinding import dev.jdtech.jellyfin.models.User class UserLoginListAdapter( - private val clickListener: (user: User) -> Unit + private val clickListener: (user: User) -> Unit, ) : ListAdapter(DiffCallback) { class UserLoginViewHolder(private var binding: UserItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -31,14 +31,14 @@ class UserLoginListAdapter( override fun onCreateViewHolder( parent: ViewGroup, - viewType: Int + viewType: Int, ): UserLoginViewHolder { return UserLoginViewHolder( UserItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt index afa1d4a1..b8707ba9 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt @@ -7,11 +7,11 @@ import androidx.core.view.isVisible import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.BaseItemBinding import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.isDownloaded +import dev.jdtech.jellyfin.core.R as CoreR class ViewItemListAdapter( private val onClickListener: OnClickListener, @@ -52,9 +52,9 @@ class ViewItemListAdapter( BaseItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false + false, ), - parent + parent, ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt index b9a374db..90dc05bd 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt @@ -7,11 +7,11 @@ import androidx.core.view.isVisible import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.BaseItemBinding import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.isDownloaded +import dev.jdtech.jellyfin.core.R as CoreR class ViewItemPagingAdapter( private val onClickListener: OnClickListener, @@ -53,9 +53,9 @@ class ViewItemPagingAdapter( BaseItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false + false, ), - parent + parent, ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt index 6eeff900..6e2021d4 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt @@ -5,12 +5,12 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.CardOfflineBinding import dev.jdtech.jellyfin.databinding.NextUpSectionBinding import dev.jdtech.jellyfin.databinding.ViewItemBinding import dev.jdtech.jellyfin.models.HomeItem import dev.jdtech.jellyfin.models.View +import dev.jdtech.jellyfin.core.R as CoreR private const val ITEM_VIEW_TYPE_NEXT_UP = 0 private const val ITEM_VIEW_TYPE_VIEW = 1 @@ -20,7 +20,7 @@ class ViewListAdapter( private val onClickListener: OnClickListener, private val onItemClickListener: ViewItemListAdapter.OnClickListener, private val onNextUpClickListener: HomeEpisodeListAdapter.OnClickListener, - private val onOnlineClickListener: OnClickListenerOfflineCard + private val onOnlineClickListener: OnClickListenerOfflineCard, ) : ListAdapter(DiffCallback) { class ViewViewHolder(private var binding: ViewItemBinding) : @@ -28,7 +28,7 @@ class ViewListAdapter( fun bind( dataItem: HomeItem.ViewItem, onClickListener: OnClickListener, - onItemClickListener: ViewItemListAdapter.OnClickListener + onItemClickListener: ViewItemListAdapter.OnClickListener, ) { val view = dataItem.view binding.view = view @@ -75,25 +75,26 @@ class ViewListAdapter( ITEM_VIEW_TYPE_NEXT_UP -> NextUpViewHolder( NextUpSectionBinding.inflate( LayoutInflater.from( - parent.context + parent.context, ), - parent, false - ) + parent, + false, + ), ) ITEM_VIEW_TYPE_VIEW -> ViewViewHolder( ViewItemBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) ITEM_VIEW_TYPE_OFFLINE_CARD -> { OfflineCardViewHolder( CardOfflineBinding.inflate( LayoutInflater.from(parent.context), parent, - false - ) + false, + ), ) } else -> throw ClassCastException("Unknown viewType $viewType") diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt index 397ab9d2..c6b0627a 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt @@ -30,7 +30,7 @@ class AddServerFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentAddServerBinding.inflate(inflater) @@ -117,7 +117,7 @@ class AddServerFragment : Fragment() { } private fun bindDiscoveredServersStateServers( - serversState: AddServerViewModel.DiscoveredServersState.Servers + serversState: AddServerViewModel.DiscoveredServersState.Servers, ) { val servers = serversState.servers if (servers.isEmpty()) { diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/CollectionFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/CollectionFragment.kt index e4a859a8..0b5bd6c4 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/CollectionFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/CollectionFragment.kt @@ -38,7 +38,7 @@ class CollectionFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentFavoriteBinding.inflate(inflater, container, false) @@ -48,7 +48,7 @@ class CollectionFragment : Fragment() { }, HomeEpisodeListAdapter.OnClickListener { item -> navigateToMediaItem(item) - } + }, ) viewLifecycleOwner.lifecycleScope.launch { @@ -112,23 +112,23 @@ class CollectionFragment : Fragment() { findNavController().navigate( CollectionFragmentDirections.actionCollectionFragmentToMovieFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidShow -> { findNavController().navigate( CollectionFragmentDirections.actionCollectionFragmentToShowFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidEpisode -> { findNavController().navigate( CollectionFragmentDirections.actionCollectionFragmentToEpisodeBottomSheetFragment( - item.id - ) + item.id, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadsFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadsFragment.kt index 2ce4edec..2773f7ed 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadsFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadsFragment.kt @@ -18,16 +18,16 @@ import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.FavoritesListAdapter import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentDownloadsBinding import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.utils.restart import dev.jdtech.jellyfin.viewmodels.DownloadsViewModel -import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class DownloadsFragment : Fragment() { @@ -40,7 +40,7 @@ class DownloadsFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentDownloadsBinding.inflate(inflater, container, false) @@ -50,7 +50,7 @@ class DownloadsFragment : Fragment() { }, HomeEpisodeListAdapter.OnClickListener { item -> navigateToMediaItem(item) - } + }, ) viewLifecycleOwner.lifecycleScope.launch { @@ -108,8 +108,8 @@ class DownloadsFragment : Fragment() { findNavController().navigate( DownloadsFragmentDirections.actionDownloadsFragmentToMovieFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidShow -> { @@ -117,8 +117,8 @@ class DownloadsFragment : Fragment() { DownloadsFragmentDirections.actionDownloadsFragmentToShowFragment( item.id, item.name, - true - ) + true, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt index 6426beba..1f049b6e 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -1,6 +1,5 @@ package dev.jdtech.jellyfin.fragments -import android.R as AndroidR import android.app.DownloadManager import android.os.Bundle import android.util.TypedValue @@ -15,7 +14,6 @@ import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import com.google.android.material.R as MaterialR import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -23,7 +21,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.bindCardItemImage -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.EpisodeBottomSheetBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.dialogs.getStorageSelectionDialog @@ -36,13 +33,16 @@ import dev.jdtech.jellyfin.models.isDownloading import dev.jdtech.jellyfin.utils.setIconTintColorAttribute import dev.jdtech.jellyfin.viewmodels.EpisodeBottomSheetViewModel import dev.jdtech.jellyfin.viewmodels.PlayerViewModel +import kotlinx.coroutines.launch +import org.jellyfin.sdk.model.DateTime +import timber.log.Timber import java.text.DateFormat import java.time.ZoneOffset import java.util.Date import java.util.UUID -import kotlinx.coroutines.launch -import org.jellyfin.sdk.model.DateTime -import timber.log.Timber +import android.R as AndroidR +import com.google.android.material.R as MaterialR +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { @@ -57,7 +57,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = EpisodeBottomSheetBinding.inflate(inflater, container, false) @@ -175,7 +175,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { onCancel = { binding.itemActions.progressDownload.isVisible = false binding.itemActions.downloadButton.setIconResource(CoreR.drawable.ic_download) - } + }, ) dialog.show() return@getStorageSelectionDialog @@ -186,7 +186,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { onCancel = { binding.itemActions.progressDownload.isVisible = false binding.itemActions.downloadButton.setIconResource(CoreR.drawable.ic_download) - } + }, ) storageDialog.show() return@setOnClickListener @@ -202,7 +202,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { onCancel = { binding.itemActions.progressDownload.isVisible = false binding.itemActions.downloadButton.setIconResource(CoreR.drawable.ic_download) - } + }, ) dialog.show() return@setOnClickListener @@ -237,7 +237,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { binding.progressBar.layoutParams.width = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, (episode.playbackPositionTicks.div(episode.runtimeTicks).times(1.26)).toFloat(), - context?.resources?.displayMetrics + context?.resources?.displayMetrics, ).toInt() binding.progressBar.isVisible = true } @@ -264,7 +264,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { CoreR.string.episode_name_extended, episode.parentIndexNumber, episode.indexNumber, - episode.name + episode.name, ) } else { getString( @@ -272,7 +272,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { episode.parentIndexNumber, episode.indexNumber, episode.indexNumberEnd, - episode.name + episode.name, ) } @@ -307,12 +307,12 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { private fun bindCheckButtonState(played: Boolean) { when (played) { true -> binding.itemActions.checkButton.setIconTintResource( - CoreR.color.red + CoreR.color.red, ) false -> binding.itemActions.checkButton.setIconTintColorAttribute( MaterialR.attr.colorOnSecondaryContainer, - requireActivity().theme + requireActivity().theme, ) } } @@ -325,12 +325,12 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { binding.itemActions.favoriteButton.setIconResource(favoriteDrawable) when (favorite) { true -> binding.itemActions.favoriteButton.setIconTintResource( - CoreR.color.red + CoreR.color.red, ) false -> binding.itemActions.favoriteButton.setIconTintColorAttribute( MaterialR.attr.colorOnSecondaryContainer, - requireActivity().theme + requireActivity().theme, ) } } @@ -392,7 +392,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { findNavController().navigate( EpisodeBottomSheetFragmentDirections.actionEpisodeBottomSheetFragmentToPlayerActivity( playerItems, - ) + ), ) } @@ -400,8 +400,8 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { findNavController().navigate( EpisodeBottomSheetFragmentDirections.actionEpisodeBottomSheetFragmentToShowFragment( itemId = id, - itemName = name - ) + itemName = name, + ), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt index 527b9727..814c7a6b 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt @@ -37,7 +37,7 @@ class FavoriteFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentFavoriteBinding.inflate(inflater, container, false) @@ -47,7 +47,7 @@ class FavoriteFragment : Fragment() { }, HomeEpisodeListAdapter.OnClickListener { item -> navigateToMediaItem(item) - } + }, ) viewLifecycleOwner.lifecycleScope.launch { @@ -105,23 +105,23 @@ class FavoriteFragment : Fragment() { findNavController().navigate( FavoriteFragmentDirections.actionFavoriteFragmentToMovieFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidShow -> { findNavController().navigate( FavoriteFragmentDirections.actionFavoriteFragmentToShowFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidEpisode -> { findNavController().navigate( FavoriteFragmentDirections.actionFavoriteFragmentToEpisodeBottomSheetFragment( - item.id - ) + item.id, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt index adc990a7..103b2a44 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt @@ -23,7 +23,6 @@ import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.adapters.HomeEpisodeListAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.adapters.ViewListAdapter -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentHomeBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.models.FindroidEpisode @@ -33,9 +32,10 @@ import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.utils.restart import dev.jdtech.jellyfin.viewmodels.HomeViewModel -import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class HomeFragment : Fragment() { @@ -53,7 +53,7 @@ class HomeFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentHomeBinding.inflate(inflater, container, false) @@ -87,7 +87,7 @@ class HomeFragment : Fragment() { settings.isVisible = true return true } - } + }, ) searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { @@ -114,7 +114,8 @@ class HomeFragment : Fragment() { } } }, - viewLifecycleOwner, Lifecycle.State.RESUMED + viewLifecycleOwner, + Lifecycle.State.RESUMED, ) } @@ -155,7 +156,7 @@ class HomeFragment : Fragment() { onOnlineClickListener = ViewListAdapter.OnClickListenerOfflineCard { appPreferences.offlineMode = false activity?.restart() - } + }, ) binding.errorLayout.errorRetryButton.setOnClickListener { @@ -211,8 +212,8 @@ class HomeFragment : Fragment() { HomeFragmentDirections.actionNavigationHomeToLibraryFragment( libraryId = view.id, libraryName = view.name, - libraryType = view.type - ) + libraryType = view.type, + ), ) } @@ -222,23 +223,23 @@ class HomeFragment : Fragment() { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToMovieFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidShow -> { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToShowFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidEpisode -> { findNavController().navigate( HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment( - item.id - ) + item.id, + ), ) } } @@ -246,13 +247,13 @@ class HomeFragment : Fragment() { private fun navigateToSettingsFragment() { findNavController().navigate( - HomeFragmentDirections.actionHomeFragmentToSettingsFragment() + HomeFragmentDirections.actionHomeFragmentToSettingsFragment(), ) } private fun navigateToSearchResultFragment(query: String) { findNavController().navigate( - HomeFragmentDirections.actionHomeFragmentToSearchResultFragment(query) + HomeFragmentDirections.actionHomeFragmentToSearchResultFragment(query), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt index 3272e1d9..e3a45ffb 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt @@ -21,7 +21,6 @@ import androidx.paging.LoadState import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.adapters.ViewItemPagingAdapter -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.dialogs.SortDialogFragment @@ -32,10 +31,11 @@ import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.viewmodels.LibraryViewModel -import java.lang.IllegalArgumentException -import javax.inject.Inject import kotlinx.coroutines.launch import org.jellyfin.sdk.model.api.SortOrder +import java.lang.IllegalArgumentException +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class LibraryFragment : Fragment() { @@ -52,7 +52,7 @@ class LibraryFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentLibraryBinding.inflate(inflater, container, false) return binding.root @@ -75,10 +75,10 @@ class LibraryFragment : Fragment() { args.libraryId, args.libraryType, viewModel, - "sortBy" + "sortBy", ).show( parentFragmentManager, - "sortdialog" + "sortdialog", ) true } @@ -87,10 +87,10 @@ class LibraryFragment : Fragment() { args.libraryId, args.libraryType, viewModel, - "sortOrder" + "sortOrder", ).show( parentFragmentManager, - "sortdialog" + "sortdialog", ) true } @@ -98,7 +98,8 @@ class LibraryFragment : Fragment() { } } }, - viewLifecycleOwner, Lifecycle.State.RESUMED + viewLifecycleOwner, + Lifecycle.State.RESUMED, ) binding.errorLayout.errorRetryButton.setOnClickListener { @@ -108,7 +109,7 @@ class LibraryFragment : Fragment() { binding.errorLayout.errorDetailsButton.setOnClickListener { errorDialog.show( parentFragmentManager, - ErrorDialogFragment.TAG + ErrorDialogFragment.TAG, ) } @@ -116,7 +117,7 @@ class LibraryFragment : Fragment() { ViewItemPagingAdapter( ViewItemPagingAdapter.OnClickListener { item -> navigateToItem(item) - } + }, ) (binding.itemsRecyclerView.adapter as ViewItemPagingAdapter).addLoadStateListener { @@ -162,7 +163,7 @@ class LibraryFragment : Fragment() { args.libraryId, args.libraryType, sortBy = sortBy, - sortOrder = sortOrder + sortOrder = sortOrder, ) } } @@ -201,24 +202,24 @@ class LibraryFragment : Fragment() { findNavController().navigate( LibraryFragmentDirections.actionLibraryFragmentToMovieFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidShow -> { findNavController().navigate( LibraryFragmentDirections.actionLibraryFragmentToShowFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidBoxSet -> { findNavController().navigate( LibraryFragmentDirections.actionLibraryFragmentToCollectionFragment( item.id, - item.name - ) + item.name, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt index f3b46a68..39330a1b 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt @@ -17,13 +17,13 @@ import androidx.navigation.fragment.navArgs import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.adapters.UserLoginListAdapter -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.databinding.FragmentLoginBinding import dev.jdtech.jellyfin.viewmodels.LoginViewModel -import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class LoginFragment : Fragment() { @@ -41,7 +41,7 @@ class LoginFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentLoginBinding.inflate(inflater) diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt index 89f5ed54..2cda75fe 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt @@ -20,7 +20,6 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.adapters.CollectionListAdapter -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentMediaBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.models.FindroidCollection @@ -28,6 +27,7 @@ import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.viewmodels.MediaViewModel import kotlinx.coroutines.launch import timber.log.Timber +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class MediaFragment : Fragment() { @@ -42,7 +42,7 @@ class MediaFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentMediaBinding.inflate(inflater, container, false) @@ -50,7 +50,7 @@ class MediaFragment : Fragment() { CollectionListAdapter( CollectionListAdapter.OnClickListener { library -> navigateToLibraryFragment(library) - } + }, ) viewLifecycleOwner.lifecycleScope.launch { @@ -108,7 +108,8 @@ class MediaFragment : Fragment() { return true } }, - viewLifecycleOwner, Lifecycle.State.RESUMED + viewLifecycleOwner, + Lifecycle.State.RESUMED, ) } @@ -152,13 +153,13 @@ class MediaFragment : Fragment() { libraryId = library.id, libraryName = library.name, libraryType = library.type, - ) + ), ) } private fun navigateToSearchResultFragment(query: String) { findNavController().navigate( - MediaFragmentDirections.actionNavigationMediaToSearchResultFragment(query) + MediaFragmentDirections.actionNavigationMediaToSearchResultFragment(query), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MovieFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MovieFragment.kt index 7e112cd4..2928b4f5 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MovieFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MovieFragment.kt @@ -24,7 +24,6 @@ import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.PersonListAdapter import dev.jdtech.jellyfin.bindItemBackdropImage -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentMovieBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.dialogs.getStorageSelectionDialog @@ -40,10 +39,11 @@ import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.utils.setIconTintColorAttribute import dev.jdtech.jellyfin.viewmodels.MovieViewModel import dev.jdtech.jellyfin.viewmodels.PlayerViewModel -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber +import java.util.UUID +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class MovieFragment : Fragment() { @@ -61,7 +61,7 @@ class MovieFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentMovieBinding.inflate(inflater, container, false) @@ -152,13 +152,14 @@ class MovieFragment : Fragment() { binding.itemActions.progressPlay.isVisible = true if (viewModel.item.sources.filter { it.type == FindroidSourceType.REMOTE }.size > 1) { val dialog = getVideoVersionDialog( - requireContext(), viewModel.item, + requireContext(), + viewModel.item, onItemSelected = { playerViewModel.loadPlayerItems(viewModel.item, it) }, onCancel = { playButtonNormal() - } + }, ) dialog.show() return@setOnClickListener @@ -170,7 +171,7 @@ class MovieFragment : Fragment() { viewModel.item.trailer.let { trailerUri -> val intent = Intent( Intent.ACTION_VIEW, - Uri.parse(trailerUri) + Uri.parse(trailerUri), ) try { startActivity(intent) @@ -215,7 +216,7 @@ class MovieFragment : Fragment() { onCancel = { binding.itemActions.progressDownload.isVisible = false binding.itemActions.downloadButton.setIconResource(CoreR.drawable.ic_download) - } + }, ) dialog.show() return@getStorageSelectionDialog @@ -226,7 +227,7 @@ class MovieFragment : Fragment() { onCancel = { binding.itemActions.progressDownload.isVisible = false binding.itemActions.downloadButton.setIconResource(CoreR.drawable.ic_download) - } + }, ) storageDialog.show() return@setOnClickListener @@ -242,7 +243,7 @@ class MovieFragment : Fragment() { onCancel = { binding.itemActions.progressDownload.isVisible = false binding.itemActions.downloadButton.setIconResource(CoreR.drawable.ic_download) - } + }, ) dialog.show() return@setOnClickListener @@ -324,7 +325,8 @@ class MovieFragment : Fragment() { videoProfileChip.isVisible = when (this) { DisplayProfile.HDR, DisplayProfile.HDR10, - DisplayProfile.HLG -> { + DisplayProfile.HLG, + -> { videoProfileChip.chipStartPadding = .0f true } @@ -411,7 +413,7 @@ class MovieFragment : Fragment() { true -> binding.itemActions.checkButton.setIconTintResource(CoreR.color.red) false -> binding.itemActions.checkButton.setIconTintColorAttribute( com.google.android.material.R.attr.colorOnSecondaryContainer, - requireActivity().theme + requireActivity().theme, ) } } @@ -426,7 +428,7 @@ class MovieFragment : Fragment() { true -> binding.itemActions.favoriteButton.setIconTintResource(CoreR.color.red) false -> binding.itemActions.favoriteButton.setIconTintColorAttribute( com.google.android.material.R.attr.colorOnSecondaryContainer, - requireActivity().theme + requireActivity().theme, ) } } @@ -494,14 +496,14 @@ class MovieFragment : Fragment() { ) { findNavController().navigate( MovieFragmentDirections.actionMovieFragmentToPlayerActivity( - playerItems - ) + playerItems, + ), ) } private fun navigateToPersonDetail(personId: UUID) { findNavController().navigate( - MovieFragmentDirections.actionMovieFragmentToPersonDetailFragment(personId) + MovieFragmentDirections.actionMovieFragmentToPersonDetailFragment(personId), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt index b0c2f00a..2b589153 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt @@ -17,7 +17,6 @@ import androidx.navigation.fragment.navArgs import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.bindItemImage -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentPersonDetailBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.models.FindroidItem @@ -27,6 +26,7 @@ import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.viewmodels.PersonDetailViewModel import kotlinx.coroutines.launch import timber.log.Timber +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint internal class PersonDetailFragment : Fragment() { @@ -41,7 +41,7 @@ internal class PersonDetailFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentPersonDetailBinding.inflate(inflater, container, false) return binding.root @@ -120,7 +120,7 @@ internal class PersonDetailFragment : Fragment() { private fun adapter() = ViewItemListAdapter( fixedWidth = true, - onClickListener = ViewItemListAdapter.OnClickListener { navigateToMediaItem(it) } + onClickListener = ViewItemListAdapter.OnClickListener { navigateToMediaItem(it) }, ) private fun setupOverviewExpansion() = binding.overview.post { @@ -145,16 +145,16 @@ internal class PersonDetailFragment : Fragment() { findNavController().navigate( PersonDetailFragmentDirections.actionPersonDetailFragmentToMovieFragment( itemId = item.id, - itemName = item.name - ) + itemName = item.name, + ), ) } is FindroidShow -> { findNavController().navigate( PersonDetailFragmentDirections.actionPersonDetailFragmentToShowFragment( itemId = item.id, - itemName = item.name - ) + itemName = item.name, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt index c8834fa0..5303d25e 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt @@ -39,7 +39,7 @@ class SearchResultFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentSearchResultBinding.inflate(inflater, container, false) @@ -49,7 +49,7 @@ class SearchResultFragment : Fragment() { }, HomeEpisodeListAdapter.OnClickListener { item -> navigateToMediaItem(item) - } + }, ) viewLifecycleOwner.lifecycleScope.launch { @@ -113,23 +113,23 @@ class SearchResultFragment : Fragment() { findNavController().navigate( SearchResultFragmentDirections.actionSearchResultFragmentToMovieFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidShow -> { findNavController().navigate( SearchResultFragmentDirections.actionSearchResultFragmentToShowFragment( item.id, - item.name - ) + item.name, + ), ) } is FindroidEpisode -> { findNavController().navigate( SearchResultFragmentDirections.actionSearchResultFragmentToEpisodeBottomSheetFragment( - item.id - ) + item.id, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt index d944d400..fcc7e973 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt @@ -37,7 +37,7 @@ class SeasonFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentSeasonBinding.inflate(inflater, container, false) return binding.root @@ -124,8 +124,8 @@ class SeasonFragment : Fragment() { private fun navigateToEpisodeBottomSheetFragment(episode: FindroidEpisode) { findNavController().navigate( SeasonFragmentDirections.actionSeasonFragmentToEpisodeBottomSheetFragment( - episode.id - ) + episode.id, + ), ) } @@ -134,8 +134,8 @@ class SeasonFragment : Fragment() { ) { findNavController().navigate( SeasonFragmentDirections.actionSeasonFragmentToPlayerActivity( - playerItems - ) + playerItems, + ), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt index b3cca5ee..c753e5d0 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt @@ -30,7 +30,7 @@ class ServerAddressesFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentServerAddressesBinding.inflate(inflater) @@ -42,16 +42,16 @@ class ServerAddressesFragment : Fragment() { { address -> DeleteServerAddressDialog(viewModel, address).show( parentFragmentManager, - "deleteServerAddress" + "deleteServerAddress", ) true - } + }, ) binding.buttonAddAddress.setOnClickListener { AddServerAddressDialog(viewModel).show( parentFragmentManager, - "addServerAddress" + "addServerAddress", ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt index 63de875a..0323c75e 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt @@ -26,7 +26,7 @@ class ServerSelectFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentServerSelectBinding.inflate(inflater) @@ -42,10 +42,10 @@ class ServerSelectFragment : Fragment() { ServerGridAdapter.OnLongClickListener { server -> DeleteServerDialogFragment(viewModel, server).show( parentFragmentManager, - "deleteServer" + "deleteServer", ) true - } + }, ) binding.buttonAddServer.setOnClickListener { @@ -67,7 +67,7 @@ class ServerSelectFragment : Fragment() { private fun navigateToAddServerFragment() { findNavController().navigate( - ServerSelectFragmentDirections.actionServerSelectFragmentToAddServerFragment() + ServerSelectFragmentDirections.actionServerSelectFragmentToAddServerFragment(), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt index 9eb8c4be..c09a6f49 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt @@ -5,8 +5,8 @@ import androidx.fragment.app.viewModels import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import dagger.hilt.android.AndroidEntryPoint -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.viewmodels.SettingsDeviceViewModel +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint @Suppress("unused") diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt index 01e1284d..9e334ae7 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt @@ -8,9 +8,9 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.AppPreferences -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.utils.restart import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class SettingsFragment : PreferenceFragmentCompat() { @@ -45,7 +45,7 @@ class SettingsFragment : PreferenceFragmentCompat() { findPreference("privacyPolicy")?.setOnPreferenceClickListener { val intent = Intent( Intent.ACTION_VIEW, - Uri.parse("https://github.com/jarnedemeulemeester/findroid/blob/main/PRIVACY") + Uri.parse("https://github.com/jarnedemeulemeester/findroid/blob/main/PRIVACY"), ) startActivity(intent) true diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt index df633a48..854a3e03 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt @@ -20,8 +20,8 @@ class SettingsLanguageFragment : PreferenceFragmentCompat() { startActivity( Intent( Settings.ACTION_APP_LOCALE_SETTINGS, - Uri.parse("package:${requireContext().packageName}") - ) + Uri.parse("package:${requireContext().packageName}"), + ), ) true } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ShowFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ShowFragment.kt index ca442a63..f544aa13 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ShowFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ShowFragment.kt @@ -22,7 +22,6 @@ import dev.jdtech.jellyfin.adapters.PersonListAdapter import dev.jdtech.jellyfin.adapters.ViewItemListAdapter import dev.jdtech.jellyfin.bindCardItemImage import dev.jdtech.jellyfin.bindItemBackdropImage -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.databinding.FragmentShowBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.models.FindroidItem @@ -34,10 +33,11 @@ import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.utils.setIconTintColorAttribute import dev.jdtech.jellyfin.viewmodels.PlayerViewModel import dev.jdtech.jellyfin.viewmodels.ShowViewModel -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber +import java.util.UUID +import javax.inject.Inject +import dev.jdtech.jellyfin.core.R as CoreR @AndroidEntryPoint class ShowFragment : Fragment() { @@ -55,7 +55,7 @@ class ShowFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentShowBinding.inflate(inflater, container, false) @@ -104,7 +104,7 @@ class ShowFragment : Fragment() { viewModel.item.trailer.let { trailerUri -> val intent = Intent( Intent.ACTION_VIEW, - Uri.parse(trailerUri) + Uri.parse(trailerUri), ) try { startActivity(intent) @@ -123,7 +123,7 @@ class ShowFragment : Fragment() { ViewItemListAdapter.OnClickListener { season -> if (season is FindroidSeason) navigateToSeasonFragment(season) }, - fixedWidth = true + fixedWidth = true, ) binding.peopleRecyclerView.adapter = PersonListAdapter { person -> navigateToPersonDetail(person.id) @@ -183,9 +183,11 @@ class ShowFragment : Fragment() { binding.itemActions.downloadButton.isVisible = true binding.itemActions.downloadButton.isEnabled = !downloaded - if (downloaded) binding.itemActions.downloadButton.setIconTintResource( - CoreR.color.red - ) + if (downloaded) { + binding.itemActions.downloadButton.setIconTintResource( + CoreR.color.red, + ) + } } false -> { @@ -222,7 +224,7 @@ class ShowFragment : Fragment() { CoreR.string.episode_name_extended, nextUp?.parentIndexNumber, nextUp?.indexNumber, - nextUp?.name + nextUp?.name, ) } else { binding.nextUpName.text = getString( @@ -230,7 +232,7 @@ class ShowFragment : Fragment() { nextUp?.parentIndexNumber, nextUp?.indexNumber, nextUp?.indexNumberEnd, - nextUp?.name + nextUp?.name, ) } @@ -265,7 +267,7 @@ class ShowFragment : Fragment() { true -> binding.itemActions.checkButton.setIconTintResource(CoreR.color.red) false -> binding.itemActions.checkButton.setIconTintColorAttribute( R.attr.colorOnSecondaryContainer, - requireActivity().theme + requireActivity().theme, ) } } @@ -280,7 +282,7 @@ class ShowFragment : Fragment() { true -> binding.itemActions.favoriteButton.setIconTintResource(CoreR.color.red) false -> binding.itemActions.favoriteButton.setIconTintColorAttribute( R.attr.colorOnSecondaryContainer, - requireActivity().theme + requireActivity().theme, ) } } @@ -310,8 +312,8 @@ class ShowFragment : Fragment() { private fun navigateToEpisodeBottomSheetFragment(episode: FindroidItem) { findNavController().navigate( ShowFragmentDirections.actionShowFragmentToEpisodeBottomSheetFragment( - episode.id - ) + episode.id, + ), ) } @@ -322,8 +324,8 @@ class ShowFragment : Fragment() { season.id, season.seriesName, season.name, - args.offline - ) + args.offline, + ), ) } @@ -332,14 +334,14 @@ class ShowFragment : Fragment() { ) { findNavController().navigate( ShowFragmentDirections.actionShowFragmentToPlayerActivity( - playerItems - ) + playerItems, + ), ) } private fun navigateToPersonDetail(personId: UUID) { findNavController().navigate( - ShowFragmentDirections.actionShowFragmentToPersonDetailFragment(personId) + ShowFragmentDirections.actionShowFragmentToPersonDetailFragment(personId), ) } } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt index 93c724fb..2923653c 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt @@ -30,7 +30,7 @@ class UsersFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { binding = FragmentUsersBinding.inflate(inflater) @@ -42,10 +42,10 @@ class UsersFragment : Fragment() { { user -> DeleteUserDialogFragment(viewModel, user).show( parentFragmentManager, - "deleteUser" + "deleteUser", ) true - } + }, ) binding.buttonAddUser.setOnClickListener { @@ -90,7 +90,7 @@ class UsersFragment : Fragment() { private fun navigateToLoginFragment() { findNavController().navigate( - AppNavigationDirections.actionGlobalLoginFragment() + AppNavigationDirections.actionGlobalLoginFragment(), ) } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt index 9ec93fb1..793d4197 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt @@ -20,14 +20,14 @@ import dev.jdtech.jellyfin.Constants import dev.jdtech.jellyfin.PlayerActivity import dev.jdtech.jellyfin.isControlsLocked import dev.jdtech.jellyfin.mpv.MPVPlayer -import kotlin.math.abs import timber.log.Timber +import kotlin.math.abs class PlayerGestureHelper( private val appPreferences: AppPreferences, private val activity: PlayerActivity, private val playerView: PlayerView, - private val audioManager: AudioManager + private val audioManager: AudioManager, ) { /** * Tracks whether video content should fill the screen, cutting off unwanted content on the sides. @@ -78,7 +78,7 @@ class PlayerGestureHelper( } return true } - } + }, ) private val seekGestureDetector = GestureDetector( @@ -89,7 +89,7 @@ class PlayerGestureHelper( firstEvent: MotionEvent, currentEvent: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { // Excludes area where app gestures conflicting with system gestures if (inExclusionArea(firstEvent)) return false @@ -114,11 +114,13 @@ class PlayerGestureHelper( swipeGestureValueTrackerProgress = newPos swipeGestureProgressOpen = true true - } else false + } else { + false + } } return true } - } + }, ) private val vbGestureDetector = GestureDetector( @@ -129,7 +131,7 @@ class PlayerGestureHelper( firstEvent: MotionEvent, currentEvent: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { // Excludes area where app gestures conflicting with system gestures if (inExclusionArea(firstEvent)) return false @@ -138,8 +140,9 @@ class PlayerGestureHelper( if (abs(distanceY / distanceX) < 2) return false - if (swipeGestureValueTrackerProgress > -1 || swipeGestureProgressOpen) + if (swipeGestureValueTrackerProgress > -1 || swipeGestureProgressOpen) { return false + } val viewCenterX = playerView.measuredWidth / 2 @@ -197,7 +200,7 @@ class PlayerGestureHelper( } return true } - } + }, ) private val hideGestureVolumeIndicatorOverlayAction = Runnable { @@ -236,7 +239,7 @@ class PlayerGestureHelper( } override fun onScaleEnd(detector: ScaleGestureDetector) = Unit - } + }, ).apply { isQuickScaleEnabled = false } private fun updateZoomMode(enabled: Boolean) { @@ -294,14 +297,16 @@ class PlayerGestureHelper( if ((firstEvent.x < insets.left) || (firstEvent.x > (screenWidth - insets.right)) || (firstEvent.y < insets.top) || (firstEvent.y > (screenHeight - insets.bottom)) - ) + ) { return true + } } else if (firstEvent.y < playerView.resources.dip(Constants.GESTURE_EXCLUSION_AREA_VERTICAL) || firstEvent.y > screenHeight - playerView.resources.dip(Constants.GESTURE_EXCLUSION_AREA_VERTICAL) || firstEvent.x < playerView.resources.dip(Constants.GESTURE_EXCLUSION_AREA_HORIZONTAL) || firstEvent.x > screenWidth - playerView.resources.dip(Constants.GESTURE_EXCLUSION_AREA_HORIZONTAL) - ) + ) { return true + } return false } diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PreviewScrubListener.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PreviewScrubListener.kt index a5e10d39..166df358 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PreviewScrubListener.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PreviewScrubListener.kt @@ -17,7 +17,7 @@ class PreviewScrubListener( private val scrubbingPreview: ImageView, private val timeBarView: View, private val player: Player, - private val currentTrickPlay: StateFlow + private val currentTrickPlay: StateFlow, ) : TimeBar.OnScrubListener { private val roundedCorners = RoundedCornersTransformation(10f) @@ -26,8 +26,9 @@ class PreviewScrubListener( override fun onScrubStart(timeBar: TimeBar, position: Long) { Timber.d("Scrubbing started at $position") - if (currentTrickPlay.value == null) + if (currentTrickPlay.value == null) { return + } scrubbingPreview.visibility = View.VISIBLE onScrubMove(timeBar, position) diff --git a/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt index 593eb1ea..7925ac10 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt @@ -19,13 +19,13 @@ object ApiModule { fun provideJellyfinApi( @ApplicationContext application: Context, appPreferences: AppPreferences, - serverDatabase: ServerDatabaseDao + serverDatabase: ServerDatabaseDao, ): JellyfinApi { val jellyfinApi = JellyfinApi.getInstance( context = application, requestTimeout = appPreferences.requestTimeout, connectTimeout = appPreferences.connectTimeout, - socketTimeout = appPreferences.socketTimeout + socketTimeout = appPreferences.socketTimeout, ) val serverId = appPreferences.currentServer ?: return jellyfinApi diff --git a/core/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt index ebca0f40..88c92dcc 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt @@ -20,7 +20,7 @@ object DatabaseModule { return Room.databaseBuilder( app.applicationContext, ServerDatabase::class.java, - "servers" + "servers", ) .fallbackToDestructiveMigration() .allowMainThreadQueries() diff --git a/core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt index 37fecf2c..968d9e7a 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt @@ -10,7 +10,7 @@ import dev.jdtech.jellyfin.viewmodels.ServerAddressesViewModel import java.lang.IllegalStateException class AddServerAddressDialog( - private val viewModel: ServerAddressesViewModel + private val viewModel: ServerAddressesViewModel, ) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val editText = EditText(this.context) diff --git a/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt index ea505b33..a38ab9b1 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt @@ -11,7 +11,7 @@ import java.lang.IllegalStateException class DeleteServerAddressDialog( private val viewModel: ServerAddressesViewModel, - val address: ServerAddress + val address: ServerAddress, ) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { diff --git a/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt index 39d94ac2..7a93955a 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt @@ -10,17 +10,17 @@ import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.models.CollectionType import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.viewmodels.LibraryViewModel +import org.jellyfin.sdk.model.api.SortOrder import java.lang.IllegalStateException import java.util.UUID import javax.inject.Inject -import org.jellyfin.sdk.model.api.SortOrder @AndroidEntryPoint class SortDialogFragment( private val parentId: UUID, private val libraryType: CollectionType, private val viewModel: LibraryViewModel, - private val sortType: String + private val sortType: String, ) : DialogFragment() { @Inject lateinit var appPreferences: AppPreferences @@ -48,7 +48,8 @@ class SortDialogFragment( builder .setTitle(getString(R.string.sort_by)) .setSingleChoiceItems( - sortByOptions, currentSortBy.ordinal + sortByOptions, + currentSortBy.ordinal, ) { dialog, which -> val sortBy = sortByValues[which] appPreferences.sortBy = sortBy.name @@ -56,7 +57,7 @@ class SortDialogFragment( parentId, libraryType, sortBy = sortBy, - sortOrder = currentSortOrder + sortOrder = currentSortOrder, ) dialog.dismiss() } @@ -68,7 +69,8 @@ class SortDialogFragment( builder .setTitle(getString(R.string.sort_order)) .setSingleChoiceItems( - sortByOptions, currentSortOrder.ordinal + sortByOptions, + currentSortOrder.ordinal, ) { dialog, which -> val sortOrder = try { sortOrderValues[which] @@ -82,7 +84,7 @@ class SortDialogFragment( parentId, libraryType, sortBy = currentSortBy, - sortOrder = sortOrder + sortOrder = sortOrder, ) dialog.dismiss() } diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt b/core/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt index bb34caa8..8ff29b32 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt @@ -3,5 +3,5 @@ package dev.jdtech.jellyfin.models data class DiscoveredServer( val id: String, val name: String, - val address: String + val address: String, ) diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt b/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt index e03b5b0f..42a6afe8 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt @@ -6,5 +6,5 @@ data class DownloadSection( val id: UUID, val name: String, val items: List? = null, - val series: List? = null + val series: List? = null, ) diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt index 79b63652..35a3d1eb 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt @@ -1,9 +1,9 @@ package dev.jdtech.jellyfin.models data class ExceptionUiText( - val uiText: UiText + val uiText: UiText, ) : Exception() data class ExceptionUiTexts( - val uiTexts: Collection + val uiTexts: Collection, ) : Exception() diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt b/core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt index c57bd6aa..ce2b31a2 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt @@ -3,5 +3,5 @@ package dev.jdtech.jellyfin.models data class FavoriteSection( val id: Int, val name: UiText, - var items: List + var items: List, ) diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt b/core/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt index 98e0caf3..8c2a9520 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt @@ -5,5 +5,5 @@ import java.util.UUID data class HomeSection( val id: UUID, val name: UiText, - var items: List + var items: List, ) diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt b/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt index 23c0fe8e..fff64c7e 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt @@ -7,7 +7,7 @@ sealed class UiText { data class DynamicString(val value: String) : UiText() class StringResource( @StringRes val resId: Int, - vararg val args: Any? + vararg val args: Any?, ) : UiText() fun asString(resources: Resources): String { diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/View.kt b/core/src/main/java/dev/jdtech/jellyfin/models/View.kt index c3ec585e..8fd3b808 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/View.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/View.kt @@ -6,5 +6,5 @@ data class View( val id: UUID, val name: String, var items: List? = null, - val type: CollectionType + val type: CollectionType, ) diff --git a/core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt b/core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt index 240e3030..83433df6 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt @@ -11,14 +11,14 @@ import androidx.annotation.AttrRes import com.google.android.material.button.MaterialButton import dev.jdtech.jellyfin.models.CollectionType import dev.jdtech.jellyfin.models.View -import java.io.Serializable import org.jellyfin.sdk.model.api.BaseItemDto +import java.io.Serializable fun BaseItemDto.toView(): View { return View( id = id, name = name ?: "", - type = valueOf(collectionType, CollectionType.Movies) + type = valueOf(collectionType, CollectionType.Movies), ) } @@ -30,14 +30,17 @@ fun MaterialButton.setIconTintColorAttribute(@AttrRes attributeId: Int, theme: R this.iconTint = ColorStateList.valueOf( resources.getColor( typedValue.resourceId, - theme - ) + theme, + ), ) } inline fun Bundle.serializable(key: String): T? = when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getSerializable(key, T::class.java) - else -> @Suppress("DEPRECATION") getSerializable(key) as? T + else -> + @Suppress("DEPRECATION") + getSerializable(key) + as? T } fun Activity.restart() { diff --git a/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadReceiver.kt b/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadReceiver.kt index 5ec20e50..659f12c2 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadReceiver.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadReceiver.kt @@ -13,11 +13,11 @@ import dev.jdtech.jellyfin.models.toFindroidSeason import dev.jdtech.jellyfin.models.toFindroidShow import dev.jdtech.jellyfin.models.toFindroidSource import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.io.File -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.io.File +import javax.inject.Inject @AndroidEntryPoint class DownloadReceiver : BroadcastReceiver() { @@ -44,16 +44,16 @@ class DownloadReceiver : BroadcastReceiver() { } else { val items = mutableListOf() items.addAll( - database.getMovies().map { it.toFindroidMovie(database, repository.getUserId()) } + database.getMovies().map { it.toFindroidMovie(database, repository.getUserId()) }, ) items.addAll( - database.getShows().map { it.toFindroidShow(database, repository.getUserId()) } + database.getShows().map { it.toFindroidShow(database, repository.getUserId()) }, ) items.addAll( - database.getSeasons().map { it.toFindroidSeason(database, repository.getUserId()) } + database.getSeasons().map { it.toFindroidSeason(database, repository.getUserId()) }, ) items.addAll( - database.getEpisodes().map { it.toFindroidEpisode(database, repository.getUserId()) } + database.getEpisodes().map { it.toFindroidEpisode(database, repository.getUserId()) }, ) items.firstOrNull { it.id == source.itemId }?.let { diff --git a/core/src/main/java/dev/jdtech/jellyfin/utils/DownloaderImpl.kt b/core/src/main/java/dev/jdtech/jellyfin/utils/DownloaderImpl.kt index 489c2d36..b3fa6c1d 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/utils/DownloaderImpl.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/utils/DownloaderImpl.kt @@ -8,7 +8,6 @@ import android.os.StatFs import android.text.format.Formatter import androidx.core.net.toUri import dev.jdtech.jellyfin.AppPreferences -import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.FindroidItem @@ -29,6 +28,7 @@ import dev.jdtech.jellyfin.repository.JellyfinRepository import java.io.File import java.util.UUID import kotlin.Exception +import dev.jdtech.jellyfin.core.R as CoreR class DownloaderImpl( private val context: Context, @@ -50,7 +50,7 @@ class DownloaderImpl( val trickPlayData = if (trickPlayManifest != null) { jellyfinRepository.getTrickPlayData( item.id, - trickPlayManifest.widthResolutions.max() + trickPlayManifest.widthResolutions.max(), ) } else { null @@ -68,8 +68,8 @@ class DownloaderImpl( UiText.StringResource( CoreR.string.not_enough_storage, Formatter.formatFileSize(context, source.size), - Formatter.formatFileSize(context, stats.availableBytes) - ) + Formatter.formatFileSize(context, stats.availableBytes), + ), ) } when (item) { @@ -98,10 +98,10 @@ class DownloaderImpl( is FindroidEpisode -> { database.insertShow( jellyfinRepository.getShow(item.seriesId) - .toFindroidShowDto(appPreferences.currentServer!!) + .toFindroidShowDto(appPreferences.currentServer!!), ) database.insertSeason( - jellyfinRepository.getSeason(item.seasonId).toFindroidSeasonDto() + jellyfinRepository.getSeason(item.seasonId).toFindroidSeasonDto(), ) database.insertEpisode(item.toFindroidEpisodeDto(appPreferences.currentServer!!)) database.insertSource(source.toFindroidSourceDto(item.id, path.path.orEmpty())) @@ -189,8 +189,8 @@ class DownloaderImpl( if (cursor.moveToFirst()) { downloadStatus = cursor.getInt( cursor.getColumnIndexOrThrow( - DownloadManager.COLUMN_STATUS - ) + DownloadManager.COLUMN_STATUS, + ), ) when (downloadStatus) { DownloadManager.STATUS_RUNNING -> { @@ -233,7 +233,7 @@ class DownloaderImpl( private fun downloadTrickPlay( item: FindroidItem, trickPlayManifest: TrickPlayManifest, - byteArray: ByteArray + byteArray: ByteArray, ) { database.insertTrickPlayManifest(trickPlayManifest.toTrickPlayManifestDto(item.id)) File(context.filesDir, "trickplay").mkdirs() diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt index f10a2c1e..98e0313f 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt @@ -13,8 +13,6 @@ import dev.jdtech.jellyfin.models.ExceptionUiTexts import dev.jdtech.jellyfin.models.Server import dev.jdtech.jellyfin.models.ServerAddress import dev.jdtech.jellyfin.models.UiText -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow @@ -27,6 +25,8 @@ import org.jellyfin.sdk.discovery.RecommendedServerInfo import org.jellyfin.sdk.discovery.RecommendedServerInfoScore import org.jellyfin.sdk.discovery.RecommendedServerIssue import timber.log.Timber +import java.util.UUID +import javax.inject.Inject @HiltViewModel class AddServerViewModel @@ -34,7 +34,7 @@ class AddServerViewModel constructor( private val appPreferences: AppPreferences, private val jellyfinApi: JellyfinApi, - private val database: ServerDatabaseDao + private val database: ServerDatabaseDao, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Normal) val uiState = _uiState.asStateFlow() @@ -65,11 +65,11 @@ constructor( DiscoveredServer( serverDiscoveryInfo.id, serverDiscoveryInfo.name, - serverDiscoveryInfo.address - ) + serverDiscoveryInfo.address, + ), ) _discoveredServersState.emit( - DiscoveredServersState.Servers(ArrayList(discoveredServers)) + DiscoveredServersState.Servers(ArrayList(discoveredServers)), ) } } @@ -96,7 +96,7 @@ constructor( val candidates = jellyfinApi.jellyfin.discovery.getAddressCandidates(inputValue) val recommended = jellyfinApi.jellyfin.discovery.getRecommendedServers( candidates, - RecommendedServerInfoScore.OK + RecommendedServerInfoScore.OK, ) val goodServers = mutableListOf() @@ -139,17 +139,17 @@ constructor( } catch (_: CancellationException) { } catch (e: ExceptionUiText) { _uiState.emit( - UiState.Error(listOf(e.uiText)) + UiState.Error(listOf(e.uiText)), ) } catch (e: ExceptionUiTexts) { _uiState.emit( - UiState.Error(e.uiTexts) + UiState.Error(e.uiTexts), ) } catch (e: Exception) { _uiState.emit( UiState.Error( - listOf(if (e.message != null) UiText.DynamicString(e.message!!) else UiText.StringResource(R.string.unknown_error)) - ) + listOf(if (e.message != null) UiText.DynamicString(e.message!!) else UiText.StringResource(R.string.unknown_error)), + ), ) } } @@ -173,7 +173,7 @@ constructor( val serverAddress = ServerAddress( id = UUID.randomUUID(), serverId = serverInDatabase.id, - address = recommendedServerInfo.address + address = recommendedServerInfo.address, ) insertServerAddress(serverAddress) @@ -183,7 +183,7 @@ constructor( val serverAddress = ServerAddress( id = UUID.randomUUID(), serverId = serverInfo.id!!, - address = recommendedServerInfo.address + address = recommendedServerInfo.address, ) val server = Server( diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/CollectionViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/CollectionViewModel.kt index c6ffd6c8..e4ccc314 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/CollectionViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/CollectionViewModel.kt @@ -11,19 +11,19 @@ import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.util.UUID +import javax.inject.Inject @HiltViewModel class CollectionViewModel @Inject constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -52,29 +52,35 @@ constructor( FavoriteSection( Constants.FAVORITE_TYPE_MOVIES, UiText.StringResource(R.string.movies_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) favoriteSections.add( - it - ) + if (it.items.isNotEmpty()) { + favoriteSections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_SHOWS, UiText.StringResource(R.string.shows_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) favoriteSections.add( - it - ) + if (it.items.isNotEmpty()) { + favoriteSections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_EPISODES, UiText.StringResource(R.string.episodes_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) favoriteSections.add( - it - ) + if (it.items.isNotEmpty()) { + favoriteSections.add( + it, + ) + } } } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadsViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadsViewModel.kt index 382d0730..0897d3f0 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadsViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadsViewModel.kt @@ -11,20 +11,20 @@ import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository -import javax.inject.Inject import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class DownloadsViewModel @Inject constructor( private val appPreferences: AppPreferences, - private val repository: JellyfinRepository + private val repository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -65,20 +65,24 @@ constructor( FavoriteSection( Constants.FAVORITE_TYPE_MOVIES, UiText.StringResource(R.string.movies_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) sections.add( - it - ) + if (it.items.isNotEmpty()) { + sections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_SHOWS, UiText.StringResource(R.string.shows_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) sections.add( - it - ) + if (it.items.isNotEmpty()) { + sections.add( + it, + ) + } } _uiState.emit(UiState.Normal(sections)) } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt index 3dec7528..00676588 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -13,15 +13,15 @@ import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.models.isDownloading import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.utils.Downloader -import java.io.File -import java.util.UUID -import javax.inject.Inject -import kotlin.random.Random import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import java.io.File +import java.util.UUID +import javax.inject.Inject +import kotlin.random.Random @HiltViewModel class EpisodeBottomSheetViewModel @@ -71,7 +71,7 @@ constructor( _uiState.emit( UiState.Normal( item, - ) + ), ) } catch (_: NullPointerException) { // Navigate back because item does not exist (probably because it's been deleted) diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt index 9faa5a3a..64bc0dd7 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt @@ -11,18 +11,18 @@ import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject @HiltViewModel class FavoriteViewModel @Inject constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -49,29 +49,35 @@ constructor( FavoriteSection( Constants.FAVORITE_TYPE_MOVIES, UiText.StringResource(R.string.movies_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) favoriteSections.add( - it - ) + if (it.items.isNotEmpty()) { + favoriteSections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_SHOWS, UiText.StringResource(R.string.shows_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) favoriteSections.add( - it - ) + if (it.items.isNotEmpty()) { + favoriteSections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_EPISODES, UiText.StringResource(R.string.episodes_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) favoriteSections.add( - it - ) + if (it.items.isNotEmpty()) { + favoriteSections.add( + it, + ) + } } } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt index 8c8f08a2..e454c7e0 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt @@ -11,11 +11,11 @@ import dev.jdtech.jellyfin.models.HomeSection import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.utils.toView -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import java.util.UUID +import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject internal constructor( @@ -77,8 +77,8 @@ class HomeViewModel @Inject internal constructor( HomeSection( uuidLibraries, uiTextLibraries, - collections - ) + collections, + ), ) } @@ -92,8 +92,8 @@ class HomeViewModel @Inject internal constructor( HomeSection( uuidContinueWatching, uiTextContinueWatching, - resumeItems - ) + resumeItems, + ), ) } @@ -102,8 +102,8 @@ class HomeViewModel @Inject internal constructor( HomeSection( uuidNextUp, uiTextNextUp, - nextUpItems - ) + nextUpItems, + ), ) } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt index e2859b5a..1f9ba938 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt @@ -9,8 +9,6 @@ import dev.jdtech.jellyfin.models.CollectionType import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -18,12 +16,14 @@ import kotlinx.coroutines.launch import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.SortOrder import timber.log.Timber +import java.util.UUID +import javax.inject.Inject @HiltViewModel class LibraryViewModel @Inject constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -40,7 +40,7 @@ constructor( parentId: UUID, libraryType: CollectionType, sortBy: SortBy = SortBy.defaultValue, - sortOrder: SortOrder = SortOrder.ASCENDING + sortOrder: SortOrder = SortOrder.ASCENDING, ) { itemsloaded = true Timber.d("$libraryType") @@ -58,7 +58,7 @@ constructor( includeTypes = itemType, recursive = true, sortBy = sortBy, - sortOrder = sortOrder + sortOrder = sortOrder, ).cachedIn(viewModelScope) _uiState.emit(UiState.Normal(items)) } catch (e: Exception) { diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt index 38db817a..f558c5dc 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt @@ -9,8 +9,6 @@ import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.models.User -import javax.inject.Inject -import kotlin.Exception import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -23,6 +21,8 @@ import kotlinx.coroutines.withContext import org.jellyfin.sdk.api.client.extensions.authenticateWithQuickConnect import org.jellyfin.sdk.model.api.AuthenticateUserByName import org.jellyfin.sdk.model.api.AuthenticationResult +import javax.inject.Inject +import kotlin.Exception @HiltViewModel class LoginViewModel @@ -30,7 +30,7 @@ class LoginViewModel constructor( private val appPreferences: AppPreferences, private val jellyfinApi: JellyfinApi, - private val database: ServerDatabaseDao + private val database: ServerDatabaseDao, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Normal) val uiState = _uiState.asStateFlow() @@ -114,8 +114,8 @@ constructor( val authenticationResult by jellyfinApi.userApi.authenticateUserByName( data = AuthenticateUserByName( username = username, - pw = password - ) + pw = password, + ), ) saveAuthenticationResult(authenticationResult) @@ -124,8 +124,10 @@ constructor( _navigateToMain.emit(true) } catch (e: Exception) { val message = - if (e.message?.contains("401") == true) UiText.StringResource(R.string.login_error_wrong_username_password) else UiText.StringResource( - R.string.unknown_error + if (e.message?.contains("401") == true) { + UiText.StringResource(R.string.login_error_wrong_username_password) + } else UiText.StringResource( + R.string.unknown_error, ) _uiState.emit(UiState.Error(message)) } @@ -147,7 +149,7 @@ constructor( delay(5000L) } val authenticationResult by jellyfinApi.userApi.authenticateWithQuickConnect( - secret = quickConnectState.secret + secret = quickConnectState.secret, ) saveAuthenticationResult(authenticationResult) @@ -167,7 +169,7 @@ constructor( id = authenticationResult.user!!.id, name = authenticationResult.user!!.name!!, serverId = serverInfo.id!!, - accessToken = authenticationResult.accessToken!! + accessToken = authenticationResult.accessToken!!, ) insertUser(appPreferences.currentServer!!, user) diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt index bddea010..eda39369 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt @@ -6,16 +6,16 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.models.CollectionType import dev.jdtech.jellyfin.models.FindroidCollection import dev.jdtech.jellyfin.repository.JellyfinRepository -import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class MediaViewModel @Inject constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) @@ -41,7 +41,7 @@ constructor( _uiState.emit(UiState.Normal(collections)) } catch (e: Exception) { _uiState.emit( - UiState.Error(e) + UiState.Error(e), ) } } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MovieViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MovieViewModel.kt index e647f128..3ef30eaa 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MovieViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MovieViewModel.kt @@ -19,10 +19,6 @@ import dev.jdtech.jellyfin.models.VideoMetadata import dev.jdtech.jellyfin.models.isDownloading import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.utils.Downloader -import java.io.File -import java.util.UUID -import javax.inject.Inject -import kotlin.random.Random import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Runnable import kotlinx.coroutines.flow.MutableSharedFlow @@ -34,6 +30,10 @@ import kotlinx.coroutines.withContext import org.jellyfin.sdk.model.api.BaseItemPerson import org.jellyfin.sdk.model.api.MediaStream import org.jellyfin.sdk.model.api.MediaStreamType +import java.io.File +import java.util.UUID +import javax.inject.Inject +import kotlin.random.Random @HiltViewModel class MovieViewModel @@ -41,7 +41,7 @@ class MovieViewModel constructor( private val repository: JellyfinRepository, private val database: ServerDatabaseDao, - private val downloader: Downloader + private val downloader: Downloader, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -111,7 +111,7 @@ constructor( getMediaString(item, MediaStreamType.SUBTITLE), runTime, getDateString(item), - ) + ), ) } catch (_: NullPointerException) { // Navigate back because item does not exist (probably because it's been deleted) @@ -175,7 +175,7 @@ constructor( AudioChannel.CH_5_1.raw -> AudioChannel.CH_5_1 AudioChannel.CH_7_1.raw -> AudioChannel.CH_7_1 else -> AudioChannel.CH_2_0 - } + }, ) /** @@ -199,7 +199,7 @@ constructor( AudioCodec.TRUEHD.toString() -> AudioCodec.TRUEHD AudioCodec.DTS.toString() -> AudioCodec.DTS else -> AudioCodec.MP3 - } + }, ) true } @@ -217,12 +217,14 @@ constructor( */ if (stream.videoDoViTitle != null) { DisplayProfile.DOLBY_VISION - } else when (videoRangeType) { - DisplayProfile.HDR.raw -> DisplayProfile.HDR - DisplayProfile.HDR10.raw -> DisplayProfile.HDR10 - DisplayProfile.HLG.raw -> DisplayProfile.HLG - else -> DisplayProfile.SDR - } + } else { + when (videoRangeType) { + DisplayProfile.HDR.raw -> DisplayProfile.HDR + DisplayProfile.HDR10.raw -> DisplayProfile.HDR10 + DisplayProfile.HLG.raw -> DisplayProfile.HLG + else -> DisplayProfile.SDR + } + }, ) /** @@ -240,7 +242,7 @@ constructor( } else -> Resolution.SD - } + }, ) } true @@ -256,7 +258,7 @@ constructor( displayProfile.toSet().toList(), audioChannels.toSet().toList(), audioCodecs.toSet().toList(), - isAtmosAudio + isAtmosAudio, ) } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt index 695e37fc..7fd03a52 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt @@ -6,17 +6,17 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind +import java.util.UUID +import javax.inject.Inject @HiltViewModel class PersonDetailViewModel @Inject internal constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) @@ -37,13 +37,13 @@ class PersonDetailViewModel @Inject internal constructor( val data = PersonOverview( name = personDetail.name.orEmpty(), overview = personDetail.overview.orEmpty(), - dto = personDetail + dto = personDetail, ) val items = jellyfinRepository.getPersonItems( personIds = listOf(personId), includeTypes = listOf(BaseItemKind.MOVIE, BaseItemKind.SERIES), - recursive = true + recursive = true, ) val movies = items.filterIsInstance() @@ -61,11 +61,11 @@ class PersonDetailViewModel @Inject internal constructor( data class PersonOverview( val name: String, val overview: String, - val dto: BaseItemDto + val dto: BaseItemDto, ) data class StarredIn( val movies: List, - val shows: List + val shows: List, ) } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt index dde782d9..46c4ae82 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt @@ -11,18 +11,18 @@ import dev.jdtech.jellyfin.models.FindroidMovie import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject @HiltViewModel class SearchResultViewModel @Inject constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -50,29 +50,35 @@ constructor( FavoriteSection( Constants.FAVORITE_TYPE_MOVIES, UiText.StringResource(R.string.movies_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) sections.add( - it - ) + if (it.items.isNotEmpty()) { + sections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_SHOWS, UiText.StringResource(R.string.shows_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) sections.add( - it - ) + if (it.items.isNotEmpty()) { + sections.add( + it, + ) + } } FavoriteSection( Constants.FAVORITE_TYPE_EPISODES, UiText.StringResource(R.string.episodes_label), - items.filterIsInstance() + items.filterIsInstance(), ).let { - if (it.items.isNotEmpty()) sections.add( - it - ) + if (it.items.isNotEmpty()) { + sections.add( + it, + ) + } } } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt index 00931be3..41f9ebaa 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt @@ -6,20 +6,20 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.models.EpisodeItem import dev.jdtech.jellyfin.models.FindroidSeason import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.jellyfin.sdk.model.api.ItemFields +import java.util.UUID +import javax.inject.Inject @HiltViewModel class SeasonViewModel @Inject constructor( - private val jellyfinRepository: JellyfinRepository + private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt index cefcea50..e5a4bd56 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt @@ -6,8 +6,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.ServerAddress -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -15,6 +13,8 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import timber.log.Timber +import java.util.UUID +import javax.inject.Inject @HiltViewModel class ServerAddressesViewModel diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt index f56146ec..0a98c24a 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt @@ -7,11 +7,11 @@ import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.Server -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class ServerSelectViewModel @@ -19,7 +19,7 @@ class ServerSelectViewModel constructor( private val jellyfinApi: JellyfinApi, private val database: ServerDatabaseDao, - private val appPreferences: AppPreferences + private val appPreferences: AppPreferences, ) : ViewModel() { val servers = database.getAllServers() diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt index a68c0c0c..294921d3 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt @@ -4,9 +4,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.repository.JellyfinRepository -import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Inject @HiltViewModel class SettingsDeviceViewModel diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ShowViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ShowViewModel.kt index 6f17c8e0..b1361b63 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ShowViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ShowViewModel.kt @@ -7,8 +7,6 @@ import dev.jdtech.jellyfin.models.FindroidEpisode import dev.jdtech.jellyfin.models.FindroidSeason import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -17,6 +15,8 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.jellyfin.sdk.model.api.BaseItemPerson +import java.util.UUID +import javax.inject.Inject @HiltViewModel class ShowViewModel @@ -89,7 +89,7 @@ constructor( dateString, nextUp, seasons, - ) + ), ) } catch (_: NullPointerException) { // Navigate back because item does not exist (probably because it's been deleted) diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt index da7e8104..299d1733 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt @@ -6,7 +6,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.User -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -14,6 +13,7 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Inject @HiltViewModel class UsersViewModel diff --git a/core/src/main/java/dev/jdtech/jellyfin/work/SyncWorker.kt b/core/src/main/java/dev/jdtech/jellyfin/work/SyncWorker.kt index f9ef07da..b2041c60 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/work/SyncWorker.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/work/SyncWorker.kt @@ -29,7 +29,7 @@ class SyncWorker @AssistedInject constructor( androidContext = context.applicationContext, requestTimeout = appPreferences.requestTimeout, connectTimeout = appPreferences.connectTimeout, - socketTimeout = appPreferences.socketTimeout + socketTimeout = appPreferences.socketTimeout, ) return withContext(Dispatchers.IO) { @@ -59,7 +59,7 @@ class SyncWorker @AssistedInject constructor( private suspend fun syncUserData( jellyfinApi: JellyfinApi, user: User, - items: List + items: List, ) { for (item in items) { val userData = database.getUserDataToBeSynced(user.id, item.id) ?: continue diff --git a/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt b/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt index ee528986..61858953 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt @@ -3,7 +3,6 @@ package dev.jdtech.jellyfin.api import android.content.Context import dev.jdtech.jellyfin.Constants import dev.jdtech.jellyfin.data.BuildConfig -import java.util.UUID import org.jellyfin.sdk.api.client.HttpClientOptions import org.jellyfin.sdk.api.client.extensions.devicesApi import org.jellyfin.sdk.api.client.extensions.itemsApi @@ -19,6 +18,7 @@ import org.jellyfin.sdk.api.client.extensions.userViewsApi import org.jellyfin.sdk.api.client.extensions.videosApi import org.jellyfin.sdk.createJellyfin import org.jellyfin.sdk.model.ClientInfo +import java.util.UUID /** * Jellyfin API class using org.jellyfin.sdk:jellyfin-platform-android @@ -31,7 +31,7 @@ class JellyfinApi( androidContext: Context, requestTimeout: Long = Constants.NETWORK_DEFAULT_REQUEST_TIMEOUT, connectTimeout: Long = Constants.NETWORK_DEFAULT_CONNECT_TIMEOUT, - socketTimeout: Long = Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT + socketTimeout: Long = Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT, ) { val jellyfin = createJellyfin { clientInfo = @@ -42,8 +42,8 @@ class JellyfinApi( httpClientOptions = HttpClientOptions( requestTimeout = requestTimeout, connectTimeout = connectTimeout, - socketTimeout = socketTimeout - ) + socketTimeout = socketTimeout, + ), ) var userId: UUID? = null @@ -68,7 +68,7 @@ class JellyfinApi( context: Context, requestTimeout: Long = Constants.NETWORK_DEFAULT_REQUEST_TIMEOUT, connectTimeout: Long = Constants.NETWORK_DEFAULT_CONNECT_TIMEOUT, - socketTimeout: Long = Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT + socketTimeout: Long = Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT, ): JellyfinApi { synchronized(this) { var instance = INSTANCE @@ -77,7 +77,7 @@ class JellyfinApi( androidContext = context.applicationContext, requestTimeout = requestTimeout, connectTimeout = connectTimeout, - socketTimeout = socketTimeout + socketTimeout = socketTimeout, ) INSTANCE = instance } diff --git a/data/src/main/java/dev/jdtech/jellyfin/database/Converters.kt b/data/src/main/java/dev/jdtech/jellyfin/database/Converters.kt index 1570c5df..9541ff8c 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/database/Converters.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/database/Converters.kt @@ -1,9 +1,9 @@ package dev.jdtech.jellyfin.database import androidx.room.TypeConverter +import org.jellyfin.sdk.model.DateTime import java.time.ZoneOffset import java.util.UUID -import org.jellyfin.sdk.model.DateTime class Converters { @TypeConverter diff --git a/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt b/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt index cf67cd08..b0240609 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt @@ -21,8 +21,8 @@ import dev.jdtech.jellyfin.models.User entities = [Server::class, ServerAddress::class, User::class, FindroidMovieDto::class, FindroidShowDto::class, FindroidSeasonDto::class, FindroidEpisodeDto::class, FindroidSourceDto::class, FindroidMediaStreamDto::class, TrickPlayManifestDto::class, IntroDto::class, FindroidUserDataDto::class], version = 3, autoMigrations = [ - AutoMigration(from = 2, to = 3) - ] + AutoMigration(from = 2, to = 3), + ], ) @TypeConverters(Converters::class) abstract class ServerDatabase : RoomDatabase() { diff --git a/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt b/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt index 0a98ca7e..fb6fd192 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt @@ -241,7 +241,7 @@ abstract class ServerDatabaseDao { itemId = itemId, played = false, favorite = false, - playbackPositionTicks = 0L + playbackPositionTicks = 0L, ) insertUserData(userData) } diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt b/data/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt index 82e577c6..8e158ce2 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt @@ -8,11 +8,16 @@ enum class CollectionType(val type: String) { Playlists("playlists"), Books("books"), LiveTv("livetv"), - BoxSets("boxsets"); + BoxSets("boxsets"), + ; companion object { val unsupportedCollections = listOf( - HomeVideos, Music, Playlists, Books, LiveTv + HomeVideos, + Music, + Playlists, + Books, + LiveTv, ) } } diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidBoxSet.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidBoxSet.kt index 57cb2284..10f567fe 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidBoxSet.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidBoxSet.kt @@ -1,7 +1,7 @@ package dev.jdtech.jellyfin.models -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto +import java.util.UUID data class FindroidBoxSet( override val id: UUID, diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidCollection.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidCollection.kt index e93db597..047e1fab 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidCollection.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidCollection.kt @@ -1,7 +1,7 @@ package dev.jdtech.jellyfin.models -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto +import java.util.UUID data class FindroidCollection( override val id: UUID, @@ -16,7 +16,7 @@ data class FindroidCollection( override val runtimeTicks: Long = 0L, override val playbackPositionTicks: Long = 0L, override val unplayedItemCount: Int? = null, - val type: CollectionType + val type: CollectionType, ) : FindroidItem fun BaseItemDto.toFindroidCollection(): FindroidCollection? { diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisode.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisode.kt index 8b9e0768..3e046ada 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisode.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisode.kt @@ -2,11 +2,11 @@ package dev.jdtech.jellyfin.models import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID import org.jellyfin.sdk.model.DateTime import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.LocationType import org.jellyfin.sdk.model.api.PlayAccess +import java.util.UUID data class FindroidEpisode( override val id: UUID, @@ -34,7 +34,7 @@ data class FindroidEpisode( suspend fun BaseItemDto.toFindroidEpisode( jellyfinRepository: JellyfinRepository, - database: ServerDatabaseDao? = null + database: ServerDatabaseDao? = null, ): FindroidEpisode? { val sources = mutableListOf() sources.addAll(mediaSources?.map { it.toFindroidSource(jellyfinRepository, id) } ?: emptyList()) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisodeDto.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisodeDto.kt index d6cb2cf8..57a48ccc 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisodeDto.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidEpisodeDto.kt @@ -14,19 +14,19 @@ import java.util.UUID entity = FindroidSeasonDto::class, parentColumns = arrayOf("id"), childColumns = arrayOf("seasonId"), - onDelete = ForeignKey.CASCADE + onDelete = ForeignKey.CASCADE, ), ForeignKey( entity = FindroidShowDto::class, parentColumns = arrayOf("id"), childColumns = arrayOf("seriesId"), - onDelete = ForeignKey.CASCADE - ) + onDelete = ForeignKey.CASCADE, + ), ], indices = [ Index("seasonId"), Index("seriesId"), - ] + ], ) data class FindroidEpisodeDto( @PrimaryKey diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidItem.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidItem.kt index 57c65b55..54bcda60 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidItem.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidItem.kt @@ -2,9 +2,9 @@ package dev.jdtech.jellyfin.models import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind +import java.util.UUID interface FindroidItem { val id: UUID @@ -23,7 +23,7 @@ interface FindroidItem { suspend fun BaseItemDto.toFindroidItem( jellyfinRepository: JellyfinRepository, - serverDatabase: ServerDatabaseDao? = null + serverDatabase: ServerDatabaseDao? = null, ): FindroidItem? { return when (type) { BaseItemKind.MOVIE -> toFindroidMovie(jellyfinRepository, serverDatabase) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMediaStreamDto.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMediaStreamDto.kt index 947e2ee7..1be318b2 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMediaStreamDto.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMediaStreamDto.kt @@ -2,11 +2,11 @@ package dev.jdtech.jellyfin.models import androidx.room.Entity import androidx.room.PrimaryKey -import java.util.UUID import org.jellyfin.sdk.model.api.MediaStreamType +import java.util.UUID @Entity( - tableName = "mediastreams" + tableName = "mediastreams", ) data class FindroidMediaStreamDto( @PrimaryKey diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMovie.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMovie.kt index 55c335eb..ecc829bc 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMovie.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidMovie.kt @@ -2,11 +2,11 @@ package dev.jdtech.jellyfin.models import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.util.UUID import org.jellyfin.sdk.model.DateTime import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemPerson import org.jellyfin.sdk.model.api.PlayAccess +import java.util.UUID data class FindroidMovie( override val id: UUID, @@ -34,7 +34,7 @@ data class FindroidMovie( suspend fun BaseItemDto.toFindroidMovie( jellyfinRepository: JellyfinRepository, - serverDatabase: ServerDatabaseDao? = null + serverDatabase: ServerDatabaseDao? = null, ): FindroidMovie { val sources = mutableListOf() sources.addAll(mediaSources?.map { it.toFindroidSource(jellyfinRepository, id) } ?: emptyList()) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeason.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeason.kt index c62ea94b..63baf247 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeason.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeason.kt @@ -1,9 +1,9 @@ package dev.jdtech.jellyfin.models import dev.jdtech.jellyfin.database.ServerDatabaseDao -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.PlayAccess +import java.util.UUID data class FindroidSeason( override val id: UUID, diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeasonDto.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeasonDto.kt index dc01db53..641c1c40 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeasonDto.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSeasonDto.kt @@ -13,12 +13,12 @@ import java.util.UUID entity = FindroidShowDto::class, parentColumns = arrayOf("id"), childColumns = arrayOf("seriesId"), - onDelete = ForeignKey.CASCADE - ) + onDelete = ForeignKey.CASCADE, + ), ], indices = [ Index("seriesId"), - ] + ], ) data class FindroidSeasonDto( @PrimaryKey diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidShow.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidShow.kt index 16de3eef..dfe3c003 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidShow.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidShow.kt @@ -1,11 +1,11 @@ package dev.jdtech.jellyfin.models import dev.jdtech.jellyfin.database.ServerDatabaseDao -import java.util.UUID import org.jellyfin.sdk.model.DateTime import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemPerson import org.jellyfin.sdk.model.api.PlayAccess +import java.util.UUID data class FindroidShow( override val id: UUID, diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSource.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSource.kt index ad2e2b7f..172242b2 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSource.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSource.kt @@ -2,10 +2,10 @@ package dev.jdtech.jellyfin.models import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.repository.JellyfinRepository -import java.io.File -import java.util.UUID import org.jellyfin.sdk.model.api.MediaProtocol import org.jellyfin.sdk.model.api.MediaSourceInfo +import java.io.File +import java.util.UUID data class FindroidSource( val id: String, @@ -14,7 +14,7 @@ data class FindroidSource( val path: String, val size: Long, val mediaStreams: List, - val downloadId: Long? = null + val downloadId: Long? = null, ) suspend fun MediaSourceInfo.toFindroidSource( @@ -39,7 +39,7 @@ suspend fun MediaSourceInfo.toFindroidSource( type = FindroidSourceType.REMOTE, path = path, size = size ?: 0, - mediaStreams = mediaStreams?.map { it.toFindroidMediaStream(jellyfinRepository) } ?: emptyList() + mediaStreams = mediaStreams?.map { it.toFindroidMediaStream(jellyfinRepository) } ?: emptyList(), ) } diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSourceDto.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSourceDto.kt index b707dece..691f1365 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSourceDto.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidSourceDto.kt @@ -5,7 +5,7 @@ import androidx.room.PrimaryKey import java.util.UUID @Entity( - tableName = "sources" + tableName = "sources", ) data class FindroidSourceDto( @PrimaryKey diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidUserDataDto.kt b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidUserDataDto.kt index 6bd45c03..76ecaba8 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/FindroidUserDataDto.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/FindroidUserDataDto.kt @@ -5,7 +5,7 @@ import java.util.UUID @Entity( tableName = "userdata", - primaryKeys = ["userId", "itemId"] + primaryKeys = ["userId", "itemId"], ) data class FindroidUserDataDto( val userId: UUID, diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/Intro.kt b/data/src/main/java/dev/jdtech/jellyfin/models/Intro.kt index c1e3bca3..31193e73 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/Intro.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/Intro.kt @@ -12,7 +12,7 @@ data class Intro( @SerialName("ShowSkipPromptAt") val showSkipPromptAt: Double, @SerialName("HideSkipPromptAt") - val hideSkipPromptAt: Double + val hideSkipPromptAt: Double, ) fun IntroDto.toIntro(): Intro { diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt b/data/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt index 2049ee0d..f973d26a 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt @@ -13,14 +13,14 @@ import java.util.UUID entity = Server::class, parentColumns = arrayOf("id"), childColumns = arrayOf("serverId"), - onDelete = ForeignKey.CASCADE - ) - ] + onDelete = ForeignKey.CASCADE, + ), + ], ) data class ServerAddress( @PrimaryKey val id: UUID, @ColumnInfo(index = true) val serverId: String, - val address: String + val address: String, ) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt b/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt index 1b74539e..62b55db1 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt @@ -8,12 +8,12 @@ data class ServerWithAddresses( val server: Server, @Relation( parentColumn = "id", - entityColumn = "serverId" + entityColumn = "serverId", ) val addresses: List, @Relation( parentColumn = "currentUserId", - entityColumn = "id" + entityColumn = "id", ) - val user: User? + val user: User?, ) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt b/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt index 90561764..0b45d188 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt @@ -8,12 +8,12 @@ data class ServerWithAddressesAndUsers( val server: Server, @Relation( parentColumn = "id", - entityColumn = "serverId" + entityColumn = "serverId", ) val addresses: List, @Relation( parentColumn = "id", - entityColumn = "serverId" + entityColumn = "serverId", ) - val users: List + val users: List, ) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt b/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt index b2e2ce73..f776ba91 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt @@ -8,7 +8,7 @@ data class ServerWithUsers( val server: Server, @Relation( parentColumn = "id", - entityColumn = "serverId" + entityColumn = "serverId", ) - val users: List + val users: List, ) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt b/data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt index 5f84ce0f..9292402d 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt @@ -6,7 +6,8 @@ enum class SortBy(val SortString: String) { PARENTAL_RATING("CriticRating"), DATE_ADDED("DateCreated"), DATE_PLAYED("DatePlayed"), - RELEASE_DATE("PremiereDate"); + RELEASE_DATE("PremiereDate"), + ; companion object { val defaultValue = NAME diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/TrickPlayManifest.kt b/data/src/main/java/dev/jdtech/jellyfin/models/TrickPlayManifest.kt index 8ec4fc1f..3533fd13 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/TrickPlayManifest.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/TrickPlayManifest.kt @@ -8,7 +8,7 @@ data class TrickPlayManifest( @SerialName("Version") val version: String, @SerialName("WidthResolutions") - val widthResolutions: List + val widthResolutions: List, ) fun TrickPlayManifestDto.toTrickPlayManifest(): TrickPlayManifest { diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/User.kt b/data/src/main/java/dev/jdtech/jellyfin/models/User.kt index 1ba96d24..30e45167 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/User.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/User.kt @@ -13,9 +13,9 @@ import java.util.UUID entity = Server::class, parentColumns = arrayOf("id"), childColumns = arrayOf("serverId"), - onDelete = ForeignKey.CASCADE - ) - ] + onDelete = ForeignKey.CASCADE, + ), + ], ) data class User( @PrimaryKey @@ -23,5 +23,5 @@ data class User( val name: String, @ColumnInfo(index = true) val serverId: String, - val accessToken: String? = null + val accessToken: String? = null, ) diff --git a/data/src/main/java/dev/jdtech/jellyfin/models/VideoMetadata.kt b/data/src/main/java/dev/jdtech/jellyfin/models/VideoMetadata.kt index 9ebe49e7..7395bde1 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/models/VideoMetadata.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/VideoMetadata.kt @@ -1,46 +1,47 @@ -@file:Suppress("Unused") - -package dev.jdtech.jellyfin.models - -data class VideoMetadata( - val resolution: List, - val displayProfiles: List, - val audioChannels: List, - val audioCodecs: List, - val isAtmos: List -) - -enum class Resolution(val raw: String) { - SD("SD"), - HD("HD"), - UHD("4K"); -} - -enum class DisplayProfile(val raw: String) { - SDR("SDR"), - HDR("HDR"), - HDR10("HDR10"), - DOLBY_VISION("Vision"), - HLG("HLG"); -} - -enum class AudioChannel(val raw: String) { - CH_2_0("2.0"), - CH_2_1("2.1"), - CH_5_1("5.1"), - CH_7_1("7.1"); -} - -enum class AudioCodec(val raw: String) { - FLAC("FLAC"), - MP3("MP3"), - AAC("AAC"), - AC3("Digital"), - EAC3("Digital+"), - VORBIS("VORBIS"), - DTS("DTS"), - TRUEHD("TrueHD"), - OPUS("OPUS"); - - override fun toString() = super.toString().lowercase() -} +@file:Suppress("Unused") + +package dev.jdtech.jellyfin.models + +data class VideoMetadata( + val resolution: List, + val displayProfiles: List, + val audioChannels: List, + val audioCodecs: List, + val isAtmos: List, +) + +enum class Resolution(val raw: String) { + SD("SD"), + HD("HD"), + UHD("4K"), +} + +enum class DisplayProfile(val raw: String) { + SDR("SDR"), + HDR("HDR"), + HDR10("HDR10"), + DOLBY_VISION("Vision"), + HLG("HLG"), +} + +enum class AudioChannel(val raw: String) { + CH_2_0("2.0"), + CH_2_1("2.1"), + CH_5_1("5.1"), + CH_7_1("7.1"), +} + +enum class AudioCodec(val raw: String) { + FLAC("FLAC"), + MP3("MP3"), + AAC("AAC"), + AC3("Digital"), + EAC3("Digital+"), + VORBIS("VORBIS"), + DTS("DTS"), + TRUEHD("TrueHD"), + OPUS("OPUS"), + ; + + override fun toString() = super.toString().lowercase() +} diff --git a/data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt index b97538bb..af8e601c 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt @@ -4,10 +4,10 @@ import androidx.paging.PagingSource import androidx.paging.PagingState import dev.jdtech.jellyfin.models.FindroidItem import dev.jdtech.jellyfin.models.SortBy -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemKind import org.jellyfin.sdk.model.api.SortOrder import timber.log.Timber +import java.util.UUID class ItemsPagingSource( private val jellyfinRepository: JellyfinRepository, @@ -15,7 +15,7 @@ class ItemsPagingSource( private val includeTypes: List?, private val recursive: Boolean, private val sortBy: SortBy, - private val sortOrder: SortOrder + private val sortOrder: SortOrder, ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { val position = params.key ?: 0 @@ -30,12 +30,12 @@ class ItemsPagingSource( sortBy = sortBy, sortOrder = sortOrder, startIndex = position, - limit = params.loadSize + limit = params.loadSize, ) LoadResult.Page( data = items, prevKey = if (position == 0) null else position - params.loadSize, - nextKey = if (items.isEmpty()) null else position + params.loadSize + nextKey = if (items.isEmpty()) null else position + params.loadSize, ) } catch (e: Exception) { LoadResult.Error(e) diff --git a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt index e447bf31..8b902f55 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt @@ -11,7 +11,6 @@ import dev.jdtech.jellyfin.models.FindroidSource import dev.jdtech.jellyfin.models.Intro import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.models.TrickPlayManifest -import java.util.UUID import kotlinx.coroutines.flow.Flow import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind @@ -19,6 +18,7 @@ import org.jellyfin.sdk.model.api.ItemFields import org.jellyfin.sdk.model.api.PublicSystemInfo import org.jellyfin.sdk.model.api.SortOrder import org.jellyfin.sdk.model.api.UserConfiguration +import java.util.UUID interface JellyfinRepository { suspend fun getPublicSystemInfo(): PublicSystemInfo @@ -50,13 +50,13 @@ interface JellyfinRepository { includeTypes: List? = null, recursive: Boolean = false, sortBy: SortBy = SortBy.defaultValue, - sortOrder: SortOrder = SortOrder.ASCENDING + sortOrder: SortOrder = SortOrder.ASCENDING, ): Flow> suspend fun getPersonItems( personIds: List, includeTypes: List? = null, - recursive: Boolean = true + recursive: Boolean = true, ): List suspend fun getFavoriteItems(): List @@ -77,7 +77,7 @@ interface JellyfinRepository { fields: List? = null, startItemId: UUID? = null, limit: Int? = null, - offline: Boolean = false + offline: Boolean = false, ): List suspend fun getMediaSources(itemId: UUID, includePath: Boolean = false): List diff --git a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt index 2af82e5b..c01a3ca1 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -28,8 +28,6 @@ import dev.jdtech.jellyfin.models.toIntro import dev.jdtech.jellyfin.models.toTrickPlayManifest import io.ktor.util.cio.toByteArray import io.ktor.utils.io.ByteReadChannel -import java.io.File -import java.util.UUID import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.withContext @@ -50,6 +48,8 @@ import org.jellyfin.sdk.model.api.SubtitleDeliveryMethod import org.jellyfin.sdk.model.api.SubtitleProfile import org.jellyfin.sdk.model.api.UserConfiguration import timber.log.Timber +import java.io.File +import java.util.UUID class JellyfinRepositoryImpl( private val context: Context, @@ -73,7 +73,7 @@ class JellyfinRepositoryImpl( withContext(Dispatchers.IO) { jellyfinApi.userLibraryApi.getItem( jellyfinApi.userId!!, - itemId + itemId, ).content.toFindroidEpisode(this@JellyfinRepositoryImpl, database)!! } @@ -81,7 +81,7 @@ class JellyfinRepositoryImpl( withContext(Dispatchers.IO) { jellyfinApi.userLibraryApi.getItem( jellyfinApi.userId!!, - itemId + itemId, ).content.toFindroidMovie(this@JellyfinRepositoryImpl, database) } @@ -89,7 +89,7 @@ class JellyfinRepositoryImpl( withContext(Dispatchers.IO) { jellyfinApi.userLibraryApi.getItem( jellyfinApi.userId!!, - itemId + itemId, ).content.toFindroidShow() } @@ -97,7 +97,7 @@ class JellyfinRepositoryImpl( withContext(Dispatchers.IO) { jellyfinApi.userLibraryApi.getItem( jellyfinApi.userId!!, - itemId + itemId, ).content.toFindroidSeason() } @@ -117,7 +117,7 @@ class JellyfinRepositoryImpl( sortBy: SortBy, sortOrder: SortOrder, startIndex: Int?, - limit: Int? + limit: Int?, ): List = withContext(Dispatchers.IO) { jellyfinApi.itemsApi.getItems( @@ -139,13 +139,13 @@ class JellyfinRepositoryImpl( includeTypes: List?, recursive: Boolean, sortBy: SortBy, - sortOrder: SortOrder + sortOrder: SortOrder, ): Flow> { return Pager( config = PagingConfig( pageSize = 10, maxSize = 100, - enablePlaceholders = false + enablePlaceholders = false, ), pagingSourceFactory = { ItemsPagingSource( @@ -154,22 +154,22 @@ class JellyfinRepositoryImpl( includeTypes, recursive, sortBy, - sortOrder + sortOrder, ) - } + }, ).flow } override suspend fun getPersonItems( personIds: List, includeTypes: List?, - recursive: Boolean + recursive: Boolean, ): List = withContext(Dispatchers.IO) { jellyfinApi.itemsApi.getItems( jellyfinApi.userId!!, personIds = personIds, includeItemTypes = includeTypes, - recursive = recursive + recursive = recursive, ).content.items .orEmpty() .mapNotNull { @@ -185,9 +185,9 @@ class JellyfinRepositoryImpl( includeItemTypes = listOf( BaseItemKind.MOVIE, BaseItemKind.SERIES, - BaseItemKind.EPISODE + BaseItemKind.EPISODE, ), - recursive = true + recursive = true, ).content.items .orEmpty() .mapNotNull { it.toFindroidItem(this@JellyfinRepositoryImpl, database) } @@ -201,9 +201,9 @@ class JellyfinRepositoryImpl( includeItemTypes = listOf( BaseItemKind.MOVIE, BaseItemKind.SERIES, - BaseItemKind.EPISODE + BaseItemKind.EPISODE, ), - recursive = true + recursive = true, ).content.items .orEmpty() .mapNotNull { it.toFindroidItem(this@JellyfinRepositoryImpl, database) } @@ -298,7 +298,7 @@ class JellyfinRepositoryImpl( containerProfiles = emptyList(), directPlayProfiles = listOf( DirectPlayProfile(type = DlnaProfileType.VIDEO), - DirectPlayProfile(type = DlnaProfileType.AUDIO) + DirectPlayProfile(type = DlnaProfileType.AUDIO), ), transcodingProfiles = emptyList(), responseProfiles = emptyList(), @@ -318,20 +318,20 @@ class JellyfinRepositoryImpl( maxAlbumArtWidth = 1_000_000_000, requiresPlainFolders = false, requiresPlainVideoItems = false, - timelineOffsetSeconds = 0 + timelineOffsetSeconds = 0, ), maxStreamingBitrate = 1_000_000_000, - ) + ), ).content.mediaSources.map { it.toFindroidSource( this@JellyfinRepositoryImpl, itemId, includePath, ) - } + }, ) sources.addAll( - database.getSources(itemId).map { it.toFindroidSource(database) } + database.getSources(itemId).map { it.toFindroidSource(database) }, ) sources } @@ -342,7 +342,7 @@ class JellyfinRepositoryImpl( jellyfinApi.videosApi.getVideoStreamUrl( itemId, static = true, - mediaSourceId = mediaSourceId + mediaSourceId = mediaSourceId, ) } catch (e: Exception) { Timber.e(e) @@ -365,7 +365,7 @@ class JellyfinRepositoryImpl( try { return@withContext jellyfinApi.api.get( "/Episode/{itemId}/IntroTimestamps/v1", - pathParameters + pathParameters, ).content } catch (e: Exception) { return@withContext null @@ -375,8 +375,9 @@ class JellyfinRepositoryImpl( override suspend fun getTrickPlayManifest(itemId: UUID): TrickPlayManifest? = withContext(Dispatchers.IO) { val trickPlayManifest = database.getTrickPlayManifest(itemId) - if (trickPlayManifest != null) + if (trickPlayManifest != null) { return@withContext trickPlayManifest.toTrickPlayManifest() + } // https://github.com/nicknsy/jellyscrub/blob/main/Nick.Plugin.Jellyscrub/Api/TrickplayController.cs val pathParameters = mutableMapOf() pathParameters["itemId"] = itemId @@ -384,7 +385,7 @@ class JellyfinRepositoryImpl( try { return@withContext jellyfinApi.api.get( "/Trickplay/{itemId}/GetManifest", - pathParameters + pathParameters, ).content } catch (e: Exception) { return@withContext null @@ -397,7 +398,7 @@ class JellyfinRepositoryImpl( if (trickPlayManifest != null) { return@withContext File( context.filesDir, - "trickplay/$itemId.bif" + "trickplay/$itemId.bif", ).readBytes() } @@ -409,7 +410,7 @@ class JellyfinRepositoryImpl( try { return@withContext jellyfinApi.api.get( "/Trickplay/{itemId}/{width}/GetBIF", - pathParameters + pathParameters, ).content.toByteArray() } catch (e: Exception) { return@withContext null @@ -434,9 +435,9 @@ class JellyfinRepositoryImpl( GeneralCommandType.PLAY, GeneralCommandType.PLAY_STATE, GeneralCommandType.PLAY_NEXT, - GeneralCommandType.PLAY_MEDIA_SOURCE + GeneralCommandType.PLAY_MEDIA_SOURCE, ), - supportsMediaControl = true + supportsMediaControl = true, ) } } @@ -451,7 +452,7 @@ class JellyfinRepositoryImpl( override suspend fun postPlaybackStop( itemId: UUID, positionTicks: Long, - playedPercentage: Int + playedPercentage: Int, ) { Timber.d("Sending stop $itemId") withContext(Dispatchers.IO) { @@ -473,7 +474,7 @@ class JellyfinRepositoryImpl( jellyfinApi.playStateApi.onPlaybackStopped( jellyfinApi.userId!!, itemId, - positionTicks = positionTicks + positionTicks = positionTicks, ) } catch (e: Exception) { database.setUserDataToBeSynced(jellyfinApi.userId!!, itemId, true) @@ -484,7 +485,7 @@ class JellyfinRepositoryImpl( override suspend fun postPlaybackProgress( itemId: UUID, positionTicks: Long, - isPaused: Boolean + isPaused: Boolean, ) { Timber.d("Posting progress of $itemId, position: $positionTicks") withContext(Dispatchers.IO) { @@ -494,7 +495,7 @@ class JellyfinRepositoryImpl( jellyfinApi.userId!!, itemId, positionTicks = positionTicks, - isPaused = isPaused + isPaused = isPaused, ) } catch (e: Exception) { database.setUserDataToBeSynced(jellyfinApi.userId!!, itemId, true) @@ -553,7 +554,7 @@ class JellyfinRepositoryImpl( withContext(Dispatchers.IO) { jellyfinApi.devicesApi.updateDeviceOptions( id, - DeviceOptionsDto(0, customName = name) + DeviceOptionsDto(0, customName = name), ) } } @@ -568,11 +569,11 @@ class JellyfinRepositoryImpl( val items = mutableListOf() items.addAll( database.getMoviesByServerId(appPreferences.currentServer!!) - .map { it.toFindroidMovie(database, jellyfinApi.userId!!) } + .map { it.toFindroidMovie(database, jellyfinApi.userId!!) }, ) items.addAll( database.getShowsByServerId(appPreferences.currentServer!!) - .map { it.toFindroidShow(database, jellyfinApi.userId!!) } + .map { it.toFindroidShow(database, jellyfinApi.userId!!) }, ) items } diff --git a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt index 525325ee..2fb4a399 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt @@ -22,8 +22,6 @@ import dev.jdtech.jellyfin.models.toFindroidShow import dev.jdtech.jellyfin.models.toFindroidSource import dev.jdtech.jellyfin.models.toIntro import dev.jdtech.jellyfin.models.toTrickPlayManifest -import java.io.File -import java.util.UUID import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.withContext @@ -33,6 +31,8 @@ import org.jellyfin.sdk.model.api.ItemFields import org.jellyfin.sdk.model.api.PublicSystemInfo import org.jellyfin.sdk.model.api.SortOrder import org.jellyfin.sdk.model.api.UserConfiguration +import java.io.File +import java.util.UUID class JellyfinRepositoryOfflineImpl( private val context: Context, @@ -84,7 +84,7 @@ class JellyfinRepositoryOfflineImpl( sortBy: SortBy, sortOrder: SortOrder, startIndex: Int?, - limit: Int? + limit: Int?, ): List { TODO("Not yet implemented") } @@ -94,7 +94,7 @@ class JellyfinRepositoryOfflineImpl( includeTypes: List?, recursive: Boolean, sortBy: SortBy, - sortOrder: SortOrder + sortOrder: SortOrder, ): Flow> { TODO("Not yet implemented") } @@ -102,7 +102,7 @@ class JellyfinRepositoryOfflineImpl( override suspend fun getPersonItems( personIds: List, includeTypes: List?, - recursive: Boolean + recursive: Boolean, ): List { TODO("Not yet implemented") } @@ -195,7 +195,7 @@ class JellyfinRepositoryOfflineImpl( if (trickPlayManifest != null) { return@withContext File( context.filesDir, - "trickplay/$itemId.bif" + "trickplay/$itemId.bif", ).readBytes() } null @@ -228,7 +228,7 @@ class JellyfinRepositoryOfflineImpl( override suspend fun postPlaybackProgress( itemId: UUID, positionTicks: Long, - isPaused: Boolean + isPaused: Boolean, ) { withContext(Dispatchers.IO) { database.setPlaybackPositionTicks(itemId, jellyfinApi.userId!!, positionTicks) @@ -282,11 +282,11 @@ class JellyfinRepositoryOfflineImpl( val items = mutableListOf() items.addAll( database.getMoviesByServerId(appPreferences.currentServer!!) - .map { it.toFindroidMovie(database, jellyfinApi.userId!!) } + .map { it.toFindroidMovie(database, jellyfinApi.userId!!) }, ) items.addAll( database.getShowsByServerId(appPreferences.currentServer!!) - .map { it.toFindroidShow(database, jellyfinApi.userId!!) } + .map { it.toFindroidShow(database, jellyfinApi.userId!!) }, ) items } diff --git a/player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt b/player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt index 8ad88bb9..ff40aa59 100644 --- a/player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt +++ b/player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt @@ -1,12 +1,12 @@ package dev.jdtech.jellyfin.models import android.os.Parcelable -import java.util.UUID import kotlinx.parcelize.Parcelize +import java.util.UUID @Parcelize data class DownloadSeriesMetadata( val itemId: UUID, val name: String? = null, - val episodes: List + val episodes: List, ) : Parcelable diff --git a/player/core/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt b/player/core/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt index 1ec663dd..f011809a 100644 --- a/player/core/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt +++ b/player/core/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt @@ -1,8 +1,8 @@ package dev.jdtech.jellyfin.models import android.os.Parcelable -import java.util.UUID import kotlinx.parcelize.Parcelize +import java.util.UUID @Parcelize data class PlayerItem( @@ -14,5 +14,5 @@ data class PlayerItem( val parentIndexNumber: Int? = null, val indexNumber: Int? = null, val indexNumberEnd: Int? = null, - val externalSubtitles: List = emptyList() + val externalSubtitles: List = emptyList(), ) : Parcelable diff --git a/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifData.kt b/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifData.kt index d6039847..0db720b8 100644 --- a/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifData.kt +++ b/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifData.kt @@ -7,5 +7,5 @@ data class BifData( val timestampMultiplier: Int, val imageCount: Int, val images: Map, - val imageWidth: Int + val imageWidth: Int, ) diff --git a/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifUtil.kt b/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifUtil.kt index a61eae83..36fdd072 100644 --- a/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifUtil.kt +++ b/player/core/src/main/java/dev/jdtech/jellyfin/utils/bif/BifUtil.kt @@ -2,8 +2,8 @@ package dev.jdtech.jellyfin.utils.bif import android.graphics.Bitmap import android.graphics.BitmapFactory -import java.nio.ByteBuffer import timber.log.Timber +import java.nio.ByteBuffer object BifUtil { diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt index acde876a..288f02ee 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt @@ -9,7 +9,7 @@ import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import java.lang.IllegalStateException class SpeedSelectionDialogFragment( - private val viewModel: PlayerActivityViewModel + private val viewModel: PlayerActivityViewModel, ) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val speedTexts = listOf("0.5x", "0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x") @@ -20,10 +20,10 @@ class SpeedSelectionDialogFragment( builder.setTitle(getString(R.string.select_playback_speed)) .setSingleChoiceItems( speedTexts.toTypedArray(), - speedNumbers.indexOf(viewModel.playbackSpeed) + speedNumbers.indexOf(viewModel.playbackSpeed), ) { dialog, which -> viewModel.selectSpeed( - speedNumbers[which] + speedNumbers[which], ) dialog.dismiss() } diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt index 03ba36a9..29085294 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt @@ -12,7 +12,7 @@ import java.lang.IllegalStateException class TrackSelectionDialogFragment( private val type: TrackType, - private val viewModel: PlayerActivityViewModel + private val viewModel: PlayerActivityViewModel, ) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { when (type) { @@ -22,11 +22,11 @@ class TrackSelectionDialogFragment( builder.setTitle(getString(R.string.select_audio_track)) .setSingleChoiceItems( getTrackNames(viewModel.currentAudioTracks), - viewModel.currentAudioTracks.indexOfFirst { it.selected } + viewModel.currentAudioTracks.indexOfFirst { it.selected }, ) { dialog, which -> viewModel.switchToTrack( TrackType.AUDIO, - viewModel.currentAudioTracks[which] + viewModel.currentAudioTracks[which], ) dialog.dismiss() } @@ -39,11 +39,11 @@ class TrackSelectionDialogFragment( builder.setTitle(getString(R.string.select_subtile_track)) .setSingleChoiceItems( getTrackNames(viewModel.currentSubtitleTracks), - viewModel.currentSubtitleTracks.indexOfFirst { if (viewModel.disableSubtitle) it.ffIndex == -1 else it.selected } + viewModel.currentSubtitleTracks.indexOfFirst { if (viewModel.disableSubtitle) it.ffIndex == -1 else it.selected }, ) { dialog, which -> viewModel.switchToTrack( TrackType.SUBTITLE, - viewModel.currentSubtitleTracks[which] + viewModel.currentSubtitleTracks[which], ) dialog.dismiss() } diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index 5c72d14b..be5ac865 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -38,20 +38,20 @@ import androidx.media3.common.util.Util import androidx.media3.exoplayer.ExoPlaybackException import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.mpv.MPVLib -import java.io.File -import java.io.FileOutputStream -import java.util.concurrent.CopyOnWriteArraySet import kotlinx.parcelize.Parcelize import org.json.JSONArray import org.json.JSONException import org.json.JSONObject import timber.log.Timber +import java.io.File +import java.io.FileOutputStream +import java.util.concurrent.CopyOnWriteArraySet @Suppress("SpellCheckingInspection") class MPVPlayer( context: Context, private val requestAudioFocus: Boolean, - private val appPreferences: AppPreferences + private val appPreferences: AppPreferences, ) : BasePlayer(), MPVLib.EventObserver, AudioManager.OnAudioFocusChangeListener { private val audioManager: AudioManager by lazy { context.getSystemService()!! } @@ -127,7 +127,7 @@ class MPVPlayer( Property("time-pos", MPVLib.MPV_FORMAT_INT64), Property("duration", MPVLib.MPV_FORMAT_INT64), Property("demuxer-cache-time", MPVLib.MPV_FORMAT_INT64), - Property("speed", MPVLib.MPV_FORMAT_DOUBLE) + Property("speed", MPVLib.MPV_FORMAT_DOUBLE), ).forEach { (name, format) -> MPVLib.observeProperty(name, format) } @@ -151,9 +151,9 @@ class MPVPlayer( // Listeners and notification. private val listeners: ListenerSet = ListenerSet( context.mainLooper, - Clock.DEFAULT + Clock.DEFAULT, ) { listener: Player.Listener, flags: FlagSet -> - listener.onEvents( /* player = */this, Player.Events(flags)) + listener.onEvents(this, Player.Events(flags)) } private val videoListeners = CopyOnWriteArraySet() @@ -221,7 +221,7 @@ class MPVPlayer( setPlayerStateAndNotifyIfChanged( playWhenReady = false, playWhenReadyChangeReason = Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, - playbackState = Player.STATE_ENDED + playbackState = Player.STATE_ENDED, ) resetInternalState() } @@ -242,7 +242,7 @@ class MPVPlayer( listeners.sendEvent(Player.EVENT_TIMELINE_CHANGED) { listener -> listener.onTimelineChanged( timeline, - Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE + Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE, ) } } @@ -261,7 +261,7 @@ class MPVPlayer( listeners.sendEvent(Player.EVENT_TIMELINE_CHANGED) { listener -> listener.onTimelineChanged( timeline, - Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE + Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE, ) } } @@ -327,7 +327,7 @@ class MPVPlayer( private fun setPlayerStateAndNotifyIfChanged( playWhenReady: Boolean = getPlayWhenReady(), @Player.PlayWhenReadyChangeReason playWhenReadyChangeReason: Int = Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, - @Player.State playbackState: Int = getPlaybackState() + @Player.State playbackState: Int = getPlaybackState(), ) { var playerStateChanged = false val wasPlaying = isPlaying @@ -367,7 +367,7 @@ class MPVPlayer( */ fun selectTrack( trackType: TrackType, - id: Int + id: Int, ) { if (id != C.INDEX_UNSET) { MPVLib.setPropertyInt(trackType.type, id) @@ -397,25 +397,39 @@ class MPVPlayer( override fun getWindow( windowIndex: Int, window: Window, - defaultPositionProjectionUs: Long + defaultPositionProjectionUs: Long, ): Window { val currentMediaItem = internalMediaItems.getOrNull(windowIndex) ?: MediaItem.Builder().build() return window.set( - /* uid = */ windowIndex, - /* mediaItem = */ currentMediaItem, - /* manifest = */ null, - /* presentationStartTimeMs = */ C.TIME_UNSET, - /* windowStartTimeMs = */ C.TIME_UNSET, - /* elapsedRealtimeEpochOffsetMs = */ C.TIME_UNSET, - /* isSeekable = */ isSeekable, - /* isDynamic = */ !isSeekable, - /* liveConfiguration = */ currentMediaItem.liveConfiguration, - /* defaultPositionUs = */ C.TIME_UNSET, - /* durationUs = */ Util.msToUs(currentDurationMs ?: C.TIME_UNSET), - /* firstPeriodIndex = */ windowIndex, - /* lastPeriodIndex = */ windowIndex, - /* positionInFirstPeriodUs = */ C.TIME_UNSET + /* uid = */ + windowIndex, + /* mediaItem = */ + currentMediaItem, + /* manifest = */ + null, + /* presentationStartTimeMs = */ + C.TIME_UNSET, + /* windowStartTimeMs = */ + C.TIME_UNSET, + /* elapsedRealtimeEpochOffsetMs = */ + C.TIME_UNSET, + /* isSeekable = */ + isSeekable, + /* isDynamic = */ + !isSeekable, + /* liveConfiguration = */ + currentMediaItem.liveConfiguration, + /* defaultPositionUs = */ + C.TIME_UNSET, + /* durationUs = */ + Util.msToUs(currentDurationMs ?: C.TIME_UNSET), + /* firstPeriodIndex = */ + windowIndex, + /* lastPeriodIndex = */ + windowIndex, + /* positionInFirstPeriodUs = */ + C.TIME_UNSET, ) } @@ -438,11 +452,16 @@ class MPVPlayer( */ override fun getPeriod(periodIndex: Int, period: Period, setIds: Boolean): Period { return period.set( - /* id = */ periodIndex, - /* uid = */ periodIndex, - /* windowIndex = */ periodIndex, - /* durationUs = */ Util.msToUs(currentDurationMs ?: C.TIME_UNSET), - /* positionInWindowUs = */ 0 + /* id = */ + periodIndex, + /* uid = */ + periodIndex, + /* windowIndex = */ + periodIndex, + /* durationUs = */ + Util.msToUs(currentDurationMs ?: C.TIME_UNSET), + /* positionInWindowUs = */ + 0, ) } @@ -484,13 +503,14 @@ class MPVPlayer( override fun onAudioFocusChange(focusChange: Int) { when (focusChange) { AudioManager.AUDIOFOCUS_LOSS, - AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT, + -> { val oldAudioFocusCallback = audioFocusCallback val wasPlaying = isPlaying MPVLib.setPropertyBoolean("pause", true) setPlayerStateAndNotifyIfChanged( playWhenReady = false, - playWhenReadyChangeReason = Player.PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS + playWhenReadyChangeReason = Player.PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, ) audioFocusCallback = { oldAudioFocusCallback() @@ -568,7 +588,7 @@ class MPVPlayer( override fun setMediaItems( mediaItems: MutableList, startWindowIndex: Int, - startPositionMs: Long + startPositionMs: Long, ) { internalMediaItems = mediaItems currentIndex = startWindowIndex @@ -589,8 +609,8 @@ class MPVPlayer( arrayOf( "loadfile", "${mediaItem.localConfiguration?.uri}", - "append" - ) + "append", + ), ) } } @@ -647,14 +667,14 @@ class MPVPlayer( COMMAND_SEEK_TO_PREVIOUS, !currentTimeline.isEmpty && (hasPreviousMediaItem() || !isCurrentMediaItemLive || isCurrentMediaItemSeekable) && - !isPlayingAd + !isPlayingAd, ) .addIf(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, hasNextMediaItem() && !isPlayingAd) .addIf( COMMAND_SEEK_TO_NEXT, !currentTimeline.isEmpty && (hasNextMediaItem() || (isCurrentMediaItemLive && isCurrentMediaItemDynamic)) && - !isPlayingAd + !isPlayingAd, ) .addIf(COMMAND_SEEK_TO_MEDIA_ITEM, !isPlayingAd) .addIf(COMMAND_SEEK_BACK, isCurrentMediaItemSeekable && !isPlayingAd) @@ -683,8 +703,8 @@ class MPVPlayer( arrayOf( "loadfile", "${mediaItem.localConfiguration?.uri}", - "append" - ) + "append", + ), ) } prepareMediaItem(currentIndex) @@ -738,7 +758,7 @@ class MPVPlayer( if (currentPlayWhenReady != playWhenReady) { setPlayerStateAndNotifyIfChanged( playWhenReady = playWhenReady, - playWhenReadyChangeReason = Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST + playWhenReadyChangeReason = Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, ) if (isPlayerReady) { MPVLib.setPropertyBoolean("pause", !playWhenReady) @@ -818,7 +838,7 @@ class MPVPlayer( mediaItemIndex: Int, positionMs: Long, @Player.Command seekCommand: Int, - isRepeatingCurrentItem: Boolean + isRepeatingCurrentItem: Boolean, ) { if (mediaItemIndex == currentMediaItemIndex) { val seekTo = @@ -841,12 +861,17 @@ class MPVPlayer( mediaItem.localConfiguration?.subtitleConfigurations?.forEach { subtitle -> initialCommands.add( arrayOf( - /* command= */ "sub-add", - /* url= */ "${subtitle.uri}", - /* flags= */ "auto", - /* title= */ "${subtitle.label}", - /* lang= */ "${subtitle.language}" - ) + /* command= */ + "sub-add", + /* url= */ + "${subtitle.uri}", + /* flags= */ + "auto", + /* title= */ + "${subtitle.label}", + /* lang= */ + "${subtitle.language}", + ), ) } currentIndex = index @@ -858,7 +883,7 @@ class MPVPlayer( listeners.sendEvent(Player.EVENT_MEDIA_ITEM_TRANSITION) { listener -> listener.onMediaItemTransition( mediaItem, - Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED + Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, ) } setPlayerStateAndNotifyIfChanged(playbackState = Player.STATE_BUFFERING) @@ -1266,7 +1291,7 @@ class MPVPlayer( COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_CHANGE_MEDIA_ITEMS, - COMMAND_SET_VIDEO_SURFACE + COMMAND_SET_VIDEO_SURFACE, ) .build() @@ -1303,7 +1328,7 @@ class MPVPlayer( holder: SurfaceHolder, format: Int, width: Int, - height: Int + height: Int, ) { MPVLib.setPropertyString("android-surface-size", "${width}x$height") } @@ -1341,7 +1366,7 @@ class MPVPlayer( val ffIndex: Int, val codec: String, val width: Int?, - val height: Int? + val height: Int?, ) : Parcelable { fun toFormat(): Format { return Format.Builder() @@ -1367,7 +1392,7 @@ class MPVPlayer( ffIndex = json.optInt("ff-index"), codec = json.optString("codec"), width = json.optInt("demux-w").takeIf { it > 0 }, - height = json.optInt("demux-h").takeIf { it > 0 } + height = json.optInt("demux-h").takeIf { it > 0 }, ) } } @@ -1397,7 +1422,7 @@ class MPVPlayer( ffIndex = -1, codec = "", width = null, - height = null + height = null, ) mpvTracks.add(emptyTrack) trackListText.add(emptyTrack.toFormat()) @@ -1440,9 +1465,9 @@ class MPVPlayer( this, true, IntArray(this.length) { C.FORMAT_HANDLED }, - BooleanArray(this.length) { it == indexCurrentVideo } + BooleanArray(this.length) { it == indexCurrentVideo }, ) - } + }, ) } if (trackListAudio.isNotEmpty()) { @@ -1452,9 +1477,9 @@ class MPVPlayer( this, true, IntArray(this.length) { C.FORMAT_HANDLED }, - BooleanArray(this.length) { it == indexCurrentAudio } + BooleanArray(this.length) { it == indexCurrentAudio }, ) - } + }, ) } if (trackListText.isNotEmpty()) { @@ -1464,9 +1489,9 @@ class MPVPlayer( this, true, IntArray(this.length) { C.FORMAT_HANDLED }, - BooleanArray(this.length) { it == indexCurrentText } + BooleanArray(this.length) { it == indexCurrentText }, ) - } + }, ) } if (trackGroups.isNotEmpty()) { diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt index 4d14c72c..a7295c76 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt @@ -3,5 +3,5 @@ package dev.jdtech.jellyfin.mpv enum class TrackType(val type: String) { VIDEO("video"), AUDIO("audio"), - SUBTITLE("sub") + SUBTITLE("sub"), } diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index 92743dbc..cd5b2b2c 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -25,8 +25,6 @@ import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.utils.bif.BifData import dev.jdtech.jellyfin.utils.bif.BifUtil -import java.util.UUID -import javax.inject.Inject import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -36,6 +34,8 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber +import java.util.UUID +import javax.inject.Inject @HiltViewModel class PlayerActivityViewModel @@ -84,18 +84,18 @@ constructor( player = MPVPlayer( application, false, - appPreferences + appPreferences, ) } else { val renderersFactory = DefaultRenderersFactory(application).setExtensionRendererMode( - DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON + DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON, ) trackSelector.setParameters( trackSelector.buildUponParameters() .setTunnelingEnabled(true) .setPreferredAudioLanguage(appPreferences.preferredAudioLanguage) - .setPreferredTextLanguage(appPreferences.preferredSubtitleLanguage) + .setPreferredTextLanguage(appPreferences.preferredSubtitleLanguage), ) player = ExoPlayer.Builder(application, renderersFactory) .setTrackSelector(trackSelector) @@ -104,7 +104,8 @@ constructor( .setContentType(C.AUDIO_CONTENT_TYPE_MOVIE) .setUsage(C.USAGE_MEDIA) .build(), - /* handleAudioFocus = */ true + /* handleAudioFocus = */ + true, ) .setSeekBackIncrementMs(appPreferences.playerSeekBackIncrement) .setSeekForwardIncrementMs(appPreferences.playerSeekForwardIncrement) @@ -113,7 +114,7 @@ constructor( } fun initializePlayer( - items: Array + items: Array, ) { this.items = items player.addListener(this) @@ -145,7 +146,7 @@ constructor( .setMediaMetadata( MediaMetadata.Builder() .setTitle(item.name) - .build() + .build(), ) .setSubtitleConfigurations(mediaSubtitles) .build() @@ -158,7 +159,7 @@ constructor( player.setMediaItems( mediaItems, currentMediaItemIndex, - items.getOrNull(currentMediaItemIndex)?.playbackPosition ?: C.TIME_UNSET + items.getOrNull(currentMediaItemIndex)?.playbackPosition ?: C.TIME_UNSET, ) if (appPreferences.playerMpv) { // For some reason, adding a 1ms delay between these two lines fixes a crash when playing with mpv from downloads withContext(Dispatchers.IO) { @@ -182,7 +183,7 @@ constructor( jellyfinRepository.postPlaybackStop( UUID.fromString(mediaId), position.times(10000), - position.div(duration.toFloat()).times(100).toInt() + position.div(duration.toFloat()).times(100).toInt(), ) } catch (e: Exception) { Timber.e(e) @@ -207,7 +208,7 @@ constructor( jellyfinRepository.postPlaybackProgress( itemId, player.currentPosition.times(10000), - !player.isPlaying + !player.isPlaying, ) } catch (e: Exception) { Timber.e(e) @@ -244,14 +245,13 @@ constructor( items.first { it.itemId.toString() == player.currentMediaItem?.mediaId } .let { item -> if (item.parentIndexNumber != null && item.indexNumber != null - ) + ) { _currentItemTitle.value = if (item.indexNumberEnd == null) { "S${item.parentIndexNumber}:E${item.indexNumber} - ${item.name}" } else { "S${item.parentIndexNumber}:E${item.indexNumber}-${item.indexNumberEnd} - ${item.name}" } - - else + } else _currentItemTitle.value = item.name jellyfinRepository.postPlaybackStart(item.itemId) @@ -333,7 +333,7 @@ constructor( jellyfinRepository.getTrickPlayData( itemId, - widthResolution + widthResolution, )?.let { byteArray -> val trickPlayData = BifUtil.trickPlayDecode(byteArray, widthResolution) diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt index f3d7fc6e..b877a5e6 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt @@ -15,13 +15,13 @@ import dev.jdtech.jellyfin.models.FindroidShow import dev.jdtech.jellyfin.models.FindroidSourceType import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.repository.JellyfinRepository -import javax.inject.Inject import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import org.jellyfin.sdk.model.api.ItemFields import org.jellyfin.sdk.model.api.MediaStreamType import timber.log.Timber +import javax.inject.Inject @HiltViewModel class PlayerViewModel @Inject internal constructor( @@ -31,7 +31,7 @@ class PlayerViewModel @Inject internal constructor( private val playerItems = MutableSharedFlow( replay = 0, extraBufferCapacity = 1, - onBufferOverflow = BufferOverflow.DROP_OLDEST + onBufferOverflow = BufferOverflow.DROP_OLDEST, ) fun onPlaybackRequested(scope: LifecycleCoroutineScope, collector: (PlayerItemState) -> Unit) { @@ -40,7 +40,7 @@ class PlayerViewModel @Inject internal constructor( fun loadPlayerItems( item: FindroidItem, - mediaSourceIndex: Int? = null + mediaSourceIndex: Int? = null, ) { Timber.d("Loading player items for item ${item.id}") @@ -61,7 +61,7 @@ class PlayerViewModel @Inject internal constructor( private suspend fun prepareMediaPlayerItems( item: FindroidItem, playbackPosition: Long, - mediaSourceIndex: Int? + mediaSourceIndex: Int?, ): List = when (item) { is FindroidMovie -> movieToPlayerItem(item, playbackPosition, mediaSourceIndex) is FindroidShow -> seriesToPlayerItems(item, playbackPosition, mediaSourceIndex) @@ -73,13 +73,13 @@ class PlayerViewModel @Inject internal constructor( private suspend fun movieToPlayerItem( item: FindroidMovie, playbackPosition: Long, - mediaSourceIndex: Int? + mediaSourceIndex: Int?, ) = listOf(item.toPlayerItem(mediaSourceIndex, playbackPosition)) private suspend fun seriesToPlayerItems( item: FindroidShow, playbackPosition: Long, - mediaSourceIndex: Int? + mediaSourceIndex: Int?, ): List { val nextUp = repository.getNextUp(item.id) @@ -95,13 +95,13 @@ class PlayerViewModel @Inject internal constructor( private suspend fun seasonToPlayerItems( item: FindroidSeason, playbackPosition: Long, - mediaSourceIndex: Int? + mediaSourceIndex: Int?, ): List { return repository .getEpisodes( seriesId = item.seriesId, seasonId = item.id, - fields = listOf(ItemFields.MEDIA_SOURCES) + fields = listOf(ItemFields.MEDIA_SOURCES), ) .filter { it.sources.isNotEmpty() } .filter { !it.missing } @@ -111,7 +111,7 @@ class PlayerViewModel @Inject internal constructor( private suspend fun episodeToPlayerItems( item: FindroidEpisode, playbackPosition: Long, - mediaSourceIndex: Int? + mediaSourceIndex: Int?, ): List { // TODO Move user configuration to a separate class val userConfig = try { @@ -125,7 +125,7 @@ class PlayerViewModel @Inject internal constructor( seasonId = item.seasonId, fields = listOf(ItemFields.MEDIA_SOURCES), startItemId = item.id, - limit = if (userConfig?.enableNextEpisodeAutoPlay != false) null else 1 + limit = if (userConfig?.enableNextEpisodeAutoPlay != false) null else 1, ) .filter { it.sources.isNotEmpty() } .filter { !it.missing } @@ -134,7 +134,7 @@ class PlayerViewModel @Inject internal constructor( private suspend fun FindroidItem.toPlayerItem( mediaSourceIndex: Int?, - playbackPosition: Long + playbackPosition: Long, ): PlayerItem { val mediaSources = repository.getMediaSources(id, true) val mediaSource = if (mediaSourceIndex == null) { @@ -163,7 +163,7 @@ class PlayerViewModel @Inject internal constructor( "webvtt" -> MimeTypes.TEXT_VTT "ass" -> MimeTypes.TEXT_SSA else -> MimeTypes.TEXT_UNKNOWN - } + }, ) } return PlayerItem( @@ -175,7 +175,7 @@ class PlayerViewModel @Inject internal constructor( parentIndexNumber = if (this is FindroidEpisode) parentIndexNumber else null, indexNumber = if (this is FindroidEpisode) indexNumber else null, indexNumberEnd = if (this is FindroidEpisode) indexNumberEnd else null, - externalSubtitles = externalSubtitles + externalSubtitles = externalSubtitles, ) } diff --git a/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt b/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt index a9ec7627..f32d9967 100644 --- a/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt +++ b/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt @@ -10,7 +10,7 @@ import javax.inject.Inject class AppPreferences @Inject constructor( - private val sharedPreferences: SharedPreferences + private val sharedPreferences: SharedPreferences, ) { // Server var currentServer: String? @@ -54,7 +54,7 @@ constructor( var playerBrightness: Float get() = sharedPreferences.getFloat( Constants.PREF_PLAYER_BRIGHTNESS, - BRIGHTNESS_OVERRIDE_NONE + BRIGHTNESS_OVERRIDE_NONE, ) set(value) { sharedPreferences.edit { @@ -63,17 +63,17 @@ constructor( } val playerSeekBackIncrement get() = sharedPreferences.getString( Constants.PREF_PLAYER_SEEK_BACK_INC, - DEFAULT_SEEK_BACK_INCREMENT_MS.toString() + DEFAULT_SEEK_BACK_INCREMENT_MS.toString(), )!!.toLongOrNull() ?: DEFAULT_SEEK_BACK_INCREMENT_MS val playerSeekForwardIncrement get() = sharedPreferences.getString( Constants.PREF_PLAYER_SEEK_FORWARD_INC, - DEFAULT_SEEK_FORWARD_INCREMENT_MS.toString() + DEFAULT_SEEK_FORWARD_INCREMENT_MS.toString(), )!!.toLongOrNull() ?: DEFAULT_SEEK_FORWARD_INCREMENT_MS val playerMpv get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_MPV, false) val playerMpvHwdec get() = sharedPreferences.getString(Constants.PREF_PLAYER_MPV_HWDEC, "mediacodec-copy")!! val playerMpvHwdecCodecs: Set get() = sharedPreferences.getStringSet( Constants.PREF_PLAYER_MPV_HWDEC_CODECS, - setOf("h264", "hevc", "mpeg4", "mpeg2video", "vp8", "vp9") + setOf("h264", "hevc", "mpeg4", "mpeg2video", "vp8", "vp9"), )!! val playerMpvVo get() = sharedPreferences.getString(Constants.PREF_PLAYER_MPV_VO, "gpu")!! val playerMpvAo get() = sharedPreferences.getString(Constants.PREF_PLAYER_MPV_AO, "audiotrack")!! @@ -88,44 +88,44 @@ constructor( // Network val requestTimeout get() = sharedPreferences.getString( Constants.PREF_NETWORK_REQUEST_TIMEOUT, - Constants.NETWORK_DEFAULT_REQUEST_TIMEOUT.toString() + Constants.NETWORK_DEFAULT_REQUEST_TIMEOUT.toString(), )!!.toLongOrNull() ?: Constants.NETWORK_DEFAULT_REQUEST_TIMEOUT val connectTimeout get() = sharedPreferences.getString( Constants.PREF_NETWORK_CONNECT_TIMEOUT, - Constants.NETWORK_DEFAULT_CONNECT_TIMEOUT.toString() + Constants.NETWORK_DEFAULT_CONNECT_TIMEOUT.toString(), )!!.toLongOrNull() ?: Constants.NETWORK_DEFAULT_CONNECT_TIMEOUT val socketTimeout get() = sharedPreferences.getString( Constants.PREF_NETWORK_SOCKET_TIMEOUT, - Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT.toString() + Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT.toString(), )!!.toLongOrNull() ?: Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT // Cache val imageCache get() = sharedPreferences.getBoolean( Constants.PREF_IMAGE_CACHE, - true + true, ) val imageCacheSize get() = sharedPreferences.getString( Constants.PREF_IMAGE_CACHE_SIZE, - Constants.DEFAULT_CACHE_SIZE.toString() + Constants.DEFAULT_CACHE_SIZE.toString(), )!!.toIntOrNull() ?: Constants.DEFAULT_CACHE_SIZE // Downloads val downloadOverMobileData get() = sharedPreferences.getBoolean( Constants.PREF_DOWNLOADS_MOBILE_DATA, - false + false, ) val downloadWhenRoaming get() = sharedPreferences.getBoolean( Constants.PREF_DOWNLOADS_ROAMING, - false + false, ) // Sorting var sortBy: String get() = sharedPreferences.getString( Constants.PREF_SORT_BY, - Constants.DEFAULT_SORT_BY + Constants.DEFAULT_SORT_BY, )!! set(value) { sharedPreferences.edit { @@ -135,7 +135,7 @@ constructor( var sortOrder get() = sharedPreferences.getString( Constants.PREF_SORT_ORDER, - Constants.DEFAULT_SORT_ORDER + Constants.DEFAULT_SORT_ORDER, )!! set(value) { sharedPreferences.edit {