//
// Copyright 2010 Mirasense AG
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
package com.mirasense.scanditsdk.plugin;
import java.util.Iterator;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.apache.cordova.PluginResult.Status;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.util.Log;
public class ScanditSDK extends CordovaPlugin {
public static final String SCAN = "scan";
private CallbackContext mCallbackContext;
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
mCallbackContext = callbackContext;
PluginResult result = null;
if (action.equals(SCAN)) {
scan(args);
result = new PluginResult(Status.NO_RESULT);
result.setKeepCallback(true);
return true;
} else {
result = new PluginResult(Status.INVALID_ACTION);
callbackContext.error("Invalid Action");
return false;
}
}
/**
* Start scanning. The available options to pass this function are as
* follows:
*
* exampleStringForOption: defaultValue
* Short explanation of option.
*
* preferFrontCamera: false
* Whether showing the front camera should be preferred over the back camera (for devices without a
* front camera the back camera is shown).
*
* searchBar: true
* Shows or hides the search bar at the top of the screen.
*
* 1DScanning: true
* Enables or disables the recognition of 1D codes.
*
* 2DScanning: true
* Enables or disables the recognition of 2D codes.
*
* ean13AndUpc12: true
* Enables or disables the recognition of EAN13 and UPC12/UPCA codes.
*
* ean8: true
* Enables or disables the recognition of EAN8 codes.
*
* upce: true
* Enables or disables the recognition of UPCE codes.
*
* code39: true
* Enables or disables the recognition of CODE39 codes.
* Note: Not all Scandit SDK versions support Code 39 scanning.
*
* code128: true
* Enables or disables the recognition of CODE128 codes.
* Note: Not all Scandit SDK versions support Code 128 scanning.
*
* itf: true
* Enables or disables the recognition of ITF codes.
* Note: Not all Scandit SDK versions support ITF scanning.
*
* qr: false
* Enables or disables the recognition of QR codes.
*
* dataMatrix: false
* Enables or disables the recognition of Data Matrix codes.
* Note: Not all Scandit SDK versions support Data Matrix scanning.
*
* msiPlessey: false
* Enables or disables the recognition of MSI Plessey codes.
* Note: Not all Scandit SDK versions support MSI Plessey scanning.
*
* msiPlesseyChecksumType: "mod10"
* Sets the type of checksum that is expected of the MSI Plessey codes.
* Legal values are: "none", "mod10", "mod11", "mod1010", "mod1110"
*
* inverseRecognition: false
* Enables the detection of white on black codes. This option currently
* only works on Data Matrix codes.
*
* microDataMatrix: false
* Enables special settings to allow the recognition of very small Data
* Matrix codes. If this is not specifically needed, do not enable it as it
* uses considerable processing power. This setting automatically forces
* 2d recognition on every frame. This option only works on devices with
* Android 2.2 or higher, it does not cause issues with lower versions but
* simply doesn't work.
*
* force2d: false
* Forces the engine to always run a 2d recognition, ignoring whether a 2d
* code was detected in the current frame.
*
* scanningHotSpot: "0.5/0.5" (x/y)
* Changes the location of the spot where the recognition actively scans for
* barcodes. X and y can be between 0 and 1, where 0/0 is the top left corner
* and 1/1 the bottom right corner.
*
* scanningHotSpotHeight: 0.25
* Changes the height of the spot where the recognition actively scans for
* barcodes. The height of the hot spot is given relative to the height of
* the screen and has to be between 0.0 and 0.5.
* Be aware that if the hot spot height is very large, the engine is forced
* to decrease the quality of the recognition to keep the speed at an
* acceptable level.
*
* ignorePreviewAspectRatio: false
* Normally the picker adjusts to the aspect ratio of the preview image. If
* this is called, it will no longer do this.
* Warning: If the aspect ratio is not kept, the camera feed may be
* stretched and no longer be a proper representation of what is recorded.
*
* searchBar: false
* Adds (or removes) a search bar to the top of the scan screen.
*
* titleBar: true
* Adds (or removes) the title bar at the top of the scan screen.
* This parameter is deprecated but retained for use with the old GUI which is
* superseeded by the new 3.0 GUI that does not have a title bar anymore.
*
* toolBar: true
* Adds (or removes) the tool bar at the bottom of the scan screen.
* This parameter is deprecated but retained for use with the old GUI which is
* superseeded by the new 3.0 GUI that does not have a tool bar anymore.
*
* beep: true
* Enables or disables the sound played when a code was recognized.
*
* vibrate: true
* Enables or disables the vibration when a code was recognized.
*
* torch: true
* Enables or disables the icon that let's the user activate the LED torch
* mode. If the device does not support torch mode, the icon to activate is
* will not be visible regardless of the value.
*
* torchButtonPositionAndSize: "0.05/0.01/67/33" (x/y/width/height)
* Sets the position at which the button to enable the torch is drawn. The X and Y coordinates are
* relative to the screen size, which means they have to be between 0 and 1.
*
* cameraSwitchVisibility: "never"
* Sets when the camera switch button is visible for all devices that have more than one camera.
* Legal values are: "never", "tablet", "always"
*
* cameraSwitchButtonPositionAndSize: "0.05/0.01/67/33" (x/y/width/height)
* Sets the position at which the button to switch the camera is drawn. The X and Y coordinates are
* relative to the screen size, which means they have to be between 0 and 1. Be aware that the x
* coordinate is calculated from the right side of the screen and not the left like with the torch
* button.
*
* logoOffsets: "0, 0, 0, 0" (xOffset, yOffset, landscapeXOffset, landscapeYOffset)
* Sets the x and y offset at which the Scandit logo should be drawn for both portrait and landscape
* orientation. Be aware that the standard Scandit SDK licenses do not allow you to hide the logo.
*
* titleMessage: "Scan a barcode"
* Sets the title shown at the top of the screen.
*
* leftButtonCaption: "KEYPAD"
* Sets the caption of the left button.
* Deprecated: This string is only used in the old GUI.
*
* leftButtonCaptionWhenKeypadVisible: "OK"
* Sets the caption of the left button when the keypad is visible.
*
* rightButtonCaption: "CANCEL"
* Sets the caption of the right button.
*
* rightButtonCaptionWhenKeypadVisible: "CANCEL"
* Sets the caption of the right button when the keypad is visible.
*
* searchBarHint: "Scan barcode or enter it here"
* Sets the text shown in the manual entry field when nothing has been
* entered yet.
*
* viewfinderSize: "0.8/0.4/0.6/0.4" (width/height/landscapeWidth/landscapeHeight)
* Sets the size of the viewfinder relative to the size of the screen size.
* Changing this value does not(!) affect the area in which barcodes are successfully recognized.
* It only changes the size of the box drawn onto the scan screen.
*
* viewfinderColor: "FFFFFF"
* Sets the color of the viewfinder when no code has been recognized yet.
*
* viewfinderDecodedColor: "00FF00"
* Sets the color of the viewfinder once the barcode has been recognized.
*/
private void scan(JSONArray data) {
Intent intent = new Intent(cordova.getActivity(), ScanditSDKActivity.class);
try {
intent.putExtra("appKey", data.getString(0));
} catch (JSONException e) {
Log.e("ScanditSDK", "Function called through Java Script contained illegal objects.");
e.printStackTrace();
return;
}
if (data.length() > 1) {
// We extract all options and add them to the intent extra bundle.
try {
JSONObject options = data.getJSONObject(1);
@SuppressWarnings("unchecked")
Iterator<String> iter = (Iterator<String>) options.keys();
while (iter.hasNext()) {
String key = iter.next();
Object obj = options.opt(key);
if (obj != null) {
if (obj instanceof Integer) {
intent.putExtra(key, (Integer) obj);
} else if (obj instanceof Boolean) {
intent.putExtra(key, (Boolean) obj);
} else if (obj instanceof String) {
intent.putExtra(key, (String) obj);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
cordova.startActivityForResult(this, intent, 1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == ScanditSDKActivity.SCAN) {
String barcode = data.getExtras().getString("barcode");
String symbology = data.getExtras().getString("symbology");
JSONArray args = new JSONArray();
args.put(barcode);
args.put(symbology);
mCallbackContext.success(args);
} else if (resultCode == ScanditSDKActivity.MANUAL) {
String barcode = data.getExtras().getString("barcode");
JSONArray args = new JSONArray();
args.put(barcode);
args.put("UNKNOWN");
mCallbackContext.success(args);
} else if (resultCode == ScanditSDKActivity.CANCEL) {
mCallbackContext.error("Canceled");
}
}
}