Skip to content

Commit

Permalink
Generalise method to start app install and move to utils
Browse files Browse the repository at this point in the history
  • Loading branch information
shubham1g5 committed Sep 15, 2023
1 parent de92b08 commit 04a3f44
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 111 deletions.
87 changes: 3 additions & 84 deletions app/src/org/commcare/activities/CommCareSetupActivity.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<CommCareSetupActivity> task =
new ResourceEngineTask<CommCareSetupActivity>(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);
Expand Down
84 changes: 83 additions & 1 deletion app/src/org/commcare/engine/resource/ResourceInstallUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<ResourceEngineListener>(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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -23,29 +24,6 @@ public class SingleAppInstallation {
* without prompting the user.
*/
public static void installSingleApp(CommCareSetupActivity activity, int dialogId) {
CommCareApp app = getNewCommCareApp();

ResourceEngineTask<CommCareSetupActivity> task =
new ResourceEngineTask<CommCareSetupActivity>(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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -539,7 +540,7 @@ static class sResourceEngineTask extends ResourceEngineTask<ExecuteRecoveryMeasu

@Override
protected void deliverResult(ExecuteRecoveryMeasuresActivity receiver, AppInstallStatus result) {
CommCareSetupActivity.handleAppInstallResult(this, receiver, result);
handleAppInstallResult(this, receiver, result);
}

@Override
Expand Down

0 comments on commit 04a3f44

Please sign in to comment.