Add first dependency

This commit is contained in:
Jarne Demeulemeester 2021-07-05 21:46:32 +02:00
parent 5e6099de93
commit 25ee7d05af
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
11 changed files with 117 additions and 42 deletions

View file

@ -4,6 +4,7 @@ plugins {
id 'kotlin-parcelize'
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'
id 'dagger.hilt.android.plugin'
}
android {
@ -37,12 +38,18 @@ android {
buildFeatures {
dataBinding true
}
kapt {
javacOptions {
// These options are normally set automatically via the Hilt Gradle plugin, but we
// set them manually to workaround a bug in the Kotlin 1.5.20
option("-Adagger.fastInit=ENABLED")
option("-Adagger.hilt.android.internal.disableAndroidSuperclassValidation=true")
}
}
}
dependencies {
def room_version = "2.3.0"
def jellyfin_version = "1.0.0-beta.9"
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
implementation 'androidx.appcompat:appcompat:1.3.0'
@ -62,17 +69,24 @@ dependencies {
implementation "androidx.recyclerview:recyclerview-selection:1.1.0"
// Room
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
// Jellyfin
def jellyfin_version = "1.0.0-beta.9"
implementation "org.jellyfin.sdk:jellyfin-platform-android:$jellyfin_version"
// Glide
implementation 'com.github.bumptech.glide:glide:4.12.0'
kapt 'com.github.bumptech.glide:compiler:4.12.0'
// Hilt
def hilt_version = "2.37"
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
// Testing
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'

View file

@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"

View file

@ -0,0 +1,8 @@
package dev.jdtech.jellyfin
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class BaseApplication : Application() {
}

View file

@ -7,8 +7,10 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.databinding.ActivityMainBinding
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding

View file

@ -3,7 +3,9 @@ package dev.jdtech.jellyfin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class SetupActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View file

@ -0,0 +1,20 @@
package dev.jdtech.jellyfin.di
import android.content.Context
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import dev.jdtech.jellyfin.BaseApplication
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class AppModule {
@Singleton
@Provides
fun provideApplication(@ApplicationContext app: Context): BaseApplication {
return app as BaseApplication
}
}

View file

@ -0,0 +1,29 @@
package dev.jdtech.jellyfin.di
import android.content.Context
import androidx.room.Room
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import dev.jdtech.jellyfin.database.ServerDatabase
import dev.jdtech.jellyfin.database.ServerDatabaseDao
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class DatabaseModule {
@Singleton
@Provides
fun provideServerDatabaseDao(@ApplicationContext app: Context): ServerDatabaseDao {
return Room.databaseBuilder(
app.applicationContext,
ServerDatabase::class.java,
"servers"
)
.fallbackToDestructiveMigration()
.build()
.serverDatabaseDao
}
}

View file

@ -6,33 +6,30 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.R
import dev.jdtech.jellyfin.database.ServerDatabase
import dev.jdtech.jellyfin.databinding.FragmentServerSelectBinding
import dev.jdtech.jellyfin.dialogs.DeleteServerDialogFragment
import dev.jdtech.jellyfin.adapters.ServerGridAdapter
import dev.jdtech.jellyfin.viewmodels.ServerSelectViewModelFactory
import dev.jdtech.jellyfin.viewmodels.ServerSelectViewModel
@AndroidEntryPoint
class ServerSelectFragment : Fragment() {
private lateinit var binding: FragmentServerSelectBinding
private val viewModel: ServerSelectViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = FragmentServerSelectBinding.inflate(inflater)
val application = requireNotNull(this.activity).application
val dataSource = ServerDatabase.getInstance(application).serverDatabaseDao
val viewModelFactory = ServerSelectViewModelFactory(dataSource, application)
val viewModel: ServerSelectViewModel by viewModels { viewModelFactory }
binding = FragmentServerSelectBinding.inflate(inflater)
binding.lifecycleOwner = this
binding.viewModel = viewModel
binding.serversRecyclerView.adapter =
ServerGridAdapter(ServerGridAdapter.OnClickListener { server ->
viewModel.connectToServer(server)
@ -45,16 +42,24 @@ class ServerSelectFragment : Fragment() {
})
binding.buttonAddServer.setOnClickListener {
this.findNavController().navigate(R.id.action_serverSelectFragment_to_addServerFragment)
navigateToAddServerFragment()
}
viewModel.navigateToMain.observe(viewLifecycleOwner, {
if (it) {
findNavController().navigate(R.id.action_serverSelectFragment_to_mainActivity)
viewModel.doneNavigatingToMain()
navigateToMainActivity()
}
})
return binding.root
}
private fun navigateToAddServerFragment() {
findNavController().navigate(R.id.action_serverSelectFragment_to_addServerFragment)
}
private fun navigateToMainActivity() {
findNavController().navigate(R.id.action_serverSelectFragment_to_mainActivity)
viewModel.doneNavigatingToMain()
}
}

View file

@ -5,6 +5,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.jdtech.jellyfin.api.JellyfinApi
import dev.jdtech.jellyfin.database.Server
import dev.jdtech.jellyfin.database.ServerDatabaseDao
@ -12,11 +13,16 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.*
import javax.inject.Inject
class ServerSelectViewModel(
val database: ServerDatabaseDao,
val application: Application,
@HiltViewModel
class ServerSelectViewModel
@Inject
constructor(
private val application: Application,
private val database: ServerDatabaseDao,
) : ViewModel() {
private val _servers = database.getAllServers()
val servers: LiveData<List<Server>> = _servers
@ -56,7 +62,12 @@ class ServerSelectViewModel(
private suspend fun postCapabilities(jellyfinApi: JellyfinApi) {
withContext(Dispatchers.IO) {
jellyfinApi.sessionApi.postCapabilities(playableMediaTypes = listOf("Video"), supportsMediaControl = false, supportsSync = false, supportsPersistentIdentifier = true)
jellyfinApi.sessionApi.postCapabilities(
playableMediaTypes = listOf("Video"),
supportsMediaControl = false,
supportsSync = false,
supportsPersistentIdentifier = true
)
}
}
}

View file

@ -1,20 +0,0 @@
package dev.jdtech.jellyfin.viewmodels
import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import dev.jdtech.jellyfin.database.ServerDatabaseDao
import java.lang.IllegalArgumentException
class ServerSelectViewModelFactory(
private val dataSource: ServerDatabaseDao,
private val application: Application
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ServerSelectViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return ServerSelectViewModel(dataSource, application) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}

View file

@ -13,6 +13,9 @@ buildscript {
// in the individual module build.gradle files
def nav_version = "2.3.5"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
def hilt_version = "2.37"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}