diff --git a/app/src/main/java/ro/code4/monitorizarevot/repositories/Repository.kt b/app/src/main/java/ro/code4/monitorizarevot/repositories/Repository.kt index 1e73d17a..ea9018d6 100644 --- a/app/src/main/java/ro/code4/monitorizarevot/repositories/Repository.kt +++ b/app/src/main/java/ro/code4/monitorizarevot/repositories/Repository.kt @@ -6,8 +6,8 @@ import android.util.Log import androidx.lifecycle.LiveData import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import io.reactivex.* import io.reactivex.Observable -import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.functions.BiFunction import io.reactivex.schedulers.Schedulers @@ -17,6 +17,8 @@ import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.ResponseBody import org.koin.core.KoinComponent import org.koin.core.inject +import retrofit2.HttpException +import retrofit2.Response import retrofit2.Retrofit import ro.code4.monitorizarevot.data.AppDatabase import ro.code4.monitorizarevot.data.model.* @@ -29,6 +31,8 @@ import ro.code4.monitorizarevot.data.model.response.VersionResponse import ro.code4.monitorizarevot.data.pojo.* import ro.code4.monitorizarevot.helper.Constants import ro.code4.monitorizarevot.helper.createMultipart +import ro.code4.monitorizarevot.helper.logD +import ro.code4.monitorizarevot.helper.logE import ro.code4.monitorizarevot.services.ApiInterface import ro.code4.monitorizarevot.services.LoginInterface import java.io.File @@ -228,11 +232,14 @@ class Repository : KoinComponent { @SuppressLint("CheckResult") fun saveAnsweredQuestion(answeredQuestion: AnsweredQuestion, answers: List) { - Observable.create { + Observable.fromCallable { db.formDetailsDao().insertAnsweredQuestion(answeredQuestion, answers) + true }.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()).subscribe({}, { - Log.i(TAG, it.message.orEmpty()) + .observeOn(AndroidSchedulers.mainThread()).subscribe({ + logD("Saving answered question: $answeredQuestion(answers: $answers)", TAG) + }, { + logE(it.message.orEmpty(), TAG) }) } @@ -244,25 +251,47 @@ class Repository : KoinComponent { }) } - @SuppressLint("CheckResult") fun syncAnswers(countyCode: String, pollingStationNumber: Int, formId: Int) { - db.formDetailsDao().getNotSyncedQuestionsForForm(countyCode, pollingStationNumber, formId) + db.formDetailsDao() + .getNotSyncedQuestionsForForm(countyCode, pollingStationNumber, formId) .toObservable() - .subscribeOn(Schedulers.io()).flatMap { - syncAnswers(it) - }.observeOn(AndroidSchedulers.mainThread()).subscribe({ - Observable.create { - db.formDetailsDao() - .updateAnsweredQuestions(countyCode, pollingStationNumber, formId) - }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe() + .subscribeOn(Schedulers.io()) + .flatMap { answers -> + syncAnswers(answers) + .flatMap { + Completable.fromAction { + if (answers.isNotEmpty()) { + logD("Updated number of answers:" + answers.size) + logD("Updated answered questions for:$pollingStationNumber", TAG) + db.formDetailsDao() + .updateAnsweredQuestions( + countyCode, + pollingStationNumber, + formId + ) + } else { + logD("empty list.") + } + }.andThen(Observable.just(it)) + } + } + .map { + if (!it.isSuccessful) { + throw HttpException(it) + } + return@map it.code() + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + logD("Success in syncing data.", Repository.TAG) }, { - Log.i(TAG, it.message ?: "Error on synchronizing data") + val errorMessage = it.message ?: "Error on synchronizing data" + logE(errorMessage, it, Repository.TAG) }) } - private fun syncAnswers(list: List): Observable { + private fun syncAnswers(list: List): Observable> { val responseAnswerContainer = ResponseAnswerContainer() responseAnswerContainer.answers = list.map { it.answeredQuestion.options = it.selectedAnswers @@ -431,7 +460,7 @@ class Repository : KoinComponent { db.pollingStationDao().deleteAll() } } - + fun getVisitedStations() = db.pollingStationDao().getVisitedPollingStations() } diff --git a/app/src/main/java/ro/code4/monitorizarevot/services/ApiInterface.kt b/app/src/main/java/ro/code4/monitorizarevot/services/ApiInterface.kt index 5d917d3a..424e0b4d 100644 --- a/app/src/main/java/ro/code4/monitorizarevot/services/ApiInterface.kt +++ b/app/src/main/java/ro/code4/monitorizarevot/services/ApiInterface.kt @@ -4,6 +4,7 @@ import io.reactivex.Observable import io.reactivex.Single import okhttp3.MultipartBody import okhttp3.ResponseBody +import retrofit2.Response import retrofit2.http.* import ro.code4.monitorizarevot.data.model.County import ro.code4.monitorizarevot.data.model.PollingStation @@ -25,7 +26,7 @@ interface ApiInterface { fun postPollingStationDetails(@Body pollingStation: PollingStation): Observable @POST("/api/v1/answers") - fun postQuestionAnswer(@Body responseAnswer: ResponseAnswerContainer): Observable + fun postQuestionAnswer(@Body responseAnswer: ResponseAnswerContainer): Observable> @Multipart @POST("/api/v2/note") diff --git a/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsFragment.kt b/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsFragment.kt index 1c52d54f..20cb1d05 100644 --- a/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsFragment.kt +++ b/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsFragment.kt @@ -161,6 +161,5 @@ class QuestionsDetailsFragment : ViewModelFragment(), } viewModel.syncData() super.onPause() - } } \ No newline at end of file diff --git a/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsViewModel.kt b/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsViewModel.kt index 0215d3a3..18bf1c47 100644 --- a/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsViewModel.kt +++ b/app/src/main/java/ro/code4/monitorizarevot/ui/forms/questions/QuestionsDetailsViewModel.kt @@ -1,10 +1,15 @@ package ro.code4.monitorizarevot.ui.forms.questions +import android.annotation.SuppressLint +import android.util.Log +import io.reactivex.subjects.PublishSubject +import org.reactivestreams.Publisher import io.reactivex.Observable import ro.code4.monitorizarevot.adapters.helper.ListItem import ro.code4.monitorizarevot.adapters.helper.MultiChoiceListItem import ro.code4.monitorizarevot.adapters.helper.QuestionDetailsListItem import ro.code4.monitorizarevot.adapters.helper.SingleChoiceListItem +import ro.code4.monitorizarevot.data.model.Answer import ro.code4.monitorizarevot.data.model.Note import ro.code4.monitorizarevot.data.model.answers.AnsweredQuestion import ro.code4.monitorizarevot.data.model.answers.SelectedAnswer