Skip to content

Commit c41cdba

Browse files
add Property detail component and dependency modules.
1 parent 37cbb80 commit c41cdba

7 files changed

Lines changed: 123 additions & 5 deletions

File tree

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,43 @@
11
package com.smarttoolfactory.property_detail
22

33
import android.os.Bundle
4-
import android.view.View
5-
import android.widget.Toast
4+
import com.smarttoolfactory.core.di.CoreModuleDependencies
65
import com.smarttoolfactory.core.ui.fragment.DynamicNavigationFragment
6+
import com.smarttoolfactory.domain.model.PropertyItem
77
import com.smarttoolfactory.property_detail.databinding.FragmentPropertyDetailBinding
8+
import com.smarttoolfactory.property_detail.di.DaggerPropertyDetailComponent
9+
import dagger.hilt.android.EntryPointAccessors
10+
import javax.inject.Inject
811

912
class PropertyDetailFragment : DynamicNavigationFragment<FragmentPropertyDetailBinding>() {
1013

1114
override fun getLayoutRes(): Int = R.layout.fragment_property_detail
1215

13-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
14-
super.onViewCreated(view, savedInstanceState)
16+
@Inject
17+
lateinit var viewModel: PropertyDetailViewModel
1518

16-
Toast.makeText(requireContext(), "Property DFM Module Fragment", Toast.LENGTH_SHORT).show()
19+
override fun bindViews() {
20+
// Get Post from navigation component arguments
21+
val property = arguments?.get("property") as PropertyItem
22+
dataBinding.item = property
23+
}
24+
25+
override fun onCreate(savedInstanceState: Bundle?) {
26+
initCoreDependentInjection()
27+
super.onCreate(savedInstanceState)
28+
}
29+
30+
private fun initCoreDependentInjection() {
31+
32+
val coreModuleDependencies = EntryPointAccessors.fromApplication(
33+
requireActivity().applicationContext,
34+
CoreModuleDependencies::class.java
35+
)
36+
37+
DaggerPropertyDetailComponent.factory().create(
38+
dependentModule = coreModuleDependencies,
39+
fragment = this
40+
)
41+
.inject(this)
1742
}
1843
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.smarttoolfactory.property_detail
2+
3+
import androidx.lifecycle.ViewModel
4+
import androidx.lifecycle.ViewModelProvider
5+
import com.smarttoolfactory.domain.usecase.SetPropertyStatusUseCase
6+
import javax.inject.Inject
7+
import kotlinx.coroutines.CoroutineScope
8+
9+
class PropertyDetailViewModel @Inject constructor(
10+
private val coroutineScope: CoroutineScope,
11+
private val setPropertyStatusUseCase: SetPropertyStatusUseCase
12+
) : ViewModel()
13+
14+
class PropertyDetailViewModelFactory @Inject constructor(
15+
private val coroutineScope: CoroutineScope,
16+
private val setPropertyStatusUseCase: SetPropertyStatusUseCase
17+
) : ViewModelProvider.Factory {
18+
19+
@Suppress("UNCHECKED_CAST")
20+
override fun <T : ViewModel> create(modelClass: Class<T>): T {
21+
if (modelClass != PropertyDetailViewModel::class.java) {
22+
throw IllegalArgumentException("Unknown ViewModel class")
23+
}
24+
return PropertyDetailViewModel(
25+
coroutineScope,
26+
setPropertyStatusUseCase
27+
) as T
28+
}
29+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.smarttoolfactory.property_detail.di
2+
3+
import androidx.fragment.app.Fragment
4+
import com.smarttoolfactory.core.di.CoreModuleDependencies
5+
import com.smarttoolfactory.property_detail.PropertyDetailFragment
6+
import dagger.BindsInstance
7+
import dagger.Component
8+
9+
@Component(
10+
dependencies = [CoreModuleDependencies::class],
11+
modules = [PropertyDetailModule::class]
12+
)
13+
interface PropertyDetailComponent {
14+
15+
fun inject(fragment: PropertyDetailFragment)
16+
17+
@Component.Factory
18+
interface Factory {
19+
fun create(
20+
dependentModule: CoreModuleDependencies,
21+
@BindsInstance fragment: Fragment
22+
): PropertyDetailComponent
23+
}
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.smarttoolfactory.property_detail.di
2+
3+
import androidx.fragment.app.Fragment
4+
import androidx.lifecycle.ViewModelProvider
5+
import com.smarttoolfactory.property_detail.PropertyDetailViewModel
6+
import com.smarttoolfactory.property_detail.PropertyDetailViewModelFactory
7+
import dagger.Module
8+
import dagger.Provides
9+
import dagger.hilt.InstallIn
10+
import dagger.hilt.android.components.FragmentComponent
11+
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.Dispatchers
13+
import kotlinx.coroutines.SupervisorJob
14+
15+
@InstallIn(FragmentComponent::class)
16+
@Module
17+
class PropertyDetailModule {
18+
19+
@Provides
20+
fun providePostDetailViewModel(fragment: Fragment, factory: PropertyDetailViewModelFactory) =
21+
ViewModelProvider(fragment, factory).get(PropertyDetailViewModel::class.java)
22+
23+
@Provides
24+
fun provideCoroutineScope() = CoroutineScope(Dispatchers.Main.immediate + SupervisorJob())
25+
}

features/property_detail/src/main/res/layout/fragment_property_detail.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<layout>
33

4+
<data>
5+
<variable
6+
name="item"
7+
type="com.smarttoolfactory.domain.model.PropertyItem" />
8+
</data>
9+
410
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
511
xmlns:app="http://schemas.android.com/apk/res-auto"
612
android:layout_width="match_parent"

libraries/core/src/main/java/com/smarttoolfactory/core/di/CoreModuleDependencies.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.smarttoolfactory.core.di
33
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseFlow
44
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCasePaged
55
import com.smarttoolfactory.domain.usecase.GetPropertiesUseCaseRxJava3
6+
import com.smarttoolfactory.domain.usecase.SetPropertyStatusUseCase
67
import dagger.hilt.EntryPoint
78
import dagger.hilt.InstallIn
89
import dagger.hilt.android.components.ApplicationComponent
@@ -20,4 +21,7 @@ interface CoreModuleDependencies {
2021
fun getPropertiesUseCaseFlow(): GetPropertiesUseCaseFlow
2122
fun getPropertiesUseCaseRxJava3(): GetPropertiesUseCaseRxJava3
2223
fun getPropertiesUseCasePaged(): GetPropertiesUseCasePaged
24+
25+
// Set property like or view status
26+
fun setPropertyStatusUseCase(): SetPropertyStatusUseCase
2327
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.smarttoolfactory.domain.usecase
2+
3+
import javax.inject.Inject
4+
5+
class SetPropertyStatusUseCase @Inject constructor()

0 commit comments

Comments
 (0)