Skip to content

Instantly share code, notes, and snippets.

View SabagRonen's full-sized avatar

Ronen Sabag SabagRonen

View GitHub Profile
@SabagRonen
SabagRonen / Details.java
Created March 3, 2018 20:52
refactor to new Architecture Components
public interface NoteDetailsContract {
interface View {
void showNote(String note);
void close();
}
interface UserActions {
void deleteNoteClick(long noteId);
void updateNoteClick(long noteId, String updatedNote);
}
@SabagRonen
SabagRonen / Test.kt
Created February 24, 2018 08:15
Fragment espresso with dagger
@RunWith(AndroidJUnit4::class)
class MainViewTests {
val mockUserAction = mock(MainContract.UserAction::class.java)
@get:Rule
val activityTestRule = object : ActivityTestRule<MainActivity>(MainActivity::class.java, true, true) {
override fun beforeActivityLaunched() {
super.beforeActivityLaunched()
val myApp = InstrumentationRegistry.getTargetContext().applicationContext as MyApp
myApp.dispatchingActivityInjector = createFakeFragmentInjector<MainFragment> {
@SabagRonen
SabagRonen / FakeFragmentInjector.kt
Last active August 31, 2019 15:59
Fragment espresso with Dagger
inline fun <reified F : Fragment> createFakeFragmentInjector(crossinline block : F.() -> Unit)
: DispatchingAndroidInjector<Any> {
val myApp = InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as MyApp
val originalDispatchingActivityInjector = myApp.dispatchingActivityInjector
var originalFragmentInjector: AndroidInjector<Any>? = null
val fragmentInjector = AndroidInjector<Fragment> { fragment ->
originalFragmentInjector?.inject(fragment)
if (fragment is F) {
fragment.block()
}
@SabagRonen
SabagRonen / appStructure.kt
Last active August 31, 2019 15:49
Fragment espresso with Dagger
class MyApp : Application(), HasAndroidInjector {
@Inject lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Any>
override fun androidInjector() = dispatchingActivityInjector
override fun onCreate() {
super.onCreate()
DaggerAppComponent.builder().application(this).build().inject(this)
}
}
@SabagRonen
SabagRonen / component.kt
Last active February 22, 2018 21:10
Fragment espresso with Dagger
// the fragment that we want to inject
@Module
class InjectFragmentModule
@Module
abstract class InjectFragmentBuilder {
@ContributesAndroidInjector(modules = [InjectFragmentModule::class])
internal abstract fun bindInjectFragment(): InjectFragment
}
// application level
@SabagRonen
SabagRonen / Presenter.kt
Last active September 17, 2018 18:49
LiveData and Lifcycle post
inline fun <reified T> lambdaMock(): T = mock(T::class.java)
class Presenter {
val titleLiveData = MutableLiveData<String>()
fun observeTitleChanges(lifecycle: Lifecycle, observer: (String) -> Unit) {
titleLiveData.observe({ lifecycle }) { title ->
title?.let(observer)
}
@SabagRonen
SabagRonen / Presenter.kt
Created January 31, 2018 12:48
LiveData and Lifecycle post
class Presenter {
val titleLiveData = MutableLiveData<String>()
fun showTitle(title: String) {
titleLiveData.postValue(title)
}
}
class PresenterTests {
@SabagRonen
SabagRonen / GetFirst
Created January 13, 2018 20:51
Clean Architecture and Kotlin Coroutines post loading image select
suspend fun getFirstImage (firstImageUrl: String, secondImageUrl: String, imageFetcher: ImageFetcher) {
val images = mutableListOf<Bitmap>()
val firstJob = launch {
images.add(imageFetcher.getImageFromUrl(firstImageUrl))
}
val secondJob = launch(CommonPool) {
images.add(imageFetcher.getImageFromUrl(secondImageUrl))
}
select<Unit> {
@SabagRonen
SabagRonen / Fetch2Images.kt
Last active January 13, 2018 20:34
Clean Architecture and Kotlin Coroutines post loading image launch
suspend fun fetch2Images (firstImageUrl: String, secondImageUrl: String, imageFetcher: ImageFetcher) {
val images = mutableListOf<Bitmap>()
val firstJob = launch {
images.add(imageFetcher.getImageFromUrl(firstImageUrl))
}
val secondJob = launch(CommonPool) {
images.add(imageFetcher.getImageFromUrl(secondImageUrl))
}
firstJob.join()
@SabagRonen
SabagRonen / AsyncImageFetcher.kt
Last active January 13, 2018 20:20
Clean Architecture and Kotlin Coroutines post loading image async
suspend fun fetchImage(key: String, storage: Storage, imageFetcher: ImageFetcher) : Bitmap {
val url = async {storage.getUrlForKey(key)}.await()
val image = async { imageFetcher.getImageFromUrl(url) }
println("this might be run after the async have started")
return image.await()
}