ravadisagarrao opened a new issue, #484:
URL: https://github.com/apache/cordova/issues/484

   # Bug Report
   In the existing code we are using Cordova with startActivityForResult(), as 
part of third party plugin update we are using registerForActivityResult().
   I am looking for an example of Cordova with registerForActivityResult() 
   
   **Below is the code implemented**.
   package com.xyz.emcd;
   
   import org.apache.cordova.CallbackContext;
   import org.apache.cordova.CordovaInterface;
   import org.apache.cordova.CordovaPlugin;
   import org.apache.cordova.CordovaWebView;
   import org.apache.cordova.CordovaPlugin;
   import org.apache.cordova.PluginResult;
   import org.json.JSONArray;
   import org.json.JSONException;
   import org.json.JSONObject;
   
   import android.app.Activity;
   import android.content.Intent;
   import android.content.pm.ActivityInfo;
   import android.util.Base64;
   import android.util.Log;
   import com.miteksystems.misnap.core.MiSnapSettings;
   import com.miteksystems.misnap.workflow.MiSnapWorkflowStep;
   import com.miteksystems.misnap.workflow.fragment.DocumentAnalysisFragment;
   import 
com.miteksystems.misnap.workflow.fragment.DocumentAnalysisFragment.Companion;
   import 
com.miteksystems.misnap.workflow.fragment.DocumentAnalysisFragment.ReviewCondition;
   import com.miteksystems.misnap.workflow.MiSnapWorkflowActivity;
   import com.miteksystems.misnap.workflow.MiSnapFinalResult;
   import androidx.activity.result.ActivityResultCallback;
   import androidx.activity.result.ActivityResultLauncher;
   import androidx.activity.result.ActivityResult;
   import androidx.activity.result.contract.ActivityResultContract;
   import androidx.activity.result.contract.ActivityResultContracts;
   
   import java.util.List;
   import java.util.Set;
   
   /**
    * This cordova plugin handles taking a picture using the MiSnap SDK
    *
    * @author Ewan Summers
    */
   public class CameraPlugin extends CordovaPlugin {
   
       // The tag we'd like to use for this class
       public static final String TAG = "XYZ_CAMERA_PLUGIN";
   
       // Actions
       public static final String TAKE_PICTURE_ACTION = "takePicture";
   
       private static final String CHECK_FRONT = "CheckFront";
       private static final String CHECK_BACK = "CheckBack";
   
       private static int REQUEST_CODE_FRONT = 56104;
       private static int REQUEST_CODE_BACK = 56105;
   
       private CallbackContext callbackContext = null;
   
       ActivityResultLauncher activityResultLauncher;
   
       /**
        * Constructor.
        */
       public CameraPlugin() {
           super();
       }
   
       private void logError(String msg) {
           Log.e(TAG, msg);
       }
   
       private void logDebug(String msg) {
           Log.d(TAG, msg);
       }
   
       /**
        * Convenience method to both add to the debug log and error on the 
callback
        * context
        *
        * @param msg
        */
       private void doContextError(String msg) {
           logDebug(msg);
           callbackContext.error(msg);
       }
   
       /**
        * Convenience method to both log error and error on the callback context
        *
        * @param msg
        */
       private void doError(String msg) {
           logError(msg);
           callbackContext.error(msg);
       }
   
       @Override
       public void initialize(CordovaInterface cordova, CordovaWebView webView) 
{
           super.initialize(cordova, webView);
   
           activityResultLauncher = 
cordova.getActivity().registerForActivityResult(
                   (ActivityResultContract) new 
ActivityResultContracts.StartActivityForResult(),
                   (ActivityResultCallback) new 
ActivityResultCallback<Set<String>>() {
                       @Override
                       public void onActivityResult(Set<String> result) {
                           logDebug("got results from authorization request");
                           if (callbackContext != null) {
                               for (String res : result) {
                                   logDebug(res);
                               }
                               if (result.isEmpty()) {
                                   callbackContext.sendPluginResult(new 
PluginResult(PluginResult.Status.OK, false));
                               } else {
                                   callbackContext.sendPluginResult(new 
PluginResult(PluginResult.Status.OK, true));
                               }
                           } else {
                               logDebug("Got activity results before callback 
was created");
                           }
                       }
                   });
       }
   
       /**
        * Executes the request and returns PluginResult.
        *
        * @param action
        *                        The action to execute.
        * @param args
        *                        JSONArry of arguments for the plugin.
        * @param callbackContext
        *                        The callback id used when calling back into
        *                        JavaScript.
        * @return True if the action was valid, false if not.
        */
       public boolean execute(String action, JSONArray args,
               CallbackContext callbackContext) throws JSONException {
   
           logDebug("Executing action: " + action);
   
           // Unfortunately the callbackContext is not serializable so we cannot
           // pass it through to the
           // intent. Let's just give the plugin a reference to the 
callbackContext
           this.callbackContext = callbackContext;
   
           if (action.equals(TAKE_PICTURE_ACTION)) {
   
               final CameraPluginConfigTakePicture config = new 
CameraPluginConfigTakePicture(
                       args);
               logDebug("Received " + action + " action with config: "
                       + config.toString());
   
               // Kick off taking a picture in a new thread rather
   
               this.cordova.getThreadPool().execute(new Runnable() {
   
                   @Override
                   public void run() {
                       logDebug("before takePicture call : " + 
config.getMiSnapSDKLicenseKey());
                       takePicture(config.isFront(), 
config.isDisableAutoCapture(), config.getMiSnapSDKLicenseKey());
                       logDebug("Harika ::: Received miSnapSDKLicenseKey: " + 
config.getMiSnapSDKLicenseKey());
                   }
               });
               return true;
           } else {
               doError("Unknown Action '" + (action != null ? action : "") + 
"'");
               return false;
           }
       }
   
       /**
        * Constructs the intent with the MiSnap settings and starts the activity
        */
       private void takePicture(boolean isFrontOfCheque, boolean 
disableAutoCapture, String miSnapSDKLicenseKey) {
           logDebug("inside takePicture call : " + miSnapSDKLicenseKey);
           JSONObject jjs = null;
           MiSnapSettings miSnapSettings = null;
   
           try {
               jjs = new JSONObject();
               
               jjs.put("MiSnapAllowScreenshots", "1");
               jjs.put("MiSnapAngle", "150");
               
               if (disableAutoCapture) {
                   jjs.put("MiSnapCaptureMode", "1");
               } else {
                   jjs.put("MiSnapCaptureMode", "2");
               }
               
               if (isFrontOfCheque) {
                   
                   miSnapSettings = new 
MiSnapSettings(MiSnapSettings.UseCase.CHECK_FRONT, miSnapSDKLicenseKey);
                   jjs.put("MiSnapSharpness", "600");
               } else {
                   
                   miSnapSettings = new 
MiSnapSettings(MiSnapSettings.UseCase.CHECK_BACK, miSnapSDKLicenseKey);
                   
                   jjs.put("MiSnapSharpness", "100");
               }
           } catch (JSONException e) {
               doError("JSON exception occurred when constructing MiSnap 
options");
           }
   
           
miSnapSettings.analysis.document.setTrigger(MiSnapSettings.Analysis.Document.Trigger.MANUAL);
           miSnapSettings.analysis.document.setEnableEnhancedManual(true);
   
           MiSnapSettings.Workflow misnapWorkflow = miSnapSettings.workflow;
           misnapWorkflow.add("CMD App",
                   DocumentAnalysisFragment.buildWorkflowSettings((Integer) 
null, (Float) null, (Float) null,
                           (Boolean) null, (Integer) null, (Boolean) null, 
(Integer) null, (Integer) null, (Integer) null,
                           (Integer) null, (Integer) null, (Boolean) null, 
(Integer) null, (Integer) null, (Integer) null,
                           (Integer) null, (Integer) null, (Integer) null, 
(Boolean) null, (String) null, (Boolean) null,
                           (Boolean) null, ReviewCondition.NEVER, (Boolean) 
null, (Boolean) null));
   
           MiSnapWorkflowStep[] workflowSteps = new MiSnapWorkflowStep[1];
           MiSnapWorkflowStep miSnapWorkflowStep = new 
MiSnapWorkflowStep(miSnapSettings);
           workflowSteps[0] = miSnapWorkflowStep;
           Intent i = 
MiSnapWorkflowActivity.buildIntent(this.cordova.getActivity().getApplicationContext(),
                   miSnapWorkflowStep, workflowSteps, false);
   
           activityResultLauncher.launch(i);
       }
   
       private class CameraPluginConfigTakePicture {
           private boolean isFront;
           private boolean disableAutoCapture;
           private String miSnapSDKLicenseKey;
   
           public CameraPluginConfigTakePicture(JSONArray configArray) {
               try {
                   logDebug("CameraPluginConfigTakePicture: 
configArray.length() ::: " + configArray.length());
                   logDebug("CameraPluginConfigTakePicture: 
configArray.toString() ::: " + configArray.toString());
                   if (configArray.length() > 0) {
                       logDebug("Inside if condition for configArray.length(), 
configArray: "
                               + configArray.toString());
                       isFront = (Boolean) configArray.get(0);
                       disableAutoCapture = (Boolean) configArray.get(1);
                       miSnapSDKLicenseKey = (String) configArray.get(2);
   
                       logDebug("CameraPluginConfigTakePicture: 
miSnapSDKLicenseKey ::: " + miSnapSDKLicenseKey);
                   }
               } catch (JSONException e) {
                   logError("Failure to parse given configuration: "
                           + e.getMessage());
               }
           }
   
           public boolean isFront() {
               return isFront;
           }
   
           public boolean isDisableAutoCapture() {
               return disableAutoCapture;
           }
   
           public String getMiSnapSDKLicenseKey() {
               logDebug("Inside getMiSnapSDKLicenseKey: " + 
miSnapSDKLicenseKey);
               return miSnapSDKLicenseKey;
           }
   
           @Override
           public String toString() {
               return "CameraPluginConfig [isFront=" + isFront + ", 
isDisableAutoCapture=" + disableAutoCapture
                       + ", miSnapSDKLicenseKey= " + miSnapSDKLicenseKey + "]";
           }
       }
   }
   
   
   **This is the exception i am getting.**
   
   07-08 15:23:59.554  7396  7468 W System.err: 
java.lang.IllegalStateException: LifecycleOwner com.ncr.cmd.qa.Emcd@acc2928 is 
attempting to register while current state is RESUMED. LifecycleOwners must 
call register before they are STARTED.
   07-08 15:23:59.554  7396  7468 W System.err:         at 
androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:833)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:842)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
com.xyz.emcd.CameraPlugin.initialize(CameraPlugin.java:97)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
org.apache.cordova.CordovaPlugin.privateInitialize(CordovaPlugin.java:59)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
org.apache.cordova.PluginManager.getPlugin(PluginManager.java:187)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
org.apache.cordova.PluginManager.exec(PluginManager.java:138)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59)
   07-08 15:23:59.555  7396  7468 W System.err:         at 
org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
   07-08 15:23:59.556  7396  7468 W System.err:         at 
android.os.MessageQueue.nativePollOnce(Native Method)
   07-08 15:23:59.556  7396  7468 W System.err:         at 
android.os.MessageQueue.next(MessageQueue.java:335)
   07-08 15:23:59.556  7396  7468 W System.err:         at 
android.os.Looper.loopOnce(Looper.java:161)
   07-08 15:23:59.556  7396  7468 W System.err:         at 
android.os.Looper.loop(Looper.java:288)
   07-08 15:23:59.556  7396  7468 W System.err:         at 
android.os.HandlerThread.run(HandlerThread.java:67)
   
   
   ### Version information
   Cordova: 12.0.0
   Operating System, Android.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org
For additional commands, e-mail: issues-h...@cordova.apache.org

Reply via email to