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
22 changes: 15 additions & 7 deletions app/src/org/commcare/activities/FormEntryActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,6 @@
import androidx.appcompat.app.ActionBar;
import androidx.core.app.ActivityCompat;

import static org.commcare.activities.components.FormEntryConstants.DO_NOT_EXIT;
import static org.commcare.activities.components.FormEntryConstants.EXIT;
import static org.commcare.android.database.user.models.FormRecord.QuarantineReason_LOCAL_PROCESSING_ERROR;
import static org.commcare.android.database.user.models.FormRecord.QuarantineReason_RECORD_ERROR;
import static org.commcare.sync.FirebaseMessagingDataSyncer.PENGING_SYNC_ALERT_ACTION;
Expand Down Expand Up @@ -596,7 +594,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
startActivityForResult(pref, FormEntryConstants.FORM_PREFERENCES_KEY);
return true;
case android.R.id.home:
FirebaseAnalyticsUtil.reportFormQuitAttempt(AnalyticsParamValue.NAV_BUTTON_PRESS);
FirebaseAnalyticsUtil.reportFormQuitAttempt(AnalyticsParamValue.NAV_BUTTON_PRESS, getCurrentFormXmlnsFailSafe());
triggerUserQuitInput();
return true;

Expand Down Expand Up @@ -1131,12 +1129,12 @@ private InterruptedFormState retrieveAndValidateFormIndex(AndroidSessionWrapper

private void handleFormLoadCompletion(AndroidFormController fc) {
HiddenPreferences.clearInterruptedFormState();

if (PollSensorAction.XPATH_ERROR_ACTION.equals(locationRecieverErrorAction)) {
handleXpathErrorBroadcast();
}

mFormController = fc;
FirebaseAnalyticsUtil.reportFormEntry(getCurrentFormXmlnsFailSafe());

// Newer menus may have already built the menu, before all data was ready
invalidateOptionsMenu();
Expand Down Expand Up @@ -1217,7 +1215,7 @@ protected void triggerUserFormComplete() {
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
FirebaseAnalyticsUtil.reportFormQuitAttempt(AnalyticsParamValue.BACK_BUTTON_PRESS);
FirebaseAnalyticsUtil.reportFormQuitAttempt(AnalyticsParamValue.BACK_BUTTON_PRESS, getCurrentFormXmlnsFailSafe());
triggerUserQuitInput();
return true;
case KeyEvent.KEYCODE_DPAD_RIGHT:
Expand Down Expand Up @@ -1296,6 +1294,7 @@ public void savingComplete(SaveToDiskTask.SaveStatus saveStatus, String errorMes
}
} else if (saveStatus != null) {
String toastMessage = "";
FirebaseAnalyticsUtil.reportFormFinishAttempt(saveStatus.toString(), getCurrentFormXmlnsFailSafe(), userTriggered);
switch (saveStatus) {
case SAVED_COMPLETE:
toastMessage = Localization.get("form.entry.complete.save.success");
Expand Down Expand Up @@ -1432,7 +1431,7 @@ private void finishReturnInstance(boolean reportSaved) {
protected boolean onBackwardSwipe() {
FirebaseAnalyticsUtil.reportFormNav(
AnalyticsParamValue.DIRECTION_BACKWARD,
AnalyticsParamValue.SWIPE);
AnalyticsParamValue.SWIPE, getCurrentFormXmlnsFailSafe());

uiController.showPreviousView(true);
return true;
Expand All @@ -1442,7 +1441,7 @@ protected boolean onBackwardSwipe() {
protected boolean onForwardSwipe() {
FirebaseAnalyticsUtil.reportFormNav(
AnalyticsParamValue.DIRECTION_FORWARD,
AnalyticsParamValue.SWIPE);
AnalyticsParamValue.SWIPE, getCurrentFormXmlnsFailSafe());

if (canNavigateForward()) {
uiController.next();
Expand Down Expand Up @@ -1682,6 +1681,15 @@ private int getCurrentFormID() {
return mFormController.getFormID();
}

public String getCurrentFormXmlnsFailSafe() {
try {
return mFormController.getFormEntryController().getModel().getForm().getMainInstance().schema;
} catch (Exception e) {
Logger.exception("Error trying to get form schema", e);
}
return null;
}

/**
* For Testing purposes only
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ public void setupUI() {
nextButton.setOnClickListener(v -> {
FirebaseAnalyticsUtil.reportFormNav(
AnalyticsParamValue.DIRECTION_FORWARD,
AnalyticsParamValue.NAV_BUTTON_PRESS);
AnalyticsParamValue.NAV_BUTTON_PRESS,
activity.getCurrentFormXmlnsFailSafe());
showNextView();
TextToSpeechConverter.INSTANCE.stop();
});
Expand All @@ -120,10 +121,12 @@ public void setupUI() {
if (!FormEntryConstants.NAV_STATE_QUIT.equals(v.getTag())) {
FirebaseAnalyticsUtil.reportFormNav(
AnalyticsParamValue.DIRECTION_BACKWARD,
AnalyticsParamValue.NAV_BUTTON_PRESS);
AnalyticsParamValue.NAV_BUTTON_PRESS,
activity.getCurrentFormXmlnsFailSafe());
showPreviousView(true);
} else {
FirebaseAnalyticsUtil.reportFormQuitAttempt(AnalyticsParamValue.NAV_BUTTON_PRESS);
FirebaseAnalyticsUtil.reportFormQuitAttempt(AnalyticsParamValue.NAV_BUTTON_PRESS,
activity.getCurrentFormXmlnsFailSafe());
activity.triggerUserQuitInput();
}
TextToSpeechConverter.INSTANCE.stop();
Expand All @@ -132,7 +135,8 @@ public void setupUI() {
finishButton.setOnClickListener(v -> {
FirebaseAnalyticsUtil.reportFormNav(
AnalyticsParamValue.DIRECTION_FORWARD,
AnalyticsParamValue.NAV_BUTTON_PRESS);
AnalyticsParamValue.NAV_BUTTON_PRESS,
activity.getCurrentFormXmlnsFailSafe());
activity.triggerUserFormComplete();
});

Expand Down
10 changes: 8 additions & 2 deletions app/src/org/commcare/activities/HomeButtons.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,10 @@ private static TextSetter getSyncButtonTextSetter(final StandardHomeActivity act
}

private static View.OnClickListener getStartButtonListener(final StandardHomeActivity activity) {
return v -> activity.enterRootModule();
return v -> {
reportButtonClick(AnalyticsParamValue.START_BUTTON);
activity.enterRootModule();
};
}

private static View.OnClickListener getTrainingButtonListener(final StandardHomeActivity activity) {
Expand Down Expand Up @@ -185,7 +188,10 @@ private static TextSetter getIncompleteButtonTextSetter(final StandardHomeActivi
}

private static View.OnClickListener getLogoutButtonListener(final StandardHomeActivity activity) {
return v -> activity.userTriggeredLogout();
return v -> {
reportButtonClick(AnalyticsParamValue.LOGOUT_BUTTON);
activity.userTriggeredLogout();
};
}

private static TextSetter getLogoutButtonTextSetter(final StandardHomeActivity activity) {
Expand Down
3 changes: 2 additions & 1 deletion app/src/org/commcare/activities/components/MenuList.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.commcare.activities.HomeScreenBaseActivity;
import org.commcare.adapters.MenuAdapter;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.session.SessionFrame;
import org.commcare.suite.model.Entry;
import org.commcare.suite.model.Menu;
Expand Down Expand Up @@ -90,7 +91,7 @@ public void onItemClick(AdapterView listView, View view, int position, long id)
} else {
commandId = ((Menu)value).getId();
}

FirebaseAnalyticsUtil.reportMenuItemClick(commandId);
Intent i = new Intent(activity.getIntent());
i.putExtra(SessionFrame.STATE_COMMAND_ID, commandId);
if (beingUsedInHomeScreen) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ public class AnalyticsParamValue {
public static final String SAVED_FORMS_BUTTON = "saved_forms";
public static final String INCOMPLETE_FORMS_BUTTON = "incomplete_forms";
public static final String SYNC_BUTTON = "sync";
public static final String START_BUTTON = "start";
public static final String LOGOUT_BUTTON = "logout";
public static final String SYNC_SUBTEXT = "sync_subtext";
public static final String REPORT_BUTTON = "report_an_issue";

Expand Down Expand Up @@ -139,4 +141,10 @@ public class AnalyticsParamValue {

public static final String IN_APP_UPDATE_SUCCESS = "success";

// Param values for Form Submission Event

public static final String USER_TRIGGERED = "user_triggered";
public static final String SYSTEM_TRIGGERED = "system_triggered";


}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ public class CCAnalyticsEvent {
static final String ENABLE_PRIVILEGE = "enable_privilege";
static final String ENTITY_DETAIL_NAVIGATION = "entity_detail_navigation";
static final String FEATURE_USAGE = "feature_usage";
static final String FORM_ENTRY_ATTEMPT = "form_entry_attempt";
static final String FORM_EXIT_ATTEMPT = "form_exit_attempt";
static final String FORM_FINISH_ATTEMPT = "form_finish_attempt";
static final String FORM_UPLOAD_ATTEMPT = "form_upload_attempt";
static final String FORM_NAVIGATION = "form_navigation";
static final String GRAPH_ACTION = "graphing_action";
static final String HOME_BUTTON_CLICK = "home_button_click";
Expand All @@ -25,6 +28,7 @@ public class CCAnalyticsEvent {
static final String VIEW_QUESTION_MEDIA = "view_question_media";
static final String COMMON_COMMCARE_EVENT = "common_commcare_event";
static final String FORM_QUARANTINE_EVENT = "form_quarantine_event";
static final String MENU_SCREEN_ITEM_CLICK = "menu_screen_item_click";
static final String IN_APP_UPDATE_EVENT = "in_app_update_event";

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ public class CCAnalyticsParam {
static final String TIME_IN_MINUTES = "time_in_minutes";
static final String MODE = "mode";
static final String REASON = "reason";
static final String RESULT = "result";
static final String UI_STATE = "uite_state";
static final String USERNAME = "username";
static final String FORM_ID = "form_id";

static final String USER_RETURNED = "user_returned";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.commcare.google.services.analytics;

import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
Expand All @@ -13,9 +12,8 @@
import org.commcare.preferences.MainConfigurablePreferences;
import org.commcare.suite.model.OfflineUserRestore;
import org.commcare.utils.EncryptionUtils;
import org.commcare.utils.FormUploadResult;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;

import static org.commcare.google.services.analytics.AnalyticsParamValue.CORRUPT_APP_STATE;
Expand Down Expand Up @@ -174,16 +172,32 @@ private static void reportGraphingAction(String actionType) {
CCAnalyticsParam.ACTION_TYPE, actionType);
}

public static void reportFormNav(String direction, String method) {
public static void reportFormEntry(String formId) {
reportEvent(CCAnalyticsEvent.FORM_ENTRY_ATTEMPT,
new String[]{CCAnalyticsParam.FORM_ID},
new String[]{formId});
}

public static void reportFormNav(String direction, String method, String formId) {
if (rateLimitReporting(.1)) {
reportEvent(CCAnalyticsEvent.FORM_NAVIGATION,
new String[]{CCAnalyticsParam.DIRECTION, FirebaseAnalytics.Param.METHOD},
new String[]{direction, method});
new String[]{CCAnalyticsParam.DIRECTION, FirebaseAnalytics.Param.METHOD, CCAnalyticsParam.FORM_ID},
new String[]{direction, method, formId});
}
}

public static void reportFormQuitAttempt(String method) {
reportEvent(CCAnalyticsEvent.FORM_EXIT_ATTEMPT, FirebaseAnalytics.Param.METHOD, method);
public static void reportFormQuitAttempt(String method, String formId) {
reportEvent(CCAnalyticsEvent.FORM_EXIT_ATTEMPT,
new String[]{FirebaseAnalytics.Param.METHOD, CCAnalyticsParam.FORM_ID},
new String[]{method, formId});
}

public static void reportFormFinishAttempt(String saveResult, String formId, boolean userTriggered) {
String method = userTriggered ? AnalyticsParamValue.USER_TRIGGERED : AnalyticsParamValue.SYSTEM_TRIGGERED;
reportEvent(CCAnalyticsEvent.FORM_FINISH_ATTEMPT,
new String[]{CCAnalyticsParam.FORM_ID, CCAnalyticsParam.RESULT,
FirebaseAnalytics.Param.METHOD},
new String[]{formId, saveResult, method});
}

/**
Expand Down Expand Up @@ -341,4 +355,16 @@ public static void reportFormQuarantined(String quarantineReasonType) {
new String[]{FirebaseAnalytics.Param.ITEM_ID},
new String[]{quarantineReasonType});
}

public static void reportMenuItemClick(String commandId) {
reportEvent(CCAnalyticsEvent.MENU_SCREEN_ITEM_CLICK,
new String[]{FirebaseAnalytics.Param.ITEM_ID},
new String[]{commandId});
}

public static void reportFormUploadAttempt(FormUploadResult first, Integer second) {
reportEvent(CCAnalyticsEvent.FORM_UPLOAD_ATTEMPT,
new String[]{CCAnalyticsParam.RESULT, FirebaseAnalytics.Param.VALUE},
new String[]{String.valueOf(first), String.valueOf(second)});
}
}
9 changes: 6 additions & 3 deletions app/src/org/commcare/sync/FormSubmissionHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.models.FormRecordProcessor;
import org.commcare.modern.util.Pair;
import org.commcare.preferences.ServerUrls;
import org.commcare.suite.model.Profile;
import org.commcare.tasks.DataSubmissionListener;
Expand Down Expand Up @@ -159,10 +160,12 @@ FormUploadResult uploadForms() {
} catch (SessionUnavailableException sue) {
return FormUploadResult.PROGRESS_LOGGED_OUT;
} finally {
boolean success =
FormUploadResult.FULL_SUCCESS.equals(FormUploadResult.getWorstResult(mResults));
Pair<FormUploadResult, Integer> resultWithSuccessCount =
FormUploadResult.getWorstResultWithSuccessCount(mResults);
boolean success = FormUploadResult.FULL_SUCCESS.equals(resultWithSuccessCount.first);
endSubmissionProcess(success);

FirebaseAnalyticsUtil.reportFormUploadAttempt(resultWithSuccessCount.first,
resultWithSuccessCount.second);
synchronized (processTasks) {
processTasks.remove(this);
}
Expand Down
11 changes: 10 additions & 1 deletion app/src/org/commcare/utils/FormUploadResult.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.commcare.utils;

import org.commcare.modern.util.Pair;
import org.commcare.views.notifications.MessageTag;

/**
Expand Down Expand Up @@ -115,12 +116,20 @@ public void setErrorMessage(String errorMessage) {
}

public static FormUploadResult getWorstResult(FormUploadResult[] results) {
return getWorstResultWithSuccessCount(results).first;
}

public static Pair<FormUploadResult, Integer> getWorstResultWithSuccessCount(FormUploadResult[] results) {
int successCount = 0;
FormUploadResult worstResult = FULL_SUCCESS;
for (FormUploadResult result : results) {
if (result == FULL_SUCCESS) {
successCount++;
}
if (result.orderVal > worstResult.orderVal) {
worstResult = result;
}
}
return worstResult;
return new Pair<>(worstResult, successCount);
}
}
Loading