From f75b54699abba5636629be103d0765d8b734f25e Mon Sep 17 00:00:00 2001 From: Mygod Date: Sun, 11 Feb 2018 02:26:23 -0800 Subject: [PATCH] Use Google mobile vision API to scan QR codes as well Interestingly even though multiple QR code isn't enabled, if there are two QR codes in the picture they will all get scanned. --- mobile/build.gradle | 2 +- .../com/github/shadowsocks/ScannerActivity.kt | 86 ++++++------------- mobile/src/main/res/layout/layout_scanner.xml | 12 ++- 3 files changed, 37 insertions(+), 63 deletions(-) diff --git a/mobile/build.gradle b/mobile/build.gradle index 997b7cc2..85a81540 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -70,9 +70,9 @@ dependencies { implementation 'com.twofortyfouram:android-plugin-api-for-locale:1.0.2' implementation 'dnsjava:dnsjava:2.1.8' implementation 'eu.chainfire:libsuperuser:1.0.0.201704021214' - implementation 'me.dm7.barcodescanner:zxing:1.9.8' implementation 'net.glxn.qrgen:android:2.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + implementation 'xyz.belvi.mobilevision:barcodescanner:2.0.3' testImplementation "junit:junit:$junitVersion" androidTestImplementation "com.android.support.test:runner:$androidTestVersion" androidTestImplementation "com.android.support.test.espresso:espresso-core:$androidEspressoVersion" diff --git a/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt b/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt index 20069c3d..1cb100e3 100644 --- a/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt +++ b/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt @@ -23,41 +23,37 @@ package com.github.shadowsocks import android.app.Activity import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.content.pm.ShortcutManager import android.graphics.BitmapFactory import android.hardware.camera2.CameraAccessException import android.hardware.camera2.CameraManager import android.os.Build import android.os.Bundle -import android.support.v4.app.ActivityCompat import android.support.v4.app.TaskStackBuilder -import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity import android.support.v7.widget.Toolbar import android.util.Log +import android.util.SparseArray import android.view.MenuItem import android.widget.Toast import com.github.shadowsocks.App.Companion.app import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.utils.resolveResourceId -import com.google.zxing.Result +import com.google.android.gms.samples.vision.barcodereader.BarcodeCapture +import com.google.android.gms.samples.vision.barcodereader.BarcodeGraphic import com.google.android.gms.vision.Frame import com.google.android.gms.vision.barcode.Barcode import com.google.android.gms.vision.barcode.BarcodeDetector +import xyz.belvi.mobilevisionbarcodescanner.BarcodeRetriever -import me.dm7.barcodescanner.zxing.ZXingScannerView - -class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Toolbar.OnMenuItemClickListener { +class ScannerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListener, BarcodeRetriever { companion object { - private const val MY_PERMISSIONS_REQUEST_CAMERA = 1 + private const val TAG = "ScannerActivity" private const val REQUEST_IMPORT = 2 private const val REQUEST_IMPORT_OR_FINISH = 3 } - private lateinit var scannerView: ZXingScannerView - private fun navigateUp() { val intent = parentActivityIntent if (shouldUpRecreateTask(intent) || isTaskRoot) @@ -67,19 +63,7 @@ class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Too override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.layout_scanner) - val toolbar = findViewById(R.id.toolbar) - toolbar.title = title - toolbar.setNavigationIcon(theme.resolveResourceId(R.attr.homeAsUpIndicator)) - toolbar.setNavigationOnClickListener { navigateUp() } - toolbar.inflateMenu(R.menu.scanner_menu) - toolbar.setOnMenuItemClickListener(this) - scannerView = findViewById(R.id.scanner) if (Build.VERSION.SDK_INT >= 25) getSystemService(ShortcutManager::class.java).reportShortcutUsed("scan") - } - - override fun onStart() { - super.onStart() if (try { (getSystemService(Context.CAMERA_SERVICE) as CameraManager).cameraIdList.isEmpty() } catch (_: CameraAccessException) { @@ -88,43 +72,29 @@ class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Too startImport() return } - val permissionCheck = ContextCompat.checkSelfPermission(this, - android.Manifest.permission.CAMERA) - if (permissionCheck != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), - MY_PERMISSIONS_REQUEST_CAMERA) + setContentView(R.layout.layout_scanner) + val toolbar = findViewById(R.id.toolbar) + toolbar.title = title + toolbar.setNavigationIcon(theme.resolveResourceId(R.attr.homeAsUpIndicator)) + toolbar.setNavigationOnClickListener { navigateUp() } + toolbar.inflateMenu(R.menu.scanner_menu) + toolbar.setOnMenuItemClickListener(this) + (supportFragmentManager.findFragmentById(R.id.barcode) as BarcodeCapture).setRetrieval(this) } - override fun onResume() { - super.onResume() - val permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) - if (permissionCheck == PackageManager.PERMISSION_GRANTED) { - scannerView.setResultHandler(this) // Register ourselves as a handler for scan results. - scannerView.startCamera() // Start camera on resume - } - } - - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - if (requestCode == MY_PERMISSIONS_REQUEST_CAMERA) - if (grantResults.getOrNull(0) == PackageManager.PERMISSION_GRANTED) { - scannerView.setResultHandler(this) - scannerView.startCamera() - } else { - Toast.makeText(this, R.string.add_profile_scanner_permission_required, Toast.LENGTH_SHORT).show() - startImport() - } - else super.onRequestPermissionsResult(requestCode, permissions, grantResults) - } - - override fun onPause() { - super.onPause() - scannerView.stopCamera() // Stop camera on pause - } - - override fun handleResult(rawResult: Result?) { - Profile.findAll(rawResult?.text).forEach { ProfileManager.createProfile(it) } + override fun onRetrieved(barcode: Barcode) = runOnUiThread { + Profile.findAll(barcode.rawValue).forEach { ProfileManager.createProfile(it) } navigateUp() } + override fun onRetrievedMultiple(closetToClick: Barcode?, barcode: MutableList?) = check(false) + override fun onBitmapScanned(sparseArray: SparseArray?) { } + override fun onRetrievedFailed(reason: String?) { + Log.w(TAG, reason) + } + override fun onPermissionRequestDenied() { + Toast.makeText(this, R.string.add_profile_scanner_permission_required, Toast.LENGTH_SHORT).show() + startImport() + } override fun onMenuItemClick(item: MenuItem) = when (item.itemId) { R.id.action_import -> { @@ -160,11 +130,11 @@ class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Too } catch (e: Exception) { app.track(e) } - } else Log.w("ScannerActivity", "Google vision isn't operational.") + } else Log.w(TAG, "Google vision isn't operational.") Toast.makeText(this, if (success) R.string.action_import_msg else R.string.action_import_err, Toast.LENGTH_SHORT).show() - finish() - } else if (requestCode == REQUEST_IMPORT_OR_FINISH) finish() + navigateUp() + } else if (requestCode == REQUEST_IMPORT_OR_FINISH) navigateUp() else -> super.onActivityResult(requestCode, resultCode, data) } } diff --git a/mobile/src/main/res/layout/layout_scanner.xml b/mobile/src/main/res/layout/layout_scanner.xml index ae575a39..293f78f0 100644 --- a/mobile/src/main/res/layout/layout_scanner.xml +++ b/mobile/src/main/res/layout/layout_scanner.xml @@ -1,12 +1,16 @@ - +