Skip to content

Commit

Permalink
add ignoreError flag to WorkDatasObserver
Browse files Browse the repository at this point in the history
  • Loading branch information
PaulinaSadowska committed Mar 31, 2019
1 parent cfea5c6 commit 073b519
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ class UniqueWorkDataTest {
.subscribeOn(AndroidSchedulers.mainThread())
.test()

sleep(DEFAULT_DELAY_LONG*100)
sleep(DEFAULT_DELAY_LONG)

//then
workListObserver.assertComplete()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.work.WorkManager
import androidx.work.WorkRequest
import androidx.work.workDataOf
import com.paulinasadowska.rxworkmanagerobservers.exceptions.WorkFailedException
import com.paulinasadowska.rxworkmanagerobservers.extensions.getWorkDatasByTagObservable
import com.paulinasadowska.rxworkmanagerobservers.extensions.toWorkDatasObservable
import com.paulinasadowska.rxworkmanagerobservers.utils.DEFAULT_DELAY
import com.paulinasadowska.rxworkmanagerobservers.utils.DEFAULT_DELAY_LONG
import com.paulinasadowska.rxworkmanagerobservers.utils.createEchoRequest
import com.paulinasadowska.rxworkmanagerobservers.utils.initializeTestWorkManager
import com.paulinasadowska.rxworkmanagerobservers.workers.EchoWorker.Companion.KEY_ECHO_MESSAGE
Expand Down Expand Up @@ -92,7 +93,7 @@ class WorkDatasObservableTest {
}

@Test
fun allRequestsFailde_echoWorker_completesWithNoValues() {
fun allRequestsFail_echoWorker_completesWithNoValues() {
//given
val request1 = createEchoRequestWithTag()
val request2 = createEchoRequestWithTag()
Expand All @@ -105,13 +106,40 @@ class WorkDatasObservableTest {
.subscribeOn(AndroidSchedulers.mainThread())
.test()

sleep(DEFAULT_DELAY)
sleep(DEFAULT_DELAY_LONG)

//then
assertThat(workListObserver.values(), emptyIterable())
workListObserver.assertComplete()
}

@Test
fun oneRequestFailAndIgnoreErrorFalse_echoWorker_error() {
//given
val request1 = createEchoRequestWithTag(KEY_ECHO_MESSAGE to EXAMPLE_ECHO_MESSAGE_1)
val request2 = createEchoRequestWithTag()

//when
workManager.enqueue(request1)
workManager.enqueue(request2)

val workListObserver = workManager
.getWorkDatasByTagObservable(REQUEST_TAG, false)
.subscribeOn(AndroidSchedulers.mainThread())
.test()

sleep(DEFAULT_DELAY)

//then
workListObserver.values().apply {
assertThat(this, iterableWithSize(1))
assertThat(this, Matchers.contains(
workDataOf(KEY_ECHO_MESSAGE to EXAMPLE_ECHO_MESSAGE_1)
))
}
workListObserver.assertError(WorkFailedException::class.java)
}

private fun createEchoRequestWithTag(pair: Pair<String, String>? = null): WorkRequest {
return createEchoRequest(pair, REQUEST_TAG)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@ import com.paulinasadowska.rxworkmanagerobservers.observers.WorkDatasObserver
import io.reactivex.Observer

class WorkDatasObservable(
private val liveData: LiveData<List<WorkInfo>>
private val liveData: LiveData<List<WorkInfo>>,
private val ignoreError: Boolean
) : MainThreadObservable<Data>() {

override fun onSubscribeOnMainThread(observer: Observer<in Data>) {
observer.subscribeAndStartObserving()
}

private fun Observer<in Data>.subscribeAndStartObserving() {
WorkDatasObserver(this, liveData).let {
WorkDatasObserver(this, liveData, ignoreError).let {
onSubscribe(it)
liveData.observeForever(it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ fun LiveData<WorkInfo>.toWorkDataSingle(): Single<Data> {
return WorkDataSingle(this)
}

fun LiveData<List<WorkInfo>>.toWorkDatasObservable(): Observable<Data> {
return WorkDatasObservable(this)
fun LiveData<List<WorkInfo>>.toWorkDatasObservable(
ignoreError: Boolean = true
): Observable<Data> {
return WorkDatasObservable(this, ignoreError)
}

fun LiveData<WorkInfo>.toWorkInfoObservable(): Observable<WorkInfo> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@file:JvmName("WorkManagerRxHelper")

package com.paulinasadowska.rxworkmanagerobservers.extensions

import androidx.work.WorkManager
Expand All @@ -12,10 +13,16 @@ fun WorkManager.getWorkInfoByIdObservable(requestId: UUID) = this
.getWorkInfoByIdLiveData(requestId)
.toWorkInfoObservable()

fun WorkManager.getWorkDatasByTagObservable(tag: String) = this
fun WorkManager.getWorkDatasByTagObservable(
tag: String,
ignoreError: Boolean = true
) = this
.getWorkInfosByTagLiveData(tag)
.toWorkDatasObservable()
.toWorkDatasObservable(ignoreError)

fun WorkManager.getWorkDatasForUniqueWorkObservable(name: String) = this
fun WorkManager.getWorkDatasForUniqueWorkObservable(
name: String,
ignoreError: Boolean = true
) = this
.getWorkInfosForUniqueWorkLiveData(name)
.toWorkDatasObservable()
.toWorkDatasObservable(ignoreError)
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@ package com.paulinasadowska.rxworkmanagerobservers.observers
import androidx.lifecycle.LiveData
import androidx.work.Data
import androidx.work.WorkInfo
import com.paulinasadowska.rxworkmanagerobservers.exceptions.WorkCancelledException
import com.paulinasadowska.rxworkmanagerobservers.exceptions.WorkException
import com.paulinasadowska.rxworkmanagerobservers.exceptions.WorkFailedException
import com.paulinasadowska.rxworkmanagerobservers.observers.base.WorkInfosLiveDataObserver
import io.reactivex.Observer
import java.util.*

internal class WorkDatasObserver(
private val observer: Observer<in Data>,
liveData: LiveData<List<WorkInfo>>
liveData: LiveData<List<WorkInfo>>,
private val ignoreError: Boolean
) : WorkInfosLiveDataObserver(liveData) {

private var succeededIds: MutableSet<UUID> = HashSet()
Expand All @@ -24,16 +28,21 @@ internal class WorkDatasObserver(
}

override fun onCanceled(workInfo: WorkInfo, requestsCount: Int) {
onError(workInfo.id, requestsCount)
onError(workInfo.id, requestsCount, WorkCancelledException(workInfo.id))
}

override fun onFailed(workInfo: WorkInfo, requestsCount: Int) {
onError(workInfo.id, requestsCount)
onError(workInfo.id, requestsCount, WorkFailedException(workInfo.id))
}

private fun onError(workId: UUID, requestsCount: Int) {
errorIds.add(workId)
completeIfShould(requestsCount)
private fun onError(workId: UUID, requestsCount: Int, cause: WorkException) {
if (ignoreError) {
errorIds.add(workId)
completeIfShould(requestsCount)
} else {
observer.onError(cause)
removeObserver()
}
}

private fun completeIfShould(requestsCount: Int) {
Expand All @@ -43,5 +52,6 @@ internal class WorkDatasObserver(
}
}

private fun shouldComplete(requestsCount: Int) = succeededIds.size + errorIds.size == requestsCount
private fun shouldComplete(requestsCount: Int) =
succeededIds.size + errorIds.size == requestsCount
}

0 comments on commit 073b519

Please sign in to comment.