Skip to content
4 changes: 3 additions & 1 deletion app/assets/locales/android_translatable_strings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ sync.fail.recovery.failure=There was an error trying to recover from a bad local
sync.fail.unsent=Having issues communicating with the server to send forms. Will try again later.
sync.fail.individual=1 or more forms failed to send due to individual problems. See quarantined forms for details.
sync.fail.invalid.case.graph=1 or more forms introduced an invalid case relationship.
sync.fail.token.unavailable=Couldn't contact server. Please make sure an internet connection is available or try again later.
sync.fail.token.denied=Please re-login into your ConnectID account, then try again.

form.send.rate.limit.error.toast=Form submission rate limit reached. Your forms are being saved locally and will be submitted to the server later.
form.send.rate.limit.error.title=You've reached your form submission rate limit
Expand Down Expand Up @@ -561,7 +563,7 @@ notification.token.unavailable.action=Check your device's time and date to make

notification.token.denied.title=Couldn't connect to the server.
notification.token.denied.detail=CommCare can no longer communicate with the ConnectID server.
notification.token.denied.action=Please recover your ConnectID account, then try again.
notification.token.denied.action=Please re-login into your ConnectID account, then try again.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@OrangeAndGreen Given we are moving away from recover workflow, I changed this to re-login but think there is a better word out there that I am missing here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree in the change but not sure of a better term. This is short-lived anyway I think until we can provide a better user experience for situations like this


notification.restore.storagefull.title=Couldn't save your application's resources
notification.restore.storagefull.detail=CommCare was not able to save one or more of your application's resources on the device. This could be because the entire application was too large, or because an individual fixture exceeded 1MB.
Expand Down
9 changes: 5 additions & 4 deletions app/src/org/commcare/activities/LoginActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
registerConnectIdUser();
return true;
case MENU_CONNECT_FORGET:
FirebaseAnalyticsUtil.reportCccForget();
connectIDManager.forgetUser(AnalyticsParamValue.CCC_FORGOT_USER_LOGIN_PAGE);
uiController.setPasswordOrPin("");
setConnectAppState(Unmanaged);
Expand Down Expand Up @@ -809,11 +810,11 @@ public void handlePullTaskResult(ResultAndError<DataPullTask.PullTaskResult> res
case EMPTY_URL:
raiseLoginMessage(StockMessages.Empty_Url, true);
break;
case TOKEN_UNAVAILABLE:
raiseLoginMessage(StockMessages.TokenUnavailable, false);
case TOKEN_DENIED:
raiseLoginMessage(StockMessages.TokenDenied, false);
case AUTH_FAILED:
if (connectIDManager.isSeatedAppLinkedToConnectId(uiController.getEnteredUsername())) {
Logger.exception("Token auth error for connect managed app",
new Throwable("Token Auth failed during login for a ConnectID managed app"));
}
raiseLoginMessage(StockMessages.Auth_BadCredentials, false);
break;
case BAD_DATA_REQUIRES_INTERVENTION:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.commcare.connect.database.ConnectUserDatabaseUtil;
import org.commcare.connect.ConnectIDManager;
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 @@ -158,7 +159,10 @@ public void setupUI() {
setTextChangeListeners();
setBannerLayoutLogic();

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
@@ -0,0 +1,39 @@
package org.commcare.activities;

import android.os.Bundle;

import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;

import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;

import javax.annotation.Nullable;

public abstract class NavigationHostCommCareActivity<R> extends CommCareActivity<R>{

private NavController.OnDestinationChangedListener destinationListener;

protected NavController navController;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResource());
destinationListener = FirebaseAnalyticsUtil.getNavControllerPageChangeLoggingListener();
navController = getHostFragment().getNavController();
navController.addOnDestinationChangedListener(destinationListener);
}

@Override
protected void onDestroy() {
super.onDestroy();
NavController navController = getHostFragment().getNavController();
navController.removeOnDestinationChangedListener(destinationListener);
destinationListener = null;
}

protected abstract int getLayoutResource();

protected abstract NavHostFragment getHostFragment();
}
18 changes: 6 additions & 12 deletions app/src/org/commcare/activities/SyncCapableCommCareActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
import androidx.annotation.LayoutRes;

