Skip to content

Commit 2bc2a4b

Browse files
Merge pull request #18 from regulaforensics/release-6.2
Release 6.2
2 parents 690e3be + 07dac1d commit 2bc2a4b

22 files changed

Lines changed: 345 additions & 95 deletions

File tree

CertificatePinningSample/app/build.gradle

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ android {
2424
buildFeatures {
2525
viewBinding true
2626
}
27-
28-
//Required to add
29-
aaptOptions {
30-
noCompress "Regula/faceSdkResource.dat"
31-
}
3227
}
3328

3429
dependencies {
@@ -39,9 +34,9 @@ dependencies {
3934
implementation "androidx.core:core-ktx:1.7.0"
4035
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
4136

42-
implementation ('com.regula.face:api:6.1.+@aar'){
37+
implementation ('com.regula.face:api:6.2.+@aar'){
4338
transitive = true
4439
}
4540

46-
implementation ('com.regula.face.core:basic:6.1.+@aar')
41+
implementation ('com.regula.face.core:basic:6.2.+@aar')
4742
}

FaceSample/app/build.gradle

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@ android {
2121
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2222
}
2323
}
24-
25-
//Required to add
26-
aaptOptions {
27-
noCompress "Regula/faceSdkResource.dat"
28-
}
2924
}
3025

