Skip to content

Commit 0e2e11d

Browse files
249/bugfix_back_button_missed_question: fixed the back button issue
* Fixed problem when back button was not saving properly the answers. There were two issues here, one, it could be the save answers did not finish before syncData and two, updateAnsweredQuestion was not doing anything as there was no emitter call at the end. This was fixed by chaining the rxjava call under one Schedulers.io and also, by chaining saveAnswers and syncData. * Added more logs. * Incorporated changes from #252.
1 parent 4d54abb commit 0e2e11d

File tree

4 files changed

+53
-20
lines changed

4 files changed

+53
-20
lines changed

app/src/main/java/ro/code4/monitorizarevot/repositories/Repository.kt

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import android.util.Log
66
import androidx.lifecycle.LiveData
77
import com.google.gson.Gson
88
import com.google.gson.reflect.TypeToken
9+
import io.reactivex.*
910
import io.reactivex.Observable
10-
import io.reactivex.Single
1111
import io.reactivex.android.schedulers.AndroidSchedulers
1212
import io.reactivex.functions.BiFunction
1313
import io.reactivex.schedulers.Schedulers
@@ -17,6 +17,8 @@ import okhttp3.RequestBody.Companion.asRequestBody
1717
import okhttp3.ResponseBody
1818
import org.koin.core.KoinComponent
1919
import org.koin.core.inject
20+
import retrofit2.HttpException
21+
import retrofit2.Response
2022
import retrofit2.Retrofit
2123
import ro.code4.monitorizarevot.data.AppDatabase
2224
import ro.code4.monitorizarevot.data.model.*
@@ -29,6 +31,8 @@ import ro.code4.monitorizarevot.data.model.response.VersionResponse
2931
import ro.code4.monitorizarevot.data.pojo.*
3032
import ro.code4.monitorizarevot.helper.Constants
3133
import ro.code4.monitorizarevot.helper.createMultipart
34+
import ro.code4.monitorizarevot.helper.logD
35+
import ro.code4.monitorizarevot.helper.logE
3236
import ro.code4.monitorizarevot.services.ApiInterface
3337
import ro.code4.monitorizarevot.services.LoginInterface
3438
import java.io.File
@@ -228,11 +232,14 @@ class Repository : KoinComponent {
228232

229233
@SuppressLint("CheckResult")
230234
fun saveAnsweredQuestion(answeredQuestion: AnsweredQuestion, answers: List<SelectedAnswer>) {
231-
Observable.create<Unit> {
235+
Observable.fromCallable<Boolean> {
232236
db.formDetailsDao().insertAnsweredQuestion(answeredQuestion, answers)
237+
true
233238
}.subscribeOn(Schedulers.io())
234-
.observeOn(AndroidSchedulers.mainThread()).subscribe({}, {
235-
Log.i(TAG, it.message.orEmpty())
239+
.observeOn(AndroidSchedulers.mainThread()).subscribe({
240+
logD("Saving answered question: $answeredQuestion(answers: $answers)", TAG)
241+
}, {
242+
logE(it.message.orEmpty(), TAG)
236243
})
237244
}
238245

@@ -244,25 +251,47 @@ class Repository : KoinComponent {
244251
})
245252
}
246253

247-
248254
@SuppressLint("CheckResult")
249255
fun syncAnswers(countyCode: String, pollingStationNumber: Int, formId: Int) {
250-
db.formDetailsDao().getNotSyncedQuestionsForForm(countyCode, pollingStationNumber, formId)
256+
db.formDetailsDao()
257+
.getNotSyncedQuestionsForForm(countyCode, pollingStationNumber, formId)
251258
.toObservable()
252-
.subscribeOn(Schedulers.io()).flatMap {
253-
syncAnswers(it)
254-
}.observeOn(AndroidSchedulers.mainThread()).subscribe({
255-
Observable.create<Unit> {
256-
db.formDetailsDao()
257-
.updateAnsweredQuestions(countyCode, pollingStationNumber, formId)
258-
}.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
259-
.subscribe()
259+
.subscribeOn(Schedulers.io())
260+
.flatMap { answers ->
261+
syncAnswers(answers)
262+
.flatMap {
263+
Completable.fromAction {
264+
if (answers.isNotEmpty()) {
265+
logD("Updated number of answers:" + answers.size)
266+
logD("Updated answered questions for:$pollingStationNumber", TAG)
267+
db.formDetailsDao()
268+
.updateAnsweredQuestions(
269+
countyCode,
270+
pollingStationNumber,
271+
formId
272+
)
273+
} else {
274+
logD("empty list.")
275+
}
276+
}.andThen(Observable.just(it))
277+
}
278+
}
279+
.map {
280+
if (!it.isSuccessful) {
281+
throw HttpException(it)
282+
}
283+
return@map it.code()
284+
}
285+
.observeOn(AndroidSchedulers.mainThread())
286+
.subscribe({
287+
logD("Success in syncing data.", Repository.TAG)
260288
}, {
261-
Log.i(TAG, it.message ?: "Error on synchronizing data")
289+
val errorMessage = it.message ?: "Error on synchronizing data"
290+
logE(errorMessage, it, Repository.TAG)
262291
})
263292
}
264293

265-
private fun syncAnswers(list: List<AnsweredQuestionPOJO>): Observable<ResponseBody> {
294+
private fun syncAnswers(list: List<AnsweredQuestionPOJO>): Observable<Response<Void>> {
266295
val responseAnswerContainer = ResponseAnswerContainer()
267296
responseAnswerContainer.answers = list.map {
268297
it.answeredQuestion.options = it.selectedAnswers
@@ -419,7 +448,7 @@ class Repository : KoinComponent {
419448
db.pollingStationDao().deleteAll()
420449
}
421450
}
422-
451+
423452
fun getVisitedStations() = db.pollingStationDao().getVisitedPollingStations()
424453
}
425454

app/src/main/java/ro/code4/monitorizarevot/services/ApiInterface.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.reactivex.Observable
44
import io.reactivex.Single
55
import okhttp3.MultipartBody
66
import okhttp3.ResponseBody
7+
import retrofit2.Response
78
import retrofit2.http.*
89
import ro.code4.monitorizarevot.data.model.County
910
import ro.code4.monitorizarevot.data.model.PollingStation
@@ -25,7 +26,7 @@ interface ApiInterface {
2526
fun postPollingStationDetails(@Body pollingStation: PollingStation): Observable<ResponseBody>
2627

2728
@POST("/api/v1/answers")
28-
fun postQuestionAnswer(@Body responseAnswer: ResponseAnswerContainer): Observable<ResponseBody>
29+
fun postQuestionAnswer(@Body responseAnswer: ResponseAnswerContainer): Observable<Response<Void>>
2930

3031
@Multipart
3132
@POST("/api/v2/note")

app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,5 @@ class QuestionsDetailsFragment : ViewModelFragment<QuestionsDetailsViewModel>(),
161161
}
162162
viewModel.syncData()
163163
super.onPause()
164-
165164
}
166165
}

app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsViewModel.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package ro.code4.monitorizarevot.ui.forms.questions
22

3+
import android.annotation.SuppressLint
4+
import android.util.Log
5+
import io.reactivex.subjects.PublishSubject
6+
import org.reactivestreams.Publisher
37
import ro.code4.monitorizarevot.adapters.helper.ListItem
48
import ro.code4.monitorizarevot.adapters.helper.MultiChoiceListItem
59
import ro.code4.monitorizarevot.adapters.helper.QuestionDetailsListItem
610
import ro.code4.monitorizarevot.adapters.helper.SingleChoiceListItem
11+
import ro.code4.monitorizarevot.data.model.Answer
712
import ro.code4.monitorizarevot.data.model.answers.AnsweredQuestion
813
import ro.code4.monitorizarevot.data.model.answers.SelectedAnswer
914
import ro.code4.monitorizarevot.data.pojo.AnsweredQuestionPOJO
@@ -85,5 +90,4 @@ class QuestionsDetailsViewModel : BaseQuestionViewModel() {
8590
fun syncData() {
8691
repository.syncAnswers(countyCode, pollingStationNumber, selectedFormId)
8792
}
88-
8993
}

0 commit comments

Comments
 (0)