diff --git a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt index ae23f01..98d195d 100644 --- a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt +++ b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt @@ -1,25 +1,15 @@ package net.touchcapture.qr.flutterqr -import android.Manifest import android.app.Activity -import android.content.pm.PackageManager -import android.os.Build import androidx.annotation.NonNull import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.embedding.engine.plugins.activity.ActivityAware import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding import io.flutter.plugin.common.BinaryMessenger -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import io.flutter.plugin.common.MethodChannel.Result import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.platform.PlatformViewRegistry - -class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { - - var cameraPermissionContinuation: Runnable? = null - var requestingPermission = false +class FlutterQrPlugin : FlutterPlugin, ActivityAware { /** Plugin registration embedding v1 */ companion object { @@ -31,7 +21,6 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private fun onAttachedToV1(registrar: PluginRegistry.Registrar) { registrar.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) - checkAndRequestPermission(null) onAttachedToEngines(registrar.platformViewRegistry(), registrar.messenger(), registrar.activity()) } @@ -53,16 +42,9 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { "net.touchcapture.qr.flutterqr/qrview", QRViewFactory(messenger)) } - override fun onMethodCall(call: MethodCall, result: Result) { - when (call.method) { - "checkAndRequestPermission" -> checkAndRequestPermission(result) - } - } - override fun onAttachedToActivity(activityPluginBinding: ActivityPluginBinding) { Shared.activity = activityPluginBinding.activity activityPluginBinding.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) - checkAndRequestPermission(null) } override fun onDetachedFromActivityForConfigChanges() { @@ -76,46 +58,4 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { override fun onDetachedFromActivity() { Shared.activity = null } - - private inner class CameraRequestPermissionsListener : PluginRegistry.RequestPermissionsResultListener { - override fun onRequestPermissionsResult(id: Int, permissions: Array, grantResults: IntArray): Boolean { - if (id == QRView.CAMERA_REQUEST_ID && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - cameraPermissionContinuation?.run() - return true - } - return false - } - } - - private fun hasCameraPermission(): Boolean { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || - Shared.activity?.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED - } - - private fun checkAndRequestPermission(result: Result?) { - if (cameraPermissionContinuation != null) { - result?.error("cameraPermission", "Camera permission request ongoing", null) - } - - cameraPermissionContinuation = Runnable { - cameraPermissionContinuation = null - if (!hasCameraPermission()) { - result?.error( - "cameraPermission", "MediaRecorderCamera permission not granted", null) - return@Runnable - } - } - - requestingPermission = false - if (hasCameraPermission()) { - cameraPermissionContinuation?.run() - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - requestingPermission = true - Shared.activity?.requestPermissions( - arrayOf(Manifest.permission.CAMERA), - QRView.CAMERA_REQUEST_ID) - } - } - } } diff --git a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt index e91743d..b795931 100644 --- a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt +++ b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt @@ -1,5 +1,6 @@ package net.touchcapture.qr.flutterqr +import android.Manifest import android.app.Activity import android.app.Application import android.content.Context @@ -8,26 +9,25 @@ import android.os.Bundle import android.view.View import com.google.zxing.ResultPoint import android.hardware.Camera.CameraInfo +import android.os.Build import com.journeyapps.barcodescanner.BarcodeCallback import com.journeyapps.barcodescanner.BarcodeResult import com.journeyapps.barcodescanner.BarcodeView import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.platform.PlatformView class QRView(messenger: BinaryMessenger, id: Int, private val context: Context) : PlatformView, MethodChannel.MethodCallHandler { - companion object { - const val CAMERA_REQUEST_ID = 513469796 - } - - var barcodeView: BarcodeView? = null - private var isTorchOn: Boolean = false - val channel: MethodChannel + private var barcodeView: BarcodeView? = null + private var requestingPermission = false + private val channel: MethodChannel init { + checkAndRequestPermission(null) channel = MethodChannel(messenger, "net.touchcapture.qr.flutterqr/qrview_$id") channel.setMethodCallHandler(this) Shared.activity?.application?.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { @@ -60,6 +60,28 @@ class QRView(messenger: BinaryMessenger, id: Int, private val context: Context) }) } + override fun dispose() { + barcodeView?.pause() + barcodeView = null + } + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + when(call.method){ + "flipCamera" -> { + flipCamera() + } + "toggleFlash" -> { + toggleFlash() + } + "pauseCamera" -> { + pauseCamera() + } + "resumeCamera" -> { + resumeCamera() + } + } + } + fun flipCamera() { barcodeView?.pause() var settings = barcodeView?.cameraSettings @@ -126,28 +148,46 @@ class QRView(messenger: BinaryMessenger, id: Int, private val context: Context) return barcode } - override fun dispose() { - barcodeView?.pause() - barcodeView = null + private fun hasCameraPermission(): Boolean { + return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || + Shared.activity?.checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED } - override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { - when(call.method){ - "flipCamera" -> { - flipCamera() - } - "toggleFlash" -> { - toggleFlash() - } - "pauseCamera" -> { - pauseCamera() + private fun checkAndRequestPermission(result: MethodChannel.Result?) { + if (Shared.cameraPermissionContinuation != null) { + result?.error("cameraPermission", "Camera permission request ongoing", null) + } + + Shared.cameraPermissionContinuation = Runnable { + Shared.cameraPermissionContinuation = null + if (!hasCameraPermission()) { + result?.error( + "cameraPermission", "MediaRecorderCamera permission not granted", null) + return@Runnable } - "resumeCamera" -> { - resumeCamera() + } + + requestingPermission = false + if (hasCameraPermission()) { + Shared.cameraPermissionContinuation?.run() + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestingPermission = true + Shared.activity?.requestPermissions( + arrayOf(Manifest.permission.CAMERA), + Shared.CAMERA_REQUEST_ID) } } } +} - +class CameraRequestPermissionsListener : PluginRegistry.RequestPermissionsResultListener { + override fun onRequestPermissionsResult(id: Int, permissions: Array, grantResults: IntArray): Boolean { + if (id == Shared.CAMERA_REQUEST_ID && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Shared.cameraPermissionContinuation?.run() + return true + } + return false + } } diff --git a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt index 7823e01..24bc4ab 100644 --- a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt +++ b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt @@ -1,9 +1,9 @@ package net.touchcapture.qr.flutterqr import android.app.Activity -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding - object Shared { + const val CAMERA_REQUEST_ID = 513469796 var activity: Activity? = null + var cameraPermissionContinuation: Runnable? = null } \ No newline at end of file