kopia lustrzana https://github.com/ryukoposting/Signal-Android
51 wiersze
1.6 KiB
Kotlin
51 wiersze
1.6 KiB
Kotlin
|
package org.signal.qr
|
||
|
|
||
|
import android.content.Context
|
||
|
import android.os.Build
|
||
|
import android.util.AttributeSet
|
||
|
import android.widget.FrameLayout
|
||
|
import androidx.lifecycle.DefaultLifecycleObserver
|
||
|
import androidx.lifecycle.LifecycleOwner
|
||
|
import io.reactivex.rxjava3.core.Observable
|
||
|
import io.reactivex.rxjava3.subjects.PublishSubject
|
||
|
|
||
|
/**
|
||
|
* View for starting up a camera and scanning a QR-Code. Safe to use on an API version and
|
||
|
* will delegate to legacy camera APIs or CameraX APIs when appropriate.
|
||
|
*
|
||
|
* QR-code data is emitted via [qrData] observable.
|
||
|
*/
|
||
|
class QrScannerView @JvmOverloads constructor(
|
||
|
context: Context,
|
||
|
attrs: AttributeSet? = null,
|
||
|
defStyleAttr: Int = 0
|
||
|
) : FrameLayout(context, attrs, defStyleAttr), ScannerView {
|
||
|
|
||
|
private val scannerView: ScannerView
|
||
|
private val qrDataPublish: PublishSubject<String> = PublishSubject.create()
|
||
|
|
||
|
val qrData: Observable<String> = qrDataPublish
|
||
|
|
||
|
init {
|
||
|
val scannerView: FrameLayout = if (Build.VERSION.SDK_INT >= 21) {
|
||
|
ScannerView21(context) { qrDataPublish.onNext(it) }
|
||
|
} else {
|
||
|
ScannerView19(context) { qrDataPublish.onNext(it) }
|
||
|
}
|
||
|
|
||
|
scannerView.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
|
||
|
addView(scannerView)
|
||
|
|
||
|
this.scannerView = (scannerView as ScannerView)
|
||
|
}
|
||
|
|
||
|
override fun start(lifecycleOwner: LifecycleOwner) {
|
||
|
scannerView.start(lifecycleOwner)
|
||
|
lifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
|
||
|
override fun onDestroy(owner: LifecycleOwner) {
|
||
|
qrDataPublish.onComplete()
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|