Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package az.scanandplay.fragments;
- import android.Manifest;
- import android.annotation.SuppressLint;
- import android.app.Dialog;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.content.pm.PackageManager;
- import android.hardware.Camera;
- import android.net.Uri;
- import android.os.Bundle;
- import android.support.annotation.NonNull;
- import android.support.annotation.Nullable;
- import android.support.design.widget.Snackbar;
- import android.support.v4.app.ActivityCompat;
- import android.support.v4.content.ContextCompat;
- import android.support.v7.widget.Toolbar;
- import android.util.Log;
- import android.view.GestureDetector;
- import android.view.LayoutInflater;
- import android.view.MenuItem;
- import android.view.MotionEvent;
- import android.view.ScaleGestureDetector;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.Toast;
- import com.arellomobile.mvp.MvpAppCompatFragment;
- import com.arellomobile.mvp.presenter.InjectPresenter;
- import com.arellomobile.mvp.presenter.ProvidePresenter;
- import com.google.android.gms.common.ConnectionResult;
- import com.google.android.gms.common.GoogleApiAvailability;
- import com.google.android.gms.vision.CameraSource;
- import com.google.android.gms.vision.MultiProcessor;
- import com.google.android.gms.vision.barcode.Barcode;
- import com.google.android.gms.vision.barcode.BarcodeDetector;
- import java.io.IOException;
- import az.scanandplay.R;
- import az.scanandplay.presenters.QrScanPresenter;
- import az.scanandplay.presenters.QrScanView;
- import az.scanandplay.utils.BarcodeGraphic;
- import az.scanandplay.utils.BarcodeGraphicTracker;
- import az.scanandplay.utils.BarcodeTrackerFactory;
- import az.scanandplay.utils.ui.CameraSourcePreview;
- import az.scanandplay.utils.ui.GraphicOverlay;
- import static android.support.constraint.Constraints.TAG;
- import static az.scanandplay.App.COMPANY_WEBSITE;
- public class QrScanFragment extends MvpAppCompatFragment implements QrScanView, BarcodeGraphicTracker.BarcodeUpdateListener, Toolbar.OnMenuItemClickListener {
- private az.scanandplay.utils.ui.CameraSource mCameraSource;
- private CameraSourcePreview mPreview;
- private GraphicOverlay<BarcodeGraphic> mGraphicOverlay;
- private PlayerBottomDialog dialog;
- private Dialog aboutDialog;
- private android.support.v7.widget.Toolbar toolbar;
- private static final int REQUEST_CAMERA = 0;
- ScaleGestureDetector scaleGestureDetector;
- GestureDetector gestureDetector;
- @InjectPresenter
- QrScanPresenter qrScanPresenter;
- @ProvidePresenter
- QrScanPresenter qrScanPresenter() {
- return new QrScanPresenter(getContext());
- }
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_qr_scan, container, false);
- toolbar = view.findViewById(R.id.qr_scanner_toolbar);
- mPreview = view.findViewById(R.id.preview);
- mGraphicOverlay = view.findViewById(R.id.graphicOverlay);
- int rc = ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA);
- if (rc == PackageManager.PERMISSION_GRANTED) {
- createCameraSource();
- } else {
- requestCameraPermission();
- }
- gestureDetector = new GestureDetector(getContext(), new CaptureGestureListener());
- scaleGestureDetector = new ScaleGestureDetector(getContext(), new ScaleListener());
- return view;
- }
- private void requestCameraPermission() {
- final String[] permissions = new String[]{Manifest.permission.CAMERA};
- if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
- Manifest.permission.CAMERA)) {
- ActivityCompat.requestPermissions(getActivity(), permissions, 2);
- return;
- }
- }
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- toolbar.inflateMenu(R.menu.menu_toolbar);
- toolbar.setOnMenuItemClickListener(this);
- }
- @Override
- public void onResume() {
- super.onResume();
- if (dialog != null && dialog.isVisible()) {
- return;
- }
- if (aboutDialog != null) {
- aboutDialog.dismiss();
- }
- startCameraSource();
- }
- private void createCameraSource() {
- BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(getContext()).build();
- BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(mGraphicOverlay, getContext());
- barcodeDetector.setProcessor(
- new MultiProcessor.Builder<>(barcodeFactory).build());
- if (!barcodeDetector.isOperational()) {
- Log.w(TAG, "Detector dependencies are not yet available.");
- }
- az.scanandplay.utils.ui.CameraSource.Builder builder = new az.scanandplay.utils.ui.CameraSource.Builder(getContext(), barcodeDetector)
- .setFacing(CameraSource.CAMERA_FACING_BACK)
- .setRequestedPreviewSize(1600, 1024)
- .setRequestedFps(15.0f);
- mCameraSource = builder.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE).build();
- }
- private void startCameraSource() throws SecurityException {
- int code = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(
- getContext());
- if (code != ConnectionResult.SUCCESS) {
- }
- if (mCameraSource != null) {
- try {
- mPreview.start(mCameraSource, mGraphicOverlay);
- } catch (IOException e) {
- mCameraSource.release();
- mCameraSource = null;
- }
- }
- }
- @Override
- public void showBottomDialog(String url) {
- dialog = PlayerBottomDialog.newInstance(url);
- dialog.setListener(new PlayerBottomDialog.OnDialogCloseListener() {
- @Override
- public void onDialogClosed() {
- dialog = null;
- }
- });
- dialog.show(getChildFragmentManager(), null);
- }
- @Override
- public void showUnsupportedFormatError(String unsupportedTextFormat) {
- Toast.makeText(getContext(), " ' " + unsupportedTextFormat + " ' " + "\n"
- + "isn't an .ogg file", Toast.LENGTH_SHORT).show();
- }
- @Override
- public void showConnectionError() {
- Snackbar.make(getView(), "Connection error", Snackbar.LENGTH_INDEFINITE)
- .setAction("Retry", new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- }
- }).show();
- }
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.contact_us_menu:
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse(COMPANY_WEBSITE));
- startActivity(intent);
- break;
- case R.id.about_us_menu:
- showAboutDialog();
- break;
- }
- return false;
- }
- public void showAboutDialog() {
- ViewGroup viewGroup = getView().findViewById(android.R.id.content);
- View dialogView = LayoutInflater.from(getContext()).inflate(R.layout.about_us_dialog, viewGroup, false);
- aboutDialog = new Dialog(getContext());
- aboutDialog.setContentView(dialogView);
- aboutDialog.show();
- aboutDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- }
- });
- Button closeButton = aboutDialog.findViewById(R.id.close_button);
- closeButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- aboutDialog.dismiss();
- }
- });
- }
- @SuppressLint("MissingPermission")
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- if (requestCode == REQUEST_CAMERA && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- //mScannerView.startCamera();
- try {
- mCameraSource.start();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void onPause() {
- super.onPause();
- if (mPreview != null) {
- mPreview.stop();
- }
- }
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- if (mPreview != null) {
- mPreview.release();
- }
- }
- private boolean onTap(float rawX, float rawY) {
- int[] location = new int[2];
- mGraphicOverlay.getLocationOnScreen(location);
- float x = (rawX - location[0]) / mGraphicOverlay.getWidthScaleFactor();
- float y = (rawY - location[1]) / mGraphicOverlay.getHeightScaleFactor();
- Barcode best = null;
- float bestDistance = Float.MAX_VALUE;
- for (BarcodeGraphic graphic : mGraphicOverlay.getGraphics()) {
- Barcode barcode = graphic.getBarcode();
- if (barcode.getBoundingBox().contains((int) x, (int) y)) {
- // Exact hit, no need to keep looking.
- best = barcode;
- break;
- }
- float dx = x - barcode.getBoundingBox().centerX();
- float dy = y - barcode.getBoundingBox().centerY();
- float distance = (dx * dx) + (dy * dy); // actually squared distance
- if (distance < bestDistance) {
- best = barcode;
- bestDistance = distance;
- }
- }
- if (best != null) {
- return true;
- }
- return false;
- }
- @Override
- public void onBarcodeDetected(Barcode barcode) {
- qrScanPresenter.handleResult(barcode.displayValue);
- }
- private class CaptureGestureListener extends GestureDetector.SimpleOnGestureListener {
- @Override
- public boolean onSingleTapConfirmed(MotionEvent e) {
- return onTap(e.getRawX(), e.getRawY()) || super.onSingleTapConfirmed(e);
- }
- }
- private class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener {
- @Override
- public boolean onScale(ScaleGestureDetector detector) {
- return false;
- }
- @Override
- public boolean onScaleBegin(ScaleGestureDetector detector) {
- return true;
- }
- @Override
- public void onScaleEnd(ScaleGestureDetector detector) {
- mCameraSource.doZoom(detector.getScaleFactor());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement