Skip to content

Commit

Permalink
Merge pull request #2755 from dimagi/dv/nav_fixes
Browse files Browse the repository at this point in the history
Navigation fixes for Connect workflows
  • Loading branch information
OrangeAndGreen authored May 21, 2024
2 parents b171736 + 3634d16 commit 1e74701
Show file tree
Hide file tree
Showing 20 changed files with 308 additions and 127 deletions.
1 change: 1 addition & 0 deletions app/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@
<activity android:name="org.commcare.activities.connect.ConnectIdMessageActivity"/>
<activity android:name="org.commcare.activities.connect.ConnectIdPinActivity"/>
<activity android:name="org.commcare.activities.connect.ConnectActivity"/>
<activity android:name="org.commcare.activities.connect.ConnectJobInfoActivity"/>
<activity android:name="org.commcare.activities.AppSelectActivity"/>

<provider
Expand Down
2 changes: 2 additions & 0 deletions app/res/layout/screen_connect.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph_connect"
/>

</androidx.constraintlayout.widget.ConstraintLayout>
16 changes: 16 additions & 0 deletions app/res/layout/screen_connect_job_info.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">

<androidx.fragment.app.FragmentContainerView
android:id="@+id/connect_job_info_container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
1 change: 1 addition & 0 deletions app/res/navigation/nav_graph_connect.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph_connect"
app:startDestination="@id/connect_jobs_list_fragment"
>

