From c340565c4fc3c5832bc583aadb326a4b5de4947a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Furkan=20T=C3=BCrkan?= <51923824+genjitsuCode@users.noreply.github.com> Date: Sun, 12 Feb 2023 20:17:12 +0300 Subject: [PATCH] Initial commit --- .gitignore | 15 + app/.gitignore | 1 + app/build.gradle | 49 ++ app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.kt | 24 + app/src/main/AndroidManifest.xml | 25 + .../cameraxmlkitpackexample/MainActivity.kt | 180 ++++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ .../res/drawable/baseline_flash_off_24.xml | 5 + .../res/drawable/baseline_flash_on_24.xml | 5 + .../res/drawable/ic_launcher_background.xml | 170 +++++++ app/src/main/res/layout/activity_main.xml | 134 ++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../res/mipmap-anydpi-v33/ic_launcher.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes app/src/main/res/mipmap-xhdpi/focus.png | Bin 0 -> 1336 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-night/themes.xml | 16 + app/src/main/res/values/colors.xml | 12 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 16 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../ExampleUnitTest.kt | 17 + build.gradle | 6 + camerax-mlkit-pack/.gitignore | 1 + camerax-mlkit-pack/build.gradle | 57 +++ camerax-mlkit-pack/consumer-rules.pro | 0 camerax-mlkit-pack/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.kt | 24 + .../src/main/AndroidManifest.xml | 9 + .../camerax_mlkit_pack/MlKitReaderManager.kt | 432 ++++++++++++++++++ .../camerax_mlkit_pack/core/Constants.kt | 12 + .../camerax_mlkit_pack/core/ReaderType.kt | 21 + .../furkan/camerax_mlkit_pack/core/Utils.kt | 106 +++++ .../core/state/BarcodeResultEvent.kt | 5 + .../core/state/FlashStatus.kt | 6 + .../camerax_mlkit_pack/ExampleUnitTest.kt | 17 + gradle.properties | 23 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++ gradlew.bat | 89 ++++ jitpack.yml | 4 + settings.gradle | 17 + 54 files changed, 1812 insertions(+) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/furkan/cameraxmlkitpackexample/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/furkan/cameraxmlkitpackexample/MainActivity.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/baseline_flash_off_24.xml create mode 100644 app/src/main/res/drawable/baseline_flash_on_24.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-anydpi-v33/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/focus.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/furkan/cameraxmlkitpackexample/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 camerax-mlkit-pack/.gitignore create mode 100644 camerax-mlkit-pack/build.gradle create mode 100644 camerax-mlkit-pack/consumer-rules.pro create mode 100644 camerax-mlkit-pack/proguard-rules.pro create mode 100644 camerax-mlkit-pack/src/androidTest/java/com/furkan/camerax_mlkit_pack/ExampleInstrumentedTest.kt create mode 100644 camerax-mlkit-pack/src/main/AndroidManifest.xml create mode 100644 camerax-mlkit-pack/src/main/java/com/furkan/camerax_mlkit_pack/MlKitReaderManager.kt create mode 100644 camerax-mlkit-pack/src/main/java/com/furkan/camerax_mlkit_pack/core/Constants.kt create mode 100644 camerax-mlkit-pack/src/main/java/com/furkan/camerax_mlkit_pack/core/ReaderType.kt create mode 100644 camerax-mlkit-pack/src/main/java/com/furkan/camerax_mlkit_pack/core/Utils.kt create mode 100644 camerax-mlkit-pack/src/main/java/com/furkan/camerax_mlkit_pack/core/state/BarcodeResultEvent.kt create mode 100644 camerax-mlkit-pack/src/main/java/com/furkan/camerax_mlkit_pack/core/state/FlashStatus.kt create mode 100644 camerax-mlkit-pack/src/test/java/com/furkan/camerax_mlkit_pack/ExampleUnitTest.kt create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 jitpack.yml create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..6ae64f5 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,49 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.furkan.cameraxmlkitpackexample' + compileSdk 33 + + defaultConfig { + applicationId "com.furkan.cameraxmlkitpackexample" + minSdk 24 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation project(':camerax-mlkit-pack') + //Default implementations + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.6.0' + implementation 'com.google.android.material:material:1.8.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + //Extra implementations + implementation "androidx.camera:camera-view:1.2.1" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/furkan/cameraxmlkitpackexample/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/furkan/cameraxmlkitpackexample/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..ddacec7 --- /dev/null +++ b/app/src/androidTest/java/com/furkan/cameraxmlkitpackexample/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.furkan.cameraxmlkitpackexample + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.furkan.cameraxmlkitpackexample", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b7baa1d --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/furkan/cameraxmlkitpackexample/MainActivity.kt b/app/src/main/java/com/furkan/cameraxmlkitpackexample/MainActivity.kt new file mode 100644 index 0000000..0ce984a --- /dev/null +++ b/app/src/main/java/com/furkan/cameraxmlkitpackexample/MainActivity.kt @@ -0,0 +1,180 @@ +package com.furkan.cameraxmlkitpackexample + +import android.Manifest +import android.content.pm.PackageManager +import android.os.Bundle +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.camera.view.PreviewView +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope +import com.furkan.camerax_mlkit_pack.MlKitReaderManager +import com.furkan.camerax_mlkit_pack.core.ReaderType +import com.furkan.camerax_mlkit_pack.core.state.FlashStatus +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class MainActivity : AppCompatActivity() { + + private val REQUIRED_PERMISSIONS = + mutableListOf( + Manifest.permission.CAMERA + ).toTypedArray() + + private val REQUEST_CODE_PERMISSIONS = 10 + + private var mlKitReader: MlKitReaderManager? = null + private lateinit var previewView: PreviewView + private lateinit var focusRing: ImageView + private lateinit var btnFlash: Button + private lateinit var ivCapturePreview: ImageView + lateinit var btnCapturePhoto: Button + lateinit var btnChangeCameraType: Button + private lateinit var btnStartCamera: Button + private lateinit var btnStopCamera: Button + private lateinit var btnStartReading: Button + private lateinit var btnStopReading: Button + private lateinit var tvReadResult: TextView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + initViews() + checkCameraPermission() + + btnFlash.setOnClickListener { + mlKitReader?.changeFlashStatus() + } + + btnChangeCameraType.setOnClickListener { + mlKitReader?.changeCameraType() + } + + btnCapturePhoto.setOnClickListener { + lifecycleScope.launch(Dispatchers.IO) { + mlKitReader?.capturePhoto() + } + } + + btnStartCamera.setOnClickListener { + mlKitReader?.startCamera() + } + + btnStopCamera.setOnClickListener { + mlKitReader?.stopCamera() + } + + btnStartReading.setOnClickListener { + mlKitReader?.startReading() + } + + btnStopReading.setOnClickListener { + mlKitReader?.stopReading() + } + + } + + private fun checkCameraPermission() { + if (allPermissionsGranted()) { + initCameraManager() + } else { + ActivityCompat.requestPermissions( + this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS + ) + } + } + + private fun initViews() { + previewView = findViewById(R.id.previewView) + focusRing = findViewById(R.id.focusRing) + btnFlash = findViewById(R.id.btnFlash) + ivCapturePreview = findViewById(R.id.ivCapturePreview) + btnCapturePhoto = findViewById(R.id.btnCapturePhoto) + btnChangeCameraType = findViewById(R.id.btnChangeCameraType) + btnStartCamera = findViewById(R.id.btnStartCamera) + btnStopCamera = findViewById(R.id.btnStopCamera) + btnStartReading = findViewById(R.id.btnStartReading) + btnStopReading = findViewById(R.id.btnStopReading) + tvReadResult = findViewById(R.id.tvReadResult) + } + + private fun initCameraManager() { + mlKitReader = MlKitReaderManager.getInstance( + this, + previewView, + focusRing, + 1 + ) + mlKitReader?.startCamera() + + mlKitReader?.startReading() + mlKitReader?.setReaderFormats( + ReaderType.FORMAT_QR_CODE.value, + ReaderType.FORMAT_EAN_8.value, + ReaderType.FORMAT_EAN_13.value, + ReaderType.FORMAT_UPC_E.value, + ReaderType.FORMAT_UPC_A.value, + ReaderType.FORMAT_AZTEC.value + ) + mlKitReader?.apply { + setQrReadSuccessListener { result -> + println("QR RESULT ----------> $result") + tvReadResult.text = result + } + + setFlashStatusChangedListener { status -> + when (status) { + FlashStatus.ENABLED -> { + btnFlash.setBackgroundResource(R.drawable.baseline_flash_on_24) + } + FlashStatus.DISABLED -> { + btnFlash.setBackgroundResource(R.drawable.baseline_flash_off_24) + } + } + } + + setPhotoCaptureResultListener { capturedBitmap -> + runOnUiThread { + ivCapturePreview.setImageBitmap(capturedBitmap) + } + } + } + } + + override fun onDestroy() { + super.onDestroy() + mlKitReader?.destroyReferences() + } + + //[START] Permission Check + private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all { + ContextCompat.checkSelfPermission( + baseContext, it + ) == PackageManager.PERMISSION_GRANTED + } + + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, grantResults: + IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_CODE_PERMISSIONS) { + if (allPermissionsGranted()) { + initCameraManager() + + } else { + Toast.makeText( + this, + "Permissions not granted by the user.", + Toast.LENGTH_SHORT + ).show() + } + } + } + //[END] Permission Check +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_flash_off_24.xml b/app/src/main/res/drawable/baseline_flash_off_24.xml new file mode 100644 index 0000000..a7f19f7 --- /dev/null +++ b/app/src/main/res/drawable/baseline_flash_off_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/baseline_flash_on_24.xml b/app/src/main/res/drawable/baseline_flash_on_24.xml new file mode 100644 index 0000000..118d8a2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_flash_on_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..7e384cb --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,134 @@ + + + + + + +