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
6 changes: 6 additions & 0 deletions app/res/layout/fragment_connect_unlock.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?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">

</androidx.constraintlayout.widget.ConstraintLayout>
7 changes: 7 additions & 0 deletions app/res/navigation/nav_graph_connect.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
android:id="@+id/nav_graph_connect"
app:startDestination="@id/connect_jobs_list_fragment">

<fragment
android:id="@+id/connect_unlock_fragment"
android:name="org.commcare.fragments.connect.ConnectUnlockFragment"
android:label="fragment_connect_unlock"
tools:layout="@layout/fragment_connect_unlock">
</fragment>

<fragment
android:id="@+id/connect_jobs_list_fragment"
android:name="org.commcare.fragments.connect.ConnectJobsListsFragment"
Expand Down
4 changes: 3 additions & 1 deletion app/src/org/commcare/activities/CommCareSetupActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
private void updateConnectButton() {
installFragment.updateConnectButton(!fromManager && !fromExternal && ConnectManager.isConnectIdConfigured(), v -> {
ConnectManager.unlockConnect(this, success -> {
ConnectManager.goToConnectJobsList(this);
if(success) {
ConnectManager.goToConnectJobsList(this);
}
});
});
}
Expand Down
167 changes: 28 additions & 139 deletions app/src/org/commcare/activities/connect/ConnectActivity.java
Original file line number Diff line number Diff line change
@@ -1,54 +1,31 @@
package org.commcare.activities.connect;

import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.Toast;

import com.google.common.base.Strings;

import org.commcare.activities.CommCareActivity;
import org.commcare.activities.CommCareVerificationActivity;
import org.commcare.android.database.connect.models.ConnectJobRecord;
import org.commcare.connect.ConnectDatabaseHelper;
import org.commcare.connect.ConnectManager;
import org.commcare.connect.network.ApiConnect;
import org.commcare.connect.network.ConnectNetworkHelper;
import org.commcare.connect.network.IApiCallback;
import org.commcare.dalvik.R;
import org.commcare.fragments.connect.ConnectDownloadingFragment;
import org.commcare.fragments.connectId.ConnectIdBiometricConfigFragment;
import org.commcare.google.services.analytics.FirebaseAnalyticsUtil;
import org.commcare.tasks.ResourceEngineListener;
import org.commcare.views.dialogs.CustomProgressDialog;
import org.javarosa.core.io.StreamsUtil;
import org.javarosa.core.services.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.annotation.Nullable;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.SearchView;
import androidx.core.content.ContextCompat;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavController;
import androidx.navigation.NavOptions;
Expand All @@ -60,10 +37,6 @@ public class ConnectActivity extends CommCareActivity<ResourceEngineListener> {
String redirectionAction = "";
String opportunityId = "";
NavController navController;
private static final String CCC_OPPORTUNITY_SUMMARY_PAGE = "ccc_opportunity_summary_page";
private static final String CCC_LEARN_PROGRESS = "ccc_learn_progress";
private static final String CCC_DELIVERY_PROGRESS = "ccc_delivery_progress";
public static final String CCC_PAYMENTS = "ccc_payment";

NavController.OnDestinationChangedListener destinationListener = null;

Expand All @@ -83,7 +56,13 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_connect);
setTitle(getString(R.string.connect_title));
getIntentData();

redirectionAction = getIntent().getStringExtra("action");
opportunityId = getIntent().getStringExtra("opportunity_id");
if(opportunityId == null) {
opportunityId = "";
}

updateBackButton();
Window window = getWindow();
window.setStatusBarColor(getResources().getColor(R.color.connect_status_bar_color));
Expand Down Expand Up @@ -111,13 +90,19 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
.setPopUpTo(navController.getGraph().getStartDestinationId(), true)
.build();
navController.navigate(fragmentId, bundle, options);
} else if (redirectionAction != null) {
} else if (!Strings.isNullOrEmpty(redirectionAction)) {
//Entering from a notification, so we may need to initialize
ConnectManager.init(this);
ConnectManager.unlockConnect(this, success -> {
if (success) {
getJobDetails();
}
});

//Navigate to the unlock fragment first, then it will navigate on as desired
NavOptions options = new NavOptions.Builder()
.setPopUpTo(navController.getGraph().getStartDestinationId(), true)
.build();
Bundle bundle = new Bundle();
bundle.putString("action", redirectionAction);
bundle.putString("opportunity_id", opportunityId);
bundle.putBoolean("buttons", getIntent().getBooleanExtra("buttons", true));
navController.navigate(R.id.connect_unlock_fragment, bundle, options);
}
}

