From 2148ed0cd42f5261c932cee6a11936f621e2f822 Mon Sep 17 00:00:00 2001 From: Julian Steenbakker Date: Wed, 9 Dec 2020 15:57:27 +0100 Subject: [PATCH 1/2] Fixed night mode. --- .../kotlin/net/touchcapture/qr/flutterqr/QRView.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 d99ddfb..ae6260c 100644 --- a/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt +++ b/android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt @@ -39,31 +39,31 @@ class QRView(private val registrar: PluginRegistry.Registrar, id: Int) : channel.setMethodCallHandler(this) checkAndRequestPermission(null) registrar.activity().application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { - override fun onActivityPaused(p0: Activity?) { + override fun onActivityPaused(p0: Activity) { if (p0 == registrar.activity()) { barcodeView?.pause() } } - override fun onActivityResumed(p0: Activity?) { + override fun onActivityResumed(p0: Activity) { if (p0 == registrar.activity()) { barcodeView?.resume() } } - override fun onActivityStarted(p0: Activity?) { + override fun onActivityStarted(p0: Activity) { } - override fun onActivityDestroyed(p0: Activity?) { + override fun onActivityDestroyed(p0: Activity) { } - override fun onActivitySaveInstanceState(p0: Activity?, p1: Bundle?) { + override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) { } - override fun onActivityStopped(p0: Activity?) { + override fun onActivityStopped(p0: Activity) { } - override fun onActivityCreated(p0: Activity?, p1: Bundle?) { + override fun onActivityCreated(p0: Activity, p1: Bundle?) { } }) } From 6830657636cb118e3e3655cb81b184b23c0918cd Mon Sep 17 00:00:00 2001 From: Julian Steenbakker Date: Mon, 21 Dec 2020 11:49:12 +0100 Subject: [PATCH 2/2] Moved permission request from plugin initialization to view initialization. --- .../qr/flutterqr/FlutterQrPlugin.kt | 62 +------------ .../net/touchcapture/qr/flutterqr/QRView.kt | 86 ++++++++++++++----- .../net/touchcapture/qr/flutterqr/Shared.kt | 4 +- 3 files changed, 66 insertions(+), 86 deletions(-) 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