11package com.regula.facesamplekotlin
22
3- import android.app.Activity
3+ import android.Manifest
44import android.content.Intent
5+ import android.content.pm.PackageManager
56import android.graphics.Bitmap
7+ import android.graphics.BitmapFactory
68import android.graphics.Color
79import android.graphics.drawable.BitmapDrawable
810import android.net.Uri
911import android.os.Bundle
1012import android.provider.MediaStore
1113import android.view.MenuItem
12- import android.widget.*
14+ import android.widget.Button
15+ import android.widget.ImageView
16+ import android.widget.PopupMenu
17+ import android.widget.RadioButton
18+ import android.widget.RadioGroup
19+ import android.widget.TextView
20+ import android.widget.Toast
21+ import androidx.activity.result.ActivityResult
22+ import androidx.activity.result.contract.ActivityResultContracts
23+ import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
24+ import androidx.appcompat.app.AppCompatActivity
25+ import androidx.appcompat.widget.SwitchCompat
26+ import androidx.core.content.ContextCompat
27+ import com.regula.facesamplekotlin.util.ResizeTransformation
1328import com.regula.facesdk.FaceSDK
1429import com.regula.facesdk.configuration.FaceCaptureConfiguration
1530import com.regula.facesdk.detection.request.OutputImageCrop
@@ -25,9 +40,11 @@ import com.regula.facesdk.model.results.matchfaces.MatchFacesSimilarityThreshold
2540import com.regula.facesdk.request.MatchFacesRequest
2641
2742
28- class MatchFacesActivity : Activity () {
43+ class MatchFacesActivity : AppCompatActivity () {
2944 private lateinit var imageView1: ImageView
3045 private lateinit var imageView2: ImageView
46+ private lateinit var switchDetectAll1: SwitchCompat
47+ private lateinit var switchDetectAll2: SwitchCompat
3148 private lateinit var imageViewResult1: ImageView
3249 private lateinit var imageViewResult2: ImageView
3350 private lateinit var group0: RadioGroup
@@ -40,6 +57,8 @@ class MatchFacesActivity : Activity() {
4057 private lateinit var textViewSimilarity: TextView
4158 private lateinit var textViewLiveness: TextView
4259
60+ private var currentImageView: ImageView ? = null
61+
4362 private var imageUri: Uri ? = null
4463
4564 public override fun onCreate (savedInstanceState : Bundle ? ) {
@@ -55,6 +74,9 @@ class MatchFacesActivity : Activity() {
5574 imageViewResult1 = findViewById(R .id.imageViewResult1)
5675 imageViewResult2 = findViewById(R .id.imageViewResult2)
5776
77+ switchDetectAll1 = findViewById(R .id.detectAll1)
78+ switchDetectAll2 = findViewById(R .id.detectAll2)
79+
5880 group0 = findViewById(R .id.rbGroup0)
5981 group1 = findViewById(R .id.rbGroup1)
6082
@@ -112,13 +134,63 @@ class MatchFacesActivity : Activity() {
112134 startFaceCaptureActivity(imageView, radioGroup)
113135 return @setOnMenuItemClickListener true
114136 }
137+ R .id.photo -> {
138+ currentImageView = imageView
139+ openDefaultCamera()
140+ return @setOnMenuItemClickListener true
141+ }
115142 else -> return @setOnMenuItemClickListener false
116143 }
117144 }
118145 popupMenu.menuInflater.inflate(R .menu.menu, popupMenu.menu)
119146 popupMenu.show()
120147 }
121148
149+
150+ private val requestPermissionLauncher =
151+ registerForActivityResult(
152+ RequestPermission ()
153+ ) { isGranted: Boolean ->
154+ if (isGranted) {
155+ launchCamera()
156+ } else {
157+ Toast .makeText(
158+ this @MatchFacesActivity,
159+ " Camera permission denied" ,
160+ Toast .LENGTH_SHORT
161+ ).show()
162+ }
163+ }
164+
165+ private fun openDefaultCamera () {
166+ when {
167+ ContextCompat .checkSelfPermission(
168+ this @MatchFacesActivity,
169+ Manifest .permission.CAMERA
170+ ) == PackageManager .PERMISSION_GRANTED -> {
171+ launchCamera()
172+ }
173+
174+ else -> {
175+ requestPermissionLauncher.launch(
176+ Manifest .permission.CAMERA
177+ )
178+ }
179+ }
180+ }
181+
182+ private fun launchCamera () {
183+ val cameraIntent = Intent (MediaStore .ACTION_IMAGE_CAPTURE )
184+ startCameraForResult.launch(cameraIntent)
185+ }
186+
187+ private val startCameraForResult =
188+ registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result: ActivityResult ->
189+ val photo = result.data?.extras?.get(" data" )
190+ if (photo is Bitmap )
191+ currentImageView?.setImageBitmap(photo);
192+ }
193+
122194 private fun getImageBitmap (imageView : ImageView ? ): Bitmap {
123195 imageView?.invalidate()
124196 val drawable = imageView?.drawable as BitmapDrawable
@@ -163,14 +235,20 @@ class MatchFacesActivity : Activity() {
163235 group = group1
164236 }
165237
166- imageView?.setImageURI(imageUri)
238+ imageUri?.let {
239+ val bitmap = contentResolver?.openInputStream(it).use { data ->
240+ BitmapFactory .decodeStream(data)
241+ }
242+ val resizedBitmap = ResizeTransformation (1080 ).transform(bitmap)
243+ imageView?.setImageBitmap(resizedBitmap)
244+ }
167245
168246 setGroupSelection(group, ImageType .PRINTED )
169247 }
170248
171249 private fun matchFaces (first : Bitmap , second : Bitmap ) {
172- val firstImage = MatchFacesImage (first, getGroupSelection(group0), true )
173- val secondImage = MatchFacesImage (second, getGroupSelection(group1), true )
250+ val firstImage = MatchFacesImage (first, getGroupSelection(group0), switchDetectAll1.isChecked )
251+ val secondImage = MatchFacesImage (second, getGroupSelection(group1), switchDetectAll1.isChecked )
174252 val matchFacesRequest = MatchFacesRequest (arrayListOf (firstImage, secondImage))
175253
176254 val crop = OutputImageCrop (
0 commit comments