From 04a3f44040ae21d56384bdfab249557774ba8706 Mon Sep 17 00:00:00 2001 From: Shubham Goyal Date: Fri, 15 Sep 2023 07:50:37 -0500 Subject: [PATCH] Generalise method to start app install and move to utils --- .../activities/CommCareSetupActivity.java | 87 +------------------ .../engine/resource/ResourceInstallUtils.java | 84 +++++++++++++++++- .../installers/SingleAppInstallation.java | 28 +----- .../ExecuteRecoveryMeasuresPresenter.java | 3 +- 4 files changed, 91 insertions(+), 111 deletions(-) diff --git a/app/src/org/commcare/activities/CommCareSetupActivity.java b/app/src/org/commcare/activities/CommCareSetupActivity.java index 5600fce3fa..920c4bf69e 100644 --- a/app/src/org/commcare/activities/CommCareSetupActivity.java +++ b/app/src/org/commcare/activities/CommCareSetupActivity.java @@ -1,13 +1,10 @@ package org.commcare.activities; -import static org.commcare.engine.resource.ResourceInstallUtils.getNewCommCareApp; - import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.RestrictionsManager; import android.content.pm.PackageManager; -import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.util.Log; @@ -27,10 +24,10 @@ import org.commcare.AppUtils; import org.commcare.CommCareApp; import org.commcare.CommCareApplication; -import org.commcare.android.database.global.models.ApplicationRecord; import org.commcare.dalvik.BuildConfig; import org.commcare.dalvik.R; import org.commcare.engine.resource.AppInstallStatus; +import org.commcare.engine.resource.ResourceInstallUtils; import org.commcare.engine.resource.installers.SingleAppInstallation; import org.commcare.fragments.ContainerFragment; import org.commcare.fragments.InstallConfirmFragment; @@ -47,7 +44,6 @@ import org.commcare.resources.model.InvalidResourceException; import org.commcare.resources.model.UnresolvedResourceException; import org.commcare.tasks.ResourceEngineListener; -import org.commcare.tasks.ResourceEngineTask; import org.commcare.tasks.RetrieveParseVerifyMessageListener; import org.commcare.tasks.RetrieveParseVerifyMessageTask; import org.commcare.utils.ConsumerAppsUtil; @@ -63,7 +59,6 @@ import org.javarosa.core.reference.InvalidReferenceException; import org.javarosa.core.reference.ReferenceManager; import org.javarosa.core.services.locale.Localization; -import org.javarosa.core.util.PropertyUtils; import java.io.IOException; import java.security.SignatureException; @@ -462,95 +457,19 @@ public void stopBlockingForTask(int id) { private void startResourceInstall() { if (startAllowed) { - ccApp = getNewCommCareApp(); - containerFragment.setData(ccApp); - CustomProgressDialog lastDialog = getCurrentProgressDialog(); // used to tell the ResourceEngineTask whether or not it should // sleep before it starts, set based on whether we are currently // in keep trying mode. boolean shouldSleep = (lastDialog != null) && lastDialog.isChecked(); - ResourceEngineTask task = - new ResourceEngineTask(ccApp, - DIALOG_INSTALL_PROGRESS, shouldSleep, false) { - - @Override - protected void deliverResult(CommCareSetupActivity receiver, - AppInstallStatus result) { - handleAppInstallResult(this, receiver, result); - } - - @Override - protected void deliverUpdate(CommCareSetupActivity receiver, - int[]... update) { - receiver.updateResourceProgress(update[0][0], update[0][1], update[0][2]); - } - - @Override - protected void deliverError(CommCareSetupActivity receiver, - Exception e) { - receiver.failUnknown(AppInstallStatus.UnknownFailure); - } - }; - - task.connect(this); - task.executeParallel(incomingRef); + ccApp = ResourceInstallUtils.startAppInstallAsync(shouldSleep, DIALOG_INSTALL_PROGRESS, this, incomingRef); + containerFragment.setData(ccApp); } else { Log.i(TAG, "During install: blocked a resource install press since a task was already running"); } } - public static void handleAppInstallResult(ResourceEngineTask resourceEngineTask, ResourceEngineListener receiver, AppInstallStatus result) { - switch (result) { - case Installed: - receiver.reportSuccess(true); - break; - case UpToDate: - receiver.reportSuccess(false); - break; - case MissingResourcesWithMessage: - // fall through to more general case: - case MissingResources: - receiver.failMissingResource(resourceEngineTask.getMissingResourceException(), result); - break; - case InvalidResource: - receiver.failInvalidResource(resourceEngineTask.getInvalidResourceException(), result); - break; - case InvalidReference: - receiver.failInvalidReference(resourceEngineTask.getInvalidReferenceException(), result); - break; - case IncompatibleReqs: - receiver.failBadReqs(resourceEngineTask.getVersionRequired(), - resourceEngineTask.getVersionAvailable(), resourceEngineTask.isMajorIsProblem()); - break; - case NoLocalStorage: - receiver.failWithNotification(AppInstallStatus.NoLocalStorage); - break; - case NoConnection: - receiver.failWithNotification(AppInstallStatus.NoConnection); - break; - case BadSslCertificate: - receiver.failWithNotification(AppInstallStatus.BadSslCertificate, NotificationActionButtonInfo.ButtonAction.LAUNCH_DATE_SETTINGS); - break; - case DuplicateApp: - receiver.failWithNotification(AppInstallStatus.DuplicateApp); - break; - case IncorrectTargetPackage: - receiver.failTargetMismatch(); - break; - case ReinstallFromInvalidCcz: - receiver.failUnknown(AppInstallStatus.ReinstallFromInvalidCcz); - break; - case CaptivePortal: - receiver.failWithNotification(AppInstallStatus.CaptivePortal); - break; - default: - receiver.failUnknown(AppInstallStatus.UnknownFailure); - break; - } - } - @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); diff --git a/app/src/org/commcare/engine/resource/ResourceInstallUtils.java b/app/src/org/commcare/engine/resource/ResourceInstallUtils.java index 0fa4b4e0e9..3c753a27ff 100644 --- a/app/src/org/commcare/engine/resource/ResourceInstallUtils.java +++ b/app/src/org/commcare/engine/resource/ResourceInstallUtils.java @@ -17,16 +17,19 @@ import org.commcare.resources.model.UnreliableSourceException; import org.commcare.resources.model.UnresolvedResourceException; import org.commcare.suite.model.Profile; +import org.commcare.tasks.ResourceEngineListener; +import org.commcare.tasks.ResourceEngineTask; +import org.commcare.tasks.templates.CommCareTaskConnector; import org.commcare.util.CommCarePlatform; import org.commcare.util.LogTypes; import org.commcare.utils.AndroidCommCarePlatform; import org.commcare.utils.SessionUnavailableException; +import org.commcare.views.notifications.NotificationActionButtonInfo; import org.javarosa.core.services.Logger; import org.javarosa.core.util.PropertyUtils; import java.net.MalformedURLException; import java.net.URL; -import java.security.cert.CertificateException; import java.util.Date; import javax.net.ssl.SSLException; @@ -62,6 +65,85 @@ public static CommCareApp getNewCommCareApp() { return new CommCareApp(newRecord); } + public static CommCareApp startAppInstallAsync(boolean shouldSleep, int taskId, CommCareTaskConnector connector, + String installRef) { + CommCareApp ccApp = getNewCommCareApp(); + ResourceEngineTask task = + new ResourceEngineTask(ccApp, + taskId, shouldSleep, false) { + + @Override + protected void deliverResult(ResourceEngineListener receiver, + AppInstallStatus result) { + handleAppInstallResult(this, receiver, result); + } + + @Override + protected void deliverUpdate(ResourceEngineListener receiver, int[]... update) { + receiver.updateResourceProgress(update[0][0], update[0][1], update[0][2]); + } + + @Override + protected void deliverError(ResourceEngineListener receiver, Exception e) { + receiver.failUnknown(AppInstallStatus.UnknownFailure); + } + }; + + task.connect(connector); + task.executeParallel(installRef); + return ccApp; + } + + public static void handleAppInstallResult(ResourceEngineTask resourceEngineTask, ResourceEngineListener receiver, AppInstallStatus result) { + switch (result) { + case Installed: + receiver.reportSuccess(true); + break; + case UpToDate: + receiver.reportSuccess(false); + break; + case MissingResourcesWithMessage: + // fall through to more general case: + case MissingResources: + receiver.failMissingResource(resourceEngineTask.getMissingResourceException(), result); + break; + case InvalidResource: + receiver.failInvalidResource(resourceEngineTask.getInvalidResourceException(), result); + break; + case InvalidReference: + receiver.failInvalidReference(resourceEngineTask.getInvalidReferenceException(), result); + break; + case IncompatibleReqs: + receiver.failBadReqs(resourceEngineTask.getVersionRequired(), + resourceEngineTask.getVersionAvailable(), resourceEngineTask.isMajorIsProblem()); + break; + case NoLocalStorage: + receiver.failWithNotification(AppInstallStatus.NoLocalStorage); + break; + case NoConnection: + receiver.failWithNotification(AppInstallStatus.NoConnection); + break; + case BadSslCertificate: + receiver.failWithNotification(AppInstallStatus.BadSslCertificate, NotificationActionButtonInfo.ButtonAction.LAUNCH_DATE_SETTINGS); + break; + case DuplicateApp: + receiver.failWithNotification(AppInstallStatus.DuplicateApp); + break; + case IncorrectTargetPackage: + receiver.failTargetMismatch(); + break; + case ReinstallFromInvalidCcz: + receiver.failUnknown(AppInstallStatus.ReinstallFromInvalidCcz); + break; + case CaptivePortal: + receiver.failWithNotification(AppInstallStatus.CaptivePortal); + break; + default: + receiver.failUnknown(AppInstallStatus.UnknownFailure); + break; + } + } + /** * @return Version from profile in the app's upgrade table; -1 if upgrade * profile not found. diff --git a/app/src/org/commcare/engine/resource/installers/SingleAppInstallation.java b/app/src/org/commcare/engine/resource/installers/SingleAppInstallation.java index 89067ad373..7ef5e51a72 100644 --- a/app/src/org/commcare/engine/resource/installers/SingleAppInstallation.java +++ b/app/src/org/commcare/engine/resource/installers/SingleAppInstallation.java @@ -3,10 +3,11 @@ import org.commcare.CommCareApp; import org.commcare.activities.CommCareSetupActivity; import org.commcare.engine.resource.AppInstallStatus; +import org.commcare.engine.resource.ResourceInstallUtils; import org.commcare.tasks.ResourceEngineTask; -import static org.commcare.activities.CommCareSetupActivity.handleAppInstallResult; import static org.commcare.engine.resource.ResourceInstallUtils.getNewCommCareApp; +import static org.commcare.engine.resource.ResourceInstallUtils.handleAppInstallResult; /** * Install CC app from the APK's asset directory @@ -23,29 +24,6 @@ public class SingleAppInstallation { * without prompting the user. */ public static void installSingleApp(CommCareSetupActivity activity, int dialogId) { - CommCareApp app = getNewCommCareApp(); - - ResourceEngineTask task = - new ResourceEngineTask(app, dialogId, false, false) { - @Override - protected void deliverResult(CommCareSetupActivity receiver, - AppInstallStatus result) { - handleAppInstallResult(this,receiver,result); - } - - @Override - protected void deliverUpdate(CommCareSetupActivity receiver, - int[]... update) { - receiver.updateResourceProgress(update[0][0], update[0][1], update[0][2]); - } - - @Override - protected void deliverError(CommCareSetupActivity receiver, - Exception e) { - receiver.failUnknown(AppInstallStatus.UnknownFailure); - } - }; - task.connect(activity); - task.executeParallel(SINGLE_APP_REFERENCE); + ResourceInstallUtils.startAppInstallAsync(false, dialogId, activity, SINGLE_APP_REFERENCE); } } diff --git a/app/src/org/commcare/recovery/measures/ExecuteRecoveryMeasuresPresenter.java b/app/src/org/commcare/recovery/measures/ExecuteRecoveryMeasuresPresenter.java index ee7ff4994e..9e60660812 100644 --- a/app/src/org/commcare/recovery/measures/ExecuteRecoveryMeasuresPresenter.java +++ b/app/src/org/commcare/recovery/measures/ExecuteRecoveryMeasuresPresenter.java @@ -48,6 +48,7 @@ import androidx.appcompat.app.AlertDialog; import static org.commcare.engine.resource.ResourceInstallUtils.getProfileReference; +import static org.commcare.engine.resource.ResourceInstallUtils.handleAppInstallResult; import static org.commcare.recovery.measures.RecoveryMeasure.MEASURE_TYPE_APP_OFFLINE_REINSTALL_AND_UPDATE; import static org.commcare.recovery.measures.RecoveryMeasure.MEASURE_TYPE_APP_REINSTALL_AND_UPDATE; import static org.commcare.recovery.measures.RecoveryMeasure.MEASURE_TYPE_APP_UPDATE; @@ -539,7 +540,7 @@ static class sResourceEngineTask extends ResourceEngineTask