Skip to content

Instantly share code, notes, and snippets.

@emmano
emmano / SimpleAdapt.kt
Created December 30, 2019 18:56
Creating simple adapter using adapt
private val adapter by adapter<ComicModel>(BR.comicModel, R.layout.comic_cell)
@emmano
emmano / comic_cell.xml
Created December 30, 2019 19:11
sample layout
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable name="comicModel" type="me.emmano.androidmva.comics.mvvm.ComicModel"/>
</data>
private val adapter by adapter<ComicModel>(BR.comicModel, R.layout.comic_cell){model-> //do something on click}
private val adapter by adapter<ComicCellBinding, ComicModel>(BR.comicModel, R.layout.comic_cell){binding, model-> //do something}
fun TestFragment.adapter() = adapter<Model> {
val TYPE_HEADER = 1
val TYPE_CONTENT = 2
onCreateViewHolder { parent, viewType ->
when (viewType) {
TYPE_HEADER -> holder<HeaderBinding, Header>(parent, R.layout.header, BR.header) {
onBind { binding, header ->
private val adapter by adapter()
class TestFragmentTest: RobolectricTest() {
@Test
fun `test adapter dsl`() {
val scenario = launchFragmentInContainer<TestFragment>()
scenario.onFragment {
val recyclerView = it.requireView().findViewById<RecyclerView>(R.id.recycler)
val headerViewHolder =
recyclerView.findViewHolderForLayoutPosition(0) ?: throw IllegalStateException()
class TimerFlow {
@ExperimentalCoroutinesApi
suspend fun timer(
pollingDelay: Long,
coroutineDispatcher: CoroutineDispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
) = flow {
while (true) {
delay(pollingDelay)
emit(Unit)
}
@emmano
emmano / launchInActivity.kt
Created March 16, 2020 03:08
launchInActivity.kt
inline fun <reified F : Fragment, reified A : AppCompatActivity> launchInActivity(
crossinline fragmentFactory: () -> F,
state: Lifecycle.State = Lifecycle.State.RESUMED,
layoutId: Int = android.R.id.content,
isTestOnlyActivity: Boolean = false
) : ActivityScenario<A> {
//Manually register test only Activity since manifest merging is broken for test resources https://github.com/robolectric/robolectric/issues/4725
if(isTestOnlyActivity) {
val appContext = ApplicationProvider.getApplicationContext<Application>()
@emmano
emmano / onFragment.kt
Created March 23, 2020 18:19
Testing Fragments that depend on a Activity.
abstract val destination: Int
inline fun <reified F : Fragment> onFragment(crossinline block: F.() -> Unit) {
val intent = Intent(
ApplicationProvider.getApplicationContext<Application>(),
MainActivity::class.java
).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }
val scenario = ActivityScenario.launch<MainActivity>(intent)
scenario.onActivity {
Shadows.shadowOf(Looper.getMainLooper()).idle()