Skip to content

Commit

Permalink
Merge pull request #57 from PatilShreyas/hilt-update
Browse files Browse the repository at this point in the history
Use @AssistedInject for PostDetailsViewModel
  • Loading branch information
PatilShreyas committed Jan 16, 2021
2 parents 11a47c1 + aa74f32 commit 8b49abb
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import retrofit2.Response
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
interface PostRepository {
fun getAllPosts(): Flow<Resource<List<Post>>>
fun getPostById(postId: Int): Flow<Post>
Expand All @@ -45,7 +43,6 @@ interface PostRepository {
* for offline capability. This is Single source of data.
*/
@ExperimentalCoroutinesApi
@Singleton
class DefaultPostRepository @Inject constructor(
private val postsDao: PostsDao,
private val foodiumService: FoodiumService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,22 @@ package dev.shreyaspatil.foodium.di.module
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.scopes.ViewModelScoped
import dagger.hilt.android.components.ActivityRetainedComponent
import dagger.hilt.android.scopes.ActivityRetainedScoped
import dev.shreyaspatil.foodium.data.repository.DefaultPostRepository
import dev.shreyaspatil.foodium.data.repository.PostRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi

/**
* Currently PostRepository is only used in ViewModels.
* PostDetailsViewModel is not injected using @HiltViewModel so can't install in ViewModelComponent.
*/
@ExperimentalCoroutinesApi
@InstallIn(ViewModelComponent::class)
@InstallIn(ActivityRetainedComponent::class)
@Module
abstract class PostRepositoryModule {

@ViewModelScoped
@ActivityRetainedScoped
@Binds
abstract fun bindPostRepository(repository: DefaultPostRepository): PostRepository
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

package dev.shreyaspatil.foodium.ui.details

import android.content.Intent
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
Expand All @@ -35,36 +35,40 @@ import coil.load
import dagger.hilt.android.AndroidEntryPoint
import dev.shreyaspatil.foodium.R
import dev.shreyaspatil.foodium.databinding.ActivityPostDetailsBinding
import dev.shreyaspatil.foodium.model.Post
import dev.shreyaspatil.foodium.ui.base.BaseActivity
import kotlinx.coroutines.ExperimentalCoroutinesApi
import javax.inject.Inject

@ExperimentalCoroutinesApi
@AndroidEntryPoint
class PostDetailsActivity : BaseActivity<PostDetailsViewModel, ActivityPostDetailsBinding>() {

override val mViewModel: PostDetailsViewModel by viewModels()
@Inject
lateinit var viewModelFactory: PostDetailsViewModel.PostDetailsViewModelFactory

private lateinit var post: Post
override val mViewModel: PostDetailsViewModel by viewModels {
val postId = intent.extras?.getInt(KEY_POST_ID)
?: throw IllegalArgumentException("`postId` must be non-null")

PostDetailsViewModel.provideFactory(viewModelFactory, postId)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(mViewBinding.root)

setSupportActionBar(mViewBinding.toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}

val postId = intent.extras?.getInt(POST_ID)
?: throw IllegalArgumentException("`postId` must be non-null")

initPost(postId)
override fun onStart() {
super.onStart()
initPost()
}

private fun initPost(postId: Int) {
mViewModel.getPost(postId).observe(this) { post ->
private fun initPost() {
mViewModel.post.observe(this) { post ->
mViewBinding.postContent.apply {
this@PostDetailsActivity.post = post

postTitle.text = post.title
postAuthor.text = post.author
postBody.text = post.body
Expand All @@ -74,6 +78,7 @@ class PostDetailsActivity : BaseActivity<PostDetailsViewModel, ActivityPostDetai
}

private fun share() {
val post = mViewModel.post.value ?: return
val shareMsg = getString(R.string.share_message, post.title, post.author)

val intent = ShareCompat.IntentBuilder.from(this)
Expand Down Expand Up @@ -109,11 +114,11 @@ class PostDetailsActivity : BaseActivity<PostDetailsViewModel, ActivityPostDetai
}

companion object {
private const val POST_ID = "postId"
private const val KEY_POST_ID = "postId"

fun getStartIntent(
context: Context,
postId: Int
) = Intent(context, PostDetailsActivity::class.java).apply { putExtra(POST_ID, postId) }
) = Intent(context, PostDetailsActivity::class.java).apply { putExtra(KEY_POST_ID, postId) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,39 @@
package dev.shreyaspatil.foodium.ui.details

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.asLiveData
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dev.shreyaspatil.foodium.data.repository.PostRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import javax.inject.Inject

/**
* ViewModel for [PostDetailsActivity]
*/
@ExperimentalCoroutinesApi
@HiltViewModel
class PostDetailsViewModel @Inject constructor(
private val postRepository: PostRepository
class PostDetailsViewModel @AssistedInject constructor(
postRepository: PostRepository,
@Assisted postId: Int
) : ViewModel() {

fun getPost(id: Int) = postRepository.getPostById(id).asLiveData()
val post = postRepository.getPostById(postId).asLiveData()

@AssistedFactory
interface PostDetailsViewModelFactory {
fun create(postId: Int): PostDetailsViewModel
}

@Suppress("UNCHECKED_CAST")
companion object {
fun provideFactory(
assistedFactory: PostDetailsViewModelFactory,
postId: Int
): ViewModelProvider.Factory = object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return assistedFactory.create(postId) as T
}
}
}
}

0 comments on commit 8b49abb

Please sign in to comment.