3126
dependencies {
@@ -39,9 +34,9 @@ dependencies {
3934

4035
implementation "androidx.recyclerview:recyclerview:1.2.1"
4136

42-
implementation ('com.regula.face:api:6.1.+@aar'){
37+
implementation ('com.regula.face:api:6.2.+@aar'){
4338
transitive = true
4439
}
4540

46-
implementation ('com.regula.face.core:basic:6.1.+@aar')
41+
implementation ('com.regula.face.core:basic:6.2.+@aar')
4742
}

FaceSampleKotlin/app/build.gradle

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ android {
2626
buildFeatures {
2727
viewBinding true
2828
}
29-
30-
//Required to add
31-
aaptOptions {
32-
noCompress "Regula/faceSdkResource.dat"
33-
}
3429
}
3530

3631
dependencies {
@@ -45,9 +40,9 @@ dependencies {
4540
implementation "androidx.core:core-ktx:1.7.0"
4641
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
4742

48-
implementation ('com.regula.face:api:6.1.+@aar'){
43+
implementation ('com.regula.face:api:6.2.+@aar'){
4944
transitive = true
5045
}
5146

52-
implementation ('com.regula.face.core:basic:6.1.+@aar')
47+
implementation ('com.regula.face.core:basic:6.2.+@aar')
5348
}

FaceSampleKotlin/app/src/main/java/com/regula/facesamplekotlin/CategoryDataProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class CategoryDataProvider {
4040
LivenessScreenConfigurationItem(),
4141
FaceCaptureConfigurationItem(),
4242

43+
LivenessNotificationItem(),
4344
HideCloseButtonItem(),
4445
HideFlashButtonItem(),
4546
HideNotificationViewItem(),

FaceSampleKotlin/app/src/main/java/com/regula/facesamplekotlin/DetectFacesActivity.kt

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.regula.facesamplekotlin
22

3+
import android.Manifest
34
import android.app.Activity
45
import android.content.Intent
6+
import android.content.pm.PackageManager
57
import android.graphics.*
68
import android.graphics.drawable.BitmapDrawable
79
import android.os.Bundle
@@ -15,9 +17,11 @@ import android.view.ViewGroup
1517
import android.widget.Button
1618
import android.widget.ImageView
1719
import android.widget.PopupMenu
20+
import android.widget.Toast
1821
import androidx.activity.result.ActivityResult
1922
import androidx.activity.result.contract.ActivityResultContracts
2023
import androidx.appcompat.app.AppCompatActivity
24+
import androidx.core.content.ContextCompat
2125
import androidx.fragment.app.DialogFragment
2226
import com.regula.facesamplekotlin.databinding.ActivityDetectFacesBinding
2327
import com.regula.facesamplekotlin.util.RandomColors
@@ -45,6 +49,7 @@ class DetectFacesActivity : AppCompatActivity() {
4549
private lateinit var scenario: Scenario
4650
private lateinit var response: DetectFacesResponse
4751
private lateinit var bitmapToDetect: Bitmap
52+
private lateinit var externalBitmap: Bitmap
4853

4954
public override fun onCreate(savedInstanceState: Bundle?) {
5055
super.onCreate(savedInstanceState)
@@ -54,10 +59,27 @@ class DetectFacesActivity : AppCompatActivity() {
5459

5560
setImage(R.drawable.detect_face1)
5661
binding.imageViewMain.setOnClickListener { showMenu(binding.imageViewMain) }
57-
binding.imageViewSample1.setOnClickListener { setImage(R.drawable.detect_face1) }
58-
binding.imageViewSample2.setOnClickListener { setImage(R.drawable.detect_face2) }
59-
binding.imageViewSample3.setOnClickListener { setImage(R.drawable.detect_face3) }
60-
binding.imageViewSample4.setOnClickListener { setImage(R.drawable.detect_face4) }
62+
binding.imageViewSample1.setOnClickListener {
63+
setImage(R.drawable.detect_face1)
64+
binding.imageViewBackground1.setBackgroundColor(Color.BLUE)
65+
}
66+
binding.imageViewSample2.setOnClickListener {
67+
setImage(R.drawable.detect_face2)
68+
binding.imageViewBackground2.setBackgroundColor(Color.BLUE)
69+
}
70+
binding.imageViewSample3.setOnClickListener {
71+
setImage(R.drawable.detect_face3)
72+
binding.imageViewBackground3.setBackgroundColor(Color.BLUE)
73+
}
74+
binding.imageViewSample4.setOnClickListener {
75+
setImage(R.drawable.detect_face4)
76+
binding.imageViewBackground4.setBackgroundColor(Color.BLUE)
77+
}
78+
binding.imageViewSample5.setOnClickListener {
79+
setImage(externalBitmap)
80+
}
81+
82+
binding.imageViewBackground1.setBackgroundColor(Color.BLUE)
6183

6284
binding.button1.setOnClickListener { updateScenario(Scenario.CROP_CENTER, it) }
6385
binding.button2.setOnClickListener { updateScenario(Scenario.CROP_ALL, it) }
@@ -79,15 +101,22 @@ class DetectFacesActivity : AppCompatActivity() {
79101
}
80102

81103
private fun setImage(res: Int) {
104+
clearImageBackground()
82105
val option = BitmapFactory.Options()
83106
option.inScaled = false
84107
val bitmap = BitmapFactory.decodeResource(resources, res, option)
85-
setImage(bitmap)
108+
bitmapToDetect = bitmap;
109+
binding.imageViewMain.setImageBitmap(bitmapToDetect);
86110
}
87111

88112
private fun setImage(bitmap: Bitmap) {
89-
bitmapToDetect = bitmap;
90-
binding.imageViewMain.setImageBitmap(bitmapToDetect);
113+
clearImageBackground()
114+
bitmapToDetect = bitmap
115+
externalBitmap = bitmap
116+
binding.imageViewMain.setImageBitmap(bitmapToDetect)
117+
binding.imageViewSample5.setImageBitmap(bitmapToDetect)
118+
binding.imageViewBackground5.visibility = View.VISIBLE
119+
binding.imageViewBackground5.setBackgroundColor(Color.BLUE)
91120
}
92121

93122
private fun updateScenario(scenario: Scenario, view: View) {
@@ -240,7 +269,40 @@ class DetectFacesActivity : AppCompatActivity() {
240269
}
241270
}
242271

272+
273+
private val requestPermissionLauncher =
274+
registerForActivityResult(
275+
ActivityResultContracts.RequestPermission()
276+
) { isGranted: Boolean ->
277+
if (isGranted) {
278+
launchCamera()
279+
} else {
280+
Toast.makeText(
281+
this@DetectFacesActivity,
282+
"Camera permission denied",
283+
Toast.LENGTH_SHORT
284+
).show()
285+
}
286+
}
287+
243288
private fun openDefaultCamera() {
289+
when {
290+
ContextCompat.checkSelfPermission(
291+
this@DetectFacesActivity,
292+
Manifest.permission.CAMERA
293+
) == PackageManager.PERMISSION_GRANTED -> {
294+
launchCamera()
295+
}
296+
297+
else -> {
298+
requestPermissionLauncher.launch(
299+
Manifest.permission.CAMERA
300+
)
301+
}
302+
}
303+
}
304+
305+
private fun launchCamera() {
244306
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
245307
startCameraForResult.launch(cameraIntent)
246308
}
@@ -267,6 +329,13 @@ class DetectFacesActivity : AppCompatActivity() {
267329
}
268330
}
269331

332+
private fun clearImageBackground() {
333+
binding.imageViewBackground1.setBackgroundColor(0)
334+
binding.imageViewBackground2.setBackgroundColor(0)
335+
binding.imageViewBackground3.setBackgroundColor(0)
336+
binding.imageViewBackground4.setBackgroundColor(0)
337+
binding.imageViewBackground5.setBackgroundColor(0)
338+
}
270339

271340
class ImageDialogFragment : DialogFragment() {
272341
override fun onCreateView(

FaceSampleKotlin/app/src/main/java/com/regula/facesamplekotlin/MatchFacesActivity.kt

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,30 @@
11
package com.regula.facesamplekotlin
22

3-
import android.app.Activity
3+
import android.Manifest
44
import android.content.Intent
5+
import android.content.pm.PackageManager
56
import android.graphics.Bitmap
7+
import android.graphics.BitmapFactory
68
import android.graphics.Color
79
import android.graphics.drawable.BitmapDrawable
810
import android.net.Uri
911
import android.os.Bundle
1012
import android.provider.MediaStore
1113
import 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
1328
import com.regula.facesdk.FaceSDK
1429
import com.regula.facesdk.configuration.FaceCaptureConfiguration
1530
import com.regula.facesdk.detection.request.OutputImageCrop
@@ -25,9 +40,11 @@ import com.regula.facesdk.model.results.matchfaces.MatchFacesSimilarityThreshold
2540
import 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

Comments
 (0)