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
1 change: 1 addition & 0 deletions app/src/org/commcare/activities/LoginActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
handleConnectButtonPress();
return true;
case MENU_CONNECT_SIGN_OUT:
FirebaseAnalyticsUtil.reportCccSignOut();
ConnectIDManager.signOut();
uiController.refreshView();
uiController.setPasswordOrPin("");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.commcare.android.database.app.models.UserKeyRecord;
import org.commcare.android.database.global.models.ApplicationRecord;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.interfaces.CommCareActivityUIController;
import org.commcare.models.database.SqlStorage;
import org.commcare.preferences.DevSessionRestorer;
Expand Down Expand Up @@ -151,7 +152,10 @@ public void setupUI() {

connectLoginButton.setOnClickListener(arg0 -> activity.handleConnectButtonPress());

loginButton.setOnClickListener(arg0 -> activity.initiateLoginAttempt(isRestoreSessionChecked()));
loginButton.setOnClickListener(arg0 -> {
FirebaseAnalyticsUtil.reportLoginClicks();
activity.initiateLoginAttempt(isRestoreSessionChecked());
});

passwordOrPin.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import androidx.biometric.BiometricPrompt;
import androidx.core.content.ContextCompat;

import org.commcare.google.services.analytics.AnalyticsParamValue;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.utils.BiometricsHelper;
import org.commcare.activities.CommCareActivity;
import org.commcare.interfaces.CommCareActivityUIController;
Expand Down Expand Up @@ -134,6 +136,7 @@ public void onAuthenticationError(int errorCode,
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
logSuccess();
finish(true, false, false);
}

Expand All @@ -148,6 +151,12 @@ public void onAuthenticationFailed() {
});
}

private void logSuccess() {
String method = attemptingFingerprint ? AnalyticsParamValue.CCC_SIGN_IN_METHOD_FINGERPRINT
: AnalyticsParamValue.CCC_SIGN_IN_METHOD_PIN;
FirebaseAnalyticsUtil.reportCccSignIn(method);
}

