package pl.pola_app.ui.fragment; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.os.Vibrator; import android.support.v4.content.ContextCompat; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.google.zxing.ResultPoint; import com.journeyapps.barcodescanner.BarcodeCallback; import com.journeyapps.barcodescanner.BarcodeResult; import com.journeyapps.barcodescanner.CompoundBarcodeView; import com.journeyapps.barcodescanner.Size; import com.journeyapps.barcodescanner.camera.CameraSettings; import com.squareup.otto.Bus; import java.util.List; import javax.inject.Inject; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import pl.pola_app.PolaApplication; import pl.pola_app.R; import pl.tajchert.nammu.Nammu; import pl.tajchert.nammu.PermissionCallback; import timber.log.Timber; public class ScannerFragment extends Fragment implements CompoundBarcodeView.TorchListener { @Inject Bus eventBus; @Bind(R.id.scanner_view) CompoundBarcodeView barcodeScanner;//ZXING this or mPreview should be used @Bind(R.id.flash_icon) ImageView flashIconView; private boolean isTorchOn = false; public ScannerFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View scannerView = inflater.inflate(R.layout.fragment_scanner, container, false); ButterKnife.bind(this, scannerView); PolaApplication.component(getActivity()).inject(this); DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; int height = metrics.heightPixels; barcodeScanner.getBarcodeView().setFramingRectSize(new Size((int) (width*0.9f), (int) (height*0.25f))); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(0, (int) (-1*(height*0.2)), 0, 0); barcodeScanner.setLayoutParams(layoutParams); CameraSettings cameraSettings = barcodeScanner.getBarcodeView().getCameraSettings(); //cameraSettings.setBarcodeSceneModeEnabled(true); cameraSettings.setContinuousFocusEnabled(true); cameraSettings.setAutoFocusEnabled(true); barcodeScanner.getBarcodeView().setCameraSettings(cameraSettings); barcodeScanner.setStatusText(getActivity().getString(R.string.scanner_status_text)); barcodeScanner.setTorchListener(this); barcodeScanner.setTorchOff(); Nammu.askForPermission(getActivity(), android.Manifest.permission.CAMERA, permissionCameraCallback); return scannerView; } @Override public void onResume() { super.onResume(); eventBus.register(this); if(barcodeScanner != null) { barcodeScanner.resume(); } } @Override public void onPause() { super.onPause(); eventBus.unregister(this); if(barcodeScanner != null) { barcodeScanner.setTorchOff(); barcodeScanner.pause(); } } @Override public void onDestroy() { super.onDestroy(); ButterKnife.unbind(this); } public void resumeScanning() { if(barcodeScanner != null) { barcodeScanner.decodeContinuous(callback); } } final PermissionCallback permissionCameraCallback = new PermissionCallback() { @Override public void permissionGranted() { resumeScanning(); } @Override public void permissionRefused() { Toast.makeText(getActivity(), getString(R.string.toast_no_camera_access), Toast.LENGTH_SHORT).show(); } }; //ZXING barcode result private BarcodeCallback callback = new BarcodeCallback() { @Override public void barcodeResult(final BarcodeResult result) { if (result.getText() != null) { if(barcodeScanner != null) { barcodeScanner.getBarcodeView().stopDecoding(); barcodeScanner.setStatusText(""); } ((Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE)).vibrate(100); getActivity().runOnUiThread(new Runnable() { @Override public void run() { onBarcode(result.getText()); } }); Timber.d(result.getText()); Timber.d(result.getBarcodeFormat().toString()); } } @Override public void possibleResultPoints(List<ResultPoint> resultPoints) { } }; private void onBarcode(String barcode) { final Activity activity = getActivity(); if (activity != null && !activity.isFinishing() && activity instanceof BarcodeListener) { ((BarcodeListener) activity).onBarcode(barcode); } } @OnClick(R.id.flash_icon) public void onFlashIconClicked() { if(isTorchOn) { barcodeScanner.setTorchOff(); } else { barcodeScanner.setTorchOn(); } } @Override public void onTorchOn() { isTorchOn = true; if(flashIconView != null) { flashIconView.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_flash_off_white_48dp)); } } @Override public void onTorchOff() { isTorchOn = false; if(flashIconView != null) { flashIconView.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_flash_on_white_48dp)); } } public void setTorchOff() { if(isTorchOn) { barcodeScanner.setTorchOff(); } } }