Skip to content

Instantly share code, notes, and snippets.

View drawers's full-sized avatar
🟩
In greenish twilight at the bottom of the Rhine

David Rawson drawers

🟩
In greenish twilight at the bottom of the Rhine
View GitHub Profile
@drawers
drawers / Button.xml
Created November 1, 2017 19:39
Button data binding example
<Button
android:text="Register"
android:onClick="@{v->interactor.onRegisterButtonClick(model.username, model.password)}"/>
@drawers
drawers / RegistrationTest.java
Created November 1, 2017 19:47
An integration test for the RegistrationActivity
public class RegistrationTest {
//mocks
@Mock Storage mockStorage;
@Mock RegistrationService mockRegistrationService;
@Mock RegistrationContract.View mockView;
//system under test
RegistrationContract.Interactor interactor;
RegistrationContract.Presenter presenter;
@drawers
drawers / EspressoTest.java
Last active November 1, 2017 21:00
An Espresso test
@Test
public void testShowAlertDialog() throws Exception {
//act
registrationActivity.showAlertDialog("No internet available.")
ScreenShotter.takeScreenshot("details", activity);
//assert
onView(withId(R.id.custom_alert_dialog_picture)).check(matches(isCompletelyDisplayed()));
onView(withId(R.id.custom_alert_dialog_button)).check(matches(withText("Shucks")));
onView(withId(R.id.custom_alert_dialog_button)).check(matches("No internet available."));
@drawers
drawers / material text sizes.md
Created September 12, 2018 00:56 — forked from webserveis/material text sizes.md
Material font sizes

Material text sizes XML for Android

Simple helper file for standard text sizes in material design. The sizes are provided by the material design documentation https://www.google.com/design/spec/style/typography.html#typography-roboto

material typography

Standard Styles

Too many type sizes and styles at once can wreck any layout. A typographic scale is a limited set of type sizes that work well together, along with the layout grid. The basic set of styles are based on a typographic scale of 12, 14, 16, 20, and 34.

@drawers
drawers / PickupFragment.kt
Created August 11, 2019 08:04
A humble Fragment with a recyclerview
class PickupFragment : Fragment() {
private val disposables = CompositeDisposable()
private lateinit var adapter: RecylerView.Adapter<PickupVH>
override fun onStart() {
super.onStart()
source().viewStates()
.observeOn(AndroidSchedulers.mainThread())
@drawers
drawers / PickupFragment.kt
Created August 11, 2019 08:06
A naive implementation using debounce
override fun onStart() {
super.onStart()
source().viewStates()
.debounce {
when {
it.isLoading() -> Observable.timer(250, TimeUnit.MILLISECONDS)
else -> Observable.empty()
}
}
.observeOn(AndroidSchedulers.mainThread())
@drawers
drawers / PickupFragment.kt
Created August 11, 2019 08:11
Cleaning it up slightly
private typealias PageDebounceSelector = (data: PickupData) -> ObservableSource<Long>
class PickupFragment {
override fun onStart() {
super.onStart()
source().viewStates()
.debounce(loadingOnly)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { data: PickupData ->
@drawers
drawers / Observable.kt
Created August 11, 2019 08:25
Extension method on Observable
fun <T> Observable<T>.debounceIf(predicate: (T) -> Boolean, delay: Long, unit: TimeUnit): Observable<T> {
return this.debounce {
when {
predicate(it) -> Observable.timer(delay, unit)
else -> Observable.empty()
}
}
}
@drawers
drawers / PickupFragment.kt
Last active August 11, 2019 08:30
Using the extension method
class PickupFragment : Fragment() {
override fun onStart() {
super.onStart()
source().viewStates()
.debounceIf({ it.isLoading() }, 250, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { data: PickupData ->
adapter.setData(data)
}
val testScheduler = TestScheduler()
val states = listOf(Loading, Loaded, ClickX, ClickY)
@Test
fun `loading followed 500ms later by loaded is emitted`() {
val observable = Observable.fromIterable(listOf(0, 500, 1000, 2000))
.zipWith(states) { index, state -> Pair(index, state) }
.delay {
Observable.timer(it.first.toLong(), TimeUnit.MILLISECONDS, testScheduler)