Skip to content

Instantly share code, notes, and snippets.

View jobinlawrance's full-sized avatar

Jobin Lawrance jobinlawrance

View GitHub Profile
@jobinlawrance
jobinlawrance / HomeActivityTest.kt
Created December 13, 2020 20:13
Testing using KoinTest
import ...
@RunWith(AndroidJUnit4ClassRunner::class)
class HomeActivityTest: KoinTest {
@get:Rule
var intentRule = IntentsTestRule(HomeActivity::class.java, true, false)
lateinit var mockModule: Module
lateinit var mockedInteractor: HomeInteractor
@jobinlawrance
jobinlawrance / HomeViewModel.kt
Created December 13, 2020 14:36
HomeViewModel and HomeInteractor
class HomeViewModel(val homeInteractor: HomeInteractor) {
private val resultLiveData = MutableLiveData<Result<String>>()
fun getResultFromApi(): LiveData<Result<String>> {
homeInteractor.getResultFromApi()
.startWith(Result.InProgress)
.subscribe({ someString ->
resultLiveData.value = Result.Success(someString)
}, { err ->
import org.koin.androidx.viewmodel.ext.android.viewModel
...
class HomeActivity: AppCompatActivity() {
private val homeViewModel by viewModel<HomeViewModel>()
override fun onCreate(..) {
...
@jobinlawrance
jobinlawrance / KoinSetup.kt
Last active December 13, 2020 10:40
Sample Application setup when using Koin Library (code might not compile)
class HomeApplication: Application() {
internal lateinit var koinApplication: KoinApplication
override fun onCreate() {
super.onCreate()
koinApplication = startKoin {
androidContext(this@HomeApplication)
modules(apiModule, interactorModule, viewModelModule)
}
class MainActivity : AppCompatActivity() {
val mainFragment by fragmentByTagOrNew(MainFragment.TAG) {
MainFragment().withArgs {
putString(MainFragment.KEY_TEXT, "Now this won't crash")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
inline fun <reified T : Fragment> AppCompatActivity.fragmentByTagOrNew(
tag: String, noinline factory: () -> T
): Lazy<T> {
return lazy(LazyThreadSafetyMode.NONE) {
supportFragmentManager.findFragmentByTag(tag) as? T ?: factory()
}
}
class MainActivity : AppCompatActivity() {
val bundle = Bundle().apply {
putString(MainFragment.KEY_TEXT, "Now this won't crash")
}
val mainFragment = MainFragment().apply {
arguements = bundle
}
val appModule = module {
single { //Existing koin dependencies }
fragment { MainFragment("Now this won't crash") }
}
class MainActivity : AppCompatActivity() {
private val mainFragment by fragmentFromFactory<MainFragment>()
override fun onCreate(savedInstanceState: Bundle?) {
setupKoinFragmentFactory() //This has to be done before super call
super.onCreate(savesInstanceState)
supportFragmentManager.beginTransaction()
.add(R.layout.fragmentContainerView, mainFragment)
inline fun <reified T : Fragment> AppCompatActivity.fragmentFromFactory(): Lazy<T> {
return lazy {
supportFragmentManager.fragmentFactory.instantiate(classLoader, T::class.java.name) as T
}
}