diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/phone/build.gradle.kts similarity index 86% rename from app/build.gradle.kts rename to app/phone/build.gradle.kts index d81e29d9..2325d5af 100644 --- a/app/build.gradle.kts +++ b/app/phone/build.gradle.kts @@ -19,8 +19,12 @@ android { applicationId = "dev.jdtech.jellyfin" minSdk = 27 targetSdk = 33 - versionCode = 14 - versionName = "0.8.0" + + val appVersionCode: Int by rootProject.extra + val appVersionName: String by rootProject.extra + + versionCode = appVersionCode + versionName = appVersionName } buildTypes { @@ -68,6 +72,11 @@ ktlint { } dependencies { + implementation(project(":core")) + implementation(project(":data")) + implementation(project(":preferences")) + implementation(project(":player:core")) + implementation(project(":player:video")) implementation(libs.aboutlibraries.core) implementation(libs.aboutlibraries) implementation(libs.androidx.activity) @@ -85,19 +94,13 @@ dependencies { implementation(libs.androidx.preference) implementation(libs.androidx.recyclerview) implementation(libs.androidx.recyclerview.selection) - implementation(libs.androidx.room.runtime) - kapt(libs.androidx.room.compiler) implementation(libs.androidx.room.ktx) implementation(libs.androidx.swiperefreshlayout) implementation(libs.glide) - kapt(libs.glide.compiler) implementation(libs.hilt.android) kapt(libs.hilt.compiler) implementation(libs.jellyfin.core) - implementation(libs.libmpv) + compileOnly(libs.libmpv) implementation(libs.material) implementation(libs.timber) - - // Media3 FFmpeg decoder - implementation(files("libs/lib-decoder-ffmpeg-release.aar")) } diff --git a/app/lint.xml b/app/phone/lint.xml similarity index 100% rename from app/lint.xml rename to app/phone/lint.xml diff --git a/app/proguard-rules.pro b/app/phone/proguard-rules.pro similarity index 100% rename from app/proguard-rules.pro rename to app/phone/proguard-rules.pro diff --git a/app/src/main/AndroidManifest.xml b/app/phone/src/main/AndroidManifest.xml similarity index 100% rename from app/src/main/AndroidManifest.xml rename to app/phone/src/main/AndroidManifest.xml diff --git a/app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt similarity index 82% rename from app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt index 93cdda26..4edd0bbd 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt @@ -2,14 +2,16 @@ package dev.jdtech.jellyfin import android.app.Application import androidx.appcompat.app.AppCompatDelegate -import androidx.preference.PreferenceManager import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp -import dev.jdtech.jellyfin.utils.AppPreferences import timber.log.Timber +import javax.inject.Inject @HiltAndroidApp class BaseApplication : Application() { + @Inject + lateinit var appPreferences: AppPreferences + override fun onCreate() { super.onCreate() @@ -17,8 +19,6 @@ class BaseApplication : Application() { Timber.plant(Timber.DebugTree()) } - val appPreferences = AppPreferences(PreferenceManager.getDefaultSharedPreferences(this)) - when (appPreferences.theme) { "system" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) "light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) diff --git a/app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt index ab4df781..1c5c6416 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt @@ -13,7 +13,7 @@ abstract class BasePlayerActivity : AppCompatActivity() { abstract val viewModel: PlayerActivityViewModel - lateinit var mediaSession: MediaSession + private lateinit var mediaSession: MediaSession override fun onStart() { super.onStart() diff --git a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt similarity index 95% rename from app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt index 50d245d6..a7812758 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BindingAdapters.kt @@ -131,11 +131,9 @@ private fun ImageView.loadImage( } private fun View.posterDescription(name: String?) { - contentDescription = - String.format(context.resources.getString(R.string.image_description_poster), name) + contentDescription = context.resources.getString(R.string.image_description_poster, name) } private fun View.backdropDescription(name: String?) { - contentDescription = - String.format(context.resources.getString(R.string.image_description_backdrop), name) + contentDescription = context.resources.getString(R.string.image_description_backdrop, name) } diff --git a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt index 0c6f9c44..f1b1ea9d 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/MainActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt @@ -15,7 +15,6 @@ import com.google.android.material.navigation.NavigationBarView import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.databinding.ActivityMainBinding -import dev.jdtech.jellyfin.utils.AppPreferences import dev.jdtech.jellyfin.utils.loadDownloadLocation import dev.jdtech.jellyfin.viewmodels.MainViewModel import javax.inject.Inject @@ -33,7 +32,7 @@ class MainActivity : AppCompatActivity() { @Inject lateinit var appPreferences: AppPreferences - lateinit var navController: NavController + private lateinit var navController: NavController @OptIn(NavigationUiSaveStateControl::class) override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 66dc59e3..985ca978 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -18,7 +18,6 @@ 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.utils.AppPreferences import dev.jdtech.jellyfin.utils.PlayerGestureHelper import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import javax.inject.Inject diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/CollectionListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DiscoveredServerListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt similarity index 93% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt index 633ef916..1ff7e21f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt @@ -9,10 +9,10 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import dev.jdtech.jellyfin.databinding.EpisodeItemBinding import dev.jdtech.jellyfin.databinding.SeasonHeaderBinding +import dev.jdtech.jellyfin.models.DownloadEpisodeItem import dev.jdtech.jellyfin.models.DownloadSeriesMetadata import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.utils.downloadMetadataToBaseItemDto -import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto private const val ITEM_VIEW_TYPE_HEADER = 0 @@ -113,16 +113,4 @@ class DownloadEpisodeListAdapter( class OnClickListener(val clickListener: (item: PlayerItem) -> Unit) { fun onClick(item: PlayerItem) = clickListener(item) } -} - -sealed class DownloadEpisodeItem { - abstract val id: UUID - - object Header : DownloadEpisodeItem() { - override val id: UUID = UUID.randomUUID() - } - - data class Episode(val episode: PlayerItem) : DownloadEpisodeItem() { - override val id = episode.itemId - } -} +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadSeriesListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadSeriesListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadSeriesListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadSeriesListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadViewItemListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadViewItemListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadViewItemListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadViewItemListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadsListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadsListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/DownloadsListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadsListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt similarity index 94% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt index e3a97328..b425b552 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import dev.jdtech.jellyfin.databinding.EpisodeItemBinding import dev.jdtech.jellyfin.databinding.SeasonHeaderBinding +import dev.jdtech.jellyfin.models.EpisodeItem import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto @@ -118,15 +119,3 @@ class EpisodeListAdapter( fun onClick(item: BaseItemDto) = clickListener(item) } } - -sealed class EpisodeItem { - abstract val id: UUID - - object Header : EpisodeItem() { - override val id: UUID = UUID.randomUUID() - } - - data class Episode(val episode: BaseItemDto) : EpisodeItem() { - override val id = episode.id - } -} diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt similarity index 95% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt index 5985a109..9a131aaf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/FavoritesListAdapter.kt @@ -5,9 +5,9 @@ import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import dev.jdtech.jellyfin.Constants import dev.jdtech.jellyfin.databinding.FavoriteSectionBinding import dev.jdtech.jellyfin.models.FavoriteSection -import dev.jdtech.jellyfin.utils.Constants class FavoritesListAdapter( private val onClickListener: ViewItemListAdapter.OnClickListener, @@ -30,6 +30,7 @@ class FavoritesListAdapter( HomeEpisodeListAdapter(onEpisodeClickListener) (binding.itemsRecyclerView.adapter as HomeEpisodeListAdapter).submitList(section.items) } + binding.sectionName.text = section.name.asString(binding.root.resources) binding.executePendingBindings() } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/HomeEpisodeListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/PersonListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerAddressAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ServerGridAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/UserLoginListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemListAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewItemPagingAdapter.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt similarity index 87% rename from app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt index 0e6ef7d0..bd0b1028 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/ViewListAdapter.kt @@ -8,9 +8,8 @@ import androidx.recyclerview.widget.RecyclerView import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.databinding.NextUpSectionBinding import dev.jdtech.jellyfin.databinding.ViewItemBinding -import dev.jdtech.jellyfin.models.HomeSection +import dev.jdtech.jellyfin.models.HomeItem import dev.jdtech.jellyfin.models.View -import java.util.UUID private const val ITEM_VIEW_TYPE_NEXT_UP = 0 private const val ITEM_VIEW_TYPE_VIEW = 1 @@ -30,7 +29,7 @@ class ViewListAdapter( ) { val view = dataItem.view binding.view = view - binding.viewName.text = String.format(binding.viewName.context.resources.getString(R.string.latest_library), view.name) + binding.viewName.text = binding.viewName.context.resources.getString(R.string.latest_library, view.name) binding.itemsRecyclerView.adapter = ViewItemListAdapter(onItemClickListener, fixedWidth = true) binding.viewAll.setOnClickListener { @@ -105,19 +104,3 @@ class ViewListAdapter( fun onClick(view: View) = clickListener(view) } } - -sealed class HomeItem { - data class Libraries(val section: HomeSection) : HomeItem() { - override val id = section.id - } - - data class Section(val homeSection: HomeSection) : HomeItem() { - override val id = homeSection.id - } - - data class ViewItem(val view: View) : HomeItem() { - override val id = view.id - } - - abstract val id: UUID -} diff --git a/app/src/main/java/dev/jdtech/jellyfin/di/AppModule.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/di/AppModule.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/di/AppModule.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/di/AppModule.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt index 127a2f06..33106d9a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/AddServerFragment.kt @@ -99,7 +99,7 @@ class AddServerFragment : Fragment() { binding.buttonConnect.isEnabled = true binding.progressCircular.isVisible = false binding.editTextServerAddressLayout.apply { - error = uiState.message + error = uiState.message.joinToString { it.asString(resources) } isEnabled = true } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/DownloadFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/DownloadFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/DownloadSeriesFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadSeriesFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/DownloadSeriesFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/DownloadSeriesFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt index 58f6a240..f4887f9c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -195,8 +195,8 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { } } - binding.episodeName.text = String.format( - getString(R.string.episode_name_extended), + binding.episodeName.text = getString( + R.string.episode_name_extended, episode.parentIndexNumber, episode.indexNumber, episode.name diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/FavoriteFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt similarity index 95% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt index 76c00f9d..262e59ff 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LibraryFragment.kt @@ -1,6 +1,5 @@ package dev.jdtech.jellyfin.fragments -import android.content.SharedPreferences import android.os.Bundle import android.view.LayoutInflater import android.view.Menu @@ -20,12 +19,13 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.paging.LoadState import dagger.hilt.android.AndroidEntryPoint +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.ViewItemPagingAdapter import dev.jdtech.jellyfin.databinding.FragmentLibraryBinding import dev.jdtech.jellyfin.dialogs.ErrorDialogFragment import dev.jdtech.jellyfin.dialogs.SortDialogFragment -import dev.jdtech.jellyfin.utils.SortBy +import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.utils.checkIfLoginRequired import dev.jdtech.jellyfin.viewmodels.LibraryViewModel import java.lang.IllegalArgumentException @@ -44,7 +44,7 @@ class LibraryFragment : Fragment() { private lateinit var errorDialog: ErrorDialogFragment @Inject - lateinit var sp: SharedPreferences + lateinit var preferences: AppPreferences override fun onCreateView( inflater: LayoutInflater, @@ -146,9 +146,9 @@ class LibraryFragment : Fragment() { viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { // Sorting options - val sortBy = SortBy.fromString(sp.getString("sortBy", SortBy.defaultValue.name)!!) + val sortBy = SortBy.fromString(preferences.sortBy) val sortOrder = try { - SortOrder.valueOf(sp.getString("sortOrder", SortOrder.ASCENDING.name)!!) + SortOrder.valueOf(preferences.sortOrder) } catch (e: IllegalArgumentException) { SortOrder.ASCENDING } diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt index 97dcca75..b8f2bc3f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt @@ -18,7 +18,7 @@ import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.adapters.UserLoginListAdapter import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.databinding.FragmentLoginBinding -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.viewmodels.LoginViewModel import javax.inject.Inject import kotlinx.coroutines.launch @@ -119,7 +119,7 @@ class LoginFragment : Fragment() { binding.buttonLogin.isEnabled = true binding.progressCircular.isVisible = false binding.editTextUsernameLayout.apply { - error = uiState.message + error = uiState.message.asString(resources) isEnabled = true } binding.editTextPasswordLayout.isEnabled = true diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index e984fbd6..1953e1f8 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -272,8 +272,8 @@ class MediaInfoFragment : Fragment() { binding.writers.text = writersString binding.description.text = item.overview binding.nextUpLayout.isVisible = nextUp != null - binding.nextUpName.text = String.format( - getString(R.string.episode_name_extended), + binding.nextUpName.text = getString( + R.string.episode_name_extended, nextUp?.parentIndexNumber, nextUp?.indexNumber, nextUp?.name diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/PersonDetailFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SearchResultFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerAddressesFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/ServerSelectFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsAppearanceFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsCacheFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDeviceFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsDownloadsFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt index 1bf814b9..971a55a3 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt @@ -8,7 +8,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.R -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import javax.inject.Inject @AndroidEntryPoint diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsLanguageFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsNetworkFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsNetworkFragment.kt similarity index 93% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsNetworkFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsNetworkFragment.kt index c4b1fbfe..e55a4fe4 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsNetworkFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsNetworkFragment.kt @@ -4,8 +4,8 @@ import android.os.Bundle import android.text.InputType import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat +import dev.jdtech.jellyfin.Constants import dev.jdtech.jellyfin.R -import dev.jdtech.jellyfin.utils.Constants @Suppress("unused") class SettingsNetworkFragment : PreferenceFragmentCompat() { diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsPlayerFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/TwoPaneSettingsFragment.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/fragments/UsersFragment.kt diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt new file mode 100644 index 00000000..e177903f --- /dev/null +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt @@ -0,0 +1,15 @@ +package dev.jdtech.jellyfin.utils + +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import dev.jdtech.jellyfin.AppNavigationDirections +import timber.log.Timber + +fun Fragment.checkIfLoginRequired(error: String?) { + if (error != null) { + if (error.contains("401")) { + Timber.d("Login required!") + findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt rename to app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt index ef169a12..563b1bc5 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/PlayerGestureHelper.kt @@ -12,6 +12,8 @@ import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF import androidx.media3.ui.AspectRatioFrameLayout import androidx.media3.ui.PlayerView +import dev.jdtech.jellyfin.AppPreferences +import dev.jdtech.jellyfin.Constants import dev.jdtech.jellyfin.PlayerActivity import dev.jdtech.jellyfin.mpv.MPVPlayer import kotlin.math.abs diff --git a/app/src/main/res/layout-w600dp/activity_main.xml b/app/phone/src/main/res/layout-w600dp/activity_main.xml similarity index 100% rename from app/src/main/res/layout-w600dp/activity_main.xml rename to app/phone/src/main/res/layout-w600dp/activity_main.xml diff --git a/app/src/main/res/layout-w600dp/fragment_media_info.xml b/app/phone/src/main/res/layout-w600dp/fragment_media_info.xml similarity index 100% rename from app/src/main/res/layout-w600dp/fragment_media_info.xml rename to app/phone/src/main/res/layout-w600dp/fragment_media_info.xml diff --git a/app/src/main/res/layout/activity_main.xml b/app/phone/src/main/res/layout/activity_main.xml similarity index 100% rename from app/src/main/res/layout/activity_main.xml rename to app/phone/src/main/res/layout/activity_main.xml diff --git a/app/src/main/res/layout/activity_player.xml b/app/phone/src/main/res/layout/activity_player.xml similarity index 100% rename from app/src/main/res/layout/activity_player.xml rename to app/phone/src/main/res/layout/activity_player.xml diff --git a/app/src/main/res/layout/base_item.xml b/app/phone/src/main/res/layout/base_item.xml similarity index 100% rename from app/src/main/res/layout/base_item.xml rename to app/phone/src/main/res/layout/base_item.xml diff --git a/app/src/main/res/layout/collection_item.xml b/app/phone/src/main/res/layout/collection_item.xml similarity index 100% rename from app/src/main/res/layout/collection_item.xml rename to app/phone/src/main/res/layout/collection_item.xml diff --git a/app/src/main/res/layout/discovered_server_item.xml b/app/phone/src/main/res/layout/discovered_server_item.xml similarity index 100% rename from app/src/main/res/layout/discovered_server_item.xml rename to app/phone/src/main/res/layout/discovered_server_item.xml diff --git a/app/src/main/res/layout/download_section.xml b/app/phone/src/main/res/layout/download_section.xml similarity index 100% rename from app/src/main/res/layout/download_section.xml rename to app/phone/src/main/res/layout/download_section.xml diff --git a/app/src/main/res/layout/episode_bottom_sheet.xml b/app/phone/src/main/res/layout/episode_bottom_sheet.xml similarity index 100% rename from app/src/main/res/layout/episode_bottom_sheet.xml rename to app/phone/src/main/res/layout/episode_bottom_sheet.xml diff --git a/app/src/main/res/layout/episode_item.xml b/app/phone/src/main/res/layout/episode_item.xml similarity index 100% rename from app/src/main/res/layout/episode_item.xml rename to app/phone/src/main/res/layout/episode_item.xml diff --git a/app/src/main/res/layout/error_panel.xml b/app/phone/src/main/res/layout/error_panel.xml similarity index 100% rename from app/src/main/res/layout/error_panel.xml rename to app/phone/src/main/res/layout/error_panel.xml diff --git a/app/src/main/res/layout/exo_player_control_view.xml b/app/phone/src/main/res/layout/exo_player_control_view.xml similarity index 100% rename from app/src/main/res/layout/exo_player_control_view.xml rename to app/phone/src/main/res/layout/exo_player_control_view.xml diff --git a/app/src/main/res/layout/exo_player_view.xml b/app/phone/src/main/res/layout/exo_player_view.xml similarity index 100% rename from app/src/main/res/layout/exo_player_view.xml rename to app/phone/src/main/res/layout/exo_player_view.xml diff --git a/app/src/main/res/layout/favorite_section.xml b/app/phone/src/main/res/layout/favorite_section.xml similarity index 97% rename from app/src/main/res/layout/favorite_section.xml rename to app/phone/src/main/res/layout/favorite_section.xml index 7b4e9a87..9fab4b6a 100644 --- a/app/src/main/res/layout/favorite_section.xml +++ b/app/phone/src/main/res/layout/favorite_section.xml @@ -22,7 +22,6 @@ android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginBottom="12dp" - android:text="@{section.name}" android:textAppearance="@style/TextAppearance.Material3.TitleMedium" android:textSize="18sp" tools:text="Movies" /> diff --git a/app/src/main/res/layout/fragment_add_server.xml b/app/phone/src/main/res/layout/fragment_add_server.xml similarity index 100% rename from app/src/main/res/layout/fragment_add_server.xml rename to app/phone/src/main/res/layout/fragment_add_server.xml diff --git a/app/src/main/res/layout/fragment_download.xml b/app/phone/src/main/res/layout/fragment_download.xml similarity index 100% rename from app/src/main/res/layout/fragment_download.xml rename to app/phone/src/main/res/layout/fragment_download.xml diff --git a/app/src/main/res/layout/fragment_download_series.xml b/app/phone/src/main/res/layout/fragment_download_series.xml similarity index 100% rename from app/src/main/res/layout/fragment_download_series.xml rename to app/phone/src/main/res/layout/fragment_download_series.xml diff --git a/app/src/main/res/layout/fragment_favorite.xml b/app/phone/src/main/res/layout/fragment_favorite.xml similarity index 100% rename from app/src/main/res/layout/fragment_favorite.xml rename to app/phone/src/main/res/layout/fragment_favorite.xml diff --git a/app/src/main/res/layout/fragment_home.xml b/app/phone/src/main/res/layout/fragment_home.xml similarity index 100% rename from app/src/main/res/layout/fragment_home.xml rename to app/phone/src/main/res/layout/fragment_home.xml diff --git a/app/src/main/res/layout/fragment_library.xml b/app/phone/src/main/res/layout/fragment_library.xml similarity index 100% rename from app/src/main/res/layout/fragment_library.xml rename to app/phone/src/main/res/layout/fragment_library.xml diff --git a/app/src/main/res/layout/fragment_login.xml b/app/phone/src/main/res/layout/fragment_login.xml similarity index 100% rename from app/src/main/res/layout/fragment_login.xml rename to app/phone/src/main/res/layout/fragment_login.xml diff --git a/app/src/main/res/layout/fragment_media.xml b/app/phone/src/main/res/layout/fragment_media.xml similarity index 100% rename from app/src/main/res/layout/fragment_media.xml rename to app/phone/src/main/res/layout/fragment_media.xml diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/phone/src/main/res/layout/fragment_media_info.xml similarity index 100% rename from app/src/main/res/layout/fragment_media_info.xml rename to app/phone/src/main/res/layout/fragment_media_info.xml diff --git a/app/src/main/res/layout/fragment_person_detail.xml b/app/phone/src/main/res/layout/fragment_person_detail.xml similarity index 100% rename from app/src/main/res/layout/fragment_person_detail.xml rename to app/phone/src/main/res/layout/fragment_person_detail.xml diff --git a/app/src/main/res/layout/fragment_search_result.xml b/app/phone/src/main/res/layout/fragment_search_result.xml similarity index 100% rename from app/src/main/res/layout/fragment_search_result.xml rename to app/phone/src/main/res/layout/fragment_search_result.xml diff --git a/app/src/main/res/layout/fragment_season.xml b/app/phone/src/main/res/layout/fragment_season.xml similarity index 100% rename from app/src/main/res/layout/fragment_season.xml rename to app/phone/src/main/res/layout/fragment_season.xml diff --git a/app/src/main/res/layout/fragment_server_addresses.xml b/app/phone/src/main/res/layout/fragment_server_addresses.xml similarity index 100% rename from app/src/main/res/layout/fragment_server_addresses.xml rename to app/phone/src/main/res/layout/fragment_server_addresses.xml diff --git a/app/src/main/res/layout/fragment_server_select.xml b/app/phone/src/main/res/layout/fragment_server_select.xml similarity index 100% rename from app/src/main/res/layout/fragment_server_select.xml rename to app/phone/src/main/res/layout/fragment_server_select.xml diff --git a/app/src/main/res/layout/fragment_users.xml b/app/phone/src/main/res/layout/fragment_users.xml similarity index 100% rename from app/src/main/res/layout/fragment_users.xml rename to app/phone/src/main/res/layout/fragment_users.xml diff --git a/app/src/main/res/layout/home_episode_item.xml b/app/phone/src/main/res/layout/home_episode_item.xml similarity index 100% rename from app/src/main/res/layout/home_episode_item.xml rename to app/phone/src/main/res/layout/home_episode_item.xml diff --git a/app/src/main/res/layout/next_up_section.xml b/app/phone/src/main/res/layout/next_up_section.xml similarity index 100% rename from app/src/main/res/layout/next_up_section.xml rename to app/phone/src/main/res/layout/next_up_section.xml diff --git a/app/src/main/res/layout/person_item.xml b/app/phone/src/main/res/layout/person_item.xml similarity index 100% rename from app/src/main/res/layout/person_item.xml rename to app/phone/src/main/res/layout/person_item.xml diff --git a/app/src/main/res/layout/season_header.xml b/app/phone/src/main/res/layout/season_header.xml similarity index 100% rename from app/src/main/res/layout/season_header.xml rename to app/phone/src/main/res/layout/season_header.xml diff --git a/app/src/main/res/layout/server_address_list_item.xml b/app/phone/src/main/res/layout/server_address_list_item.xml similarity index 100% rename from app/src/main/res/layout/server_address_list_item.xml rename to app/phone/src/main/res/layout/server_address_list_item.xml diff --git a/app/src/main/res/layout/server_item.xml b/app/phone/src/main/res/layout/server_item.xml similarity index 100% rename from app/src/main/res/layout/server_item.xml rename to app/phone/src/main/res/layout/server_item.xml diff --git a/app/src/main/res/layout/user_item.xml b/app/phone/src/main/res/layout/user_item.xml similarity index 100% rename from app/src/main/res/layout/user_item.xml rename to app/phone/src/main/res/layout/user_item.xml diff --git a/app/src/main/res/layout/user_list_item.xml b/app/phone/src/main/res/layout/user_list_item.xml similarity index 100% rename from app/src/main/res/layout/user_list_item.xml rename to app/phone/src/main/res/layout/user_list_item.xml diff --git a/app/src/main/res/layout/view_item.xml b/app/phone/src/main/res/layout/view_item.xml similarity index 100% rename from app/src/main/res/layout/view_item.xml rename to app/phone/src/main/res/layout/view_item.xml diff --git a/app/src/main/res/navigation/app_navigation.xml b/app/phone/src/main/res/navigation/app_navigation.xml similarity index 100% rename from app/src/main/res/navigation/app_navigation.xml rename to app/phone/src/main/res/navigation/app_navigation.xml diff --git a/app/src/main/res/anim/item_animation_slide_in.xml b/app/src/main/res/anim/item_animation_slide_in.xml deleted file mode 100644 index c035240c..00000000 --- a/app/src/main/res/anim/item_animation_slide_in.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/overview_media_animation.xml b/app/src/main/res/anim/overview_media_animation.xml deleted file mode 100644 index d197e7e7..00000000 --- a/app/src/main/res/anim/overview_media_animation.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml deleted file mode 100644 index a6b3daec..00000000 --- a/app/src/main/res/values-hr/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index d5d3f067..00000000 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - Versão do servidor desatualizada: %1$s. Por favor atualize seu servidor - Versão do servidor não suportada: %1$s. Por favor atualize seu servidor - O servidor é lendo demais para responder: %1$s - Endereço de servidor vazio - Servidor não possui id, algo parece errado como servidor - Entrar - Nome de usuário ou senha incorretos - Selecione o servidor - Endereço do servidor - Senha - Conectar - Entrar - Remover servidor - Remover - Cancelar - Início - Minhas mídia - Favoritos - Configurações - Downloads - Ver tudo - Erro carregando dados - Tentar novamente - Gêneros - Diretor(a) - Escritores(as) - Elenco e equipe - Temporadas - Tocar a mídia - Assistir ao trailer - Favoritar - Indicador de episódio assistido - %1$d. %2$s - E%1$d:T%2$d - %3$s - Próximo - Continue assistindo - Poster da série - Você não tem favoritos - Buscar - Sem resultados - Idioma - Idioma de áudio preferido - Idioma de legenda preferido - Inicializando… - Reprodutor - Gerenciar servidores - Aparência - Nome do dispositivo - Dispositivo - Cache - Cache de imagens - Tamanho do cache (MB) - Tema - Erro preparando itens a serem reproduzidos. - Ver detalhes - Ver detalhes - Sobre - Política de privacidade - Informações do aplicativo - Erro desconhecido - Selecione uma versão - Selecione uma faixa de áudio - Selecione uma legenda - Selecione a velocidade de reprodução - Reprodutor mpv - Baixar usando dados móveis - Baixar - Deletar - Detalhes - Detalhes indisponíveis - Filmes - Series de TV - Esconder - Ordenar por - Ordem - Fechar - Compartilhar - %1$s poster - %1$s imagem de fundo - Gestos - Adicionar servidor - Não é um servidor do jellyfin: %1$s - Servidor não encontrado - Nome de usuário - Tem certeza que deseja remover o servidor %1$s - Marcar como assistido ou não assistido - Você não tem nada baixado - Servidores - Downloads - Armazena imagens no disco para acelerar o tempo de carregamento. Surte efeito após reiniciar o aplicativo. - Busca filmes, shows, episódios… - Usa o reprodutor experimental mpv para reproduzir vídeos. mpv tem suporte a mais codecs de vidro, áudio e legenda. - Biblioteca - Rede - Data de Lançamento - [%1$s] %2$s (%3$s) - Saída de áudio - Legendas - Personalize a aparência das legendas - Classificação Etária - Externo - Usar configurações do sistema - Claro - Escuro - Aplicação Jellyfin nativa de terceiros - Mais recentes %1$s - Jellyfin banner - Download quando estiver em roaming - O aplicativo usará essa quantidade em MB do seu espaço em disco para armazenar imagens do servidor Jellyfin. Valores maiores podem ser benéficos em redes mais lentas. - Episódios - Gestos do player - Lembrar do nível de brilho - Exibe o título estendido do episódio, incluindo informações sobre a temporada e o episódio (SXX:EXX - NomeEpisódio). - Exibir título estendido - Endereço de servidor vazio - Título - Usar cores dinâmicas do Material You (disponível apenas no Android 12+) - Cores dinâmicas - Gestos de volume e brilho - Gestos de zoom - Deslize para cima e para baixo no lado direito da tela para alterar o volume e no lado esquerdo para alterar o brilho - Aperte para preencher a tela com o vídeo - Pular - %1$d minutos - Selecione a versão - Sair do player - Retroceder - Avanço rápido - Pausar - Usuários - Adicionar usuário - Decodificação de hardware - Codecs de decodificação de hardware - Data de Adição - Data de Reprodução - Crescente - Decrescente - Saida de vídeo - Remover usuário - Tem certeza que deseja remover o usuário (%1$s) - Avaliação IMDb - Endereços - Adicionar endereço - Adicionar endereço do servidor - Adicionar - Buscando - Incremento para frente (ms) - Incremento para trás (ms) - Tempo limite do soquete (ms) - Tempo limite da requisição (ms) - Tempo limite da conexão (ms) - \ No newline at end of file diff --git a/app/src/main/res/values/about_libraries.xml b/app/src/main/res/values/about_libraries.xml deleted file mode 100644 index c34ab3d8..00000000 --- a/app/src/main/res/values/about_libraries.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - true - true - @string/app_name - @string/app_description - true - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index bcb4baaf..38f544bc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,7 @@ @Suppress("DSL_SCOPE_VIOLATION") // False positive plugins { alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.parcelize) apply false alias(libs.plugins.kotlin.kapt) apply false @@ -20,4 +21,7 @@ allprojects { tasks.create("clean") { delete(rootProject.buildDir) -} \ No newline at end of file +} + +val appVersionCode by extra { 14 } +val appVersionName by extra { "0.8.0" } \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 00000000..3fe6232e --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,65 @@ +@Suppress("DSL_SCOPE_VIOLATION") // False positive +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.androidx.navigation.safeargs) + alias(libs.plugins.hilt) + alias(libs.plugins.ktlint) +} + +android { + namespace = "dev.jdtech.jellyfin.core" + compileSdk = 33 + buildToolsVersion = "33.0.1" + + defaultConfig { + minSdk = 27 + targetSdk = 33 + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + create("staging") { + initWith(getByName("release")) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +ktlint { + android.set(true) + ignoreFailures.set(false) + disabledRules.add("max-line-length") +} + +dependencies { + implementation(project(":data")) + implementation(project(":preferences")) + implementation(project(":player:core")) + implementation(libs.androidx.activity) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.viewmodel) + implementation(libs.androidx.navigation.fragment) + implementation(libs.androidx.paging) + implementation(libs.androidx.preference) + implementation(libs.androidx.room.runtime) + kapt(libs.androidx.room.compiler) + implementation(libs.androidx.room.ktx) + implementation(libs.glide) + kapt(libs.glide.compiler) + implementation(libs.hilt.android) + kapt(libs.hilt.compiler) + implementation(libs.jellyfin.core) + implementation(libs.material) + implementation(libs.timber) +} diff --git a/app/libs/lib-decoder-ffmpeg-release.aar b/core/libs/lib-decoder-ffmpeg-release.aar similarity index 100% rename from app/libs/lib-decoder-ffmpeg-release.aar rename to core/libs/lib-decoder-ffmpeg-release.aar diff --git a/app/src/debug/res/drawable/ic_banner_foreground.xml b/core/src/debug/res/drawable/ic_banner_foreground.xml similarity index 100% rename from app/src/debug/res/drawable/ic_banner_foreground.xml rename to core/src/debug/res/drawable/ic_banner_foreground.xml diff --git a/app/src/debug/res/drawable/ic_launcher_foreground.xml b/core/src/debug/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from app/src/debug/res/drawable/ic_launcher_foreground.xml rename to core/src/debug/res/drawable/ic_launcher_foreground.xml diff --git a/app/src/debug/res/values/strings.xml b/core/src/debug/res/values/strings.xml similarity index 100% rename from app/src/debug/res/values/strings.xml rename to core/src/debug/res/values/strings.xml diff --git a/app/src/main/ic_launcher-playstore.png b/core/src/main/ic_launcher-playstore.png similarity index 100% rename from app/src/main/ic_launcher-playstore.png rename to core/src/main/ic_launcher-playstore.png diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt b/core/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt rename to core/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt b/core/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt rename to core/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt rename to core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt index 535204fd..f1113e95 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt @@ -8,7 +8,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import javax.inject.Singleton @Module diff --git a/core/src/main/java/dev/jdtech/jellyfin/di/AppPreferencesModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/AppPreferencesModule.kt new file mode 100644 index 00000000..16db7eac --- /dev/null +++ b/core/src/main/java/dev/jdtech/jellyfin/di/AppPreferencesModule.kt @@ -0,0 +1,19 @@ +package dev.jdtech.jellyfin.di + +import android.content.SharedPreferences +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import dev.jdtech.jellyfin.AppPreferences +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AppPreferencesModule { + @Singleton + @Provides + fun provideAppPreferences(sp: SharedPreferences): AppPreferences { + return AppPreferences(sp) + } +} diff --git a/app/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt rename to core/src/main/java/dev/jdtech/jellyfin/di/DatabaseModule.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/di/GlideModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/GlideModule.kt similarity index 80% rename from app/src/main/java/dev/jdtech/jellyfin/di/GlideModule.kt rename to core/src/main/java/dev/jdtech/jellyfin/di/GlideModule.kt index 30234fae..8f02e0e1 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/di/GlideModule.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/di/GlideModule.kt @@ -9,7 +9,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy.RESOURCE import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory import com.bumptech.glide.module.AppGlideModule import com.bumptech.glide.request.RequestOptions -import dev.jdtech.jellyfin.utils.Constants +import dev.jdtech.jellyfin.AppPreferences import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import timber.log.Timber @@ -17,11 +17,11 @@ import timber.log.Timber @GlideModule class GlideModule : AppGlideModule() { override fun applyOptions(context: Context, builder: GlideBuilder) { - val preferences = PreferenceManager.getDefaultSharedPreferences(context) - val use = preferences.getBoolean(Constants.PREF_IMAGE_CACHE, true) + val preferences = AppPreferences(PreferenceManager.getDefaultSharedPreferences(context)) + val use = preferences.imageCache if (use) { - val sizeMb = preferences.getString(Constants.PREF_IMAGE_CACHE_SIZE, Constants.DEFAULT_CACHE_SIZE.toString())!!.toIntOrNull() ?: Constants.DEFAULT_CACHE_SIZE + val sizeMb = preferences.imageCacheSize val sizeB = 1024L * 1024 * sizeMb Timber.d("Setting image cache to use $sizeMb MB of disk space") diff --git a/app/src/main/java/dev/jdtech/jellyfin/di/RepositoryModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/RepositoryModule.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/di/RepositoryModule.kt rename to core/src/main/java/dev/jdtech/jellyfin/di/RepositoryModule.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/di/SharedPreferencesModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/SharedPreferencesModule.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/di/SharedPreferencesModule.kt rename to core/src/main/java/dev/jdtech/jellyfin/di/SharedPreferencesModule.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt rename to core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt index 332f0e45..37fecf2c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/AddServerAddressDialog.kt @@ -5,7 +5,7 @@ import android.os.Bundle import android.widget.EditText import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.viewmodels.ServerAddressesViewModel import java.lang.IllegalStateException diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt rename to core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt index a008d846..a3bd1477 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerAddressDialog.kt @@ -4,7 +4,7 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.models.ServerAddress import dev.jdtech.jellyfin.viewmodels.ServerAddressesViewModel import java.lang.IllegalStateException diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerDialogFragment.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerDialogFragment.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerDialogFragment.kt rename to core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerDialogFragment.kt index 0b93daa2..f8220060 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerDialogFragment.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteServerDialogFragment.kt @@ -4,7 +4,7 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.models.Server import dev.jdtech.jellyfin.viewmodels.ServerSelectViewModel import java.lang.IllegalStateException diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteUserDialogFragment.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteUserDialogFragment.kt similarity index 96% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteUserDialogFragment.kt rename to core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteUserDialogFragment.kt index 906c9f4d..e2e5e27f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteUserDialogFragment.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/DeleteUserDialogFragment.kt @@ -4,7 +4,7 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.models.User import dev.jdtech.jellyfin.viewmodels.UsersViewModel import java.lang.IllegalStateException diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt rename to core/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt index b0097ecd..3e93f2af 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/ErrorDialogFragment.kt @@ -5,7 +5,7 @@ import android.content.Intent import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.utils.serializable import java.io.Serializable import java.lang.IllegalStateException diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt similarity index 80% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt rename to core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt index 18b888ca..7c531251 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt @@ -3,35 +3,40 @@ package dev.jdtech.jellyfin.dialogs import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment -import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R -import dev.jdtech.jellyfin.utils.SortBy +import dagger.hilt.android.AndroidEntryPoint +import dev.jdtech.jellyfin.AppPreferences +import dev.jdtech.jellyfin.core.R +import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.viewmodels.LibraryViewModel import java.lang.IllegalStateException import java.util.UUID import org.jellyfin.sdk.model.api.SortOrder +import javax.inject.Inject +@AndroidEntryPoint class SortDialogFragment( private val parentId: UUID, private val libraryType: String?, private val viewModel: LibraryViewModel, private val sortType: String ) : DialogFragment() { + @Inject + lateinit var appPreferences: AppPreferences + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { - val sp = PreferenceManager.getDefaultSharedPreferences(it.applicationContext) val builder = MaterialAlertDialogBuilder(it) // Current sort by - val currentSortByString = sp.getString("sortBy", SortBy.defaultValue.name)!! + val currentSortByString = appPreferences.sortBy val currentSortBy = SortBy.fromString(currentSortByString) // Current sort order - val currentSortOrderString = sp.getString("sortOrder", SortOrder.ASCENDING.name)!! + val currentSortOrderString = appPreferences.sortOrder val currentSortOrder = try { SortOrder.valueOf(currentSortOrderString) - } catch (e: java.lang.IllegalArgumentException) { + } catch (e: IllegalArgumentException) { SortOrder.ASCENDING } @@ -44,11 +49,12 @@ class SortDialogFragment( .setSingleChoiceItems( sortByOptions, currentSortBy.ordinal ) { dialog, which -> - sp.edit().putString("sortBy", sortByValues[which].name).apply() + val sortBy = sortByValues[which] + appPreferences.sortBy = sortBy.name viewModel.loadItems( parentId, libraryType, - sortBy = sortByValues[which], + sortBy = sortBy, sortOrder = currentSortOrder ) dialog.dismiss() @@ -63,14 +69,14 @@ class SortDialogFragment( .setSingleChoiceItems( sortByOptions, currentSortOrder.ordinal ) { dialog, which -> - sp.edit().putString("sortOrder", sortOrderValues[which].name).apply() - val sortOrder = try { sortOrderValues[which] } catch (e: IllegalArgumentException) { SortOrder.ASCENDING } + appPreferences.sortOrder = sortOrder.name + viewModel.loadItems( parentId, libraryType, diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt b/core/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/CollectionType.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt b/core/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/DiscoveredServer.kt diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/DownloadEpisodeItem.kt b/core/src/main/java/dev/jdtech/jellyfin/models/DownloadEpisodeItem.kt new file mode 100644 index 00000000..1d74d8db --- /dev/null +++ b/core/src/main/java/dev/jdtech/jellyfin/models/DownloadEpisodeItem.kt @@ -0,0 +1,15 @@ +package dev.jdtech.jellyfin.models + +import java.util.UUID + +sealed class DownloadEpisodeItem { + abstract val id: UUID + + object Header : DownloadEpisodeItem() { + override val id: UUID = UUID.randomUUID() + } + + data class Episode(val episode: PlayerItem) : DownloadEpisodeItem() { + override val id = episode.itemId + } +} diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt b/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/DownloadSection.kt diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt b/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt new file mode 100644 index 00000000..d7398652 --- /dev/null +++ b/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt @@ -0,0 +1,16 @@ +package dev.jdtech.jellyfin.models + +import org.jellyfin.sdk.model.api.BaseItemDto +import java.util.UUID + +sealed class EpisodeItem { + abstract val id: UUID + + object Header : EpisodeItem() { + override val id: UUID = UUID.randomUUID() + } + + data class Episode(val episode: BaseItemDto) : EpisodeItem() { + override val id = episode.id + } +} \ No newline at end of file diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt new file mode 100644 index 00000000..7c65a9d5 --- /dev/null +++ b/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt @@ -0,0 +1,9 @@ +package dev.jdtech.jellyfin.models + +data class ExceptionUiText( + val uiText: UiText +): Exception() + +data class ExceptionUiTexts( + val uiTexts: Collection +): Exception() diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt b/core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt similarity index 88% rename from app/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt index b2d4aca1..0adb8979 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/FavoriteSection.kt @@ -4,6 +4,6 @@ import org.jellyfin.sdk.model.api.BaseItemDto data class FavoriteSection( val id: Int, - val name: String, + val name: UiText, var items: List ) diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt b/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt new file mode 100644 index 00000000..7e5a99d2 --- /dev/null +++ b/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt @@ -0,0 +1,19 @@ +package dev.jdtech.jellyfin.models + +import java.util.UUID + +sealed class HomeItem { + data class Libraries(val section: HomeSection) : HomeItem() { + override val id = section.id + } + + data class Section(val homeSection: HomeSection) : HomeItem() { + override val id = homeSection.id + } + + data class ViewItem(val view: View) : HomeItem() { + override val id = view.id + } + + abstract val id: UUID +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt b/core/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/HomeSection.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/Server.kt b/core/src/main/java/dev/jdtech/jellyfin/models/Server.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/Server.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/Server.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/ServerAddress.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddresses.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/ServerWithAddressesAndUsers.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/ServerWithUsers.kt diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt b/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt new file mode 100644 index 00000000..51af2286 --- /dev/null +++ b/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt @@ -0,0 +1,19 @@ +package dev.jdtech.jellyfin.models + +import android.content.res.Resources +import androidx.annotation.StringRes + +sealed class UiText { + data class DynamicString(val value: String): UiText() + class StringResource( + @StringRes val resId: Int, + vararg val args: Any? + ): UiText() + + fun asString(resources: Resources): String { + return when(this) { + is DynamicString -> return value + is StringResource -> resources.getString(resId, args) + } + } +} diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/User.kt b/core/src/main/java/dev/jdtech/jellyfin/models/User.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/User.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/User.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/View.kt b/core/src/main/java/dev/jdtech/jellyfin/models/View.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/View.kt rename to core/src/main/java/dev/jdtech/jellyfin/models/View.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/extensions.kt b/core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt similarity index 75% rename from app/src/main/java/dev/jdtech/jellyfin/utils/extensions.kt rename to core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt index 6176f5db..40894b37 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/extensions.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/utils/CoreExtensions.kt @@ -8,13 +8,9 @@ import android.util.TypedValue import android.widget.ImageButton import androidx.annotation.AttrRes import androidx.annotation.ColorRes -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import dev.jdtech.jellyfin.AppNavigationDirections import dev.jdtech.jellyfin.models.View import java.io.Serializable import org.jellyfin.sdk.model.api.BaseItemDto -import timber.log.Timber fun BaseItemDto.toView(): View { return View( @@ -24,15 +20,6 @@ fun BaseItemDto.toView(): View { ) } -fun Fragment.checkIfLoginRequired(error: String?) { - if (error != null) { - if (error.contains("401")) { - Timber.d("Login required!") - findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true)) - } - } -} - fun Resources.dip(px: Int) = (px * displayMetrics.density).toInt() fun ImageButton.setTintColor(@ColorRes colorId: Int, theme: Resources.Theme) { diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt similarity index 81% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt index 628642b4..d45b8c09 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt @@ -1,18 +1,18 @@ package dev.jdtech.jellyfin.viewmodels -import android.content.res.Resources -import android.widget.Toast import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.BaseApplication -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.DiscoveredServer +import dev.jdtech.jellyfin.models.ExceptionUiText +import dev.jdtech.jellyfin.models.ExceptionUiTexts import dev.jdtech.jellyfin.models.Server import dev.jdtech.jellyfin.models.ServerAddress -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.models.UiText +import dev.jdtech.jellyfin.AppPreferences import java.util.UUID import javax.inject.Inject import kotlinx.coroutines.CancellationException @@ -32,13 +32,10 @@ import timber.log.Timber class AddServerViewModel @Inject constructor( - private val application: BaseApplication, private val appPreferences: AppPreferences, private val jellyfinApi: JellyfinApi, private val database: ServerDatabaseDao ) : ViewModel() { - private val resources: Resources = application.resources - private val _uiState = MutableStateFlow(UiState.Normal) val uiState = _uiState.asStateFlow() private val _navigateToLogin = MutableSharedFlow() @@ -52,7 +49,7 @@ constructor( sealed class UiState { object Normal : UiState() object Loading : UiState() - data class Error(val message: String) : UiState() + data class Error(val message: Collection) : UiState() } sealed class DiscoveredServersState { @@ -93,7 +90,7 @@ constructor( try { // Check if input value is not empty if (inputValue.isBlank()) { - throw Exception(resources.getString(R.string.add_server_error_empty_address)) + throw ExceptionUiText(UiText.StringResource(R.string.add_server_error_empty_address)) } val candidates = jellyfinApi.jellyfin.discovery.getAddressCandidates(inputValue) @@ -123,27 +120,35 @@ constructor( } when { goodServers.isNotEmpty() -> { - val issuesString = createIssuesString(goodServers.first()) - Toast.makeText( - application, - issuesString, - Toast.LENGTH_LONG - ).show() +// val issuesString = createIssuesString(goodServers.first()) +// Toast.makeText( +// application, +// issuesString, +// Toast.LENGTH_LONG +// ).show() connectToServer(goodServers.first()) } okServers.isNotEmpty() -> { val okServer = okServers.first() - throw Exception(createIssuesString(okServer)) + throw ExceptionUiTexts(createIssuesString(okServer)) } else -> { - throw Exception(resources.getString(R.string.add_server_error_not_found)) + throw ExceptionUiText(UiText.StringResource(R.string.add_server_error_not_found)) } } } catch (_: CancellationException) { + } catch (e: ExceptionUiText) { + _uiState.emit( + UiState.Error(listOf(e.uiText)) + ) + } catch (e: ExceptionUiTexts) { + _uiState.emit( + UiState.Error(e.uiTexts) + ) } catch (e: Exception) { _uiState.emit( UiState.Error( - e.message ?: resources.getString(R.string.unknown_error) + listOf(if (e.message != null) UiText.DynamicString(e.message!!) else UiText.StringResource(R.string.unknown_error)) ) ) } @@ -152,7 +157,7 @@ constructor( private suspend fun connectToServer(recommendedServerInfo: RecommendedServerInfo) { val serverInfo = recommendedServerInfo.systemInfo.getOrNull() - ?: throw Exception(resources.getString(R.string.add_server_error_no_id)) + ?: throw ExceptionUiText(UiText.StringResource(R.string.add_server_error_no_id)) Timber.d("Connecting to server: ${serverInfo.serverName}") @@ -210,35 +215,23 @@ constructor( * @param server The server with issues * @return A presentable string of issues separated with \n */ - private fun createIssuesString(server: RecommendedServerInfo): String { - return server.issues.joinToString("\n") { + private fun createIssuesString(server: RecommendedServerInfo): Collection { + return server.issues.map { when (it) { is RecommendedServerIssue.OutdatedServerVersion -> { - String.format( - resources.getString(R.string.add_server_error_outdated), - it.version - ) + UiText.StringResource(R.string.add_server_error_outdated, it.version) } is RecommendedServerIssue.InvalidProductName -> { - String.format( - resources.getString(R.string.add_server_error_not_jellyfin), - it.productName - ) + UiText.StringResource(R.string.add_server_error_not_jellyfin, it.productName) } is RecommendedServerIssue.UnsupportedServerVersion -> { - String.format( - resources.getString(R.string.add_server_error_version), - it.version - ) + UiText.StringResource(R.string.add_server_error_version, it.version) } is RecommendedServerIssue.SlowResponse -> { - String.format( - resources.getString(R.string.add_server_error_slow), - it.responseTime - ) + UiText.StringResource(R.string.add_server_error_slow, it.responseTime) } else -> { - resources.getString(R.string.unknown_error) + UiText.StringResource(R.string.unknown_error) } } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadSeriesViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadSeriesViewModel.kt similarity index 96% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadSeriesViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadSeriesViewModel.kt index ccca57e5..76831574 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadSeriesViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadSeriesViewModel.kt @@ -3,7 +3,7 @@ package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.adapters.DownloadEpisodeItem +import dev.jdtech.jellyfin.models.DownloadEpisodeItem import dev.jdtech.jellyfin.models.DownloadSeriesMetadata import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadViewModel.kt similarity index 92% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadViewModel.kt index cf31acce..4f5fd613 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/DownloadViewModel.kt @@ -50,7 +50,13 @@ constructor( items.filter { it.item?.type == BaseItemKind.EPISODE }.forEach { showsMap.computeIfAbsent(it.item!!.seriesId!!) { mutableListOf() } += it } - val shows = showsMap.map { DownloadSeriesMetadata(it.key, it.value[0].item!!.seriesName, it.value) } + val shows = showsMap.map { + DownloadSeriesMetadata( + it.key, + it.value[0].item!!.seriesName, + it.value + ) + } val downloadSections = mutableListOf() withContext(Dispatchers.Default) { diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt similarity index 85% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt index ec1c539d..0b57174a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/FavoriteViewModel.kt @@ -1,14 +1,13 @@ package dev.jdtech.jellyfin.viewmodels -import android.content.res.Resources import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.BaseApplication -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.Constants +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.models.FavoriteSection +import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository -import dev.jdtech.jellyfin.utils.Constants import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -21,11 +20,8 @@ import org.jellyfin.sdk.model.api.BaseItemKind class FavoriteViewModel @Inject constructor( - application: BaseApplication, private val jellyfinRepository: JellyfinRepository ) : ViewModel() { - private val resources: Resources = application.resources - private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -55,7 +51,7 @@ constructor( withContext(Dispatchers.Default) { FavoriteSection( Constants.FAVORITE_TYPE_MOVIES, - resources.getString(R.string.movies_label), + UiText.StringResource(R.string.movies_label), items.filter { it.type == BaseItemKind.MOVIE } ).let { if (it.items.isNotEmpty()) favoriteSections.add( @@ -64,7 +60,7 @@ constructor( } FavoriteSection( Constants.FAVORITE_TYPE_SHOWS, - resources.getString(R.string.shows_label), + UiText.StringResource(R.string.shows_label), items.filter { it.type == BaseItemKind.SERIES } ).let { if (it.items.isNotEmpty()) favoriteSections.add( @@ -73,7 +69,7 @@ constructor( } FavoriteSection( Constants.FAVORITE_TYPE_EPISODES, - resources.getString(R.string.episodes_label), + UiText.StringResource(R.string.episodes_label), items.filter { it.type == BaseItemKind.EPISODE } ).let { if (it.items.isNotEmpty()) favoriteSections.add( diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt similarity index 92% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt index 0f22c7b2..6882cc04 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/HomeViewModel.kt @@ -4,12 +4,10 @@ import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.R -import dev.jdtech.jellyfin.adapters.HomeItem -import dev.jdtech.jellyfin.adapters.HomeItem.Section -import dev.jdtech.jellyfin.adapters.HomeItem.ViewItem +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.database.DownloadDatabaseDao import dev.jdtech.jellyfin.models.CollectionType +import dev.jdtech.jellyfin.models.HomeItem import dev.jdtech.jellyfin.models.HomeSection import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.utils.syncPlaybackProgress @@ -81,7 +79,7 @@ class HomeViewModel @Inject internal constructor( ) } - private suspend fun loadDynamicItems(): List
{ + private suspend fun loadDynamicItems(): List { val resumeItems = repository.getResumeItems() val nextUpItems = repository.getNextUp() @@ -106,7 +104,7 @@ class HomeViewModel @Inject internal constructor( ) } - return items.map { Section(it) } + return items.map { HomeItem.Section(it) } } private suspend fun loadViews() = repository @@ -115,5 +113,5 @@ class HomeViewModel @Inject internal constructor( .map { view -> view to repository.getLatestMedia(view.id) } .filter { (_, latest) -> latest.isNotEmpty() } .map { (view, latest) -> view.toView().apply { items = latest } } - .map { ViewItem(it) } + .map { HomeItem.ViewItem(it) } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt index f42beac7..3cb3938a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.repository.JellyfinRepository -import dev.jdtech.jellyfin.utils.SortBy +import dev.jdtech.jellyfin.models.SortBy import java.util.UUID import javax.inject.Inject import kotlinx.coroutines.flow.Flow @@ -47,7 +47,6 @@ constructor( viewModelScope.launch { _uiState.emit(UiState.Loading) try { - val items = jellyfinRepository.getItemsPaging( parentId = parentId, includeTypes = if (itemType != null) listOf(itemType) else null, diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt similarity index 90% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt index 7e2e87c5..2820312e 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt @@ -1,15 +1,14 @@ package dev.jdtech.jellyfin.viewmodels -import android.content.res.Resources import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.BaseApplication -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao +import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.models.User -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import javax.inject.Inject import kotlin.Exception import kotlinx.coroutines.Dispatchers @@ -25,13 +24,10 @@ import org.jellyfin.sdk.model.api.AuthenticateUserByName class LoginViewModel @Inject constructor( - application: BaseApplication, private val appPreferences: AppPreferences, private val jellyfinApi: JellyfinApi, private val database: ServerDatabaseDao ) : ViewModel() { - private val resources: Resources = application.resources - private val _uiState = MutableStateFlow(UiState.Normal) val uiState = _uiState.asStateFlow() private val _usersState = MutableStateFlow(UsersState.Loading) @@ -42,7 +38,7 @@ constructor( sealed class UiState { object Normal : UiState() object Loading : UiState() - data class Error(val message: String) : UiState() + data class Error(val message: UiText) : UiState() } sealed class UsersState { @@ -116,7 +112,7 @@ constructor( _navigateToMain.emit(true) } catch (e: Exception) { val message = - if (e.message?.contains("401") == true) resources.getString(R.string.login_error_wrong_username_password) else resources.getString( + 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)) diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MainViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MainViewModel.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/MainViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/MainViewModel.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaViewModel.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt index 9b70979e..847e4c71 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/PersonDetailViewModel.kt @@ -13,7 +13,7 @@ import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind @HiltViewModel -internal class PersonDetailViewModel @Inject internal constructor( +class PersonDetailViewModel @Inject internal constructor( private val jellyfinRepository: JellyfinRepository ) : ViewModel() { diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt similarity index 85% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt index 6e236ecc..a61c2bd4 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SearchResultViewModel.kt @@ -1,14 +1,13 @@ package dev.jdtech.jellyfin.viewmodels -import android.content.res.Resources import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.BaseApplication -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.Constants +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.models.FavoriteSection +import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.repository.JellyfinRepository -import dev.jdtech.jellyfin.utils.Constants import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -21,11 +20,8 @@ import org.jellyfin.sdk.model.api.BaseItemKind class SearchResultViewModel @Inject constructor( - application: BaseApplication, private val jellyfinRepository: JellyfinRepository ) : ViewModel() { - private val resources: Resources = application.resources - private val _uiState = MutableStateFlow(UiState.Loading) val uiState = _uiState.asStateFlow() @@ -51,7 +47,7 @@ constructor( withContext(Dispatchers.Default) { FavoriteSection( Constants.FAVORITE_TYPE_MOVIES, - resources.getString(R.string.movies_label), + UiText.StringResource(R.string.movies_label), items.filter { it.type == BaseItemKind.MOVIE } ).let { if (it.items.isNotEmpty()) sections.add( @@ -60,7 +56,7 @@ constructor( } FavoriteSection( Constants.FAVORITE_TYPE_SHOWS, - resources.getString(R.string.shows_label), + UiText.StringResource(R.string.shows_label), items.filter { it.type == BaseItemKind.SERIES } ).let { if (it.items.isNotEmpty()) sections.add( @@ -69,7 +65,7 @@ constructor( } FavoriteSection( Constants.FAVORITE_TYPE_EPISODES, - resources.getString(R.string.episodes_label), + UiText.StringResource(R.string.episodes_label), items.filter { it.type == BaseItemKind.EPISODE } ).let { if (it.items.isNotEmpty()) sections.add( diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt index c222ddfd..e5037838 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SeasonViewModel.kt @@ -3,7 +3,7 @@ package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.adapters.EpisodeItem +import dev.jdtech.jellyfin.models.EpisodeItem import dev.jdtech.jellyfin.repository.JellyfinRepository import java.util.UUID import javax.inject.Inject diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerAddressesViewModel.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt index b5268148..ce049a9b 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt @@ -6,7 +6,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.Server -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt similarity index 94% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt index 06c94657..a68c0c0c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/SettingsDeviceViewModel.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.launch import timber.log.Timber @HiltViewModel -internal class SettingsDeviceViewModel +class SettingsDeviceViewModel @Inject internal constructor( private val jellyfinRepository: JellyfinRepository, ) : ViewModel() { diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt rename to core/src/main/java/dev/jdtech/jellyfin/viewmodels/UsersViewModel.kt diff --git a/app/src/main/res/drawable-night/ic_banner.xml b/core/src/main/res/drawable-night/ic_banner.xml similarity index 100% rename from app/src/main/res/drawable-night/ic_banner.xml rename to core/src/main/res/drawable-night/ic_banner.xml diff --git a/app/src/main/res/drawable/button_accent_background.xml b/core/src/main/res/drawable/button_accent_background.xml similarity index 100% rename from app/src/main/res/drawable/button_accent_background.xml rename to core/src/main/res/drawable/button_accent_background.xml diff --git a/app/src/main/res/drawable/button_setup_background.xml b/core/src/main/res/drawable/button_setup_background.xml similarity index 100% rename from app/src/main/res/drawable/button_setup_background.xml rename to core/src/main/res/drawable/button_setup_background.xml diff --git a/app/src/main/res/drawable/circle_background.xml b/core/src/main/res/drawable/circle_background.xml similarity index 100% rename from app/src/main/res/drawable/circle_background.xml rename to core/src/main/res/drawable/circle_background.xml diff --git a/app/src/main/res/drawable/focus_border.xml b/core/src/main/res/drawable/focus_border.xml similarity index 100% rename from app/src/main/res/drawable/focus_border.xml rename to core/src/main/res/drawable/focus_border.xml diff --git a/app/src/main/res/drawable/header_gradient.xml b/core/src/main/res/drawable/header_gradient.xml similarity index 100% rename from app/src/main/res/drawable/header_gradient.xml rename to core/src/main/res/drawable/header_gradient.xml diff --git a/app/src/main/res/drawable/ic_alert_circle.xml b/core/src/main/res/drawable/ic_alert_circle.xml similarity index 100% rename from app/src/main/res/drawable/ic_alert_circle.xml rename to core/src/main/res/drawable/ic_alert_circle.xml diff --git a/app/src/main/res/drawable/ic_arrow_left.xml b/core/src/main/res/drawable/ic_arrow_left.xml similarity index 100% rename from app/src/main/res/drawable/ic_arrow_left.xml rename to core/src/main/res/drawable/ic_arrow_left.xml diff --git a/app/src/main/res/drawable/ic_banner.xml b/core/src/main/res/drawable/ic_banner.xml similarity index 100% rename from app/src/main/res/drawable/ic_banner.xml rename to core/src/main/res/drawable/ic_banner.xml diff --git a/app/src/main/res/drawable/ic_banner_foreground.xml b/core/src/main/res/drawable/ic_banner_foreground.xml similarity index 100% rename from app/src/main/res/drawable/ic_banner_foreground.xml rename to core/src/main/res/drawable/ic_banner_foreground.xml diff --git a/app/src/main/res/drawable/ic_check.xml b/core/src/main/res/drawable/ic_check.xml similarity index 100% rename from app/src/main/res/drawable/ic_check.xml rename to core/src/main/res/drawable/ic_check.xml diff --git a/app/src/main/res/drawable/ic_closed_caption.xml b/core/src/main/res/drawable/ic_closed_caption.xml similarity index 100% rename from app/src/main/res/drawable/ic_closed_caption.xml rename to core/src/main/res/drawable/ic_closed_caption.xml diff --git a/app/src/main/res/drawable/ic_download.xml b/core/src/main/res/drawable/ic_download.xml similarity index 100% rename from app/src/main/res/drawable/ic_download.xml rename to core/src/main/res/drawable/ic_download.xml diff --git a/app/src/main/res/drawable/ic_fast_forward.xml b/core/src/main/res/drawable/ic_fast_forward.xml similarity index 100% rename from app/src/main/res/drawable/ic_fast_forward.xml rename to core/src/main/res/drawable/ic_fast_forward.xml diff --git a/app/src/main/res/drawable/ic_film.xml b/core/src/main/res/drawable/ic_film.xml similarity index 100% rename from app/src/main/res/drawable/ic_film.xml rename to core/src/main/res/drawable/ic_film.xml diff --git a/app/src/main/res/drawable/ic_gauge.xml b/core/src/main/res/drawable/ic_gauge.xml similarity index 100% rename from app/src/main/res/drawable/ic_gauge.xml rename to core/src/main/res/drawable/ic_gauge.xml diff --git a/app/src/main/res/drawable/ic_globe.xml b/core/src/main/res/drawable/ic_globe.xml similarity index 100% rename from app/src/main/res/drawable/ic_globe.xml rename to core/src/main/res/drawable/ic_globe.xml diff --git a/app/src/main/res/drawable/ic_heart.xml b/core/src/main/res/drawable/ic_heart.xml similarity index 100% rename from app/src/main/res/drawable/ic_heart.xml rename to core/src/main/res/drawable/ic_heart.xml diff --git a/app/src/main/res/drawable/ic_heart_filled.xml b/core/src/main/res/drawable/ic_heart_filled.xml similarity index 100% rename from app/src/main/res/drawable/ic_heart_filled.xml rename to core/src/main/res/drawable/ic_heart_filled.xml diff --git a/app/src/main/res/drawable/ic_home.xml b/core/src/main/res/drawable/ic_home.xml similarity index 100% rename from app/src/main/res/drawable/ic_home.xml rename to core/src/main/res/drawable/ic_home.xml diff --git a/app/src/main/res/drawable/ic_languages.xml b/core/src/main/res/drawable/ic_languages.xml similarity index 100% rename from app/src/main/res/drawable/ic_languages.xml rename to core/src/main/res/drawable/ic_languages.xml diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/core/src/main/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from app/src/main/res/drawable/ic_launcher_foreground.xml rename to core/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/app/src/main/res/drawable/ic_library.xml b/core/src/main/res/drawable/ic_library.xml similarity index 100% rename from app/src/main/res/drawable/ic_library.xml rename to core/src/main/res/drawable/ic_library.xml diff --git a/app/src/main/res/drawable/ic_lock.xml b/core/src/main/res/drawable/ic_lock.xml similarity index 100% rename from app/src/main/res/drawable/ic_lock.xml rename to core/src/main/res/drawable/ic_lock.xml diff --git a/app/src/main/res/drawable/ic_minus_fat.xml b/core/src/main/res/drawable/ic_minus_fat.xml similarity index 100% rename from app/src/main/res/drawable/ic_minus_fat.xml rename to core/src/main/res/drawable/ic_minus_fat.xml diff --git a/app/src/main/res/drawable/ic_network.xml b/core/src/main/res/drawable/ic_network.xml similarity index 100% rename from app/src/main/res/drawable/ic_network.xml rename to core/src/main/res/drawable/ic_network.xml diff --git a/app/src/main/res/drawable/ic_palette.xml b/core/src/main/res/drawable/ic_palette.xml similarity index 100% rename from app/src/main/res/drawable/ic_palette.xml rename to core/src/main/res/drawable/ic_palette.xml diff --git a/app/src/main/res/drawable/ic_pause.xml b/core/src/main/res/drawable/ic_pause.xml similarity index 100% rename from app/src/main/res/drawable/ic_pause.xml rename to core/src/main/res/drawable/ic_pause.xml diff --git a/app/src/main/res/drawable/ic_play.xml b/core/src/main/res/drawable/ic_play.xml similarity index 100% rename from app/src/main/res/drawable/ic_play.xml rename to core/src/main/res/drawable/ic_play.xml diff --git a/app/src/main/res/drawable/ic_plus.xml b/core/src/main/res/drawable/ic_plus.xml similarity index 100% rename from app/src/main/res/drawable/ic_plus.xml rename to core/src/main/res/drawable/ic_plus.xml diff --git a/app/src/main/res/drawable/ic_rewind.xml b/core/src/main/res/drawable/ic_rewind.xml similarity index 100% rename from app/src/main/res/drawable/ic_rewind.xml rename to core/src/main/res/drawable/ic_rewind.xml diff --git a/app/src/main/res/drawable/ic_rotate_ccw.xml b/core/src/main/res/drawable/ic_rotate_ccw.xml similarity index 100% rename from app/src/main/res/drawable/ic_rotate_ccw.xml rename to core/src/main/res/drawable/ic_rotate_ccw.xml diff --git a/app/src/main/res/drawable/ic_search.xml b/core/src/main/res/drawable/ic_search.xml similarity index 100% rename from app/src/main/res/drawable/ic_search.xml rename to core/src/main/res/drawable/ic_search.xml diff --git a/app/src/main/res/drawable/ic_server.xml b/core/src/main/res/drawable/ic_server.xml similarity index 100% rename from app/src/main/res/drawable/ic_server.xml rename to core/src/main/res/drawable/ic_server.xml diff --git a/app/src/main/res/drawable/ic_settings.xml b/core/src/main/res/drawable/ic_settings.xml similarity index 100% rename from app/src/main/res/drawable/ic_settings.xml rename to core/src/main/res/drawable/ic_settings.xml diff --git a/app/src/main/res/drawable/ic_skip_back.xml b/core/src/main/res/drawable/ic_skip_back.xml similarity index 100% rename from app/src/main/res/drawable/ic_skip_back.xml rename to core/src/main/res/drawable/ic_skip_back.xml diff --git a/app/src/main/res/drawable/ic_skip_forward.xml b/core/src/main/res/drawable/ic_skip_forward.xml similarity index 100% rename from app/src/main/res/drawable/ic_skip_forward.xml rename to core/src/main/res/drawable/ic_skip_forward.xml diff --git a/app/src/main/res/drawable/ic_smartphone.xml b/core/src/main/res/drawable/ic_smartphone.xml similarity index 100% rename from app/src/main/res/drawable/ic_smartphone.xml rename to core/src/main/res/drawable/ic_smartphone.xml diff --git a/app/src/main/res/drawable/ic_speaker.xml b/core/src/main/res/drawable/ic_speaker.xml similarity index 100% rename from app/src/main/res/drawable/ic_speaker.xml rename to core/src/main/res/drawable/ic_speaker.xml diff --git a/app/src/main/res/drawable/ic_star.xml b/core/src/main/res/drawable/ic_star.xml similarity index 100% rename from app/src/main/res/drawable/ic_star.xml rename to core/src/main/res/drawable/ic_star.xml diff --git a/app/src/main/res/drawable/ic_sun.xml b/core/src/main/res/drawable/ic_sun.xml similarity index 100% rename from app/src/main/res/drawable/ic_sun.xml rename to core/src/main/res/drawable/ic_sun.xml diff --git a/app/src/main/res/drawable/ic_trash.xml b/core/src/main/res/drawable/ic_trash.xml similarity index 100% rename from app/src/main/res/drawable/ic_trash.xml rename to core/src/main/res/drawable/ic_trash.xml diff --git a/app/src/main/res/drawable/ic_user.xml b/core/src/main/res/drawable/ic_user.xml similarity index 100% rename from app/src/main/res/drawable/ic_user.xml rename to core/src/main/res/drawable/ic_user.xml diff --git a/app/src/main/res/drawable/ic_user_color_on_primary.xml b/core/src/main/res/drawable/ic_user_color_on_primary.xml similarity index 100% rename from app/src/main/res/drawable/ic_user_color_on_primary.xml rename to core/src/main/res/drawable/ic_user_color_on_primary.xml diff --git a/app/src/main/res/drawable/ic_volume.xml b/core/src/main/res/drawable/ic_volume.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume.xml rename to core/src/main/res/drawable/ic_volume.xml diff --git a/app/src/main/res/drawable/overlay_background.xml b/core/src/main/res/drawable/overlay_background.xml similarity index 100% rename from app/src/main/res/drawable/overlay_background.xml rename to core/src/main/res/drawable/overlay_background.xml diff --git a/app/src/main/res/drawable/person_placeholder.xml b/core/src/main/res/drawable/person_placeholder.xml similarity index 100% rename from app/src/main/res/drawable/person_placeholder.xml rename to core/src/main/res/drawable/person_placeholder.xml diff --git a/app/src/main/res/drawable/progress_scale_drawable.xml b/core/src/main/res/drawable/progress_scale_drawable.xml similarity index 100% rename from app/src/main/res/drawable/progress_scale_drawable.xml rename to core/src/main/res/drawable/progress_scale_drawable.xml diff --git a/app/src/main/res/drawable/ripple_background.xml b/core/src/main/res/drawable/ripple_background.xml similarity index 100% rename from app/src/main/res/drawable/ripple_background.xml rename to core/src/main/res/drawable/ripple_background.xml diff --git a/app/src/main/res/drawable/transparent_circle_background.xml b/core/src/main/res/drawable/transparent_circle_background.xml similarity index 100% rename from app/src/main/res/drawable/transparent_circle_background.xml rename to core/src/main/res/drawable/transparent_circle_background.xml diff --git a/app/src/main/res/drawable/user_placeholder.xml b/core/src/main/res/drawable/user_placeholder.xml similarity index 100% rename from app/src/main/res/drawable/user_placeholder.xml rename to core/src/main/res/drawable/user_placeholder.xml diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/core/src/main/res/menu/bottom_nav_menu.xml similarity index 100% rename from app/src/main/res/menu/bottom_nav_menu.xml rename to core/src/main/res/menu/bottom_nav_menu.xml diff --git a/app/src/main/res/menu/home_menu.xml b/core/src/main/res/menu/home_menu.xml similarity index 100% rename from app/src/main/res/menu/home_menu.xml rename to core/src/main/res/menu/home_menu.xml diff --git a/app/src/main/res/menu/library_menu.xml b/core/src/main/res/menu/library_menu.xml similarity index 100% rename from app/src/main/res/menu/library_menu.xml rename to core/src/main/res/menu/library_menu.xml diff --git a/app/src/main/res/menu/media_menu.xml b/core/src/main/res/menu/media_menu.xml similarity index 100% rename from app/src/main/res/menu/media_menu.xml rename to core/src/main/res/menu/media_menu.xml diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/core/src/main/res/mipmap-anydpi/ic_launcher.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi/ic_launcher.xml rename to core/src/main/res/mipmap-anydpi/ic_launcher.xml diff --git a/app/src/main/res/values-b+es+419/strings.xml b/core/src/main/res/values-b+es+419/strings.xml similarity index 96% rename from app/src/main/res/values-b+es+419/strings.xml rename to core/src/main/res/values-b+es+419/strings.xml index 2991ca5c..dd27c2c3 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/core/src/main/res/values-b+es+419/strings.xml @@ -75,10 +75,6 @@ Información de aplicación Error desconocido Buscar películas, series, episodios… - Selecciona una versión - Selecciona la pista de audio - Selecciona la pista de subtitulo - Seleccionar la velocidad de reproducción Reproductor MPV Usar el reproductor experimental MPV para reproducir contenidos. MPV soporta más códecs de vídeo, audio y subtítulos. Descarga @@ -131,7 +127,6 @@ Usar colores dinámicos de Material You (sólo disponible en Android 12+) Subtítulos Personalizar apariencia de subtítulos - Externo Episodios Seguir al sistema Claro @@ -152,4 +147,4 @@ Tiempo de espera del socket (ms) Usuarios Agregar usuario - \ No newline at end of file + diff --git a/app/src/main/res/values-bg/strings.xml b/core/src/main/res/values-bg/strings.xml similarity index 95% rename from app/src/main/res/values-bg/strings.xml rename to core/src/main/res/values-bg/strings.xml index 180325d1..f63e8e3c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/core/src/main/res/values-bg/strings.xml @@ -60,9 +60,6 @@ Ред на сортиране Свалете с мобилна дата Възходящ - Изберете аудиопът - Изберете писта за субтитри - Изберете скорост на възпроизвеждане mpv плейър Изтрийте Свалете @@ -81,7 +78,6 @@ Информация за приложението Непозната грешка Търсене на филми, предавания, епизоди… - Изберете версия Изберете сървър Добавете сървър Версията на сървъра е остаряла: %1$s. Моля ъпдейтнете сървъра @@ -99,4 +95,4 @@ [%1$s] %2$s (%3$s) Празен адрес на сървъра %1$d мин - \ No newline at end of file + diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/core/src/main/res/values-cs-rCZ/strings.xml similarity index 97% rename from app/src/main/res/values-cs-rCZ/strings.xml rename to core/src/main/res/values-cs-rCZ/strings.xml index 2d94b6df..31fce5cd 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/core/src/main/res/values-cs-rCZ/strings.xml @@ -67,10 +67,8 @@ Zásady ochrany osobních údajů Informace o aplikaci Neočekávaná chyba - Vyberte zvukovou stopu - Vyberte titulky mpv přehrávač Použít experimentální mpv přehrávač k přehrávání videí. mpv má podporu pro více video a audio kodeků a formátů titulků. %1$s plakát %1$s pozadí - \ No newline at end of file + diff --git a/app/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml similarity index 96% rename from app/src/main/res/values-de/strings.xml rename to core/src/main/res/values-de/strings.xml index fa0dca05..45a3c52b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/core/src/main/res/values-de/strings.xml @@ -55,10 +55,6 @@ App Info Unbekannter Fehler Suche Filme, Serien, Episoden… - Wähle eine Version - Wähle eine Audiospur - Wähle eine Untertitelspur - Wähle Wiedergabegeschwindigkeit MPV Mediaplayer Über mobile Daten herunterladen Über Roaming herunterladen @@ -122,7 +118,6 @@ Suchen Untertitel Untertitel anpassen - Extern Light Dark Episoden @@ -132,4 +127,4 @@ Zoom-Gesten Ziehen um den Bildschirm zu füllen Bibliotheken - \ No newline at end of file + diff --git a/app/src/main/res/values-es-rMX/strings.xml b/core/src/main/res/values-es-rMX/strings.xml similarity index 96% rename from app/src/main/res/values-es-rMX/strings.xml rename to core/src/main/res/values-es-rMX/strings.xml index d3ec8ab9..3d01fca9 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/core/src/main/res/values-es-rMX/strings.xml @@ -75,10 +75,6 @@ Información de aplicación Error desconocido Buscar películas, series, episodios… - Selecciona una versión - Selecciona la pista de audio - Selecciona la pista de subtitulo - Seleccionar la velocidad de reproducción Reproductor MPV Usar el reproductor experimental MPV para reproducir contenidos. MPV soporta más códecs de vídeo, audio y subtítulos. Descarga @@ -131,9 +127,8 @@ Usar colores dinámicos de Material You (sólo disponible en Android 12+) Subtítulos Personalizar apariencia de subtítulos - Externo Seguir al sistema Claro Oscuro Episodios - \ No newline at end of file + diff --git a/app/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml similarity index 95% rename from app/src/main/res/values-es/strings.xml rename to core/src/main/res/values-es/strings.xml index 3ebd7932..b16e3256 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/core/src/main/res/values-es/strings.xml @@ -75,10 +75,6 @@ Información de la aplicación Error desconocido Buscar películas, series, episodios… - Selecciona una versión - Selecciona la pista de audio - Selecciona la pista de subtítulo - Selecciona la velocidad de reproducción Reproductor MPV Usar el reproductor experimental MPV parar reproducir contenidos. MPV soporta mas códecs de vídeo, audio y subtítulos. Descarga @@ -95,7 +91,7 @@ Poster de %1$s Fondo de %1$s Título - Calificación IMDB + Calificación IMDb Clasificación de edad Fecha de adición Fecha de reproducción @@ -131,7 +127,6 @@ Bibliotecas Colores dinámicos Usar colores dinámicos de Material You (solo en Android 12+) - Externo Seguir tema del dispositivo Claro Oscuro @@ -148,4 +143,4 @@ Salida de audio Quitar usuario ¿Quiere quitar el usuario %1$s\? - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml similarity index 96% rename from app/src/main/res/values-fr/strings.xml rename to core/src/main/res/values-fr/strings.xml index 35402a21..bec39855 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/core/src/main/res/values-fr/strings.xml @@ -75,9 +75,6 @@ Infos sur l\'application Erreur inconnue %1$d. %2$s - Choix de la piste audio - Choix de la piste des sous-titres - Vitesse de lecture Lecteur MPV Télécharger via données mobiles Télécharger @@ -85,7 +82,6 @@ Films Derniers %1$s Rechercher… - Choisissez une version Bannière Jellyfin Version du serveur non supportée : %1$s. Veuillez mettre à jour le serveur Authentification @@ -129,7 +125,6 @@ Réseau Sous-titres Customiser l\'apparence des sous-titres - Externe Clair Sombre Épisodes @@ -141,4 +136,4 @@ Voulez-vous vraiment supprimer l\'utilisateur %1$s Utilisateurs Décodages matériels supportés - \ No newline at end of file + diff --git a/app/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml similarity index 96% rename from app/src/main/res/values-hu/strings.xml rename to core/src/main/res/values-hu/strings.xml index 38724bd6..d23dc7e7 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/core/src/main/res/values-hu/strings.xml @@ -68,10 +68,6 @@ Bővített cím megjelenítése Egy egyedi, natív Jellyfin alkalmazás Szerver törlése - Verzió kiválasztása - Hangsáv kiválasztása - Felirat kiválasztása - Lejátszási sebesség kiválasztása mpv lejátszó Letöltés roaming közben Letöltés @@ -119,4 +115,4 @@ %1$s poszter Húzd az újjad fel és le a képernyő jobb oldán, hogy változtasd a hangerőt, és a bal oldalán, hogy változtasd a fényerőt [%1$s] %2$s (%3$s) - \ No newline at end of file + diff --git a/app/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml similarity index 96% rename from app/src/main/res/values-it/strings.xml rename to core/src/main/res/values-it/strings.xml index 26bca711..4d0d2941 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/core/src/main/res/values-it/strings.xml @@ -69,7 +69,6 @@ Dimensione della cache (MB) Guarda il trailer L\'app userà questa quantità di MB per salvare le immagini del tuo server Jellyfin. Valori alti potrebbero aiutarti in caso di connessione lenta. - Seleziona traccia audio Usa il player MPV sperimentale per riprodurre i video. MPV supporta più video, audio e sottotitoli. Salta avanti di (ms) Dettagli @@ -82,9 +81,6 @@ Info App Errore sconosciuto Cerca film, serie, episodi… - Seleziona una versione - Seleziona sottotilo - Seleziona velocità di riproduzione mpv player Scarica usando i dati cellulare Scarica in roaming @@ -128,7 +124,6 @@ Sottotitoli Personalizza lo stile dei sottotitoli Librerie - Esterno Colori dinamici Usa i colori dinamici Material You (disponibile solo per Android 12+) Rimuovi utente @@ -151,4 +146,4 @@ Aggiungi indirizzo Aggiungi indirizzo server Aggiungi - \ No newline at end of file + diff --git a/app/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml similarity index 96% rename from app/src/main/res/values-ko/strings.xml rename to core/src/main/res/values-ko/strings.xml index ca7dc6e7..94d93594 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/core/src/main/res/values-ko/strings.xml @@ -14,10 +14,6 @@ 앱 정보 알 수 없는 오류 영화, 시리즈, 에피소드 검색… - 버전 선택 - 오디오 트랙 선택 - 자막 트랙 선택 - 재생 속도 선택 모바일 데이터를 사용하여 다운로드 mpv 플레이어 로밍 중에도 다운로드 @@ -130,7 +126,6 @@ 라이브러리 자막 자막 스타일 커스텀 - 외부 기기 테마와 동기화 라이트 모드 다크 모드 @@ -151,4 +146,4 @@ 주소 주소 추가 추가 - \ No newline at end of file + diff --git a/app/src/main/res/values-night/themes.xml b/core/src/main/res/values-night/themes.xml similarity index 100% rename from app/src/main/res/values-night/themes.xml rename to core/src/main/res/values-night/themes.xml diff --git a/app/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml similarity index 95% rename from app/src/main/res/values-nl/strings.xml rename to core/src/main/res/values-nl/strings.xml index 8a01e201..808e79ef 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/core/src/main/res/values-nl/strings.xml @@ -17,8 +17,8 @@ Server verwijderen Verwijderen Server adres - Inlogen - Inlogen + Inloggen + Inloggen Favorieten Server heeft geen id, er lijkt iets miss te zijn met de server Gewenste ondertiteling taal @@ -26,8 +26,6 @@ Servers Speler Weet je zeker dat je de server wilt verwijderen %1$s - Selecteer ondertiteling - Selecteer afspeelsnelheid mpv speler Download met mobiele data Download met roaming @@ -40,7 +38,6 @@ pas het uiterlijk van ondertiteling aan Zoeken Terugzoek stappen (ms) - Extern Volg systeem Licht Donker @@ -141,8 +138,6 @@ App info Onbekende fout Zoek films, series, afleveringen… - Kies een versie - Selecteer audiotrack Gebruik de experimentele mpv speler om videos af te spelen. mpv heeft ondersteuning voor meer video, audio en ondertiteling codecs. Download Verwijderen @@ -151,4 +146,4 @@ Server adres toevoegen Adressen toevoegen Toevoegen - \ No newline at end of file + diff --git a/app/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml similarity index 96% rename from app/src/main/res/values-pl/strings.xml rename to core/src/main/res/values-pl/strings.xml index e8dbdcf7..32d01327 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/core/src/main/res/values-pl/strings.xml @@ -4,7 +4,6 @@ Przechowuj obrazy w pamięci podręcznej by przyspieszyć ładowanie. Zadziała po ponownym uruchomieniu aplikacji. Aplikacja zużyje tyle pamięci urządzenia by przechowywać obrazy z serwera Jellyfin. Większe wartości mogą być korzystne w wolnych sieciach. Zobacz szczegóły - Wybierz wersję Pobieraj używając danych komórkowych Używaj eksperymentalnego odtwarzacza MPV do odtwarzania wideo. MPV wspiera więcej kodeków wideo, audio i napisów. Przesuń w górę lub w dół po prawej stronie ekrany by zmienić głośność, po lewej stronie by zmienić jasność @@ -77,9 +76,6 @@ Informacje o aplikacji Nieznany błąd Szukaj filmów, seriali, odcinków… - Wybierz ścieżkę audio - Wybierz ścieżkę napisów - Wybierz prędkość odtwarzania Odtwarzacz MPV Pobieraj w roamingu Pobierz @@ -133,7 +129,6 @@ Dostosuj wygląd napisów Napisy Przesuwanie - Zewnętrzny Zgodnie z systemem Jasny Ciemny @@ -151,4 +146,4 @@ Dodaj adres Dodaj adres serwera Dodaj - \ No newline at end of file + diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..33b37e62 --- /dev/null +++ b/core/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,8 @@ + + + Selecione uma versão + Selecione uma faixa de áudio + Selecione uma legenda + Selecione a velocidade de reprodução + Externo + diff --git a/app/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml similarity index 96% rename from app/src/main/res/values-pt/strings.xml rename to core/src/main/res/values-pt/strings.xml index ea9fb318..3771684c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/core/src/main/res/values-pt/strings.xml @@ -54,10 +54,6 @@ Info da Aplicação Erro Desconhecido Procurar filmes, séries, episódios… - Selecionar a versão - Seleccione a faixa de áudio - Seleccione as legendas - Seleccionar velocidade de reprodução Sobre mpv player Transferir com dados móveis @@ -123,7 +119,6 @@ Pausa Servidores Transferências - Externo Mostrar título de episódio alargado incluindo temporada e informação de episódio (SXX:EXX - EpisodeName). Indicador de episódio visto Continuar a ver @@ -135,4 +130,4 @@ A App irá utilizar esta quantidade de MB do seu espaço em disco para armazenar imagens do servidor Jellyfin. Valores maiores podem ser benéficos em redes mais lentas. Preferir idioma audio Cache de imagens em memória para acelerar o tempo de carregamento. Terá efeito após o reinício da aplicação. - \ No newline at end of file + diff --git a/app/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml similarity index 96% rename from app/src/main/res/values-ru/strings.xml rename to core/src/main/res/values-ru/strings.xml index 3926d3be..d733df67 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/core/src/main/res/values-ru/strings.xml @@ -73,11 +73,7 @@ Устройство Кэшировать изображения Кэшировать изображения на диск ускорит время загрузки. Требуется перезапуск приложения. - Выбрать субтитры - Выбрать скорость воспроизведения Проигрыватель mpv - Выбрать версию - Выбрать аудиодорожку Скачивать через мобильный интернет Скачивать в роуминге Использовать экспериментальный проигрыватель mpv. Он имеет большую поддержку форматов аудио, видео и субтитров. @@ -118,4 +114,4 @@ %1$d минут Перемотка Быстрая перемотка - \ No newline at end of file + diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/core/src/main/res/values-sw600dp/dimens.xml similarity index 100% rename from app/src/main/res/values-sw600dp/dimens.xml rename to core/src/main/res/values-sw600dp/dimens.xml diff --git a/app/src/main/res/values-sw720dp/dimens.xml b/core/src/main/res/values-sw720dp/dimens.xml similarity index 100% rename from app/src/main/res/values-sw720dp/dimens.xml rename to core/src/main/res/values-sw720dp/dimens.xml diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/core/src/main/res/values-zh-rCN/strings.xml similarity index 96% rename from app/src/main/res/values-zh-rCN/strings.xml rename to core/src/main/res/values-zh-rCN/strings.xml index 9912c70d..94eb8980 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/core/src/main/res/values-zh-rCN/strings.xml @@ -59,10 +59,6 @@ 应用详情 您的订阅已到期, 请登录官网续费 搜索电影、节目、集名… - 选择版本 - 选择音轨 - 选择字幕轨 - 选择播放速度 mpv播放器 使用移动数据下载 漫游时下载 @@ -130,7 +126,6 @@ 动态色彩 使用 Material You 动态颜色(仅适用于 Android 12+) - 加载 跟随系统 浅色 深色 @@ -151,4 +146,4 @@ 添加地址 添加服务器地址 添加 - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml similarity index 96% rename from app/src/main/res/values-zh-rTW/strings.xml rename to core/src/main/res/values-zh-rTW/strings.xml index 5716cc46..6ebd7983 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -62,9 +62,6 @@ 應用程式資訊 未知錯誤 搜尋電影、節目、影集… - 選擇版本 - 選擇音軌 - 選擇播放速度 漫遊時下載 mpv 播放器 下載 @@ -108,7 +105,6 @@ 動態色彩 字幕 自訂字幕外觀 - 外部的 跟隨系統 明亮 黑暗 @@ -134,7 +130,6 @@ 應用程式將使用此大小的磁碟空間儲存來自 Jellyfin 伺服器的圖片。 較大的值可能對較慢的網路有益。 查看詳情 查看詳情 - 選擇字幕軌道 使用行動網路下載 使用實驗性 mpv 播放器播放影片。 mpv 支援更多的影片、音訊和字幕編解碼器。 排序方式 @@ -143,4 +138,4 @@ 顯示擴展影集標題,包括季和影集資訊 (第XX季:第XX集 - 影集名稱)。 尋回向前增量(毫秒) 使用 Material You Dynamic 顏色(僅適用於 Android 12+) - \ No newline at end of file + diff --git a/core/src/main/res/values/about_libraries.xml b/core/src/main/res/values/about_libraries.xml new file mode 100644 index 00000000..3b0a7d8e --- /dev/null +++ b/core/src/main/res/values/about_libraries.xml @@ -0,0 +1,8 @@ + + + true + true + @string/app_name + @string/app_description + true + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to core/src/main/res/values/colors.xml diff --git a/app/src/main/res/values/dimens.xml b/core/src/main/res/values/dimens.xml similarity index 100% rename from app/src/main/res/values/dimens.xml rename to core/src/main/res/values/dimens.xml diff --git a/app/src/main/res/values/drawables.xml b/core/src/main/res/values/drawables.xml similarity index 100% rename from app/src/main/res/values/drawables.xml rename to core/src/main/res/values/drawables.xml diff --git a/app/src/main/res/values/ic_banner_background.xml b/core/src/main/res/values/ic_banner_background.xml similarity index 100% rename from app/src/main/res/values/ic_banner_background.xml rename to core/src/main/res/values/ic_banner_background.xml diff --git a/app/src/main/res/values/ic_launcher_background.xml b/core/src/main/res/values/ic_launcher_background.xml similarity index 100% rename from app/src/main/res/values/ic_launcher_background.xml rename to core/src/main/res/values/ic_launcher_background.xml diff --git a/app/src/main/res/values/languages.xml b/core/src/main/res/values/languages.xml similarity index 100% rename from app/src/main/res/values/languages.xml rename to core/src/main/res/values/languages.xml diff --git a/app/src/main/res/values/shape.xml b/core/src/main/res/values/shape.xml similarity index 100% rename from app/src/main/res/values/shape.xml rename to core/src/main/res/values/shape.xml diff --git a/app/src/main/res/values/string_arrays.xml b/core/src/main/res/values/string_arrays.xml similarity index 100% rename from app/src/main/res/values/string_arrays.xml rename to core/src/main/res/values/string_arrays.xml diff --git a/app/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml similarity index 96% rename from app/src/main/res/values/strings.xml rename to core/src/main/res/values/strings.xml index eff68e6d..7bfff49e 100644 --- a/app/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -78,10 +78,6 @@ App info Unknown error Search movies, shows, episodes… - "Select a version" - Select audio track - Select subtitle track - Select playback speed mpv player Download using mobile data Download when roaming @@ -133,7 +129,6 @@ Use Material You Dynamic colors (only available on Android 12+) Subtitles Customize subtitles appearance - External Follow system Light Dark diff --git a/app/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to core/src/main/res/values/styles.xml diff --git a/app/src/main/res/values/themes.xml b/core/src/main/res/values/themes.xml similarity index 100% rename from app/src/main/res/values/themes.xml rename to core/src/main/res/values/themes.xml diff --git a/app/src/main/res/xml/fragment_settings.xml b/core/src/main/res/xml/fragment_settings.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings.xml rename to core/src/main/res/xml/fragment_settings.xml diff --git a/app/src/main/res/xml/fragment_settings_appearance.xml b/core/src/main/res/xml/fragment_settings_appearance.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_appearance.xml rename to core/src/main/res/xml/fragment_settings_appearance.xml diff --git a/app/src/main/res/xml/fragment_settings_cache.xml b/core/src/main/res/xml/fragment_settings_cache.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_cache.xml rename to core/src/main/res/xml/fragment_settings_cache.xml diff --git a/app/src/main/res/xml/fragment_settings_device.xml b/core/src/main/res/xml/fragment_settings_device.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_device.xml rename to core/src/main/res/xml/fragment_settings_device.xml diff --git a/app/src/main/res/xml/fragment_settings_downloads.xml b/core/src/main/res/xml/fragment_settings_downloads.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_downloads.xml rename to core/src/main/res/xml/fragment_settings_downloads.xml diff --git a/app/src/main/res/xml/fragment_settings_language.xml b/core/src/main/res/xml/fragment_settings_language.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_language.xml rename to core/src/main/res/xml/fragment_settings_language.xml diff --git a/app/src/main/res/xml/fragment_settings_network.xml b/core/src/main/res/xml/fragment_settings_network.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_network.xml rename to core/src/main/res/xml/fragment_settings_network.xml diff --git a/app/src/main/res/xml/fragment_settings_player.xml b/core/src/main/res/xml/fragment_settings_player.xml similarity index 100% rename from app/src/main/res/xml/fragment_settings_player.xml rename to core/src/main/res/xml/fragment_settings_player.xml diff --git a/app/src/main/res/xml/network_security_config.xml b/core/src/main/res/xml/network_security_config.xml similarity index 100% rename from app/src/main/res/xml/network_security_config.xml rename to core/src/main/res/xml/network_security_config.xml diff --git a/app/src/staging/res/drawable/ic_banner_foreground.xml b/core/src/staging/res/drawable/ic_banner_foreground.xml similarity index 100% rename from app/src/staging/res/drawable/ic_banner_foreground.xml rename to core/src/staging/res/drawable/ic_banner_foreground.xml diff --git a/app/src/staging/res/drawable/ic_launcher_foreground.xml b/core/src/staging/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from app/src/staging/res/drawable/ic_launcher_foreground.xml rename to core/src/staging/res/drawable/ic_launcher_foreground.xml diff --git a/app/src/staging/res/values/strings.xml b/core/src/staging/res/values/strings.xml similarity index 100% rename from app/src/staging/res/values/strings.xml rename to core/src/staging/res/values/strings.xml diff --git a/data/build.gradle.kts b/data/build.gradle.kts new file mode 100644 index 00000000..65caab8e --- /dev/null +++ b/data/build.gradle.kts @@ -0,0 +1,49 @@ +@Suppress("DSL_SCOPE_VIOLATION") // False positive +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.ktlint) +} + +android { + namespace = "dev.jdtech.jellyfin.data" + compileSdk = 33 + buildToolsVersion = "33.0.1" + + defaultConfig { + minSdk = 27 + targetSdk = 33 + + val appVersionCode: Int by rootProject.extra + val appVersionName: String by rootProject.extra + buildConfigField("int", "VERSION_CODE", appVersionCode.toString()) + buildConfigField("String", "VERSION_NAME", "\"$appVersionName\"") + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + create("staging") { + initWith(getByName("release")) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +ktlint { + android.set(true) + ignoreFailures.set(false) + disabledRules.add("max-line-length") +} + +dependencies { + implementation(project(":preferences")) + implementation(libs.androidx.paging) + implementation(libs.jellyfin.core) + implementation(libs.timber) +} diff --git a/data/lint.xml b/data/lint.xml new file mode 100644 index 00000000..bf11943b --- /dev/null +++ b/data/lint.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt b/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt rename to data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt index 5b792ae9..10c38d57 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt @@ -1,8 +1,8 @@ package dev.jdtech.jellyfin.api import android.content.Context -import dev.jdtech.jellyfin.BuildConfig -import dev.jdtech.jellyfin.utils.Constants +import dev.jdtech.jellyfin.data.BuildConfig +import dev.jdtech.jellyfin.Constants import java.util.UUID import org.jellyfin.sdk.api.client.HttpClientOptions import org.jellyfin.sdk.api.client.extensions.devicesApi diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/SortBy.kt b/data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt similarity index 93% rename from app/src/main/java/dev/jdtech/jellyfin/utils/SortBy.kt rename to data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt index 48c4e4b4..5f84ce0f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/SortBy.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/models/SortBy.kt @@ -1,4 +1,4 @@ -package dev.jdtech.jellyfin.utils +package dev.jdtech.jellyfin.models enum class SortBy(val SortString: String) { NAME("SortName"), diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt similarity index 97% rename from app/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt rename to data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt index a0ec0cfa..b38ba255 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/ItemsPagingSource.kt @@ -3,7 +3,7 @@ package dev.jdtech.jellyfin.repository import androidx.paging.PagingSource import androidx.paging.PagingState import dev.jdtech.jellyfin.api.JellyfinApi -import dev.jdtech.jellyfin.utils.SortBy +import dev.jdtech.jellyfin.models.SortBy import java.util.UUID import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemKind diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt rename to data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt index 38e6f2f3..d481a214 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt @@ -1,7 +1,7 @@ package dev.jdtech.jellyfin.repository import androidx.paging.PagingData -import dev.jdtech.jellyfin.utils.SortBy +import dev.jdtech.jellyfin.models.SortBy import java.util.UUID import kotlinx.coroutines.flow.Flow import org.jellyfin.sdk.model.api.BaseItemDto diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt rename to data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt index cc6cc137..9f19e661 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -4,7 +4,7 @@ import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import dev.jdtech.jellyfin.api.JellyfinApi -import dev.jdtech.jellyfin.utils.SortBy +import dev.jdtech.jellyfin.models.SortBy import java.util.UUID import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e59cb0e9..e34a60cd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,6 +34,7 @@ androidx-core = { module = "androidx.core:core-ktx", version.ref = "androidx-cor androidx-leanback = { module = "androidx.leanback:leanback", version.ref = "androidx-leanback" } androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } +androidx-media3-common = { module = "androidx.media3:media3-common", version.ref = "androidx-media3" } androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "androidx-media3" } androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "androidx-media3" } androidx-media3-session = { module = "androidx.media3:media3-session", version.ref = "androidx-media3" } @@ -59,6 +60,7 @@ timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } [plugins] aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutlibraries" } android-application = { id = "com.android.application", version.ref = "android-plugin" } +android-library = { id = "com.android.library", version.ref = "android-plugin" } androidx-navigation-safeargs = { id = "androidx.navigation.safeargs.kotlin", version.ref = "androidx-navigation" } hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } diff --git a/player/core/build.gradle.kts b/player/core/build.gradle.kts new file mode 100644 index 00000000..f647da17 --- /dev/null +++ b/player/core/build.gradle.kts @@ -0,0 +1,51 @@ +@Suppress("DSL_SCOPE_VIOLATION") // False positive +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.ktlint) +} + +android { + namespace = "dev.jdtech.jellyfin.player.core" + compileSdk = 33 + buildToolsVersion = "33.0.1" + + defaultConfig { + minSdk = 27 + targetSdk = 33 + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + create("staging") { + initWith(getByName("release")) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +ktlint { + android.set(true) + ignoreFailures.set(false) + disabledRules.add("max-line-length") +} + +dependencies { + implementation(project(":data")) + implementation(project(":preferences")) + implementation(libs.androidx.core) + implementation(libs.androidx.preference) + implementation(libs.androidx.room.runtime) + kapt(libs.androidx.room.compiler) + implementation(libs.androidx.room.ktx) + implementation(libs.jellyfin.core) + implementation(libs.timber) +} diff --git a/player/core/lint.xml b/player/core/lint.xml new file mode 100644 index 00000000..bf11943b --- /dev/null +++ b/player/core/lint.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/Converters.kt b/player/core/src/main/java/dev/jdtech/jellyfin/database/Converters.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/database/Converters.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/database/Converters.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabase.kt b/player/core/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabase.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabase.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabase.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabaseDao.kt b/player/core/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabaseDao.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabaseDao.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/database/DownloadDatabaseDao.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/DownloadItem.kt b/player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadItem.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/DownloadItem.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadItem.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt b/player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/models/DownloadSeriesMetadata.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/ExternalSubtitle.kt b/player/core/src/main/java/dev/jdtech/jellyfin/models/ExternalSubtitle.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/ExternalSubtitle.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/models/ExternalSubtitle.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt b/player/core/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt b/player/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt similarity index 96% rename from app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt rename to player/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt index b6bde7de..eef41cd5 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt +++ b/player/core/src/main/java/dev/jdtech/jellyfin/utils/DownloadUtilities.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.os.Environment import androidx.core.content.getSystemService import androidx.preference.PreferenceManager +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.database.DownloadDatabaseDao import dev.jdtech.jellyfin.models.DownloadItem import dev.jdtech.jellyfin.models.DownloadSeriesMetadata @@ -58,13 +59,11 @@ suspend fun requestDownload( } private fun downloadFile(request: DownloadManager.Request, context: Context): Long { - val preferences = PreferenceManager.getDefaultSharedPreferences(context) - val downloadOverData = preferences.getBoolean("download_mobile_data", false) - val downloadWhenRoaming = preferences.getBoolean("download_roaming", false) + val preferences = AppPreferences(PreferenceManager.getDefaultSharedPreferences(context)) request.apply { - setAllowedOverMetered(downloadOverData) - setAllowedOverRoaming(downloadWhenRoaming) + setAllowedOverMetered(preferences.downloadOverMobileData) + setAllowedOverRoaming(preferences.downloadWhenRoaming) } return context.getSystemService()!!.enqueue(request) } diff --git a/player/video/build.gradle.kts b/player/video/build.gradle.kts new file mode 100644 index 00000000..458d4698 --- /dev/null +++ b/player/video/build.gradle.kts @@ -0,0 +1,56 @@ +@Suppress("DSL_SCOPE_VIOLATION") // False positive +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.hilt) + alias(libs.plugins.ktlint) +} + +android { + namespace = "dev.jdtech.jellyfin.player.video" + compileSdk = 33 + buildToolsVersion = "33.0.1" + + defaultConfig { + minSdk = 27 + targetSdk = 33 + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + create("staging") { + initWith(getByName("release")) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +ktlint { + android.set(true) + ignoreFailures.set(false) + disabledRules.add("max-line-length") +} + +dependencies { + implementation(project(":player:core")) + implementation(project(":data")) + implementation(project(":preferences")) + implementation(libs.androidx.core) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.viewmodel) + implementation(libs.androidx.media3.exoplayer) + implementation(libs.hilt.android) + kapt(libs.hilt.compiler) + implementation(libs.jellyfin.core) + implementation(libs.libmpv) + implementation(libs.material) + implementation(libs.timber) +} diff --git a/player/video/lint.xml b/player/video/lint.xml new file mode 100644 index 00000000..bf11943b --- /dev/null +++ b/player/video/lint.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/assets/mpv.conf b/player/video/src/main/assets/mpv.conf similarity index 100% rename from app/src/main/assets/mpv.conf rename to player/video/src/main/assets/mpv.conf diff --git a/app/src/main/assets/subfont.ttf b/player/video/src/main/assets/subfont.ttf similarity index 100% rename from app/src/main/assets/subfont.ttf rename to player/video/src/main/assets/subfont.ttf diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt similarity index 96% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt index bbd4a110..acde876a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/SpeedSelectionDialogFragment.kt @@ -4,7 +4,7 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import java.lang.IllegalStateException diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt similarity index 98% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt index 52220018..bde2c38c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt @@ -4,7 +4,7 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.mpv.MPVPlayer import dev.jdtech.jellyfin.mpv.TrackType import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel diff --git a/app/src/main/java/dev/jdtech/jellyfin/dialogs/VideoVersionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/VideoVersionDialogFragment.kt similarity index 95% rename from app/src/main/java/dev/jdtech/jellyfin/dialogs/VideoVersionDialogFragment.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/dialogs/VideoVersionDialogFragment.kt index 9189865d..2d83560f 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/dialogs/VideoVersionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/VideoVersionDialogFragment.kt @@ -4,7 +4,7 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.viewmodels.PlayerViewModel import java.lang.IllegalStateException import org.jellyfin.sdk.model.api.BaseItemDto diff --git a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index 11eaefe5..76dcfbf2 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -35,7 +35,7 @@ import androidx.media3.common.util.ListenerSet import androidx.media3.common.util.Size import androidx.media3.common.util.Util import androidx.media3.exoplayer.ExoPlaybackException -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.mpv.MPVLib import java.io.File import java.io.FileOutputStream diff --git a/app/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt similarity index 100% rename from app/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index 761845e1..940416b0 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -21,7 +21,7 @@ import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.mpv.MPVPlayer import dev.jdtech.jellyfin.mpv.TrackType import dev.jdtech.jellyfin.repository.JellyfinRepository -import dev.jdtech.jellyfin.utils.AppPreferences +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.utils.postDownloadPlaybackProgress import java.util.UUID import javax.inject.Inject diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt similarity index 99% rename from app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt rename to player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt index 5e5bcc29..aaa48a00 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.media3.common.MimeTypes import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.database.DownloadDatabaseDao import dev.jdtech.jellyfin.models.ExternalSubtitle import dev.jdtech.jellyfin.models.PlayerItem diff --git a/player/video/src/main/res/values-b+es+419/strings.xml b/player/video/src/main/res/values-b+es+419/strings.xml new file mode 100644 index 00000000..b8425b4a --- /dev/null +++ b/player/video/src/main/res/values-b+es+419/strings.xml @@ -0,0 +1,8 @@ + + + Selecciona una versión + Selecciona la pista de audio + Selecciona la pista de subtitulo + Seleccionar la velocidad de reproducción + Externo + diff --git a/player/video/src/main/res/values-bg/strings.xml b/player/video/src/main/res/values-bg/strings.xml new file mode 100644 index 00000000..29e53c10 --- /dev/null +++ b/player/video/src/main/res/values-bg/strings.xml @@ -0,0 +1,7 @@ + + + Изберете аудиопът + Изберете писта за субтитри + Изберете скорост на възпроизвеждане + Изберете версия + diff --git a/player/video/src/main/res/values-cs-rCZ/strings.xml b/player/video/src/main/res/values-cs-rCZ/strings.xml new file mode 100644 index 00000000..e2052972 --- /dev/null +++ b/player/video/src/main/res/values-cs-rCZ/strings.xml @@ -0,0 +1,4 @@ + + Vyberte zvukovou stopu + Vyberte titulky + diff --git a/player/video/src/main/res/values-de/strings.xml b/player/video/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..f29832ff --- /dev/null +++ b/player/video/src/main/res/values-de/strings.xml @@ -0,0 +1,8 @@ + + + Wähle eine Version + Wähle eine Audiospur + Wähle eine Untertitelspur + Wähle Wiedergabegeschwindigkeit + Extern + diff --git a/player/video/src/main/res/values-es-rMX/strings.xml b/player/video/src/main/res/values-es-rMX/strings.xml new file mode 100644 index 00000000..b8425b4a --- /dev/null +++ b/player/video/src/main/res/values-es-rMX/strings.xml @@ -0,0 +1,8 @@ + + + Selecciona una versión + Selecciona la pista de audio + Selecciona la pista de subtitulo + Seleccionar la velocidad de reproducción + Externo + diff --git a/player/video/src/main/res/values-es/strings.xml b/player/video/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..0288d8c1 --- /dev/null +++ b/player/video/src/main/res/values-es/strings.xml @@ -0,0 +1,8 @@ + + + Selecciona una versión + Selecciona la pista de audio + Selecciona la pista de subtítulo + Selecciona la velocidad de reproducción + Externo + diff --git a/player/video/src/main/res/values-fr/strings.xml b/player/video/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000..f866fdd3 --- /dev/null +++ b/player/video/src/main/res/values-fr/strings.xml @@ -0,0 +1,8 @@ + + + Choisissez une version + Choix de la piste audio + Choix de la piste des sous-titres + Vitesse de lecture + Externe + diff --git a/player/video/src/main/res/values-hu/strings.xml b/player/video/src/main/res/values-hu/strings.xml new file mode 100644 index 00000000..de36c9ff --- /dev/null +++ b/player/video/src/main/res/values-hu/strings.xml @@ -0,0 +1,7 @@ + + + Verzió kiválasztása + Hangsáv kiválasztása + Felirat kiválasztása + Lejátszási sebesség kiválasztása + diff --git a/player/video/src/main/res/values-it/strings.xml b/player/video/src/main/res/values-it/strings.xml new file mode 100644 index 00000000..a8e7f039 --- /dev/null +++ b/player/video/src/main/res/values-it/strings.xml @@ -0,0 +1,8 @@ + + + Seleziona una versione + Seleziona traccia audio + Seleziona sottotilo + Seleziona velocità di riproduzione + Esterno + diff --git a/player/video/src/main/res/values-ko/strings.xml b/player/video/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000..c8bd5175 --- /dev/null +++ b/player/video/src/main/res/values-ko/strings.xml @@ -0,0 +1,8 @@ + + + 버전 선택 + 오디오 트랙 선택 + 자막 트랙 선택 + 재생 속도 선택 + 외부 + diff --git a/player/video/src/main/res/values-nl/strings.xml b/player/video/src/main/res/values-nl/strings.xml new file mode 100644 index 00000000..ea77d864 --- /dev/null +++ b/player/video/src/main/res/values-nl/strings.xml @@ -0,0 +1,8 @@ + + + Kies een versie + Selecteer audiotrack + Selecteer ondertiteling + Selecteer afspeelsnelheid + Extern + diff --git a/player/video/src/main/res/values-pl/strings.xml b/player/video/src/main/res/values-pl/strings.xml new file mode 100644 index 00000000..ffaa66da --- /dev/null +++ b/player/video/src/main/res/values-pl/strings.xml @@ -0,0 +1,8 @@ + + + Wybierz wersję + Wybierz ścieżkę audio + Wybierz ścieżkę napisów + Wybierz prędkość odtwarzania + Zewnętrzny + diff --git a/player/video/src/main/res/values-pt-rBR/strings.xml b/player/video/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..33b37e62 --- /dev/null +++ b/player/video/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,8 @@ + + + Selecione uma versão + Selecione uma faixa de áudio + Selecione uma legenda + Selecione a velocidade de reprodução + Externo + diff --git a/player/video/src/main/res/values-pt/strings.xml b/player/video/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000..02ac7055 --- /dev/null +++ b/player/video/src/main/res/values-pt/strings.xml @@ -0,0 +1,8 @@ + + + Selecionar a versão + Seleccione a faixa de áudio + Seleccione as legendas + Seleccionar velocidade de reprodução + Externo + diff --git a/player/video/src/main/res/values-ru/strings.xml b/player/video/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..d4c6e8d4 --- /dev/null +++ b/player/video/src/main/res/values-ru/strings.xml @@ -0,0 +1,7 @@ + + + Выбрать субтитры + Выбрать скорость воспроизведения + Выбрать версию + Выбрать аудиодорожку + diff --git a/player/video/src/main/res/values-zh-rCN/strings.xml b/player/video/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 00000000..5cf1e851 --- /dev/null +++ b/player/video/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,8 @@ + + + 选择版本 + 选择音轨 + 选择字幕轨 + 选择播放速度 + 加载 + diff --git a/player/video/src/main/res/values-zh-rTW/strings.xml b/player/video/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 00000000..0d3d3e89 --- /dev/null +++ b/player/video/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,8 @@ + + + 選擇版本 + 選擇音軌 + 選擇字幕軌道 + 選擇播放速度 + 外部的 + diff --git a/player/video/src/main/res/values/strings.xml b/player/video/src/main/res/values/strings.xml new file mode 100644 index 00000000..9103e965 --- /dev/null +++ b/player/video/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + Select audio track + Select subtitle track + Select playback speed + "Select a version" + External + diff --git a/preferences/build.gradle.kts b/preferences/build.gradle.kts new file mode 100644 index 00000000..c58b1fe0 --- /dev/null +++ b/preferences/build.gradle.kts @@ -0,0 +1,43 @@ +@Suppress("DSL_SCOPE_VIOLATION") // False positive +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.ktlint) +} + +android { + namespace = "dev.jdtech.jellyfin.preferences" + compileSdk = 33 + buildToolsVersion = "33.0.1" + + defaultConfig { + minSdk = 27 + targetSdk = 33 + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + create("staging") { + initWith(getByName("release")) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +ktlint { + android.set(true) + ignoreFailures.set(false) + disabledRules.add("max-line-length") +} + +dependencies { + implementation(libs.androidx.core) + implementation(libs.androidx.media3.common) + implementation(libs.hilt.android) +} diff --git a/preferences/lint.xml b/preferences/lint.xml new file mode 100644 index 00000000..bf11943b --- /dev/null +++ b/preferences/lint.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt b/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt similarity index 75% rename from app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt rename to preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt index 3a707d9c..0a9ea951 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/AppPreferences.kt +++ b/preferences/src/main/java/dev/jdtech/jellyfin/AppPreferences.kt @@ -1,4 +1,4 @@ -package dev.jdtech.jellyfin.utils +package dev.jdtech.jellyfin import android.content.SharedPreferences import android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE @@ -82,4 +82,46 @@ constructor( Constants.PREF_NETWORK_SOCKET_TIMEOUT, Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT.toString() )!!.toLongOrNull() ?: Constants.NETWORK_DEFAULT_SOCKET_TIMEOUT + + // Cache + val imageCache get() = sharedPreferences.getBoolean( + Constants.PREF_IMAGE_CACHE, + true + ) + val imageCacheSize get() = sharedPreferences.getString( + Constants.PREF_IMAGE_CACHE_SIZE, + Constants.DEFAULT_CACHE_SIZE.toString() + )!!.toIntOrNull() ?: Constants.DEFAULT_CACHE_SIZE + + // Downloads + val downloadOverMobileData get() = sharedPreferences.getBoolean( + Constants.PREF_DOWNLOADS_MOBILE_DATA, + false + ) + val downloadWhenRoaming get() = sharedPreferences.getBoolean( + Constants.PREF_DOWNLOADS_ROAMING, + false + ) + + // Sorting + var sortBy: String + get() = sharedPreferences.getString( + Constants.PREF_SORT_BY, + Constants.DEFAULT_SORT_BY + )!! + set(value) { + sharedPreferences.edit { + putString(Constants.PREF_SORT_BY, value) + } + } + var sortOrder + get() = sharedPreferences.getString( + Constants.PREF_SORT_ORDER, + Constants.DEFAULT_SORT_ORDER + )!! + set(value) { + sharedPreferences.edit { + putString(Constants.PREF_SORT_ORDER, value) + } + } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt b/preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt similarity index 83% rename from app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt rename to preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt index ed5d4332..31504287 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/utils/Constants.kt +++ b/preferences/src/main/java/dev/jdtech/jellyfin/Constants.kt @@ -1,4 +1,4 @@ -package dev.jdtech.jellyfin.utils +package dev.jdtech.jellyfin object Constants { // player @@ -32,6 +32,10 @@ object Constants { const val PREF_NETWORK_REQUEST_TIMEOUT = "pref_network_request_timeout" const val PREF_NETWORK_CONNECT_TIMEOUT = "pref_network_connect_timeout" const val PREF_NETWORK_SOCKET_TIMEOUT = "pref_network_socket_timeout" + const val PREF_DOWNLOADS_MOBILE_DATA = "pref_downloads_mobile_data" + const val PREF_DOWNLOADS_ROAMING = "pref_downloads_roaming" + const val PREF_SORT_BY = "pref_sort_by" + const val PREF_SORT_ORDER = "pref_sort_order" // caching const val DEFAULT_CACHE_SIZE = 20 @@ -45,4 +49,9 @@ object Constants { const val NETWORK_DEFAULT_REQUEST_TIMEOUT = 30_000L const val NETWORK_DEFAULT_CONNECT_TIMEOUT = 6_000L const val NETWORK_DEFAULT_SOCKET_TIMEOUT = 10_000L + + // sorting + // This values must correspond to a SortString from [SortBy] + const val DEFAULT_SORT_BY = "SortName" + const val DEFAULT_SORT_ORDER = "Ascending" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 10069790..71443c9f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,9 @@ -include(":app") +include(":app:phone") +include(":core") +include(":data") +include(":preferences") +include(":player:core") +include(":player:video") pluginManagement { repositories {