diff --git a/app/build.gradle b/app/build.gradle index 037b2af3..7f332127 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 112 - def appVersionName = '1.10.9' + def appVersionCode = 113 + def appVersionName = '1.10.10' signingConfigs { release { diff --git a/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java b/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java index 8091d60b..58db8448 100644 --- a/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java +++ b/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/KeyboardEmulatorBarcodeReader.java @@ -55,28 +55,28 @@ public class KeyboardEmulatorBarcodeReader implements BarcodeReaderInterface { @Override public void onKeyEvent(KeyEvent keyEvent) { - if (keyEvent.getEventTime() - mLastCharInsertTime > 500){ - mLastCharInsertTime =keyEvent.getEventTime(); + if (keyEvent.getEventTime() - mLastCharInsertTime > 500) { + mLastCharInsertTime = keyEvent.getEventTime(); mTextBarcode = ""; } - if (keyEvent.getKeyCode() != KeyEvent.KEYCODE_ENTER){ - if (keyEvent.getKeyCode() != KeyEvent.KEYCODE_SHIFT_LEFT){ - mLastCharInsertTime =keyEvent.getEventTime(); - if (keyEvent.getUnicodeChar() > 0){ - mTextBarcode+= (char) keyEvent.getUnicodeChar(); - }else if (keyEvent.getCharacters() != null){ + if (keyEvent.getKeyCode() != KeyEvent.KEYCODE_ENTER) { + if (keyEvent.getKeyCode() != KeyEvent.KEYCODE_SHIFT_LEFT) { + mLastCharInsertTime = keyEvent.getEventTime(); + if (keyEvent.getUnicodeChar() > 0) { + mTextBarcode += (char) keyEvent.getUnicodeChar(); + } else if (keyEvent.getCharacters() != null) { mTextBarcode = keyEvent.getCharacters(); } } - }else{ - if (mTextBarcode.length() > 0){ + } else { + if (mTextBarcode.length() > 0) { BarcodeType barcodeType = decodeBarcode(mTextBarcode); BarcodeScanDTO barcodeScanDTO = new BarcodeScanDTO() .setByteValue(mTextBarcode.getBytes()) .setStringValue(mTextBarcode) .setType(barcodeType) - .setName(barcodeType != null ? barcodeType.toString():""); + .setName(barcodeType != null ? barcodeType.toString() : ""); mOnScanSuccessfull.run(barcodeScanDTO); } @@ -84,32 +84,52 @@ public class KeyboardEmulatorBarcodeReader implements BarcodeReaderInterface { } - public BarcodeType decodeBarcode(String barcode){ -/* - Pattern patternUPCA = Pattern.compile("^[0-9]{12}$"); + public BarcodeType decodeBarcode(String barcode) { + /*Pattern patternUPCA = Pattern.compile("^[0-9]{12}$"); Pattern patternUPCE = Pattern.compile("^[0-1][0-9]{7}$"); Pattern patternUPCE1 = Pattern.compile(""); Pattern patternEAN8 = Pattern.compile("^[0-9]{8}$"); Pattern patternEAN13 = Pattern.compile("^[0-9]{13}$"); Pattern patternCODE11 = Pattern.compile(""); - Pattern patternCODE39 = Pattern.compile(""); - if(){ - return BarcodeType.CODE11; - }else if(){ - return BarcodeType.CODE39; - }else if(){ - return BarcodeType.EAN13; - }else if(){ - return BarcodeType.EAN8; - }else if(){ - return BarcodeType.UPCA; - }else if(){ - return BarcodeType.UPCE; - }else if(false){ - return BarcodeType.UPCE1; - }else{ - return BarcodeType.CODE128; - }*/ + Pattern patternCODE39 = Pattern.compile("");*/ + if (barcode.length() == 8) { + try { + int checksum = getEanChecksum(barcode); + if (checksum == Integer.parseInt(barcode.substring(7))){ + return BarcodeType.EAN8; + } + } catch (WrongFormatException e) { + return BarcodeType.CODE128; + } + } else if (barcode.length() == 13) { + try { + int checksum = getEanChecksum(barcode); + if (checksum == Integer.parseInt(barcode.substring(12))){ + return BarcodeType.EAN13; + } + } catch (WrongFormatException e) { + return BarcodeType.CODE128; + } + } return BarcodeType.CODE128; } + + private static int getEanChecksum(String barcode) throws WrongFormatException { + int odds = 0; + int evens = 0; + barcode = barcode.substring(0,barcode.length()-1); + int pos = 0; + for (int i = barcode.length() -1; i >=0 ; i--) { + pos++; + if (!Character.isDigit(barcode.charAt(i))) { + throw new WrongFormatException(); + } + if (pos % 2 == 0) { + evens += Integer.parseInt(barcode.charAt(i)+""); + } else { + odds += Integer.parseInt(barcode.charAt(i)+""); + } + } + return ((10 - (((3 * odds) + evens) % 10)) % 10); + } } diff --git a/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/WrongFormatException.java b/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/WrongFormatException.java new file mode 100644 index 00000000..54d0aa09 --- /dev/null +++ b/keyobardemulatorscannerlibrary/src/main/java/it/integry/keyobardemulatorscannerlibrary/WrongFormatException.java @@ -0,0 +1,4 @@ +package it.integry.keyobardemulatorscannerlibrary; + +public class WrongFormatException extends Exception { +}