Skip to content

Commit

Permalink
Added refresh button to progress bar on app home page (to refresh job…
Browse files Browse the repository at this point in the history
… delivery progress).
  • Loading branch information
OrangeAndGreen committed May 15, 2024
1 parent 92cfac8 commit 8ede3b7
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 117 deletions.
12 changes: 11 additions & 1 deletion app/res/layout/home_screen.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,22 @@
android:layout_height="wrap_content"
android:visibility="visible"
>
<ImageView
android:id="@+id/home_connect_refresh"
android:layout_width="32dp"
android:layout_height="32dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="10dp"
android:src="@drawable/cloud_backup"
android:contentDescription="@string/refresh" />
<ProgressBar
android:id="@+id/home_connect_prog_bar"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/home_connect_refresh"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="@dimen/content_start"
android:layout_marginRight="@dimen/content_start"
Expand Down
10 changes: 10 additions & 0 deletions app/src/org/commcare/activities/StandardHomeActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.commcare.CommCareApplication;
import org.commcare.CommCareNoficationManager;
import org.commcare.activities.connect.ConnectManager;
import org.commcare.android.database.connect.models.ConnectJobRecord;
import org.commcare.google.services.analytics.AnalyticsParamValue;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.interfaces.CommCareActivityUIController;
Expand Down Expand Up @@ -292,4 +293,13 @@ public void performSecondaryPhoneVerification() {
updateSecondaryPhoneConfirmationTile();
});
}

