Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/src/org/commcare/activities/LoginActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,7 @@ private boolean handleConnectSignIn(CommCareActivity<?> context, String username

if (job != null) {
personalIdManager.updateAppAccess(context, appId, username);
ConnectJobHelper.INSTANCE.updateJobProgress(context, job, success -> setResultAndFinish(job.getIsUserSuspended()));
ConnectJobHelper.INSTANCE.updateJobProgress(context, job,null,null, success -> setResultAndFinish(job.getIsUserSuspended()));
} else {
//Possibly offer to link or de-link PersonalId-managed login
personalIdManager.checkPersonalIdLink(context,
Expand Down
2 changes: 1 addition & 1 deletion app/src/org/commcare/activities/StandardHomeActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ void refreshCCUpdateOption() {
public void fetchJobProgressOverNetwork() {
ConnectJobRecord job = getActiveJob();
if(job != null && job.getStatus() == ConnectJobRecord.STATUS_DELIVERING) {
ConnectJobHelper.INSTANCE.updateDeliveryProgress(this, job, success -> {
ConnectJobHelper.INSTANCE.updateDeliveryProgress(this, job, null,null,success -> {
if (success) {
uiController.updateConnectJobProgress();
}
Expand Down
68 changes: 42 additions & 26 deletions app/src/org/commcare/connect/ConnectJobHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import org.commcare.google.services.analytics.AnalyticsParamValue.FINISH_DELIVER
import org.commcare.google.services.analytics.AnalyticsParamValue.PAID_DELIVERY
import org.commcare.google.services.analytics.AnalyticsParamValue.START_DELIVERY
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil
import org.commcare.interfaces.base.BaseConnectView

object ConnectJobHelper {
fun getJobForSeatedApp(context: Context): ConnectJobRecord? {
Expand All @@ -25,26 +26,31 @@ object ConnectJobHelper {
return ConnectJobUtils.getCompositeJob(context, appRecord.jobId)
}

fun shouldShowJobStatus(context: Context?, appId: String?): Boolean {
fun shouldShowJobStatus(
context: Context?,
appId: String?,
): Boolean {
val record = ConnectJobUtils.getAppRecord(context, appId) ?: return false
val job = ConnectJobUtils.getJobForApp(context, appId) ?: return false

//Only time not to show is when we're in learn app but job is in delivery state
// Only time not to show is when we're in learn app but job is in delivery state
return !record.isLearning || job.status != ConnectJobRecord.STATUS_DELIVERING
}

fun updateJobProgress(
context: Context,
job: ConnectJobRecord,
listener: ConnectActivityCompleteListener
showLoading: Boolean? = null,
baseConnectView: BaseConnectView? = null,
listener: ConnectActivityCompleteListener,
) {
when (job.status) {
ConnectJobRecord.STATUS_LEARNING -> {
updateLearningProgress(context, job, listener)
}

ConnectJobRecord.STATUS_DELIVERING -> {
updateDeliveryProgress(context, job, listener)
updateDeliveryProgress(context, job, showLoading, baseConnectView, listener)
}

else -> {
Expand All @@ -56,7 +62,7 @@ object ConnectJobHelper {
fun updateLearningProgress(
context: Context,
job: ConnectJobRecord,
listener: ConnectActivityCompleteListener
listener: ConnectActivityCompleteListener,
) {
val user = ConnectUserDatabaseUtil.getUser(context)
object : ConnectApiHandler<LearningAppProgressResponseModel>() {
Expand All @@ -66,13 +72,16 @@ object ConnectJobHelper {
learningAppProgressResponseModel.connectJobLearningRecords.size
job.assessments = learningAppProgressResponseModel.connectJobAssessmentRecords
ConnectJobUtils.updateJobLearnProgress(context, job)
if (job.passedAssessment()){
if (job.passedAssessment()) {
FirebaseAnalyticsUtil.reportCccApiLearnProgress(true)
}
listener.connectActivityComplete(true)
}

override fun onFailure(errorCode: PersonalIdOrConnectApiErrorCodes, t: Throwable?) {
override fun onFailure(
errorCode: PersonalIdOrConnectApiErrorCodes,
t: Throwable?,
) {
FirebaseAnalyticsUtil.reportCccApiLearnProgress(false)
listener.connectActivityComplete(false)
}
Expand All @@ -82,10 +91,12 @@ object ConnectJobHelper {
fun updateDeliveryProgress(
context: Context,
job: ConnectJobRecord,
listener: ConnectActivityCompleteListener
showLoading: Boolean? = null,
baseConnectView: BaseConnectView? = null,
listener: ConnectActivityCompleteListener,
) {
val user = ConnectUserDatabaseUtil.getUser(context)
object : ConnectApiHandler<DeliveryAppProgressResponseModel>() {
object : ConnectApiHandler<DeliveryAppProgressResponseModel>(showLoading, baseConnectView) {
override fun onSuccess(deliveryAppProgressResponseModel: DeliveryAppProgressResponseModel) {
val events = mutableSetOf<String?>()

Expand All @@ -102,7 +113,7 @@ object ConnectJobHelper {
}

if (deliveryAppProgressResponseModel.hasPayment) {
if (job.payments.isNotEmpty()){
if (job.payments.isNotEmpty()) {
events.add(PAID_DELIVERY)
}
ConnectJobUtils.storePayments(context, job.payments, job.jobId, true)
Expand All @@ -115,8 +126,11 @@ object ConnectJobHelper {
listener.connectActivityComplete(true)
}

override fun onFailure(errorCode: PersonalIdOrConnectApiErrorCodes, t: Throwable?) {
FirebaseAnalyticsUtil.reportCccApiDeliveryProgress(false,null)
override fun onFailure(
errorCode: PersonalIdOrConnectApiErrorCodes,
t: Throwable?,
) {
FirebaseAnalyticsUtil.reportCccApiDeliveryProgress(false, null)
listener.connectActivityComplete(false)
}
}.getDeliveries(context, user, job)
Expand All @@ -126,39 +140,43 @@ object ConnectJobHelper {
context: Context,
payment: ConnectJobPaymentRecord,
confirmed: Boolean,
listener: ConnectActivityCompleteListener
listener: ConnectActivityCompleteListener,
) {
val user = ConnectUserDatabaseUtil.getUser(context)


object : ConnectApiHandler<Boolean>() {
override fun onSuccess(success: Boolean) {

payment.confirmed = confirmed
ConnectJobUtils.storePayment(context, payment)
FirebaseAnalyticsUtil.reportCccApiPaymentConfirmation(true)
listener.connectActivityComplete(true)
}

override fun onFailure(errorCode: PersonalIdOrConnectApiErrorCodes, t: Throwable?) {
Toast.makeText(
context,
PersonalIdApiErrorHandler.handle(context, errorCode, t),
Toast.LENGTH_LONG
).show()
override fun onFailure(
errorCode: PersonalIdOrConnectApiErrorCodes,
t: Throwable?,
) {
Toast
.makeText(
context,
PersonalIdApiErrorHandler.handle(context, errorCode, t),
Toast.LENGTH_LONG,
).show()
FirebaseAnalyticsUtil.reportCccApiPaymentConfirmation(false)
listener.connectActivityComplete(false)
}
}.setPaymentConfirmation(context, user, payment.paymentId, confirmed)
}

fun retrieveOpportunities(context: Context,
listener: ConnectActivityCompleteListener){
fun retrieveOpportunities(
context: Context,
listener: ConnectActivityCompleteListener,
) {
val user = ConnectUserDatabaseUtil.getUser(context)
object : ConnectApiHandler<ConnectOpportunitiesResponseModel?>() {
override fun onFailure(
errorCode: PersonalIdOrConnectApiErrorCodes,
t: Throwable?
t: Throwable?,
) {
listener.connectActivityComplete(false)
}
Expand All @@ -168,6 +186,4 @@ object ConnectJobHelper {
}
}.getConnectOpportunities(context, user!!)
}


}
81 changes: 47 additions & 34 deletions app/src/org/commcare/connect/network/base/BaseApiCallback.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.commcare.connect.network.base


import org.commcare.android.database.connect.models.PersonalIdSessionData
import org.commcare.connect.network.IApiCallback
import org.commcare.connect.network.base.BaseApiHandler.PersonalIdOrConnectApiErrorCodes
Expand All @@ -14,69 +13,83 @@ import java.io.InputStream
* This is base class for all API callbacks. It by default handles all error messages, no need
* to define the error handling in all api handlers
*/
abstract class BaseApiCallback<T>(val baseApiHandler: BaseApiHandler<T>) :

IApiCallback {
override fun processFailure(responseCode: Int, url: String?, errorBody: String) {
abstract class BaseApiCallback<T>(
val baseApiHandler: BaseApiHandler<T>,
) : IApiCallback {
override fun processFailure(
responseCode: Int,
url: String?,
errorBody: String,
) {
// Common error_code handler used before checking error response code
when (responseCode) {
401 -> baseApiHandler.onFailure(
PersonalIdOrConnectApiErrorCodes.FAILED_AUTH_ERROR,
null
)
401 ->
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.FAILED_AUTH_ERROR,
null,
)

403 -> baseApiHandler.onFailure(
PersonalIdOrConnectApiErrorCodes.FORBIDDEN_ERROR,
null
)
403 ->
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.FORBIDDEN_ERROR,
null,
)

429 -> baseApiHandler.onFailure(
PersonalIdOrConnectApiErrorCodes.RATE_LIMIT_EXCEEDED_ERROR,
null
)
429 ->
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.RATE_LIMIT_EXCEEDED_ERROR,
null,
)

400 -> baseApiHandler.onFailure(
PersonalIdOrConnectApiErrorCodes.BAD_REQUEST_ERROR,null
)
400 ->
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.BAD_REQUEST_ERROR,
null,
)

in 500..509 -> baseApiHandler.onFailure(
PersonalIdOrConnectApiErrorCodes.SERVER_ERROR,
null
)
in 500..509 ->
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.SERVER_ERROR,
null,
)

else -> {
val exception = Exception("Encountered response code $responseCode for url ${url ?: "url not found"}")
val exception =
Exception("Encountered response code $responseCode for url ${url ?: "url not found"}")
Logger.exception("Unknown http response code", exception)
baseApiHandler.onFailure(PersonalIdOrConnectApiErrorCodes.UNKNOWN_ERROR, exception)
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.UNKNOWN_ERROR,
exception,
)
}
}
}

override fun processNetworkFailure() {
baseApiHandler.onFailure(
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.NETWORK_ERROR,
null
null,
)
}

override fun processTokenUnavailableError() {
baseApiHandler.onFailure(
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.TOKEN_UNAVAILABLE_ERROR,
null
null,
)
}

override fun processTokenRequestDeniedError() {
baseApiHandler.onFailure(
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.TOKEN_DENIED_ERROR,
null
null,
)
}

override fun processOldApiError() {
baseApiHandler.onFailure(
baseApiHandler.stopLoadingAndInformError(
PersonalIdOrConnectApiErrorCodes.OLD_API_ERROR,
null
null,
)
}
}
Loading