185 permission on app startflutter-beta
| @@ -1,25 +1,15 @@ | |||||
| package net.touchcapture.qr.flutterqr | package net.touchcapture.qr.flutterqr | ||||
| import android.Manifest | |||||
| import android.app.Activity | import android.app.Activity | ||||
| import android.content.pm.PackageManager | |||||
| import android.os.Build | |||||
| import androidx.annotation.NonNull | import androidx.annotation.NonNull | ||||
| import io.flutter.embedding.engine.plugins.FlutterPlugin | import io.flutter.embedding.engine.plugins.FlutterPlugin | ||||
| import io.flutter.embedding.engine.plugins.activity.ActivityAware | import io.flutter.embedding.engine.plugins.activity.ActivityAware | ||||
| import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding | import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding | ||||
| import io.flutter.plugin.common.BinaryMessenger | 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.common.PluginRegistry | ||||
| import io.flutter.plugin.platform.PlatformViewRegistry | 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 */ | /** Plugin registration embedding v1 */ | ||||
| companion object { | companion object { | ||||
| @@ -31,7 +21,6 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { | |||||
| private fun onAttachedToV1(registrar: PluginRegistry.Registrar) { | private fun onAttachedToV1(registrar: PluginRegistry.Registrar) { | ||||
| registrar.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) | registrar.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) | ||||
| checkAndRequestPermission(null) | |||||
| onAttachedToEngines(registrar.platformViewRegistry(), registrar.messenger(), registrar.activity()) | onAttachedToEngines(registrar.platformViewRegistry(), registrar.messenger(), registrar.activity()) | ||||
| } | } | ||||
| @@ -53,16 +42,9 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { | |||||
| "net.touchcapture.qr.flutterqr/qrview", QRViewFactory(messenger)) | "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) { | override fun onAttachedToActivity(activityPluginBinding: ActivityPluginBinding) { | ||||
| Shared.activity = activityPluginBinding.activity | Shared.activity = activityPluginBinding.activity | ||||
| activityPluginBinding.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) | activityPluginBinding.addRequestPermissionsResultListener(CameraRequestPermissionsListener()) | ||||
| checkAndRequestPermission(null) | |||||
| } | } | ||||
| override fun onDetachedFromActivityForConfigChanges() { | override fun onDetachedFromActivityForConfigChanges() { | ||||
| @@ -76,46 +58,4 @@ class FlutterQrPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { | |||||
| override fun onDetachedFromActivity() { | override fun onDetachedFromActivity() { | ||||
| Shared.activity = null | Shared.activity = null | ||||
| } | } | ||||
| private inner class CameraRequestPermissionsListener : PluginRegistry.RequestPermissionsResultListener { | |||||
| override fun onRequestPermissionsResult(id: Int, permissions: Array<String>, 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) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -1,5 +1,6 @@ | |||||
| package net.touchcapture.qr.flutterqr | package net.touchcapture.qr.flutterqr | ||||
| import android.Manifest | |||||
| import android.app.Activity | import android.app.Activity | ||||
| import android.app.Application | import android.app.Application | ||||
| import android.content.Context | import android.content.Context | ||||
| @@ -8,26 +9,25 @@ import android.os.Bundle | |||||
| import android.view.View | import android.view.View | ||||
| import com.google.zxing.ResultPoint | import com.google.zxing.ResultPoint | ||||
| import android.hardware.Camera.CameraInfo | import android.hardware.Camera.CameraInfo | ||||
| import android.os.Build | |||||
| import com.journeyapps.barcodescanner.BarcodeCallback | import com.journeyapps.barcodescanner.BarcodeCallback | ||||
| import com.journeyapps.barcodescanner.BarcodeResult | import com.journeyapps.barcodescanner.BarcodeResult | ||||
| import com.journeyapps.barcodescanner.BarcodeView | import com.journeyapps.barcodescanner.BarcodeView | ||||
| import io.flutter.plugin.common.BinaryMessenger | import io.flutter.plugin.common.BinaryMessenger | ||||
| import io.flutter.plugin.common.MethodCall | import io.flutter.plugin.common.MethodCall | ||||
| import io.flutter.plugin.common.MethodChannel | import io.flutter.plugin.common.MethodChannel | ||||
| import io.flutter.plugin.common.PluginRegistry | |||||
| import io.flutter.plugin.platform.PlatformView | import io.flutter.plugin.platform.PlatformView | ||||
| class QRView(messenger: BinaryMessenger, id: Int, private val context: Context) : | class QRView(messenger: BinaryMessenger, id: Int, private val context: Context) : | ||||
| PlatformView, MethodChannel.MethodCallHandler { | PlatformView, MethodChannel.MethodCallHandler { | ||||
| companion object { | |||||
| const val CAMERA_REQUEST_ID = 513469796 | |||||
| } | |||||
| var barcodeView: BarcodeView? = null | |||||
| private var isTorchOn: Boolean = false | private var isTorchOn: Boolean = false | ||||
| val channel: MethodChannel | |||||
| private var barcodeView: BarcodeView? = null | |||||
| private var requestingPermission = false | |||||
| private val channel: MethodChannel | |||||
| init { | init { | ||||
| checkAndRequestPermission(null) | |||||
| channel = MethodChannel(messenger, "net.touchcapture.qr.flutterqr/qrview_$id") | channel = MethodChannel(messenger, "net.touchcapture.qr.flutterqr/qrview_$id") | ||||
| channel.setMethodCallHandler(this) | channel.setMethodCallHandler(this) | ||||
| Shared.activity?.application?.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { | 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() { | fun flipCamera() { | ||||
| barcodeView?.pause() | barcodeView?.pause() | ||||
| var settings = barcodeView?.cameraSettings | var settings = barcodeView?.cameraSettings | ||||
| @@ -126,28 +148,46 @@ class QRView(messenger: BinaryMessenger, id: Int, private val context: Context) | |||||
| return barcode | 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<String>, grantResults: IntArray): Boolean { | |||||
| if (id == Shared.CAMERA_REQUEST_ID && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||||
| Shared.cameraPermissionContinuation?.run() | |||||
| return true | |||||
| } | |||||
| return false | |||||
| } | |||||
| } | } | ||||
| @@ -1,9 +1,9 @@ | |||||
| package net.touchcapture.qr.flutterqr | package net.touchcapture.qr.flutterqr | ||||
| import android.app.Activity | import android.app.Activity | ||||
| import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding | |||||
| object Shared { | object Shared { | ||||
| const val CAMERA_REQUEST_ID = 513469796 | |||||
| var activity: Activity? = null | var activity: Activity? = null | ||||
| var cameraPermissionContinuation: Runnable? = null | |||||
| } | } | ||||