private void finish(boolean success, boolean password, boolean recover) {
Intent intent = new Intent(getIntent());

Expand Down
3 changes: 3 additions & 0 deletions app/src/org/commcare/activities/connect/ConnectIDManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import org.commcare.android.database.connect.models.ConnectUserRecord;
import org.commcare.core.network.AuthInfo;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.AnalyticsParamValue;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.preferences.AppManagerDeveloperPreferences;

import java.util.Date;
Expand Down Expand Up @@ -537,6 +539,7 @@ public static void handleFinishedActivity(int requestCode, int resultCode, Inten
manager.forgotPassword = false;
manager.connectStatus = ConnectIDStatus.LoggedIn;
manager.loginListener.connectActivityComplete(true);
FirebaseAnalyticsUtil.reportCccSignIn(AnalyticsParamValue.CCC_SIGN_IN_METHOD_PASSWORD);

ConnectUserRecord user = ConnectIDDatabaseHelper.getUser(manager.parentActivity);
user.setLastPasswordDate(new Date());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.commcare.android.database.connect.models.ConnectUserRecord;
import org.commcare.core.network.AuthInfo;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.AnalyticsParamValue;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.interfaces.CommCareActivityUIController;
import org.commcare.interfaces.WithUIController;
import org.javarosa.core.io.StreamsUtil;
Expand Down Expand Up @@ -85,6 +87,7 @@ public void finish(boolean success, boolean forgot, String username, String name

public void handleWrongPassword() {
failureCount++;
logRecoveryResult(false);
uiController.clearPassword();

int requestCode = PASSWORD_FAIL;
Expand All @@ -103,6 +106,10 @@ public void handleWrongPassword() {
startActivityForResult(messageIntent, requestCode);
}

private void logRecoveryResult(boolean success) {
FirebaseAnalyticsUtil.reportCccRecovery(success, AnalyticsParamValue.CCC_RECOVERY_METHOD_PASSWORD);
}

public void handleForgotPress() {
finish(true, true, null, null, null);
}
Expand All @@ -113,6 +120,7 @@ public void handleButtonPress() {
if(user != null) {
//If we have the password stored locally, no need for network call
if(password.equals(user.getPassword())) {
logRecoveryResult(true);
finish(true, false, null, null, null);
}
else {
Expand Down Expand Up @@ -149,7 +157,7 @@ public void processSuccess(int responseCode, InputStream responseData) {
catch(IOException | JSONException e) {
Logger.exception("Parsing return from OTP request", e);
}

logRecoveryResult(true);
finish(true, false, username, name, password);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

import org.commcare.activities.CommCareActivity;
import org.commcare.core.network.AuthInfo;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.AnalyticsParamValue;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.interfaces.CommCareActivityUIController;
import org.commcare.interfaces.WithUIController;
import org.javarosa.core.io.StreamsUtil;
Expand Down Expand Up @@ -236,6 +237,7 @@ public void processSuccess(int responseCode, InputStream responseData) {
Logger.exception("Parsing return from confirm_secondary_otp", e);
}
}
logRecoveryResult(true);
finish(true, false, username, displayName, recoveryPhone);
}

Expand All @@ -248,12 +250,22 @@ public void processFailure(int responseCode, IOException e) {
else if(e != null) {
message = e.toString();
}

logRecoveryResult(false);
uiController.setErrorMessage(String.format("Error verifying SMS code. %s", message));
}
});
}

private void logRecoveryResult(boolean success) {
if (method != MethodRegistrationPrimary) {
String methodParam = AnalyticsParamValue.CCC_RECOVERY_METHOD_PRIMARY_OTP;
if (method == MethodRecoveryAlternate) {
methodParam = AnalyticsParamValue.CCC_RECOVERY_METHOD_ALTERNATE_OTP;
}
FirebaseAnalyticsUtil.reportCccRecovery(success, methodParam);
}
}

public void changeNumber() {
finish(true, true, null, null, null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,15 @@ public class AnalyticsParamValue {

public static final String IN_APP_UPDATE_SUCCESS = "success";

// Param values for connect signin
public static final String CCC_SIGN_IN_METHOD_PIN = "pin";
public static final String CCC_SIGN_IN_METHOD_FINGERPRINT = "fingerprint";
public static final String CCC_SIGN_IN_METHOD_PASSWORD = "password";


// Param values for connect recovery
public static final String CCC_RECOVERY_METHOD_PRIMARY_OTP = "primary_otp";
public static final String CCC_RECOVERY_METHOD_ALTERNATE_OTP = "alternate_otp";
public static final String CCC_RECOVERY_METHOD_PASSWORD = "password";

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,10 @@ public class CCAnalyticsEvent {
static final String COMMON_COMMCARE_EVENT = "common_commcare_event";
static final String FORM_QUARANTINE_EVENT = "form_quarantine_event";
static final String IN_APP_UPDATE_EVENT = "in_app_update_event";
static final String LOGIN_CLICK = "login_click";

static final String CCC_SIGN_IN = "ccc_sign_in";
static final String CCC_SIGN_OUT = "ccc_sign_out";
static final String CCC_RECOVERY = "ccc_recovery";

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class CCAnalyticsParam {
static final String CCHQ_DOMAIN = "cchq_domain";
static final String SERVER = "server";
static final String FREE_DISK = "free_disk";
static final String CCC_ENABLED = "ccc_enabled";

static final String ACTION_TYPE = "action_type";
static final String DIRECTION = "direction";
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 @@ -9,13 +8,12 @@

import org.commcare.CommCareApplication;
import org.commcare.DiskUtils;
import org.commcare.activities.connect.ConnectIDManager;
import org.commcare.android.logging.ReportingUtils;
import org.commcare.preferences.MainConfigurablePreferences;
import org.commcare.suite.model.OfflineUserRestore;
import org.commcare.utils.EncryptionUtils;

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

import static org.commcare.google.services.analytics.AnalyticsParamValue.CORRUPT_APP_STATE;
Expand All @@ -36,6 +34,11 @@ public class FirebaseAnalyticsUtil {
// constant to approximate time taken by an user to go to the video playing app after clicking on the video
private static final long VIDEO_USAGE_ERROR_APPROXIMATION = 3;


private static void reportEvent(String eventName){
reportEvent(eventName, new Bundle());
}

private static void reportEvent(String eventName, String paramKey, String paramVal) {
reportEvent(eventName, new String[]{paramKey}, new String[]{paramVal});
}
Expand Down Expand Up @@ -75,7 +78,7 @@ private static void setUserProperties(FirebaseAnalytics analyticsInstance) {
}

String buildProfileID = ReportingUtils.getAppBuildProfileId();
if (!TextUtils.isEmpty(appId)) {
if (!TextUtils.isEmpty(buildProfileID)) {
analyticsInstance.setUserProperty(CCAnalyticsParam.CC_APP_BUILD_PROFILE_ID, buildProfileID);
}

Expand All @@ -88,6 +91,9 @@ private static void setUserProperties(FirebaseAnalytics analyticsInstance) {
if (!TextUtils.isEmpty(freeDiskBucket)) {
analyticsInstance.setUserProperty(CCAnalyticsParam.FREE_DISK, freeDiskBucket);
}

analyticsInstance.setUserProperty(CCAnalyticsParam.CCC_ENABLED,
String.valueOf(ConnectIDManager.isConnectIDIntroduced()));
}

private static String getFreeDiskBucket() {
Expand Down Expand Up @@ -341,4 +347,25 @@ public static void reportFormQuarantined(String quarantineReasonType) {
new String[]{FirebaseAnalytics.Param.ITEM_ID},
new String[]{quarantineReasonType});
}

public static void reportCccSignIn(String method) {
reportEvent(CCAnalyticsEvent.CCC_SIGN_IN,
new String[]{FirebaseAnalytics.Param.METHOD},
new String[]{method});
}

public static void reportCccRecovery(boolean success, String method) {
Bundle b = new Bundle();
b.putLong(FirebaseAnalytics.Param.SUCCESS, success ? 1 : 0);
b.putString(FirebaseAnalytics.Param.METHOD, method);
reportEvent(CCAnalyticsEvent.CCC_RECOVERY, b);
}

public static void reportCccSignOut() {
reportEvent(CCAnalyticsEvent.CCC_SIGN_OUT);
}

public static void reportLoginClicks() {
reportEvent(CCAnalyticsEvent.LOGIN_CLICK);
}
}