Expand All @@ -126,6 +111,13 @@ public void setTitle(CharSequence title) {
super.setTitle(title);
getSupportActionBar().setTitle(title);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @androidx.annotation.Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ConnectManager.handleFinishedActivity(this, requestCode, resultCode, data);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_connect, menu);
Expand All @@ -147,58 +139,6 @@ private Fragment getCurrentFragment() {
navHostFragment.getChildFragmentManager().getPrimaryNavigationFragment();
return currentFragment;
}
/**
* Returns the fragment ID based on the redirection action.
* <p>
* This method determines which fragment should be displayed based on the value of the redirectionAction.
* It maps specific actions to their corresponding fragment IDs.
*
* @return The ID of the fragment to be displayed.
*/
private int getFragmentId() {
int fragmentId;
if (redirectionAction.equals(CCC_OPPORTUNITY_SUMMARY_PAGE)) {
fragmentId = R.id.connect_job_intro_fragment;
} else if (redirectionAction.equals(CCC_LEARN_PROGRESS)) {
fragmentId = R.id.connect_job_learning_progress_fragment;
} else {
fragmentId = R.id.connect_job_delivery_progress_fragment;
}
return fragmentId;
}

private void getIntentData() {
redirectionAction = getIntent().getStringExtra("action");
opportunityId = getIntent().getStringExtra("opportunity_id");
}

/**
* Sets the fragment redirection based on the redirection action.
* <p>
* This method determines the fragment to be displayed using the getFragmentId() method,
* prepares a bundle with additional data, and navigates to the appropriate fragment.
*/
private void setFragmentRedirection(boolean ApiSuccess) {
if (ApiSuccess) {
int fragmentId = getFragmentId();

boolean buttons = getIntent().getBooleanExtra("buttons", true);
Bundle bundle = new Bundle();
bundle.putBoolean("showLaunch", buttons);

// Set the tab position in the bundle based on the redirection action
if (redirectionAction.equals(CCC_DELIVERY_PROGRESS)) {
bundle.putString("tabPosition", "0");
} else if (redirectionAction.equals(CCC_PAYMENTS)) {
bundle.putString("tabPosition", "1");
}

NavOptions options = new NavOptions.Builder()
.setPopUpTo(navController.getGraph().getStartDestinationId(), true)
.build();
navController.navigate(fragmentId, bundle, options);
}
}

@Override
public void onBackPressed() {
Expand Down Expand Up @@ -274,55 +214,4 @@ public void startAppValidation() {
i.putExtra(CommCareVerificationActivity.KEY_LAUNCH_FROM_SETTINGS, true);
verificationLauncher.launch(i);
}

public void getJobDetails() {
ApiConnect.getConnectOpportunities(ConnectActivity.this, new IApiCallback() {
@Override
public void processSuccess(int responseCode, InputStream responseData) {
try {
String responseAsString = new String(StreamsUtil.inputStreamToByteArray(responseData));
if (responseAsString.length() > 0) {
//Parse the JSON
JSONArray json = new JSONArray(responseAsString);
List<ConnectJobRecord> jobs = new ArrayList<>(json.length());
for (int i = 0; i < json.length(); i++) {
JSONObject obj = (JSONObject) json.get(i);
ConnectJobRecord job = ConnectJobRecord.fromJson(obj);
jobs.add(job);
if (job.getJobId() == Integer.parseInt(opportunityId)) {
ConnectManager.setActiveJob(job);
}
}
ConnectDatabaseHelper.storeJobs(ConnectActivity.this, jobs, true);
setFragmentRedirection(true);
}
} catch (IOException | JSONException | ParseException e) {
setFragmentRedirection(false);
Toast.makeText(ConnectActivity.this, R.string.connect_job_list_api_failure, Toast.LENGTH_SHORT).show();
Logger.exception("Parsing return from Opportunities request", e);
}
}

@Override
public void processFailure(int responseCode, IOException e) {
setFragmentRedirection(false);
Toast.makeText(ConnectActivity.this, R.string.connect_job_list_api_failure, Toast.LENGTH_SHORT).show();
Logger.log("ERROR", String.format(Locale.getDefault(), "Opportunities call failed: %d", responseCode));
}

@Override
public void processNetworkFailure() {
setFragmentRedirection(false);
Toast.makeText(ConnectActivity.this, R.string.recovery_network_unavailable, Toast.LENGTH_SHORT).show();
Logger.log("ERROR", "Failed (network)");
}

@Override
public void processOldApiError() {
setFragmentRedirection(false);
Toast.makeText(ConnectActivity.this, R.string.connect_job_list_api_failure, Toast.LENGTH_SHORT).show();
ConnectNetworkHelper.showOutdatedApiError(ConnectActivity.this);
}
});
}
}
4 changes: 4 additions & 0 deletions app/src/org/commcare/connect/ConnectConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ public class ConnectConstants {
public static final String NEW_APP = "new-app";
public static final String LEARN_APP = "learn-app";
public static final String DELIVERY_APP = "delivery-app";
public static final String CCC_DEST_OPPORTUNITY_SUMMARY_PAGE = "ccc_opportunity_summary_page";
public static final String CCC_DEST_LEARN_PROGRESS = "ccc_learn_progress";
public static final String CCC_DEST_DELIVERY_PROGRESS = "ccc_delivery_progress";
public static final String CCC_DEST_PAYMENTS = "ccc_payment";

public final static int CONNECT_NO_ACTIVITY = ConnectConstants.ConnectIdTaskIdOffset;
public final static int CONNECT_REGISTRATION_PRIMARY_PHONE = ConnectConstants.ConnectIdTaskIdOffset + 2;
Expand Down
Loading