/*
*
* Panbox - encryption for cloud storage
* Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Additonally, third party code may be provided with notices and open source
* licenses from communities and third parties that govern the use of those
* portions, and any licenses granted hereunder do not alter any rights and
* obligations you may have under such open source licenses, however, the
* disclaimer of warranty and limitation of liability provisions of the GPLv3
* will apply to all the product.
*
*/
package org.panbox.mobile.android.gui.webcam;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Bitmap;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
public class QRCodeProcessor extends AbstractProcessor {
private List<QRCodeListener> listeners = new ArrayList<QRCodeListener>();
private long lastFoundTime = 0;
private final static long CLEAR_RESULT_TIMEOUT = 5000;
private String lastResult = "";
public QRCodeProcessor() {
}
public void addSquareCodeListener(QRCodeListener sql) {
listeners.add(sql);
}
public void removeSquareCodeListener(QRCodeListener sql) {
listeners.remove(sql);
}
private void fire(String text) {
List<QRCodeListener> tmp = new ArrayList<QRCodeListener>(listeners);
for (QRCodeListener sql : tmp) {
sql.qrCodeDetected(text);
}
}
@Override
public Bitmap processImage(Bitmap bMap) {
int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];
//copy pixel data from the Bitmap into the 'intArray' array
bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(),intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
try {
result = new MultiFormatReader().decode(bitmap);
lastResult = result.getText();
lastFoundTime = System.currentTimeMillis();
fire(result.getText());
} catch (NotFoundException e) {
//that's ok
if (!lastResult.equals("")) //if result was not empty, clear old result
{
long mt1 = System.currentTimeMillis();
if (mt1 - lastFoundTime > CLEAR_RESULT_TIMEOUT) {
lastFoundTime = mt1;
fire("");
lastResult = "";
}
}
}
return bMap;
}
}