import org.commcare.CommCareApplication;
import org.commcare.connect.ConnectIDManager;
import org.commcare.connect.ConnectManager;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.AnalyticsParamValue;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
Expand All @@ -32,7 +30,6 @@
import org.commcare.views.dialogs.StandardAlertDialog;
import org.commcare.views.notifications.NotificationActionButtonInfo;
import org.commcare.views.notifications.NotificationMessageFactory;
import org.javarosa.core.services.Logger;
import org.javarosa.core.services.locale.Localization;

public abstract class SyncCapableCommCareActivity<T> extends SessionAwareCommCareActivity<T>
Expand Down Expand Up @@ -99,20 +96,17 @@ public void handlePullTaskResult(ResultAndError<DataPullTask.PullTaskResult> res
}

DataPullTask.PullTaskResult result = resultAndError.data;


switch (result) {
case EMPTY_URL:
updateUiAfterDataPullOrSend(Localization.get("sync.fail.empty.url"), FAIL);
break;
case TOKEN_UNAVAILABLE:
updateUiAfterDataPullOrSend(Localization.get("sync.fail.token.unavailable"), FAIL);
break;
case TOKEN_DENIED:
updateUiAfterDataPullOrSend(Localization.get("sync.fail.token.denied"), FAIL);
break;
case AUTH_FAILED:
String username = CommCareApplication.instance().getRecordForCurrentUser().getUsername();

if(ConnectIDManager.getInstance().isSeatedAppLinkedToConnectId(username)) {
Logger.exception("Token auth error for connect managed app",
new Throwable("Token Auth failed during sync for a ConnectID managed app"));
}

updateUiAfterDataPullOrSend(Localization.get("sync.fail.auth.loggedin"), FAIL);
break;
case BAD_DATA:
Expand Down
54 changes: 19 additions & 35 deletions app/src/org/commcare/activities/connect/ConnectActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,45 +10,40 @@
import android.view.Menu;
import android.view.MenuItem;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.Fragment;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.navigation.NavOptions;
import androidx.navigation.fragment.NavHostFragment;

import com.google.common.base.Strings;

import org.commcare.activities.CommCareActivity;
import org.commcare.activities.CommCareVerificationActivity;
import org.commcare.activities.NavigationHostCommCareActivity;
import org.commcare.android.database.connect.models.ConnectJobRecord;
import org.commcare.connect.ConnectIDManager;
import org.commcare.connect.MessageManager;
import org.commcare.connect.ConnectManager;
import org.commcare.connect.MessageManager;
import org.commcare.connect.database.ConnectMessagingDatabaseHelper;
import org.commcare.dalvik.R;
import org.commcare.fragments.connect.ConnectDownloadingFragment;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.services.CommCareFirebaseMessagingService;
import org.commcare.tasks.ResourceEngineListener;
import org.commcare.views.dialogs.CustomProgressDialog;
import org.javarosa.core.services.Logger;

import javax.annotation.Nullable;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.Fragment;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.navigation.NavController;
import androidx.navigation.NavOptions;
import androidx.navigation.fragment.NavHostFragment;

public class ConnectActivity extends CommCareActivity<ResourceEngineListener> {
public class ConnectActivity extends NavigationHostCommCareActivity<ResourceEngineListener> {
private boolean backButtonAndActionBarEnabled = true;
private boolean waitDialogEnabled = true;
String redirectionAction = "";
String opportunityId = "";
NavController navController;
MenuItem messagingMenuItem = null;

NavController.OnDestinationChangedListener destinationListener = null;

final ActivityResultLauncher<Intent> verificationLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
Expand All @@ -63,7 +58,6 @@ public class ConnectActivity extends CommCareActivity<ResourceEngineListener> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_connect);
setTitle(getString(R.string.connect_title));

redirectionAction = getIntent().getStringExtra("action");
Expand All @@ -74,12 +68,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {

updateBackButton();

destinationListener = FirebaseAnalyticsUtil.getDestinationChangeListener();

NavHostFragment host = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_connect);
navController = host.getNavController();
navController.addOnDestinationChangedListener(destinationListener);

if (getIntent().getBooleanExtra("info", false)) {
ConnectJobRecord job = ConnectManager.getActiveJob();
int fragmentId = job.getStatus() == ConnectJobRecord.STATUS_DELIVERING ?
Expand Down Expand Up @@ -204,18 +192,14 @@ public void onBackPressed() {
}

@Override
protected void onDestroy() {
if (destinationListener != null) {
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment_connect);
if (navHostFragment != null) {
NavController navController = navHostFragment.getNavController();
navController.removeOnDestinationChangedListener(destinationListener);
}
destinationListener = null;
}
protected int getLayoutResource() {
return R.layout.screen_connect;
}

super.onDestroy();
@Override
protected NavHostFragment getHostFragment() {
return (NavHostFragment) getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment_connect);
}

@Override
Expand Down
39 changes: 20 additions & 19 deletions app/src/org/commcare/activities/connect/ConnectIdActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,34 @@
import android.content.Intent;
import android.os.Bundle;

import org.commcare.fragments.connectId.ConnectIdBiometricConfigFragment;
import org.commcare.activities.CommCareActivity;
import org.commcare.android.database.connect.models.ConnectUserRecord;
import org.commcare.connect.ConnectConstants;
import org.commcare.connect.database.ConnectUserDatabaseUtil;
import org.commcare.connect.ConnectIDManager;
import org.commcare.fragments.connectId.ConnectIDSignupFragmentDirections;
import org.commcare.dalvik.R;
import org.commcare.views.dialogs.CustomProgressDialog;

import androidx.appcompat.app.ActionBar;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavController;
import androidx.navigation.NavDirections;
import androidx.navigation.fragment.NavHostFragment;

import org.commcare.activities.NavigationHostCommCareActivity;
import org.commcare.android.database.connect.models.ConnectUserRecord;
import org.commcare.connect.ConnectConstants;
import org.commcare.connect.ConnectIDManager;
import org.commcare.connect.database.ConnectUserDatabaseUtil;
import org.commcare.dalvik.R;
import org.commcare.fragments.connectId.ConnectIDSignupFragmentDirections;
import org.commcare.fragments.connectId.ConnectIdBiometricConfigFragment;
import org.commcare.utils.CommCareNavController;
import org.commcare.views.dialogs.CustomProgressDialog;

public class ConnectIdActivity extends CommCareActivity<ConnectIdActivity> {
public class ConnectIdActivity extends NavigationHostCommCareActivity<ConnectIdActivity> {

public boolean forgotPassword = false;
public boolean forgotPin = false;
public String recoverPhone;
public String recoverSecret;
public String recoveryAltPhone;
private NavController controller;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connect_id);
controller = getHostFragment().getNavController();
handleRedirection(getIntent());

updateBackButton();
}

Expand Down Expand Up @@ -80,7 +75,13 @@ private ConnectIdBiometricConfigFragment getCurrentFragment() {
return null;
}

private NavHostFragment getHostFragment() {
@Override
protected int getLayoutResource() {
return R.layout.activity_connect_id;
}

@Override
protected NavHostFragment getHostFragment() {
NavHostFragment navHostFragment =
(NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_connectid);
return navHostFragment;
Expand Down Expand Up @@ -148,7 +149,7 @@ private void beginRegistration(Context parent) {
break;
}

CommCareNavController.navigateSafely(controller,navDirections);
CommCareNavController.navigateSafely(navController,navDirections);

}

Expand All @@ -168,7 +169,7 @@ private void beginSecondaryPhoneVerification(Context parent) {
ConnectConstants.CONNECT_VERIFY_ALT_PHONE_MESSAGE,
parent.getString(R.string.connect_password_fail_button),
parent.getString(R.string.connect_recovery_alt_change_button),null,null);
CommCareNavController.navigateSafely(controller,navDirections);
CommCareNavController.navigateSafely(navController,navDirections);

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import org.commcare.android.database.connect.models.ConnectMessagingChannelRecord;
import org.commcare.android.database.connect.models.ConnectMessagingMessageRecord;
import org.commcare.connect.ConnectIDManager;
import org.commcare.connect.database.ConnectDatabaseHelper;
import org.commcare.connect.ConnectManager;
import org.commcare.connect.database.ConnectMessagingDatabaseHelper;
import org.commcare.dalvik.R;
Expand All @@ -29,7 +28,7 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_connect_messaging);
setTitle(R.string.connect_messaging_title);

destinationListener = FirebaseAnalyticsUtil.getDestinationChangeListener();
destinationListener = FirebaseAnalyticsUtil.getNavControllerPageChangeLoggingListener();

NavHostFragment navHostFragment =
(NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_connect_messaging);
Expand Down
Loading