Преглед изворни кода

Moved permission request from plugin initialization to view initialization.

flutter-beta
Julian Steenbakker пре 5 година
родитељ
комит
6830657636
3 измењених фајлова са 66 додато и 86 уклоњено
  1. +1
    -61
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt
  2. +63
    -23
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt
  3. +2
    -2
      android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt

+ 1
- 61
android/src/main/kotlin/net/touchcapture/qr/flutterqr/FlutterQrPlugin.kt Прегледај датотеку

@@ -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)
}
}
}
} }

+ 63
- 23
android/src/main/kotlin/net/touchcapture/qr/flutterqr/QRView.kt Прегледај датотеку

@@ -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
}
} }

+ 2
- 2
android/src/main/kotlin/net/touchcapture/qr/flutterqr/Shared.kt Прегледај датотеку

@@ -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
} }

Loading…
Откажи
Сачувај