<fragment
Expand Down
7 changes: 1 addition & 6 deletions app/src/org/commcare/activities/DispatchActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,7 @@ private void dispatch() {
launchHomeScreen();
}
} catch (SessionUnavailableException sue) {
if(!userTriggeredLogout || ConnectManager.getShouldLock() || !ConnectManager.wasAppLaunchedFromConnect(currentApp.getUniqueId())) {
launchLoginScreen();
}
else {
finish();
}
launchLoginScreen();
}
}
}
Expand Down
12 changes: 7 additions & 5 deletions app/src/org/commcare/activities/LoginActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public class LoginActivity extends CommCareActivity<LoginActivity>
private FormAndDataSyncer formAndDataSyncer;
private String presetAppId;
private boolean appLaunchedFromConnect;
private boolean appAutoLaunchPerformed;
private boolean connectLaunchPerformed;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -130,8 +130,8 @@ protected void onCreate(Bundle savedInstanceState) {
uiController.updateConnectLoginState();

presetAppId = getIntent().getStringExtra(EXTRA_APP_ID);
appAutoLaunchPerformed = false;
appLaunchedFromConnect = ConnectManager.wasAppLaunchedFromConnect(presetAppId);
connectLaunchPerformed = false;

if (savedInstanceState == null) {
// Only restore last user on the initial creation
Expand Down Expand Up @@ -469,6 +469,8 @@ public void handleConnectButtonPress() {
ConnectManager.unlockConnect(this, success -> {
if(success) {
ConnectManager.goToConnectJobsList();
setResult(RESULT_OK);
finish();
}
});
}
Expand Down Expand Up @@ -512,13 +514,13 @@ public void registerConnectIdUser() {
private void checkForSavedCredentials() {
boolean loginWithConnectIDVisible = false;
if (ConnectManager.isConnectIdIntroduced()) {
if (appLaunchedFromConnect) {
if (appLaunchedFromConnect && !connectLaunchPerformed) {
loginWithConnectIDVisible = true;
uiController.setConnectButtonVisible(false);
uiController.setUsername(getString(R.string.login_input_auto));
uiController.setPasswordOrPin(getString(R.string.login_input_auto));
if(!seatAppIfNeeded(presetAppId) && !appAutoLaunchPerformed) {
appAutoLaunchPerformed = true;
if(!seatAppIfNeeded(presetAppId)) {
connectLaunchPerformed = true;
initiateLoginAttempt(uiController.isRestoreSessionChecked());
}
} else {
Expand Down
53 changes: 13 additions & 40 deletions app/src/org/commcare/activities/connect/ConnectActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,62 +47,35 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
setTitle(getString(R.string.connect_title));
updateBackButton();

boolean showJobInfo = getIntent().getBooleanExtra("info", false);

destinationListener = FirebaseAnalyticsUtil.getDestinationChangeListener();

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

NavGraph graph = navController.getNavInflater().inflate(R.navigation.nav_graph_connect);

int startId = showJobInfo ? R.id.connect_job_intro_fragment : R.id.connect_jobs_list_fragment;
ConnectJobRecord job = ConnectManager.getActiveJob();
if(showJobInfo && job != null) {
switch(job.getStatus()) {
case ConnectJobRecord.STATUS_AVAILABLE,
ConnectJobRecord.STATUS_AVAILABLE_NEW -> {
startId = R.id.connect_job_intro_fragment;
}
case ConnectJobRecord.STATUS_LEARNING -> {
startId = R.id.connect_job_learning_progress_fragment;
}
case ConnectJobRecord.STATUS_DELIVERING -> {
startId = R.id.connect_job_delivery_progress_fragment;
}
}
}

graph.setStartDestination(startId);
navController.setGraph(graph);
}

@Override
public void onBackPressed() {
if(backButtonEnabled) {
NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment_connect);
if(navHostFragment != null) {
int count = navHostFragment.getChildFragmentManager().getBackStackEntryCount();
if(count > 0) {
NavController navController = navHostFragment.getNavController();
navController.getNavInflater();
navController.popBackStack();
} else {
finish();
}
}
super.onBackPressed();
// NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager()
// .findFragmentById(R.id.nav_host_fragment_connect);
// if(navHostFragment != null) {
// int count = navHostFragment.getChildFragmentManager().getBackStackEntryCount();
// if(count > 0) {
// NavController navController = navHostFragment.getNavController();
// navController.getNavInflater();
// navController.popBackStack();
// } else {
// finish();
// }
// }
}
}

@Override
protected void onResume() {
super.onResume();
if(ConnectManager.getShouldLock()) {
ConnectManager.setShouldLock(false);
finish();
}
}

@Override
Expand Down
140 changes: 140 additions & 0 deletions app/src/org/commcare/activities/connect/ConnectJobInfoActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package org.commcare.activities.connect;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavController;
import androidx.navigation.fragment.NavHostFragment;

import org.commcare.activities.CommCareActivity;
import org.commcare.activities.CommCareVerificationActivity;
import org.commcare.android.database.connect.models.ConnectJobRecord;
import org.commcare.dalvik.R;
import org.commcare.fragments.connect.ConnectDeliveryProgressFragment;
import org.commcare.fragments.connect.ConnectDownloadingFragment;
import org.commcare.fragments.connect.ConnectJobIntroFragment;
import org.commcare.fragments.connect.ConnectLearningProgressFragment;
import org.commcare.tasks.ResourceEngineListener;
import org.commcare.views.dialogs.CustomProgressDialog;

import javax.annotation.Nullable;

public class ConnectJobInfoActivity extends CommCareActivity<ResourceEngineListener> {
private boolean backButtonEnabled = true;
private boolean waitDialogEnabled = true;

ActivityResultLauncher<Intent> verificationLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
ConnectDownloadingFragment connectDownloadFragment = getConnectDownloadFragment();
if (connectDownloadFragment != null) {
connectDownloadFragment.onSuccessfulVerification();
}
}
});

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_connect_job_info);
setTitle(getString(R.string.connect_title));
updateBackButton();

Fragment fragment = null;
ConnectJobRecord job = ConnectManager.getActiveJob();
if(job != null) {
switch(job.getStatus()) {
case ConnectJobRecord.STATUS_LEARNING -> {
fragment = ConnectLearningProgressFragment.newInstance(false);
}
case ConnectJobRecord.STATUS_DELIVERING -> {
fragment = ConnectDeliveryProgressFragment.newInstance(false, false);
}
}
}

if(fragment == null) {
fragment = ConnectJobIntroFragment.newInstance(false);
}

getSupportFragmentManager().beginTransaction()
.add(R.id.connect_job_info_container, fragment).commit();
}

@Override
public void onBackPressed() {
if(backButtonEnabled) {
super.onBackPressed();
}
}

@Override
protected void onResume() {
super.onResume();
}

@Override
protected void onDestroy() {
super.onDestroy();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
ConnectManager.handleFinishedActivity(requestCode, resultCode, intent);
super.onActivityResult(requestCode, resultCode, intent);
}

@Override
public CustomProgressDialog generateProgressDialog(int taskId) {
if(waitDialogEnabled) {
return CustomProgressDialog.newInstance(null, getString(R.string.please_wait), taskId);
}

return null;
}

public void setBackButtonEnabled(boolean enabled) { backButtonEnabled = enabled; }
public void setWaitDialogEnabled(boolean enabled) { waitDialogEnabled = enabled; }

private void updateBackButton() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayShowHomeEnabled(isBackEnabled());
actionBar.setDisplayHomeAsUpEnabled(isBackEnabled());
}
}

