diff --git a/app/AndroidManifest.xml b/app/AndroidManifest.xml index 36cca38d93..ec6ae13e4b 100644 --- a/app/AndroidManifest.xml +++ b/app/AndroidManifest.xml @@ -171,6 +171,7 @@ + \ No newline at end of file diff --git a/app/res/layout/screen_connect_job_info.xml b/app/res/layout/screen_connect_job_info.xml new file mode 100644 index 0000000000..ef0a0bd132 --- /dev/null +++ b/app/res/layout/screen_connect_job_info.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/res/navigation/nav_graph_connect.xml b/app/res/navigation/nav_graph_connect.xml index 98e9492101..fa30cd2b1e 100644 --- a/app/res/navigation/nav_graph_connect.xml +++ b/app/res/navigation/nav_graph_connect.xml @@ -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" > private FormAndDataSyncer formAndDataSyncer; private String presetAppId; private boolean appLaunchedFromConnect; - private boolean appAutoLaunchPerformed; + private boolean connectLaunchPerformed; @Override protected void onCreate(Bundle savedInstanceState) { @@ -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 @@ -469,6 +469,8 @@ public void handleConnectButtonPress() { ConnectManager.unlockConnect(this, success -> { if(success) { ConnectManager.goToConnectJobsList(); + setResult(RESULT_OK); + finish(); } }); } @@ -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 { diff --git a/app/src/org/commcare/activities/connect/ConnectActivity.java b/app/src/org/commcare/activities/connect/ConnectActivity.java index 3e6641b26c..250f6bb758 100644 --- a/app/src/org/commcare/activities/connect/ConnectActivity.java +++ b/app/src/org/commcare/activities/connect/ConnectActivity.java @@ -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 diff --git a/app/src/org/commcare/activities/connect/ConnectJobInfoActivity.java b/app/src/org/commcare/activities/connect/ConnectJobInfoActivity.java new file mode 100644 index 0000000000..48f45a5215 --- /dev/null +++ b/app/src/org/commcare/activities/connect/ConnectJobInfoActivity.java @@ -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 { + private boolean backButtonEnabled = true; + private boolean waitDialogEnabled = true; + + ActivityResultLauncher 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); + } +} diff --git a/app/src/org/commcare/activities/connect/ConnectManager.java b/app/src/org/commcare/activities/connect/ConnectManager.java index 42b3b7f7e5..3ff121f5ab 100644 --- a/app/src/org/commcare/activities/connect/ConnectManager.java +++ b/app/src/org/commcare/activities/connect/ConnectManager.java @@ -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() { } @@ -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) { @@ -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); } @@ -590,11 +586,6 @@ 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(); @@ -602,13 +593,13 @@ public static void launchApp(Context context, boolean isLearning, String appId) 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); } diff --git a/app/src/org/commcare/activities/connect/ConnectTask.java b/app/src/org/commcare/activities/connect/ConnectTask.java index 720d9d4ea6..a5e5609afe 100644 --- a/app/src/org/commcare/activities/connect/ConnectTask.java +++ b/app/src/org/commcare/activities/connect/ConnectTask.java @@ -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), ; diff --git a/app/src/org/commcare/activities/connect/IConnectAppLauncher.java b/app/src/org/commcare/activities/connect/IConnectAppLauncher.java new file mode 100644 index 0000000000..6ffa534458 --- /dev/null +++ b/app/src/org/commcare/activities/connect/IConnectAppLauncher.java @@ -0,0 +1,5 @@ +package org.commcare.activities.connect; + +public interface IConnectAppLauncher { + void launchApp(String appId, boolean isLearning); +} diff --git a/app/src/org/commcare/adapters/ConnectJobAdapter.java b/app/src/org/commcare/adapters/ConnectJobAdapter.java index 209c1711db..1147f48e9a 100644 --- a/app/src/org/commcare/adapters/ConnectJobAdapter.java +++ b/app/src/org/commcare/adapters/ConnectJobAdapter.java @@ -10,6 +10,7 @@ import org.commcare.activities.connect.ConnectDatabaseHelper; import org.commcare.activities.connect.ConnectManager; +import org.commcare.activities.connect.IConnectAppLauncher; import org.commcare.android.database.connect.models.ConnectJobRecord; import org.commcare.dalvik.R; import org.commcare.fragments.connect.ConnectDeliveryProgressFragmentDirections; @@ -33,9 +34,11 @@ public class ConnectJobAdapter extends RecyclerView.Adapter { // String title = null; // String message = null; @@ -75,6 +81,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, }); Button reviewButton = view.findViewById(R.id.connect_progress_review_button); + reviewButton.setVisibility(showLearningLaunch ? View.VISIBLE : View.GONE); reviewButton.setOnClickListener(v -> { launchLearningApp(reviewButton); }); @@ -86,6 +93,7 @@ private void launchLearningApp(Button button) { ConnectJobRecord job = ConnectManager.getActiveJob(); if(ConnectManager.isAppInstalled(job.getLearnAppInfo().getAppId())) { ConnectManager.launchApp(getContext(), true, job.getLearnAppInfo().getAppId()); + getActivity().finish(); } else { String title = getString(R.string.connect_downloading_learn); @@ -97,6 +105,7 @@ private void launchDeliveryApp(Button button) { ConnectJobRecord job = ConnectManager.getActiveJob(); if(ConnectManager.isAppInstalled(job.getDeliveryAppInfo().getAppId())) { ConnectManager.launchApp(getContext(), false, job.getDeliveryAppInfo().getAppId()); + getActivity().finish(); } else { String title = getString(R.string.connect_downloading_delivery); diff --git a/app/src/org/commcare/fragments/connect/ConnectDeliveryProgressFragment.java b/app/src/org/commcare/fragments/connect/ConnectDeliveryProgressFragment.java index a0d36a4bd6..b4fd144a76 100644 --- a/app/src/org/commcare/fragments/connect/ConnectDeliveryProgressFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectDeliveryProgressFragment.java @@ -54,13 +54,18 @@ public class ConnectDeliveryProgressFragment extends Fragment { private ConstraintLayout paymentAlertTile; private TextView paymentAlertText; private ConnectJobPaymentRecord paymentToConfirm = null; + private boolean showLearningLaunch = true; + private boolean showDeliveryLaunch = true; public ConnectDeliveryProgressFragment() { // Required empty public constructor } - public static ConnectDeliveryProgressFragment newInstance() { - return new ConnectDeliveryProgressFragment(); + public static ConnectDeliveryProgressFragment newInstance(boolean showLearningLaunch, boolean showDeliveryLaunch) { + ConnectDeliveryProgressFragment fragment = new ConnectDeliveryProgressFragment(); + fragment.showLearningLaunch = showLearningLaunch; + fragment.showDeliveryLaunch = showDeliveryLaunch; + return fragment; } @Override @@ -106,7 +111,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, }); final ViewPager2 pager = view.findViewById(R.id.connect_delivery_progress_view_pager); - viewStateAdapter = new ConnectDeliveryProgressFragment.ViewStateAdapter(getChildFragmentManager(), getLifecycle()); + viewStateAdapter = new ConnectDeliveryProgressFragment.ViewStateAdapter(getChildFragmentManager(), + getLifecycle(), showLearningLaunch, showDeliveryLaunch); pager.setAdapter(viewStateAdapter); final TabLayout tabLayout = view.findViewById(R.id.connect_delivery_progress_tabs); @@ -206,15 +212,19 @@ private void updateUpdatedDate(Date lastUpdate) { private static class ViewStateAdapter extends FragmentStateAdapter { private static ConnectDeliveryProgressDeliveryFragment deliveryFragment = null; private static ConnectResultsSummaryListFragment verificationFragment = null; - public ViewStateAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { + private boolean showLearningLaunch; + private boolean showDeliveryLaunch; + public ViewStateAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, boolean showLearningLaunch, boolean showDeliveryLaunch) { super(fragmentManager, lifecycle); + this.showLearningLaunch = showLearningLaunch; + this.showDeliveryLaunch = showDeliveryLaunch; } @NonNull @Override public Fragment createFragment(int position) { if (position == 0) { - deliveryFragment = ConnectDeliveryProgressDeliveryFragment.newInstance(); + deliveryFragment = ConnectDeliveryProgressDeliveryFragment.newInstance(showLearningLaunch, showDeliveryLaunch); return deliveryFragment; } diff --git a/app/src/org/commcare/fragments/connect/ConnectDownloadingFragment.java b/app/src/org/commcare/fragments/connect/ConnectDownloadingFragment.java index 90c33f911a..211dc5e75a 100644 --- a/app/src/org/commcare/fragments/connect/ConnectDownloadingFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectDownloadingFragment.java @@ -122,6 +122,7 @@ public void onSuccessfulVerification() { ConnectJobRecord job = ConnectManager.getActiveJob(); ConnectAppRecord appToLaunch = getLearnApp ? job.getLearnAppInfo() : job.getDeliveryAppInfo(); ConnectManager.launchApp(getContext(), getLearnApp, appToLaunch.getAppId()); + getActivity().finish(); } else { //Go to learn/deliver progress diff --git a/app/src/org/commcare/fragments/connect/ConnectJobIntroFragment.java b/app/src/org/commcare/fragments/connect/ConnectJobIntroFragment.java index 03c5a74204..133665affd 100644 --- a/app/src/org/commcare/fragments/connect/ConnectJobIntroFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectJobIntroFragment.java @@ -34,12 +34,15 @@ * @author dviggiano */ public class ConnectJobIntroFragment extends Fragment { + private boolean showLaunchButton; public ConnectJobIntroFragment() { // Required empty public constructor } - public static ConnectJobIntroFragment newInstance() { - return new ConnectJobIntroFragment(); + public static ConnectJobIntroFragment newInstance(boolean showLaunchButton) { + ConnectJobIntroFragment fragment = new ConnectJobIntroFragment(); + fragment.showLaunchButton = showLaunchButton; + return fragment; } @Override @@ -83,45 +86,48 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, final boolean appInstalled = ConnectManager.isAppInstalled(job.getLearnAppInfo().getAppId()); Button button = view.findViewById(R.id.connect_job_intro_start_button); - button.setText(getString(appInstalled ? R.string.connect_job_go_to_learn_app : R.string.connect_job_download_learn_app)); - button.setOnClickListener(v -> { - //First, need to tell Connect we're starting learning so it can create a user on HQ - ApiConnect.startLearnApp(getContext(), job.getJobId(), new IApiCallback() { - @Override - public void processSuccess(int responseCode, InputStream responseData) { - reportApiCall(true); - //TODO: Expecting to eventually get HQ username from server here - NavDirections directions; - if (appInstalled) { - directions = ConnectJobIntroFragmentDirections.actionConnectJobIntroFragmentToConnectJobLearningProgressFragment(); - } else { - String title = getString(R.string.connect_downloading_learn); - directions = ConnectJobIntroFragmentDirections.actionConnectJobIntroFragmentToConnectDownloadingFragment(title, true, false); + button.setVisibility(showLaunchButton ? View.VISIBLE : View.GONE); + if(showLaunchButton) { + button.setText(getString(appInstalled ? R.string.connect_job_go_to_learn_app : R.string.connect_job_download_learn_app)); + button.setOnClickListener(v -> { + //First, need to tell Connect we're starting learning so it can create a user on HQ + ApiConnect.startLearnApp(getContext(), job.getJobId(), new IApiCallback() { + @Override + public void processSuccess(int responseCode, InputStream responseData) { + reportApiCall(true); + //TODO: Expecting to eventually get HQ username from server here + NavDirections directions; + if (appInstalled) { + directions = ConnectJobIntroFragmentDirections.actionConnectJobIntroFragmentToConnectJobLearningProgressFragment(); + } else { + String title = getString(R.string.connect_downloading_learn); + directions = ConnectJobIntroFragmentDirections.actionConnectJobIntroFragmentToConnectDownloadingFragment(title, true, false); + } + + Navigation.findNavController(button).navigate(directions); } - Navigation.findNavController(button).navigate(directions); - } - - @Override - public void processFailure(int responseCode, IOException e) { - Toast.makeText(getContext(), "Connect: error starting learning", Toast.LENGTH_SHORT).show(); - reportApiCall(false); - //TODO: Log the message from the server - } - - @Override - public void processNetworkFailure() { - ConnectNetworkHelper.showNetworkError(getContext()); - reportApiCall(false); - } - - @Override - public void processOldApiError() { - ConnectNetworkHelper.showOutdatedApiError(getContext()); - reportApiCall(false); - } + @Override + public void processFailure(int responseCode, IOException e) { + Toast.makeText(getContext(), "Connect: error starting learning", Toast.LENGTH_SHORT).show(); + reportApiCall(false); + //TODO: Log the message from the server + } + + @Override + public void processNetworkFailure() { + ConnectNetworkHelper.showNetworkError(getContext()); + reportApiCall(false); + } + + @Override + public void processOldApiError() { + ConnectNetworkHelper.showOutdatedApiError(getContext()); + reportApiCall(false); + } + }); }); - }); + } return view; } diff --git a/app/src/org/commcare/fragments/connect/ConnectJobsAvailableListFragment.java b/app/src/org/commcare/fragments/connect/ConnectJobsAvailableListFragment.java index 30272dfa6c..faed6f7ef2 100644 --- a/app/src/org/commcare/fragments/connect/ConnectJobsAvailableListFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectJobsAvailableListFragment.java @@ -5,6 +5,7 @@ import android.view.View; import android.view.ViewGroup; +import org.commcare.activities.connect.IConnectAppLauncher; import org.commcare.adapters.ConnectJobAdapter; import org.commcare.dalvik.R; @@ -20,12 +21,15 @@ */ public class ConnectJobsAvailableListFragment extends Fragment { private ConnectJobAdapter adapter; + private IConnectAppLauncher launcher; public ConnectJobsAvailableListFragment() { // Required empty public constructor } - public static ConnectJobsAvailableListFragment newInstance() { - return new ConnectJobsAvailableListFragment(); + public static ConnectJobsAvailableListFragment newInstance(IConnectAppLauncher appLauncher) { + ConnectJobsAvailableListFragment fragment = new ConnectJobsAvailableListFragment(); + fragment.launcher = appLauncher; + return fragment; } @Override @@ -45,7 +49,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), linearLayoutManager.getOrientation())); - adapter = new ConnectJobAdapter(true); + adapter = new ConnectJobAdapter(true, launcher); recyclerView.setAdapter(adapter); return view; diff --git a/app/src/org/commcare/fragments/connect/ConnectJobsListsFragment.java b/app/src/org/commcare/fragments/connect/ConnectJobsListsFragment.java index 2ff42d7719..66def3afd7 100644 --- a/app/src/org/commcare/fragments/connect/ConnectJobsListsFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectJobsListsFragment.java @@ -21,6 +21,7 @@ import org.commcare.activities.CommCareActivity; import org.commcare.activities.connect.ConnectDatabaseHelper; import org.commcare.activities.connect.ConnectManager; +import org.commcare.activities.connect.IConnectAppLauncher; import org.commcare.connect.network.ConnectNetworkHelper; import org.commcare.android.database.connect.models.ConnectJobRecord; import org.commcare.CommCareApplication; @@ -53,13 +54,16 @@ public class ConnectJobsListsFragment extends Fragment { private ViewPager2 viewPager; private ViewStateAdapter viewStateAdapter; private TextView updateText; + private IConnectAppLauncher launcher; public ConnectJobsListsFragment() { // Required empty public constructor } - public static ConnectJobsListsFragment newInstance() { - return new ConnectJobsListsFragment(); + public static ConnectJobsListsFragment newInstance(IConnectAppLauncher appLauncher) { + ConnectJobsListsFragment fragment = new ConnectJobsListsFragment(); + fragment.launcher = appLauncher; + return fragment; } @Override @@ -85,7 +89,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, refreshButton.setOnClickListener(v -> refreshData()); viewPager = view.findViewById(R.id.jobs_view_pager); - viewStateAdapter = new ViewStateAdapter(getChildFragmentManager(), getLifecycle()); + viewStateAdapter = new ViewStateAdapter(getChildFragmentManager(), getLifecycle(), (appId, isLearning) -> { + //Launch app and finish this activity + ConnectManager.launchApp(getActivity(), isLearning, appId); + getActivity().finish(); + }); viewPager.setAdapter(viewStateAdapter); tabLayout = view.findViewById(R.id.connect_jobs_tabs); @@ -217,20 +225,22 @@ private void chooseTab() { private static class ViewStateAdapter extends FragmentStateAdapter { static ConnectJobsAvailableListFragment availableFragment; static ConnectJobsMyListFragment myFragment; + IConnectAppLauncher launcher; - public ViewStateAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { + public ViewStateAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, IConnectAppLauncher appLauncher) { super(fragmentManager, lifecycle); + launcher = appLauncher; } @NonNull @Override public Fragment createFragment(int position) { if (position == 0) { - availableFragment = ConnectJobsAvailableListFragment.newInstance(); + availableFragment = ConnectJobsAvailableListFragment.newInstance(launcher); return availableFragment; } - myFragment = ConnectJobsMyListFragment.newInstance(); + myFragment = ConnectJobsMyListFragment.newInstance(launcher); return myFragment; } diff --git a/app/src/org/commcare/fragments/connect/ConnectJobsMyListFragment.java b/app/src/org/commcare/fragments/connect/ConnectJobsMyListFragment.java index 9ba8068830..3e30fe2386 100644 --- a/app/src/org/commcare/fragments/connect/ConnectJobsMyListFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectJobsMyListFragment.java @@ -5,8 +5,10 @@ import android.view.View; import android.view.ViewGroup; +import org.commcare.activities.connect.IConnectAppLauncher; import org.commcare.adapters.ConnectJobAdapter; import org.commcare.dalvik.R; +import org.commcare.dalvik.databinding.FragmentConnectMyJobsListsBinding; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DividerItemDecoration; @@ -20,13 +22,17 @@ */ public class ConnectJobsMyListFragment extends Fragment { private ConnectJobAdapter adapter; + private IConnectAppLauncher launcher; public ConnectJobsMyListFragment() { // Required empty public constructor } - public static ConnectJobsMyListFragment newInstance() { - return new ConnectJobsMyListFragment(); + public static ConnectJobsMyListFragment newInstance(IConnectAppLauncher appLauncher) { + ConnectJobsMyListFragment fragment = new ConnectJobsMyListFragment(); + fragment.launcher = appLauncher; + return fragment; + } @Override @@ -47,7 +53,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), linearLayoutManager.getOrientation())); - adapter = new ConnectJobAdapter(false); + adapter = new ConnectJobAdapter(false, launcher); recyclerView.setAdapter(adapter); return view; diff --git a/app/src/org/commcare/fragments/connect/ConnectLearningProgressFragment.java b/app/src/org/commcare/fragments/connect/ConnectLearningProgressFragment.java index ec7e755f1e..41212be73f 100644 --- a/app/src/org/commcare/fragments/connect/ConnectLearningProgressFragment.java +++ b/app/src/org/commcare/fragments/connect/ConnectLearningProgressFragment.java @@ -47,12 +47,15 @@ * @author dviggiano */ public class ConnectLearningProgressFragment extends Fragment { + boolean showAppLaunch; public ConnectLearningProgressFragment() { // Required empty public constructor } - public static ConnectLearningProgressFragment newInstance() { - return new ConnectLearningProgressFragment(); + public static ConnectLearningProgressFragment newInstance(boolean showAppLaunch) { + ConnectLearningProgressFragment fragment = new ConnectLearningProgressFragment(); + fragment.showAppLaunch = showAppLaunch; + return fragment; } @Override @@ -312,12 +315,13 @@ private void updateUi(View view) { } final Button reviewButton = view.findViewById(R.id.connect_learning_review_button); - reviewButton.setVisibility(showReviewLearningButton ? View.VISIBLE : View.GONE); + reviewButton.setVisibility(showAppLaunch && showReviewLearningButton ? View.VISIBLE : View.GONE); reviewButton.setText(R.string.connect_learn_review); reviewButton.setOnClickListener(v -> { NavDirections directions = null; if(ConnectManager.isAppInstalled(job.getLearnAppInfo().getAppId())) { ConnectManager.launchApp(getContext(), true, job.getLearnAppInfo().getAppId()); + getActivity().finish(); } else { String title = getString(R.string.connect_downloading_learn); directions = ConnectLearningProgressFragmentDirections.actionConnectJobLearningProgressFragmentToConnectDownloadingFragment(title, true, true); @@ -329,6 +333,7 @@ private void updateUi(View view) { }); final Button button = view.findViewById(R.id.connect_learning_button); + button.setVisibility(showAppLaunch ? View.VISIBLE : View.GONE); button.setText(buttonText); button.setOnClickListener(v -> { NavDirections directions = null; @@ -336,6 +341,7 @@ private void updateUi(View view) { directions = ConnectLearningProgressFragmentDirections.actionConnectJobLearningProgressFragmentToConnectJobDeliveryDetailsFragment(); } else if(ConnectManager.isAppInstalled(job.getLearnAppInfo().getAppId())) { ConnectManager.launchApp(getContext(), true, job.getLearnAppInfo().getAppId()); + getActivity().finish(); } else { String title = getString(R.string.connect_downloading_learn); directions = ConnectLearningProgressFragmentDirections.actionConnectJobLearningProgressFragmentToConnectDownloadingFragment(title, true, true);