public void updateConnectJobProgress() {
ConnectJobRecord job = ConnectManager.getActiveJob();
ConnectManager.updateDeliveryProgress(this, job, success -> {
if(success) {
uiController.updateConnectProgress();
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.content.Context;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

Expand Down Expand Up @@ -58,6 +59,9 @@ public void setupUI() {
connectProgressText = activity.findViewById(R.id.home_connect_prog_text);
connectProgressMaxText = activity.findViewById(R.id.home_connect_prog_max_text);

ImageView refreshButton = activity.findViewById(R.id.home_connect_refresh);
refreshButton.setOnClickListener(v -> activity.updateConnectJobProgress());

updateConnectProgress();
adapter = new HomeScreenAdapter(activity, getHiddenButtons(activity), StandardHomeActivity.isDemoUser());
setupGridView();
Expand Down
148 changes: 131 additions & 17 deletions app/src/org/commcare/activities/connect/ConnectManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.commcare.activities.CommCareActivity;
import org.commcare.android.database.app.models.UserKeyRecord;
import org.commcare.android.database.connect.models.ConnectAppRecord;
import org.commcare.android.database.connect.models.ConnectJobDeliveryRecord;
import org.commcare.android.database.connect.models.ConnectJobPaymentRecord;
import org.commcare.android.database.connect.models.ConnectJobRecord;
import org.commcare.android.database.connect.models.ConnectLinkedAppRecord;
Expand All @@ -44,15 +45,22 @@
import org.commcare.tasks.templates.CommCareTaskConnector;
import org.commcare.utils.CrashUtil;
import org.commcare.views.dialogs.StandardAlertDialog;
import org.javarosa.core.io.StreamsUtil;
import org.javarosa.core.services.Logger;
import org.javarosa.core.util.PropertyUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -270,6 +278,21 @@ public static void forgetUser() {
manager.loginListener = null;
}

public static void setConnectJobForApp(Context context, String appId) {
ConnectAppRecord appRecord = getAppRecord(context, appId);
if(appRecord != null) {
setActiveJob(ConnectDatabaseHelper.getJob(context, appRecord.getJobId()));
}
}

private static ConnectJobRecord activeJob = null;
public static void setActiveJob(ConnectJobRecord job) {
activeJob = job;
}
public static ConnectJobRecord getActiveJob() {
return activeJob;
}

public static void unlockConnect(CommCareActivity<?> parent, ConnectActivityCompleteListener listener) {
if(manager.connectStatus == ConnectIdStatus.LoggedIn) {
ConnectIdWorkflows.unlockConnect(parent, success -> {
Expand Down Expand Up @@ -321,10 +344,6 @@ public static void goToConnectJobsList() {
manager.parentActivity.startActivityForResult(i, task.getRequestCode());
}

public static void goToActiveAppForJob() {

}

public static void goToActiveInfoForJob(Activity activity) {
ConnectTask task = ConnectTask.CONNECT_JOB_INFO;
Intent i = new Intent(activity, task.getNextActivity());
Expand Down Expand Up @@ -637,32 +656,140 @@ public static ConnectLinkedAppRecord prepareConnectManagedApp(Context context, S
return appRecord;
}

public static void updateDeliveryProgress(Context context, ConnectJobRecord job, ConnectActivityCompleteListener listener) {
ApiConnect.getDeliveries(context, job.getJobId(), new IApiCallback() {
private static void reportApiCall(boolean success) {
FirebaseAnalyticsUtil.reportCccApiDeliveryProgress(success);
}

@Override
public void processSuccess(int responseCode, InputStream responseData) {
boolean success = true;
try {
String responseAsString = new String(StreamsUtil.inputStreamToByteArray(responseData));
if (responseAsString.length() > 0) {
//Parse the JSON
JSONObject json = new JSONObject(responseAsString);

boolean updatedJob = false;
String key = "max_payments";
if(json.has(key)) {
job.setMaxVisits(json.getInt(key));
updatedJob = true;
}

key = "end_date";
if(json.has(key)) {
job.setProjectEndDate(ConnectNetworkHelper.parseDate(json.getString(key)));
updatedJob = true;
}

key = "payment_accrued";
if(json.has(key)) {
job.setPaymentAccrued(json.getInt(key));
updatedJob = true;
}

if(updatedJob) {
job.setLastDeliveryUpdate(new Date());
ConnectDatabaseHelper.upsertJob(context, job);
}

List<ConnectJobDeliveryRecord> deliveries = new ArrayList<>(json.length());
key = "deliveries";
if(json.has(key)) {
JSONArray array = json.getJSONArray(key);
for (int i = 0; i < array.length(); i++) {
JSONObject obj = (JSONObject)array.get(i);
deliveries.add(ConnectJobDeliveryRecord.fromJson(obj, job.getJobId()));
}

//Store retrieved deliveries
ConnectDatabaseHelper.storeDeliveries(context, deliveries, job.getJobId(), true);

job.setDeliveries(deliveries);
}

List<ConnectJobPaymentRecord> payments = new ArrayList<>();
key = "payments";
if(json.has(key)) {
JSONArray array = json.getJSONArray(key);
for (int i = 0; i < array.length(); i++) {
JSONObject obj = (JSONObject)array.get(i);
payments.add(ConnectJobPaymentRecord.fromJson(obj, job.getJobId()));
}

ConnectDatabaseHelper.storePayments(context, payments, job.getJobId(), true);

job.setPayments(payments);
}
}
} catch (IOException | JSONException | ParseException e) {
Logger.exception("Parsing return from delivery progress request", e);
success = false;
}

reportApiCall(success);
listener.connectActivityComplete(success);
}

@Override
public void processFailure(int responseCode, IOException e) {
Logger.log("ERROR", String.format(Locale.getDefault(), "Delivery progress call failed: %d", responseCode));
reportApiCall(false);
listener.connectActivityComplete(false);
}

@Override
public void processNetworkFailure() {
Logger.log("ERROR", "Failed (network)");
reportApiCall(false);
listener.connectActivityComplete(false);
}

@Override
public void processOldApiError() {
ConnectNetworkHelper.showOutdatedApiError(context);
reportApiCall(false);
listener.connectActivityComplete(false);
}
});
}

public static void updatePaymentConfirmed(Context context, final ConnectJobPaymentRecord payment, boolean confirmed, ConnectActivityCompleteListener listener) {
ApiConnect.setPaymentConfirmed(context, payment.getPaymentId(), confirmed, new IApiCallback() {
private void reportApiCall(boolean success) {
FirebaseAnalyticsUtil.reportCccApiPaymentConfirmation(success);
}

@Override
public void processSuccess(int responseCode, InputStream responseData) {
payment.setConfirmed(confirmed);
ConnectDatabaseHelper.storePayment(context, payment);

//No need to report to user
reportApiCall(true);
listener.connectActivityComplete(true);
}

@Override
public void processFailure(int responseCode, IOException e) {
Toast.makeText(context, R.string.connect_payment_confirm_failed, Toast.LENGTH_SHORT).show();
reportApiCall(false);
listener.connectActivityComplete(false);
}

@Override
public void processNetworkFailure() {
Toast.makeText(context, R.string.connect_payment_confirm_failed, Toast.LENGTH_SHORT).show();
reportApiCall(false);
listener.connectActivityComplete(false);
}

@Override
public void processOldApiError() {
ConnectNetworkHelper.showOutdatedApiError(context);
reportApiCall(false);
listener.connectActivityComplete(false);
}
});
Expand All @@ -680,18 +807,5 @@ public static String generatePassword() {
return password.toString();
}

public static void setConnectJobForApp(Context context, String appId) {
ConnectAppRecord appRecord = getAppRecord(context, appId);
if(appRecord != null) {
setActiveJob(ConnectDatabaseHelper.getJob(context, appRecord.getJobId()));
}
}

private static ConnectJobRecord activeJob = null;
public static void setActiveJob(ConnectJobRecord job) {
activeJob = job;
}
public static ConnectJobRecord getActiveJob() {
return activeJob;
}
}
Loading

0 comments on commit 8ede3b7

Please sign in to comment.