diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
new file mode 100644
index 00000000..36adc78e
--- /dev/null
+++ b/.github/workflows/pr.yml
@@ -0,0 +1,9 @@
+name: PR
+
+on:
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ call-pr-workflow:
+ uses: FossifyOrg/.github/.github/workflows/pr.yml@main
diff --git a/.github/workflows/testing-build.yml b/.github/workflows/testing-build.yml
new file mode 100644
index 00000000..33379f92
--- /dev/null
+++ b/.github/workflows/testing-build.yml
@@ -0,0 +1,10 @@
+name: Testing build (on PR)
+
+on:
+ pull_request:
+ branches: [ master ]
+ types: [ labeled, opened, synchronize, reopened ]
+
+jobs:
+ call-testing-build-workflow:
+ uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 3d2029f4..912fffc0 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -5,6 +5,7 @@ import java.io.FileInputStream
plugins {
alias(libs.plugins.android)
alias(libs.plugins.kotlinAndroid)
+ alias(libs.plugins.detekt)
base
}
@@ -84,13 +85,19 @@ android {
}
namespace = "com.simplemobiletools.camera"
-
+
lint {
checkReleaseBuilds = false
- abortOnError = false
+ abortOnError = true
+ warningsAsErrors = true
+ baseline = file("lint-baseline.xml")
}
}
+detekt {
+ baseline = file("detekt-baseline.xml")
+}
+
dependencies {
implementation(libs.simple.tools.commons)
implementation(libs.bundles.androidx.camera)
diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml
new file mode 100644
index 00000000..735ea4b2
--- /dev/null
+++ b/app/detekt-baseline.xml
@@ -0,0 +1,196 @@
+
+
+
+
+ ComplexCondition:MainActivity.kt$MainActivity$!mIsHardwareShutterHandled && config.volumeButtonsAsShutter && (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)
+ CyclomaticComplexMethod:CameraXPreview.kt$CameraXPreview$@SuppressLint("MissingPermission", "NewApi") private fun startRecording()
+ CyclomaticComplexMethod:ImageSaver.kt$ImageSaver$@SuppressLint("RestrictedApi") private fun saveImageToTempFile(): File?
+ CyclomaticComplexMethod:PhotoProcessor.kt$PhotoProcessor$override fun doInBackground(vararg params: ByteArray): String
+ EmptyFunctionBlock:FocusCircleView.kt$FocusCircleView${}
+ FunctionNaming:ImageUtil.kt$ImageUtil$private fun yuv_420_888toNv21(image: ImageProxy): ByteArray
+ ImplicitDefaultLocale:MySize.kt$MySize$String.format("%.1f", (width * height.toFloat()) / ONE_MEGA_PIXEL)
+ ImplicitDefaultLocale:VideoQuality.kt$VideoQuality$String.format("%.1f", (width * height.toFloat()) / VideoQuality.ONE_MEGA_PIXEL)
+ LargeClass:MainActivity.kt$MainActivity : SimpleActivityMediaSavedListenerCameraXPreviewListener
+ LongMethod:ImageSaver.kt$ImageSaver$@SuppressLint("RestrictedApi") private fun saveImageToTempFile(): File?
+ LongMethod:PhotoProcessor.kt$PhotoProcessor$override fun doInBackground(vararg params: ByteArray): String
+ LongMethod:ShadowDrawable.kt$ShadowDrawable$override fun draw(canvas: Canvas)
+ LongParameterList:CameraXInitializer.kt$CameraXInitializer$( previewView: PreviewView, listener: CameraXPreviewListener, mediaSoundHelper: MediaSoundHelper, outputUri: Uri?, isThirdPartyIntent: Boolean, initInPhotoMode: Boolean, )
+ LongParameterList:CameraXPreview.kt$CameraXPreview$( private val activity: BaseSimpleActivity, private val previewView: PreviewView, private val mediaSoundHelper: MediaSoundHelper, private val mediaOutputHelper: MediaOutputHelper, private val cameraErrorHandler: CameraErrorHandler, private val listener: CameraXPreviewListener, private val isThirdPartyIntent: Boolean, initInPhotoMode: Boolean, )
+ LongParameterList:ImageSaver.kt$ImageSaver$( private val contentResolver: ContentResolver, private val image: ImageProxy, private val mediaOutput: MediaOutput.ImageCaptureOutput, private val metadata: Metadata, private val jpegQuality: Int, private val saveExifAttributes: Boolean, private val onImageSaved: (Uri) -> Unit, private val onError: (ImageCaptureException) -> Unit, )
+ LongParameterList:ImageSaver.kt$ImageSaver.Companion$( contentResolver: ContentResolver, image: ImageProxy, mediaOutput: MediaOutput.ImageCaptureOutput, metadata: Metadata, jpegQuality: Int, saveExifAttributes: Boolean, onImageSaved: (Uri) -> Unit, onError: (ImageCaptureException) -> Unit, )
+ LoopWithTooManyJumpStatements:ImageQualityManager.kt$ImageQualityManager$for
+ LoopWithTooManyJumpStatements:MediaActionSound.kt$MediaActionSound$for
+ MagicNumber:BitmapUtils.kt$BitmapUtils$128
+ MagicNumber:BitmapUtils.kt$BitmapUtils$7
+ MagicNumber:BitmapUtils.kt$BitmapUtils$8
+ MagicNumber:CameraXPreview.kt$CameraXPreview.<no name provided>$135
+ MagicNumber:CameraXPreview.kt$CameraXPreview.<no name provided>$225
+ MagicNumber:CameraXPreview.kt$CameraXPreview.<no name provided>$315
+ MagicNumber:CameraXPreview.kt$CameraXPreview.<no name provided>$45
+ MagicNumber:Config.kt$Config$80
+ MagicNumber:Constants.kt$270
+ MagicNumber:Constants.kt$90
+ MagicNumber:FocusCircleView.kt$FocusCircleView$500L
+ MagicNumber:FocusCircleView.kt$FocusCircleView$50f
+ MagicNumber:MainActivity.kt$MainActivity$33
+ MagicNumber:MainActivity.kt$MainActivity$35
+ MagicNumber:MainActivity.kt$MainActivity$39
+ MagicNumber:MainActivity.kt$MainActivity$44
+ MagicNumber:MainActivity.kt$MainActivity$46
+ MagicNumber:MainActivity.kt$MainActivity$52
+ MagicNumber:MainActivity.kt$MainActivity.<no name provided>$1000
+ MagicNumber:MainActivity.kt$MainActivity.<no name provided>$134
+ MagicNumber:MainActivity.kt$MainActivity.<no name provided>$225
+ MagicNumber:MainActivity.kt$MainActivity.<no name provided>$289
+ MagicNumber:MainActivity.kt$MainActivity.<no name provided>$75
+ MagicNumber:MainActivity.kt$MainActivity.<no name provided>$90
+ MagicNumber:MySize.kt$MySize$1.9f
+ MagicNumber:MySize.kt$MySize$16
+ MagicNumber:MySize.kt$MySize$19
+ MagicNumber:MySize.kt$MySize$3
+ MagicNumber:MySize.kt$MySize$3f
+ MagicNumber:MySize.kt$MySize$4
+ MagicNumber:MySize.kt$MySize$4f
+ MagicNumber:MySize.kt$MySize$5
+ MagicNumber:MySize.kt$MySize$5f
+ MagicNumber:MySize.kt$MySize$6
+ MagicNumber:MySize.kt$MySize$8f
+ MagicNumber:MySize.kt$MySize$9f
+ MagicNumber:PhotoProcessor.kt$PhotoProcessor$360
+ MagicNumber:SettingsActivity.kt$SettingsActivity$100
+ MagicNumber:SettingsActivity.kt$SettingsActivity$50
+ MagicNumber:SettingsActivity.kt$SettingsActivity$55
+ MagicNumber:SettingsActivity.kt$SettingsActivity$60
+ MagicNumber:SettingsActivity.kt$SettingsActivity$65
+ MagicNumber:SettingsActivity.kt$SettingsActivity$70
+ MagicNumber:SettingsActivity.kt$SettingsActivity$75
+ MagicNumber:SettingsActivity.kt$SettingsActivity$80
+ MagicNumber:SettingsActivity.kt$SettingsActivity$85
+ MagicNumber:SettingsActivity.kt$SettingsActivity$90
+ MagicNumber:SettingsActivity.kt$SettingsActivity$95
+ MagicNumber:ShadowDrawable.kt$ShadowDrawable$255.0f
+ MagicNumber:TimerMode.kt$TimerMode.TIMER_10$10000
+ MagicNumber:TimerMode.kt$TimerMode.TIMER_3$3000
+ MagicNumber:TimerMode.kt$TimerMode.TIMER_5$5000
+ MagicNumber:VideoQuality.kt$VideoQuality$1.9f
+ MagicNumber:VideoQuality.kt$VideoQuality$16
+ MagicNumber:VideoQuality.kt$VideoQuality$19
+ MagicNumber:VideoQuality.kt$VideoQuality$3
+ MagicNumber:VideoQuality.kt$VideoQuality$3f
+ MagicNumber:VideoQuality.kt$VideoQuality$4
+ MagicNumber:VideoQuality.kt$VideoQuality$4f
+ MagicNumber:VideoQuality.kt$VideoQuality$5
+ MagicNumber:VideoQuality.kt$VideoQuality$5f
+ MagicNumber:VideoQuality.kt$VideoQuality$6
+ MagicNumber:VideoQuality.kt$VideoQuality$8f
+ MagicNumber:VideoQuality.kt$VideoQuality$9f
+ MagicNumber:VideoQuality.kt$VideoQuality.FHD$1080
+ MagicNumber:VideoQuality.kt$VideoQuality.FHD$1920
+ MagicNumber:VideoQuality.kt$VideoQuality.HD$1280
+ MagicNumber:VideoQuality.kt$VideoQuality.HD$720
+ MagicNumber:VideoQuality.kt$VideoQuality.SD$480
+ MagicNumber:VideoQuality.kt$VideoQuality.SD$720
+ MagicNumber:VideoQuality.kt$VideoQuality.UHD$2160
+ MagicNumber:VideoQuality.kt$VideoQuality.UHD$3840
+ MaxLineLength:BitmapUtils.kt$BitmapUtils$val upperBound = if (minSideLength < 0) 128 else floor(w / minSideLength).coerceAtMost(floor(h / minSideLength)).toInt()
+ MaxLineLength:CameraErrorHandler.kt$CameraErrorHandler$VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE -> context.toast(R.string.video_capture_insufficient_storage_error)
+ MaxLineLength:CameraXPreview.kt$CameraXPreview$private
+ MaxLineLength:CameraXPreview.kt$CameraXPreview$val scaleGesture = camera?.let { ScaleGestureDetector(activity, PinchToZoomOnScaleGestureListener(it.cameraInfo, it.cameraControl)) }
+ MaxLineLength:Config.kt$Config$var path = prefs.getString(SAVE_PHOTOS, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString())
+ MaxLineLength:ImageQualityManager.kt$ImageQualityManager$val configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) ?: continue
+ MaxLineLength:ImageQualityManager.kt$ImageQualityManager.Companion$private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK)
+ MaxLineLength:ImageUtil.kt$ImageUtil$require(image.format == ImageFormat.YUV_420_888) { "Incorrect image format of the input image proxy: " + image.format }
+ MaxLineLength:ImageUtil.kt$ImageUtil.CodecFailedException$class
+ MaxLineLength:MainActivity.kt$MainActivity$binding.toggleCamera.setImageResource(if (frontCamera) R.drawable.ic_camera_rear_vector else R.drawable.ic_camera_front_vector)
+ MaxLineLength:MainActivity.kt$MainActivity$constraintSet.connect(previewView.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM)
+ MaxLineLength:MainActivity.kt$MainActivity$hasPermission(PERMISSION_WRITE_STORAGE) && hasPermission(PERMISSION_CAMERA) && hasPermission(PERMISSION_RECORD_AUDIO)
+ MaxLineLength:MainActivity.kt$MainActivity$if
+ MaxLineLength:MainActivity.kt$MainActivity$layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+ MaxLineLength:MainActivity.kt$MainActivity$private
+ MaxLineLength:MainActivity.kt$MainActivity$private fun isImageCaptureIntent(): Boolean
+ MaxLineLength:MainActivity.kt$MainActivity$val iconColors = intArrayOf(ContextCompat.getColor(this, com.simplemobiletools.commons.R.color.md_grey_white), primaryColor)
+ MaxLineLength:MainActivity.kt$MainActivity$val marginBottom = safeInsetBottom + navigationBarHeight + resources.getDimensionPixelSize(com.simplemobiletools.commons.R.dimen.bigger_margin)
+ MaxLineLength:MainActivity.kt$MainActivity$val uri = if (isPhoto) MediaStore.Images.Media.EXTERNAL_CONTENT_URI else MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+ MaxLineLength:MainActivity.kt$MainActivity$var hasMediaPermission = hasPermission(PERMISSION_READ_MEDIA_IMAGES) || hasPermission(PERMISSION_READ_MEDIA_VIDEO)
+ MaxLineLength:MainActivity.kt$MainActivity$window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ MaxLineLength:MainActivity.kt$MainActivity$}
+ MaxLineLength:MainActivity.kt$MainActivity.<no name provided>$override
+ MaxLineLength:MediaActionSound.kt$MediaActionSound$else -> Log.e(TAG, "OnLoadCompleteListener() called in wrong state: ${sound.state} for sound: ${sound.mediaSound}")
+ MaxLineLength:MediaActionSound.kt$MediaActionSound.Companion$private val SOUNDS = arrayOf(SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING, TIMER_COUNTDOWN, TIMER_COUNTDOWN_2_SECONDS)
+ MaxLineLength:MediaOutputHelper.kt$MediaOutputHelper$put(MediaStore.MediaColumns.DATA, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString())
+ MaxLineLength:PhotoProcessor.kt$PhotoProcessor$activity.config.savePhotosFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()
+ MaxLineLength:PhotoProcessor.kt$PhotoProcessor$document = document?.createFile("", path.substring(path.lastIndexOf('/') + 1)) ?: activity.getDocumentFile(path)
+ MaxLineLength:PhotoProcessor.kt$PhotoProcessor$val activity: MainActivity
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$OpenDeviceSettingsDialog(activity = this@SettingsActivity, message = getString(com.simplemobiletools.commons.R.string.allow_location_permission))
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_2_title_commons, com.simplemobiletools.commons.R.string.faq_2_text_commons))
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_6_title_commons, com.simplemobiletools.commons.R.string.faq_6_text_commons))
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$it.beGoneIf(settingsUseEnglishHolder.isGone() && settingsPurchaseThankYouHolder.isGone() && settingsLanguageHolder.isGone())
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
+ MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
+ MaxLineLength:ShadowDrawable.kt$ShadowDrawable$if
+ MaxLineLength:ShadowDrawable.kt$ShadowDrawable$obtainStyledAttributes.getColor(R.styleable.ShadowDrawable_android_shadowColor, ContextCompat.getColor(context, com.simplemobiletools.commons.R.color.md_grey_400_dark))
+ MaxLineLength:ShadowDrawable.kt$ShadowDrawable$sharedBitmap = Bitmap.createBitmap(SHARED_BITMAP_BUFFER_SIZE, SHARED_BITMAP_BUFFER_SIZE, Bitmap.Config.ARGB_8888)
+ MaxLineLength:ShadowDrawable.kt$ShadowDrawable$val shadowRadius = obtainStyledAttributes.getFloat(R.styleable.ShadowDrawable_android_shadowRadius, 0.0f).coerceAtLeast(0.0f)
+ MaxLineLength:VideoQualityManager.kt$VideoQualityManager$val selectionIndex = mediaSizeStore.getCurrentSizeIndex(isPhotoCapture = false, isFrontCamera = isFrontCamera).coerceAtLeast(0)
+ NestedBlockDepth:ImageQualityManager.kt$ImageQualityManager$fun initSupportedQualities()
+ NestedBlockDepth:ImageSaver.kt$ImageSaver$private fun copyTempFileToDestination(tempFile: File)
+ NestedBlockDepth:MediaOutputHelper.kt$MediaOutputHelper$fun getImageMediaOutput(): MediaOutput.ImageCaptureOutput
+ NestedBlockDepth:MediaOutputHelper.kt$MediaOutputHelper$fun getVideoMediaOutput(): MediaOutput.VideoCaptureOutput
+ NestedBlockDepth:MediaOutputHelper.kt$MediaOutputHelper$private fun getUriForFilePath(path: String): Uri?
+ NestedBlockDepth:PhotoProcessor.kt$PhotoProcessor$override fun doInBackground(vararg params: ByteArray): String
+ NestedBlockDepth:VideoQualityManager.kt$VideoQualityManager$fun initSupportedQualities(cameraProvider: ProcessCameraProvider)
+ ReturnCount:ImageSaver.kt$ImageSaver$@SuppressLint("RestrictedApi") private fun saveImageToTempFile(): File?
+ ReturnCount:MediaActionSound.kt$MediaActionSound$private fun loadSound(sound: SoundState): Int
+ ReturnCount:MediaOutputHelper.kt$MediaOutputHelper$private fun getFileDescriptorMediaOutput(): MediaOutput.FileDescriptorMediaOutput?
+ ReturnCount:MediaOutputHelper.kt$MediaOutputHelper$private fun getUriForFilePath(path: String): Uri?
+ ReturnCount:PhotoProcessor.kt$PhotoProcessor$override fun doInBackground(vararg params: ByteArray): String
+ ReturnCount:PhotoProcessor.kt$PhotoProcessor$private fun rotate(bitmap: Bitmap, degree: Int): Bitmap?
+ SwallowedException:BitmapUtils.kt$BitmapUtils$ex: OutOfMemoryError
+ SwallowedException:CameraXPreview.kt$CameraXPreview$e: Exception
+ SwallowedException:ImageUtil.kt$ImageUtil$e: IOException
+ SwallowedException:MediaOutputHelper.kt$MediaOutputHelper$e: Exception
+ SwallowedException:PhotoProcessor.kt$PhotoProcessor$e: Exception
+ SwallowedException:PhotoProcessor.kt$PhotoProcessor$e: OutOfMemoryError
+ ThrowsCount:ImageUtil.kt$ImageUtil$@Throws(CodecFailedException::class) private fun cropJpegByteArray( data: ByteArray, cropRect: Rect, @IntRange(from = 1, to = 100) jpegQuality: Int, ): ByteArray
+ TooGenericExceptionCaught:CameraXPreview.kt$CameraXPreview$e: Exception
+ TooGenericExceptionCaught:ImageQualityManager.kt$ImageQualityManager$e: Exception
+ TooGenericExceptionCaught:MediaOutputHelper.kt$MediaOutputHelper$e: Exception
+ TooGenericExceptionCaught:PhotoProcessor.kt$PhotoProcessor$e: Exception
+ TooGenericExceptionCaught:VideoQualityManager.kt$VideoQualityManager$e: Exception
+ TooManyFunctions:CameraXPreview.kt$CameraXPreview : MyPreviewDefaultLifecycleObserver
+ TooManyFunctions:CameraXPreviewListener.kt$CameraXPreviewListener
+ TooManyFunctions:MainActivity.kt$MainActivity : SimpleActivityMediaSavedListenerCameraXPreviewListener
+ TooManyFunctions:MediaOutputHelper.kt$MediaOutputHelper
+ TooManyFunctions:MySize.kt$MySize
+ TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity
+ TooManyFunctions:ShadowDrawable.kt$ShadowDrawable : Drawable
+ TooManyFunctions:VideoQuality.kt$VideoQuality
+ UnusedPrivateProperty:ImageUtil.kt$ImageUtil$col
+ UnusedPrivateProperty:ImageUtil.kt$ImageUtil$row
+ UseCheckOrError:CameraXPreview.kt$CameraXPreview$throw IllegalStateException("Camera initialization failed.")
+ UseCheckOrError:MainActivity.kt$MainActivity.<no name provided>$throw IllegalStateException("Unsupported tab position ${tab.position}")
+ VariableNaming:FocusCircleView.kt$FocusCircleView$private val CIRCLE_DURATION = 500L
+ VariableNaming:FocusCircleView.kt$FocusCircleView$private val CIRCLE_RADIUS = 50f
+ WildcardImport:CameraXPreview.kt$import android.view.*
+ WildcardImport:CameraXPreview.kt$import androidx.camera.core.*
+ WildcardImport:CameraXPreview.kt$import androidx.camera.core.ImageCapture.*
+ WildcardImport:CameraXPreview.kt$import androidx.camera.video.*
+ WildcardImport:CameraXPreview.kt$import com.simplemobiletools.camera.extensions.*
+ WildcardImport:CameraXPreview.kt$import com.simplemobiletools.camera.helpers.*
+ WildcardImport:ImageSaver.kt$import java.io.*
+ WildcardImport:ImageUtil.kt$import android.graphics.*
+ WildcardImport:MainActivity.kt$import android.view.*
+ WildcardImport:MainActivity.kt$import androidx.core.view.*
+ WildcardImport:MainActivity.kt$import androidx.transition.*
+ WildcardImport:MainActivity.kt$import com.simplemobiletools.camera.helpers.*
+ WildcardImport:MainActivity.kt$import com.simplemobiletools.commons.extensions.*
+ WildcardImport:MainActivity.kt$import com.simplemobiletools.commons.helpers.*
+ WildcardImport:MediaOutputHelper.kt$import com.simplemobiletools.commons.extensions.*
+ WildcardImport:PhotoProcessor.kt$import com.simplemobiletools.commons.extensions.*
+ WildcardImport:SettingsActivity.kt$import com.simplemobiletools.commons.dialogs.*
+ WildcardImport:SettingsActivity.kt$import com.simplemobiletools.commons.extensions.*
+ WildcardImport:SettingsActivity.kt$import com.simplemobiletools.commons.helpers.*
+ WildcardImport:ShadowDrawable.kt$import android.graphics.*
+
+
diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml
new file mode 100644
index 00000000..a840f4c5
--- /dev/null
+++ b/app/lint-baseline.xml
@@ -0,0 +1,1396 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-hi@hinglish/strings.xml b/app/src/main/res/values-hi@hinglish/strings.xml
deleted file mode 100644
index a6b3daec..00000000
--- a/app/src/main/res/values-hi@hinglish/strings.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index f0236317..883ff3df 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,4 +1,5 @@
plugins {
alias(libs.plugins.android).apply(false)
alias(libs.plugins.kotlinAndroid).apply(false)
+ alias(libs.plugins.detekt).apply(false)
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 3a4175cf..f834e0a7 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,6 +1,8 @@
[versions]
#jetbrains
kotlin = "1.9.0"
+#Detekt
+detekt = "1.23.3"
#Androidx
androidx-document-file = "1.0.1"
androidx-exif-interface = "1.3.6"
@@ -11,7 +13,7 @@ androidx-ktx = "2.6.1"
#Simple tools
simple-commons = "73d78e5cd3"
#Gradle
-gradlePlugins-agp = "8.1.1"
+gradlePlugins-agp = "8.6.1"
#build
app-build-compileSDKVersion = "34"
app-build-targetSDK = "34"
@@ -48,3 +50,4 @@ androidx-camera = [
[plugins]
android = { id = "com.android.application", version.ref = "gradlePlugins-agp" }
kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 5e4d7c19..86507826 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Mon Jul 31 10:49:23 CEST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists