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