@Override
protected boolean shouldShowBreadcrumbBar() {
return false;
}

@Override
public ResourceEngineListener getReceiver() {
return getConnectDownloadFragment();
}

@Nullable
private ConnectDownloadingFragment getConnectDownloadFragment() {
NavHostFragment navHostFragment =
(NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_connect);
Fragment currentFragment =
navHostFragment.getChildFragmentManager().getPrimaryNavigationFragment();
if (currentFragment instanceof ConnectDownloadingFragment) {
return (ConnectDownloadingFragment)currentFragment;
}
return null;
}

public void startAppValidation() {
Intent i = new Intent(this, CommCareVerificationActivity.class);
i.putExtra(CommCareVerificationActivity.KEY_LAUNCH_FROM_SETTINGS, true);
verificationLauncher.launch(i);
}
}
17 changes: 4 additions & 13 deletions app/src/org/commcare/activities/connect/ConnectManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,6 @@ public interface ConnectActivityCompleteListener {

private String primedAppIdForAutoLogin = null;

//Remembers that we should lock ConnectId once we've entered an app
private boolean shouldLock = false;

//Singleton, private constructor
private ConnectManager() {
}
Expand Down Expand Up @@ -343,14 +340,13 @@ public static void verifySecondaryPhone(CommCareActivity<?> parent, ConnectActiv
public static void goToConnectJobsList() {
ConnectTask task = ConnectTask.CONNECT_MAIN;
Intent i = new Intent(manager.parentActivity, task.getNextActivity());
manager.parentActivity.startActivityForResult(i, task.getRequestCode());
manager.parentActivity.startActivity(i);
}

public static void goToActiveInfoForJob(Activity activity) {
ConnectTask task = ConnectTask.CONNECT_JOB_INFO;
Intent i = new Intent(activity, task.getNextActivity());
i.putExtra("info", true);
activity.startActivityForResult(i, task.getRequestCode());
activity.startActivity(i);
}

public static void forgetAppCredentials(String appId, String userId) {
Expand Down Expand Up @@ -447,7 +443,7 @@ public static void checkConnectIdLink(CommCareActivity<?> activity, boolean auto
//Link the HQ user by aqcuiring the SSO token for the first time
ConnectSsoHelper.retrieveHqSsoTokenAsync(activity, username, true, auth -> {
if(auth == null) {
Toast.makeText(activity, "Failed to acquire SSO token", Toast.LENGTH_SHORT).show();
//Toast.makeText(activity, "Failed to acquire SSO token", Toast.LENGTH_SHORT).show();
//TODO: Re-enable when token working again
//ConnectManager.forgetAppCredentials(appId, username);
}
Expand Down Expand Up @@ -590,25 +586,20 @@ public void hideTaskCancelButton() {
}
}

public static boolean getShouldLock() { return getInstance().shouldLock; }
public static void setShouldLock(boolean shouldLock) {
getInstance().shouldLock = shouldLock;
}

public static void launchApp(Context context, boolean isLearning, String appId) {
CommCareApplication.instance().closeUserSession();

String appType = isLearning ? "Learn" : "Deliver";
FirebaseAnalyticsUtil.reportCccAppLaunch(appType, appId);

getInstance().primedAppIdForAutoLogin = appId;
getInstance().shouldLock = true;

CommCareLauncher.launchCommCareForAppId(context, appId);
}

public static boolean wasAppLaunchedFromConnect(String appId) {
String primed = getInstance().primedAppIdForAutoLogin;
getInstance().primedAppIdForAutoLogin = null;
return primed != null && primed.equals(appId);
}

Expand Down
2 changes: 1 addition & 1 deletion app/src/org/commcare/activities/connect/ConnectTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public enum ConnectTask {
CONNECT_UNLOCK_VERIFY_ALT_PHONE(ConnectConstants.ConnectIdTaskIdOffset + 33,
ConnectIdPhoneVerificationActivity.class),
CONNECT_JOB_INFO(ConnectConstants.ConnectIdTaskIdOffset + 34,
ConnectActivity.class),
ConnectJobInfoActivity.class),
CONNECT_REGISTRATION_CHANGE_PIN(ConnectConstants.ConnectIdTaskIdOffset + 35,
ConnectIdPinActivity.class),
;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.commcare.activities.connect;

public interface IConnectAppLauncher {
void launchApp(String appId, boolean isLearning);
}
Loading

0 comments on commit 1e74701

Please sign in to comment.