diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 912fffc0..8ddfbacb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -75,7 +75,8 @@ android { } compileOptions { - val currentJavaVersionFromLibs = JavaVersion.valueOf(libs.versions.app.build.javaVersion.get().toString()) + val currentJavaVersionFromLibs = + JavaVersion.valueOf(libs.versions.app.build.javaVersion.get()) sourceCompatibility = currentJavaVersionFromLibs targetCompatibility = currentJavaVersionFromLibs } @@ -84,7 +85,7 @@ android { kotlinOptions.jvmTarget = project.libs.versions.app.build.kotlinJVMTarget.get() } - namespace = "com.simplemobiletools.camera" + namespace = "org.fossify.camera" lint { checkReleaseBuilds = false @@ -99,7 +100,7 @@ detekt { } dependencies { - implementation(libs.simple.tools.commons) + implementation(libs.fossify.commons) implementation(libs.bundles.androidx.camera) implementation(libs.androidx.documentfile) implementation(libs.androidx.exifinterface) diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml index 735ea4b2..cd356a98 100644 --- a/app/detekt-baseline.xml +++ b/app/detekt-baseline.xml @@ -1,196 +1,359 @@ - - - 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.* - + + + 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, org.fossify.commons.R.color.md_grey_white), + primaryColor) + + MaxLineLength:MainActivity.kt$MainActivity$val marginBottom = safeInsetBottom + + navigationBarHeight + + resources.getDimensionPixelSize(org.fossify.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(org.fossify.commons.R.string.allow_location_permission)) + + + MaxLineLength:SettingsActivity.kt$SettingsActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_2_title_commons, + org.fossify.commons.R.string.faq_2_text_commons)) + + + MaxLineLength:SettingsActivity.kt$SettingsActivity$faqItems.add(FAQItem(org.fossify.commons.R.string.faq_6_title_commons, + org.fossify.commons.R.string.faq_6_text_commons)) + + + MaxLineLength:SettingsActivity.kt$SettingsActivity$findItem(R.id.more_apps_from_us).isVisible + = !resources.getBoolean(org.fossify.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, org.fossify.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 org.fossify.camera.extensions.* + WildcardImport:CameraXPreview.kt$import org.fossify.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 org.fossify.camera.helpers.* + WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:MainActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:MediaOutputHelper.kt$import org.fossify.commons.extensions.* + WildcardImport:PhotoProcessor.kt$import org.fossify.commons.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.dialogs.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.* + WildcardImport:SettingsActivity.kt$import org.fossify.commons.helpers.* + WildcardImport:ShadowDrawable.kt$import android.graphics.* + diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index a840f4c5..2761f5a1 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -1,1396 +1,906 @@ - + - - + message="WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 11+, even when using `requestLegacyExternalStorage`"> + - - - - + + + + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="DefaultLocale" + message="Implicitly using the default locale is a common source of bugs: Use `String.format(Locale, ...)` instead"> + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + - + errorLine2=" ~~~~" + id="InflateParams" + message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)"> + - + errorLine2=" ~~~~~" + id="VectorRaster" + message="Limit vector icons sizes to 200×200 to keep icon drawing fast; see https://developer.android.com/studio/write/vector-asset-studio#when for more"> + - - + message="A newer version of org.jetbrains.kotlin.android than 1.9.0 is available: 1.9.25"> + - - + message="A newer version of org.jetbrains.kotlin.android than 1.9.0 is available: 1.9.25"> + - - + message="A newer version of org.jetbrains.kotlin.android than 1.9.0 is available: 1.9.25"> + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + message="A newer version of androidx.lifecycle:lifecycle-runtime-ktx than 2.6.1 is available: 2.8.6"> + - - + message="A newer version of androidx.lifecycle:lifecycle-runtime-ktx than 2.6.1 is available: 2.8.6"> + - - + message="A newer version of androidx.lifecycle:lifecycle-runtime-ktx than 2.6.1 is available: 2.8.6"> + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""maximize_quality" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""minimize_latency" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_unavailable" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_open_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""video_creating_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""video_mode_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""save_error_internal_storage" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_switch_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""click_to_resume_preview" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""photo_not_saved" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""setting_resolution_failed" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""video_recording_failed" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_in_use_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_configure_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_disabled_by_admin_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""camera_dnd_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""photo_capture_failed" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="MissingTranslation" + message=""video_capture_insufficient_storage_error" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""toggle_photo_video" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""change_resolution" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""view_last_media" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "da" (Danish)"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""toggle_camera" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "da" (Danish)"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""toggle_flash" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "be" (Belarusian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "da" (Danish)"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""toggle_timer" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "be" (Belarusian), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "da" (Danish)"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""faq_1_title" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""faq_1_text" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""save_photos" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""show_preview" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + + + + + - - - - - + errorLine2=" ~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""back_camera" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""front_camera" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + + + + + + + + + - - - - - - - - - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""focus_before_capture" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""volume_buttons_as_shutter" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""turn_flash_off_at_startup" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="MissingTranslation" + message=""flip_front_camera_photos_horizontally" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ne" (Nepali), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""keep_settings_visible" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""always_open_back_camera" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""save_photo_metadata" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "ckb""> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""save_photo_video_location" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "da" (Danish)"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="MissingTranslation" + message=""photo_compression_quality" is not translated in "fil" (Filipino; Pilipino), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "fa" (Persian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "ckb""> + + + + + - - - - - + errorLine2=" ^" id="Typos" + message=""camera" is a common misspelling; did you mean "câmera"?"> + - + errorLine2=" ^" + id="Typos" + message=""camera" is a common misspelling; did you mean "câmera"?"> + - + errorLine2=" ^" id="Typos" + message=""camera" is a common misspelling; did you mean "câmera"?"> + - + errorLine2=" ^" + id="Typos" + message=""video" is a common misspelling; did you mean "vídeo"?"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~" + id="Recycle" + message="This `ParcelFileDescriptor` should be freed up after use with `#close()`"> + - - + - - + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~" id="StaticFieldLeak" + message="This field leaks a context object"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="VectorPath" + message="Very long vector path (1695 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="VectorPath" + message="Very long vector path (2896 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="VectorPath" + message="Very long vector path (1515 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="VectorPath" + message="Very long vector path (829 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."> + - - - - + + + + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="VectorPath" + message="Very long vector path (874 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."> + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.video_creating_error` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.video_mode_error` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.click_to_resume_preview` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.setting_resolution_failed` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.toggle_photo_video` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.change_resolution` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.show_preview` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.back_camera` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.front_camera` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.focus_before_capture` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.turn_flash_off_at_startup` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.keep_settings_visible` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" id="UnusedResources" + message="The resource `R.string.always_open_back_camera` appears to be unused"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="TypographyDashes" + message="Replace "-" with an "en dash" character (–, &#8211;) ?"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="TypographyDashes" + message="Replace "-" with an "en dash" character (–, &#8211;) ?"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="TypographyDashes" + message="Replace "-" with an "en dash" character (–, &#8211;) ?"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="TypographyDashes" + message="Replace "-" with an "en dash" character (–, &#8211;) ?"> + - + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + id="TypographyDashes" + message="Replace "-" with an "en dash" character (–, &#8211;) ?"> + - - - - - + message="Replace "-" with an "en dash" character (–, &#8211;) ?"> + + + + + - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2a192fc4..f99c2205 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,7 +35,7 @@ tools:node="remove" /> throw IllegalStateException("Unsupported tab position ${tab.position}") } } else { - toast(com.simplemobiletools.commons.R.string.no_audio_permissions) + toast(org.fossify.commons.R.string.no_audio_permissions) selectPhotoTab() if (isVideoCaptureIntent()) { finish() @@ -96,11 +95,11 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera initVariables() tryInitCamera() supportActionBar?.hide() - checkWhatsNewDialog() setupOrientationEventListener() val windowInsetsController = ViewCompat.getWindowInsetsController(window.decorView) - windowInsetsController?.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + windowInsetsController?.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE windowInsetsController?.hide(WindowInsetsCompat.Type.statusBars()) if (isOreoMr1Plus()) { @@ -109,9 +108,9 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } else { window.addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or - WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or - WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or - WindowManager.LayoutParams.FLAG_FULLSCREEN + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or + WindowManager.LayoutParams.FLAG_FULLSCREEN ) } } @@ -130,7 +129,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera ensureTransparentNavigationBar() if (ViewCompat.getWindowInsetsController(window.decorView) == null) { - window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION } } @@ -234,7 +234,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera if (grantedRecordAudioPermission) { initializeCamera(false) } else { - toast(com.simplemobiletools.commons.R.string.no_audio_permissions) + toast(org.fossify.commons.R.string.no_audio_permissions) if (isThirdPartyIntent()) { finish() } else { @@ -247,7 +247,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } } } else { - toast(com.simplemobiletools.commons.R.string.no_camera_permissions) + toast(org.fossify.commons.R.string.no_camera_permissions) finish() } } @@ -265,7 +265,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera private fun handleStoragePermission(callback: (granted: Boolean) -> Unit) { if (isTiramisuPlus()) { - val mediaPermissionIds = mutableListOf(PERMISSION_READ_MEDIA_IMAGES, PERMISSION_READ_MEDIA_VIDEO) + val mediaPermissionIds = + mutableListOf(PERMISSION_READ_MEDIA_IMAGES, PERMISSION_READ_MEDIA_VIDEO) if (isUpsideDownCakePlus()) { mediaPermissionIds.add(PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED) } @@ -278,14 +279,18 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera private fun isThirdPartyIntent() = isVideoCaptureIntent() || isImageCaptureIntent() - private fun isImageCaptureIntent(): Boolean = intent?.action == MediaStore.ACTION_IMAGE_CAPTURE || intent?.action == MediaStore.ACTION_IMAGE_CAPTURE_SECURE + private fun isImageCaptureIntent(): Boolean = + intent?.action == MediaStore.ACTION_IMAGE_CAPTURE || intent?.action == MediaStore.ACTION_IMAGE_CAPTURE_SECURE private fun isVideoCaptureIntent(): Boolean = intent?.action == MediaStore.ACTION_VIDEO_CAPTURE private fun createToggleGroup(): MaterialButtonToggleGroup { return MaterialButtonToggleGroup(this).apply { isSingleSelection = true - layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) } } @@ -308,7 +313,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera topMargin = safeInsetTop } - val marginBottom = safeInsetBottom + navigationBarHeight + resources.getDimensionPixelSize(com.simplemobiletools.commons.R.dimen.bigger_margin) + val marginBottom = + safeInsetBottom + navigationBarHeight + resources.getDimensionPixelSize(org.fossify.commons.R.dimen.bigger_margin) binding.shutter.updateLayoutParams { bottomMargin = marginBottom @@ -436,7 +442,12 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera return true } - override fun onFling(event1: MotionEvent?, event2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean { + override fun onFling( + event1: MotionEvent?, + event2: MotionEvent?, + velocityX: Float, + velocityY: Float + ): Boolean { if (event1 == null || event2 == null) { return true } @@ -481,7 +492,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera private fun showLastMediaPreview() { if (mPreviewUri != null) { - val path = applicationContext.getRealPathFromURI(mPreviewUri!!) ?: mPreviewUri!!.toString() + val path = + applicationContext.getRealPathFromURI(mPreviewUri!!) ?: mPreviewUri!!.toString() openPathIntent(path, false, BuildConfig.APPLICATION_ID) } } @@ -534,7 +546,8 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } private fun setupPreviewImage(isPhoto: Boolean) { - val uri = if (isPhoto) MediaStore.Images.Media.EXTERNAL_CONTENT_URI else MediaStore.Video.Media.EXTERNAL_CONTENT_URI + val uri = + if (isPhoto) MediaStore.Images.Media.EXTERNAL_CONTENT_URI else MediaStore.Video.Media.EXTERNAL_CONTENT_URI val lastMediaId = getLatestMediaId(uri) if (lastMediaId == 0L) { return @@ -568,9 +581,12 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera private fun hasPhotoModePermissions(): Boolean { return if (isTiramisuPlus()) { - var hasMediaPermission = hasPermission(PERMISSION_READ_MEDIA_IMAGES) || hasPermission(PERMISSION_READ_MEDIA_VIDEO) + var hasMediaPermission = hasPermission(PERMISSION_READ_MEDIA_IMAGES) || hasPermission( + PERMISSION_READ_MEDIA_VIDEO + ) if (isUpsideDownCakePlus()) { - hasMediaPermission = hasMediaPermission || hasPermission(PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED) + hasMediaPermission = + hasMediaPermission || hasPermission(PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED) } hasMediaPermission && hasPermission(PERMISSION_CAMERA) } else { @@ -582,16 +598,23 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera return if (isTiramisuPlus()) { var hasMediaPermission = hasPermission(PERMISSION_READ_MEDIA_VIDEO) if (isUpsideDownCakePlus()) { - hasMediaPermission = hasMediaPermission || hasPermission(PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED) + hasMediaPermission = + hasMediaPermission || hasPermission(PERMISSION_READ_MEDIA_VISUAL_USER_SELECTED) } - hasMediaPermission && hasPermission(PERMISSION_CAMERA) && hasPermission(PERMISSION_RECORD_AUDIO) + hasMediaPermission && hasPermission(PERMISSION_CAMERA) && hasPermission( + PERMISSION_RECORD_AUDIO + ) } else { - hasPermission(PERMISSION_WRITE_STORAGE) && hasPermission(PERMISSION_CAMERA) && hasPermission(PERMISSION_RECORD_AUDIO) + hasPermission(PERMISSION_WRITE_STORAGE) && hasPermission(PERMISSION_CAMERA) && hasPermission( + PERMISSION_RECORD_AUDIO + ) } } private fun setupOrientationEventListener() { - mOrientationEventListener = object : OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { + mOrientationEventListener = object : OrientationEventListener( + this, SensorManager.SENSOR_DELAY_NORMAL + ) { override fun onOrientationChanged(orientation: Int) { if (isDestroyed) { mOrientationEventListener.disable() @@ -632,10 +655,11 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } } - private fun rotate(view: View, degrees: Int) = view.animate().rotation(degrees.toFloat()).start() + private fun rotate(view: View, degrees: Int) = + view.animate().rotation(degrees.toFloat()).start() override fun setHasFrontAndBackCamera(hasFrontAndBack: Boolean) { - binding.toggleCamera?.beVisibleIf(hasFrontAndBack) + binding.toggleCamera.beVisibleIf(hasFrontAndBack) } override fun setFlashAvailable(available: Boolean) { @@ -823,7 +847,10 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera mediaSizeToggleGroup.children.map { it as MaterialButton }.forEach(::setButtonColors) } - private fun createButton(resolutionOption: ResolutionOption, onClick: (clickedViewId: Int) -> Unit): MaterialButton { + private fun createButton( + resolutionOption: ResolutionOption, + onClick: (clickedViewId: Int) -> Unit + ): MaterialButton { val params = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT).apply { weight = 1f } @@ -862,8 +889,14 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera private fun setButtonColors(button: MaterialButton) { val primaryColor = getProperPrimaryColor() - val states = arrayOf(intArrayOf(-android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)) - val iconColors = intArrayOf(ContextCompat.getColor(this, com.simplemobiletools.commons.R.color.md_grey_white), primaryColor) + val states = arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked) + ) + val iconColors = intArrayOf( + ContextCompat.getColor(this, org.fossify.commons.R.color.md_grey_white), + primaryColor + ) button.iconTint = ColorStateList(states, iconColors) } @@ -872,11 +905,31 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera val constraintSet = ConstraintSet() constraintSet.clone(viewHolder) if (requiresCentering) { - constraintSet.connect(previewView.id, ConstraintSet.TOP, topOptions.id, ConstraintSet.BOTTOM) - constraintSet.connect(previewView.id, ConstraintSet.BOTTOM, cameraModeHolder.id, ConstraintSet.TOP) + constraintSet.connect( + previewView.id, + ConstraintSet.TOP, + topOptions.id, + ConstraintSet.BOTTOM + ) + constraintSet.connect( + previewView.id, + ConstraintSet.BOTTOM, + cameraModeHolder.id, + ConstraintSet.TOP + ) } else { - constraintSet.connect(previewView.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP) - constraintSet.connect(previewView.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM) + constraintSet.connect( + previewView.id, + ConstraintSet.TOP, + ConstraintSet.PARENT_ID, + ConstraintSet.TOP + ) + constraintSet.connect( + previewView.id, + ConstraintSet.BOTTOM, + ConstraintSet.PARENT_ID, + ConstraintSet.BOTTOM + ) } constraintSet.applyTo(viewHolder) } @@ -887,7 +940,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera setupPreviewImage(true) Intent(BROADCAST_REFRESH_MEDIA).apply { putExtra(REFRESH_PATH, path) - `package` = "com.simplemobiletools.gallery" + `package` = "org.fossify.gallery" sendBroadcast(this) } } @@ -933,23 +986,11 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera private fun resetViewsOnTimerFinish() = binding.apply { arrayOf(topOptions, toggleCamera, lastPhotoVideoPreview, cameraModeHolder).forEach { - it?.fadeIn() - it?.beVisible() + it.fadeIn() + it.beVisible() } timerText.beGone() shutter.setImageState(intArrayOf(-R.attr.state_timer_cancel), true) } - - private fun checkWhatsNewDialog() { - arrayListOf().apply { - add(Release(33, R.string.release_33)) - add(Release(35, R.string.release_35)) - add(Release(39, R.string.release_39)) - add(Release(44, R.string.release_44)) - add(Release(46, R.string.release_46)) - add(Release(52, R.string.release_52)) - checkWhatsNew(this, BuildConfig.VERSION_CODE) - } - } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/camera/activities/SettingsActivity.kt similarity index 80% rename from app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt rename to app/src/main/kotlin/org/fossify/camera/activities/SettingsActivity.kt index cc66798a..3e8d2103 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/camera/activities/SettingsActivity.kt @@ -1,18 +1,18 @@ -package com.simplemobiletools.camera.activities +package org.fossify.camera.activities import android.annotation.SuppressLint import android.os.Bundle -import com.simplemobiletools.camera.BuildConfig -import com.simplemobiletools.camera.R -import com.simplemobiletools.camera.databinding.ActivitySettingsBinding -import com.simplemobiletools.camera.extensions.checkLocationPermission -import com.simplemobiletools.camera.extensions.config -import com.simplemobiletools.camera.models.CaptureMode -import com.simplemobiletools.commons.dialogs.* -import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.* -import com.simplemobiletools.commons.models.FAQItem -import com.simplemobiletools.commons.models.RadioItem +import org.fossify.camera.BuildConfig +import org.fossify.camera.R +import org.fossify.camera.databinding.ActivitySettingsBinding +import org.fossify.camera.extensions.checkLocationPermission +import org.fossify.camera.extensions.config +import org.fossify.camera.models.CaptureMode +import org.fossify.commons.dialogs.* +import org.fossify.commons.extensions.* +import org.fossify.commons.helpers.* +import org.fossify.commons.models.FAQItem +import org.fossify.commons.models.RadioItem import java.util.* import kotlin.system.exitProcess @@ -27,7 +27,12 @@ class SettingsActivity : SimpleActivity() { setupOptionsMenu() refreshMenuItems() - updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false) + updateMaterialActivityViews( + settingsCoordinator, + settingsHolder, + useTransparentNavigation = true, + useTopSearchMenu = false + ) setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar) } } @@ -65,7 +70,8 @@ class SettingsActivity : SimpleActivity() { private fun refreshMenuItems() { binding.settingsToolbar.menu.apply { - findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations) + findItem(R.id.more_apps_from_us).isVisible = + !resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations) } } @@ -124,12 +130,29 @@ class SettingsActivity : SimpleActivity() { FAQItem(R.string.faq_1_title, R.string.faq_1_text) ) - if (!resources.getBoolean(com.simplemobiletools.commons.R.bool.hide_google_relations)) { - faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_2_title_commons, com.simplemobiletools.commons.R.string.faq_2_text_commons)) - faqItems.add(FAQItem(com.simplemobiletools.commons.R.string.faq_6_title_commons, com.simplemobiletools.commons.R.string.faq_6_text_commons)) + if (!resources.getBoolean(org.fossify.commons.R.bool.hide_google_relations)) { + faqItems.add( + FAQItem( + org.fossify.commons.R.string.faq_2_title_commons, + org.fossify.commons.R.string.faq_2_text_commons + ) + ) + faqItems.add( + FAQItem( + org.fossify.commons.R.string.faq_6_title_commons, + org.fossify.commons.R.string.faq_6_text_commons + ) + ) } - startAboutActivity(R.string.app_name, licenses, BuildConfig.VERSION_NAME, faqItems, true) + startAboutActivity( + appNameId = R.string.app_name, + licenseMask = licenses, + versionName = BuildConfig.VERSION_NAME, + repositoryName = "Camera", + faqItems = faqItems, + showFAQBeforeMail = true + ) } private fun getLastPart(path: String): String { @@ -182,7 +205,10 @@ class SettingsActivity : SimpleActivity() { if (checkLocationPermission()) { updateSavePhotoVideoLocationConfig(true) } else { - OpenDeviceSettingsDialog(activity = this@SettingsActivity, message = getString(com.simplemobiletools.commons.R.string.allow_location_permission)) + OpenDeviceSettingsDialog( + activity = this@SettingsActivity, + message = getString(org.fossify.commons.R.string.allow_location_permission) + ) } } } @@ -202,7 +228,12 @@ class SettingsActivity : SimpleActivity() { settingsSavePhotos.text = getLastPart(config.savePhotosFolder) settingsSavePhotosHolder.setOnClickListener { if (isOrWasThankYouInstalled()) { - FilePickerDialog(this@SettingsActivity, config.savePhotosFolder, false, showFAB = true) { + FilePickerDialog( + this@SettingsActivity, + config.savePhotosFolder, + false, + showFAB = true + ) { val path = it handleSAFDialog(it) { success -> if (success) { diff --git a/app/src/main/kotlin/org/fossify/camera/activities/SimpleActivity.kt b/app/src/main/kotlin/org/fossify/camera/activities/SimpleActivity.kt new file mode 100644 index 00000000..1a9f0d63 --- /dev/null +++ b/app/src/main/kotlin/org/fossify/camera/activities/SimpleActivity.kt @@ -0,0 +1,30 @@ +package org.fossify.camera.activities + +import org.fossify.camera.R +import org.fossify.commons.activities.BaseSimpleActivity + +open class SimpleActivity : BaseSimpleActivity() { + override fun getAppIconIDs() = arrayListOf( + R.mipmap.ic_launcher_red, + R.mipmap.ic_launcher_pink, + R.mipmap.ic_launcher_purple, + R.mipmap.ic_launcher_deep_purple, + R.mipmap.ic_launcher_indigo, + R.mipmap.ic_launcher_blue, + R.mipmap.ic_launcher_light_blue, + R.mipmap.ic_launcher_cyan, + R.mipmap.ic_launcher_teal, + R.mipmap.ic_launcher_green, + R.mipmap.ic_launcher_light_green, + R.mipmap.ic_launcher_lime, + R.mipmap.ic_launcher_yellow, + R.mipmap.ic_launcher_amber, + R.mipmap.ic_launcher, + R.mipmap.ic_launcher_deep_orange, + R.mipmap.ic_launcher_brown, + R.mipmap.ic_launcher_blue_grey, + R.mipmap.ic_launcher_grey_black + ) + + override fun getAppLauncherName() = getString(R.string.app_launcher_name) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/SplashActivity.kt b/app/src/main/kotlin/org/fossify/camera/activities/SplashActivity.kt similarity index 63% rename from app/src/main/kotlin/com/simplemobiletools/camera/activities/SplashActivity.kt rename to app/src/main/kotlin/org/fossify/camera/activities/SplashActivity.kt index 45c1e3dc..3e5ce056 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/SplashActivity.kt +++ b/app/src/main/kotlin/org/fossify/camera/activities/SplashActivity.kt @@ -1,7 +1,7 @@ -package com.simplemobiletools.camera.activities +package org.fossify.camera.activities import android.content.Intent -import com.simplemobiletools.commons.activities.BaseSplashActivity +import org.fossify.commons.activities.BaseSplashActivity class SplashActivity : BaseSplashActivity() { override fun initActivity() { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/CameraSelector.kt b/app/src/main/kotlin/org/fossify/camera/extensions/CameraSelector.kt similarity index 83% rename from app/src/main/kotlin/com/simplemobiletools/camera/extensions/CameraSelector.kt rename to app/src/main/kotlin/org/fossify/camera/extensions/CameraSelector.kt index 0b98bca4..5bfa1e3d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/CameraSelector.kt +++ b/app/src/main/kotlin/org/fossify/camera/extensions/CameraSelector.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.extensions +package org.fossify.camera.extensions import androidx.camera.core.CameraSelector diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Context.kt b/app/src/main/kotlin/org/fossify/camera/extensions/Context.kt similarity index 76% rename from app/src/main/kotlin/com/simplemobiletools/camera/extensions/Context.kt rename to app/src/main/kotlin/org/fossify/camera/extensions/Context.kt index 90fa434f..788e123b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/camera/extensions/Context.kt @@ -1,10 +1,10 @@ -package com.simplemobiletools.camera.extensions +package org.fossify.camera.extensions import android.content.Context -import com.simplemobiletools.camera.helpers.Config -import com.simplemobiletools.commons.extensions.hasPermission -import com.simplemobiletools.commons.helpers.PERMISSION_ACCESS_COARSE_LOCATION -import com.simplemobiletools.commons.helpers.PERMISSION_ACCESS_FINE_LOCATION +import org.fossify.camera.helpers.Config +import org.fossify.commons.extensions.hasPermission +import org.fossify.commons.helpers.PERMISSION_ACCESS_COARSE_LOCATION +import org.fossify.commons.helpers.PERMISSION_ACCESS_FINE_LOCATION import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -28,6 +28,7 @@ fun Context.getOutputMediaFilePath(isPhoto: Boolean): String { "${mediaStorageDir.path}/$mediaName.mp4" } } + fun Context.getOutputMediaFileName(isPhoto: Boolean): String { val mediaName = getRandomMediaName(isPhoto) return if (isPhoto) { @@ -47,5 +48,7 @@ fun getRandomMediaName(isPhoto: Boolean): String { } fun Context.checkLocationPermission(): Boolean { - return hasPermission(PERMISSION_ACCESS_FINE_LOCATION) || hasPermission(PERMISSION_ACCESS_COARSE_LOCATION) + return hasPermission(PERMISSION_ACCESS_FINE_LOCATION) || hasPermission( + PERMISSION_ACCESS_COARSE_LOCATION + ) } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt b/app/src/main/kotlin/org/fossify/camera/extensions/Int.kt similarity index 79% rename from app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt rename to app/src/main/kotlin/org/fossify/camera/extensions/Int.kt index 5a2f9877..75532560 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Int.kt +++ b/app/src/main/kotlin/org/fossify/camera/extensions/Int.kt @@ -1,12 +1,12 @@ -package com.simplemobiletools.camera.extensions +package org.fossify.camera.extensions import androidx.camera.core.CameraSelector import androidx.camera.core.ImageCapture -import com.simplemobiletools.camera.R -import com.simplemobiletools.camera.helpers.FLASH_ALWAYS_ON -import com.simplemobiletools.camera.helpers.FLASH_AUTO -import com.simplemobiletools.camera.helpers.FLASH_OFF -import com.simplemobiletools.camera.helpers.FLASH_ON +import org.fossify.camera.R +import org.fossify.camera.helpers.FLASH_ALWAYS_ON +import org.fossify.camera.helpers.FLASH_AUTO +import org.fossify.camera.helpers.FLASH_OFF +import org.fossify.camera.helpers.FLASH_ON fun Int.toCameraXFlashMode(): Int { return when (this) { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/MaterialButton.kt b/app/src/main/kotlin/org/fossify/camera/extensions/MaterialButton.kt similarity index 62% rename from app/src/main/kotlin/com/simplemobiletools/camera/extensions/MaterialButton.kt rename to app/src/main/kotlin/org/fossify/camera/extensions/MaterialButton.kt index f44fd81b..57e5ec6d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/MaterialButton.kt +++ b/app/src/main/kotlin/org/fossify/camera/extensions/MaterialButton.kt @@ -1,9 +1,9 @@ -package com.simplemobiletools.camera.extensions +package org.fossify.camera.extensions import androidx.annotation.DrawableRes import com.google.android.material.button.MaterialButton -import com.simplemobiletools.camera.R -import com.simplemobiletools.camera.views.ShadowDrawable +import org.fossify.camera.R +import org.fossify.camera.views.ShadowDrawable fun MaterialButton.setShadowIcon(@DrawableRes drawableResId: Int) { icon = ShadowDrawable(context, drawableResId, R.style.TopIconShadow) diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Quality.kt b/app/src/main/kotlin/org/fossify/camera/extensions/Quality.kt similarity index 84% rename from app/src/main/kotlin/com/simplemobiletools/camera/extensions/Quality.kt rename to app/src/main/kotlin/org/fossify/camera/extensions/Quality.kt index 07f4b78e..ec054f60 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/extensions/Quality.kt +++ b/app/src/main/kotlin/org/fossify/camera/extensions/Quality.kt @@ -1,7 +1,7 @@ -package com.simplemobiletools.camera.extensions +package org.fossify.camera.extensions import androidx.camera.video.Quality -import com.simplemobiletools.camera.models.VideoQuality +import org.fossify.camera.models.VideoQuality fun Quality.toVideoQuality(): VideoQuality { return when (this) { diff --git a/app/src/main/kotlin/org/fossify/camera/extensions/View.kt b/app/src/main/kotlin/org/fossify/camera/extensions/View.kt new file mode 100644 index 00000000..47a86129 --- /dev/null +++ b/app/src/main/kotlin/org/fossify/camera/extensions/View.kt @@ -0,0 +1,14 @@ +package org.fossify.camera.extensions + +import android.view.View +import org.fossify.commons.helpers.SHORT_ANIMATION_DURATION + +fun View.fadeIn() { + animate().alpha(1f).setDuration(SHORT_ANIMATION_DURATION).withStartAction { isClickable = true } + .start() +} + +fun View.fadeOut() { + animate().alpha(0f).setDuration(SHORT_ANIMATION_DURATION).withEndAction { isClickable = false } + .start() +} diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/BitmapUtils.kt b/app/src/main/kotlin/org/fossify/camera/helpers/BitmapUtils.kt similarity index 77% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/BitmapUtils.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/BitmapUtils.kt index b7b481eb..913641a9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/BitmapUtils.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/BitmapUtils.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -10,7 +10,10 @@ import kotlin.math.sqrt object BitmapUtils { private const val INLINE_BITMAP_MAX_PIXEL_NUM = 50 * 1024 - fun makeBitmap(jpegData: ByteArray, maxNumOfPixels: Int = INLINE_BITMAP_MAX_PIXEL_NUM): Bitmap? { + fun makeBitmap( + jpegData: ByteArray, + maxNumOfPixels: Int = INLINE_BITMAP_MAX_PIXEL_NUM + ): Bitmap? { return try { val options = BitmapFactory.Options() options.inJustDecodeBounds = true @@ -33,7 +36,11 @@ object BitmapUtils { } } - private fun computeSampleSize(options: BitmapFactory.Options, minSideLength: Int, maxNumOfPixels: Int): Int { + private fun computeSampleSize( + options: BitmapFactory.Options, + minSideLength: Int, + maxNumOfPixels: Int + ): Int { val initialSize = computeInitialSampleSize( options, minSideLength, maxNumOfPixels @@ -50,11 +57,17 @@ object BitmapUtils { return roundedSize } - private fun computeInitialSampleSize(options: BitmapFactory.Options, minSideLength: Int, maxNumOfPixels: Int): Int { + private fun computeInitialSampleSize( + options: BitmapFactory.Options, + minSideLength: Int, + maxNumOfPixels: Int + ): Int { val w = options.outWidth.toDouble() val h = options.outHeight.toDouble() val lowerBound = if (maxNumOfPixels < 0) 1 else ceil(sqrt(w * h / maxNumOfPixels)).toInt() - val upperBound = if (minSideLength < 0) 128 else floor(w / minSideLength).coerceAtMost(floor(h / minSideLength)).toInt() + val upperBound = + if (minSideLength < 0) 128 else floor(w / minSideLength).coerceAtMost(floor(h / minSideLength)) + .toInt() if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/CameraErrorHandler.kt b/app/src/main/kotlin/org/fossify/camera/helpers/CameraErrorHandler.kt similarity index 79% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/CameraErrorHandler.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/CameraErrorHandler.kt index 8b3139dc..991ae879 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/CameraErrorHandler.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/CameraErrorHandler.kt @@ -1,12 +1,12 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.content.Context import android.widget.Toast import androidx.camera.core.CameraState import androidx.camera.core.ImageCapture import androidx.camera.video.VideoRecordEvent -import com.simplemobiletools.camera.R -import com.simplemobiletools.commons.extensions.toast +import org.fossify.camera.R +import org.fossify.commons.extensions.toast class CameraErrorHandler( private val context: Context, @@ -15,11 +15,19 @@ class CameraErrorHandler( fun handleCameraError(error: CameraState.StateError?) { when (error?.code) { CameraState.ERROR_MAX_CAMERAS_IN_USE, - CameraState.ERROR_CAMERA_IN_USE -> context.toast(R.string.camera_in_use_error, Toast.LENGTH_LONG) + CameraState.ERROR_CAMERA_IN_USE -> context.toast( + id = R.string.camera_in_use_error, + length = Toast.LENGTH_LONG + ) + CameraState.ERROR_CAMERA_FATAL_ERROR -> context.toast(R.string.camera_unavailable) CameraState.ERROR_STREAM_CONFIG -> context.toast(R.string.camera_configure_error) CameraState.ERROR_CAMERA_DISABLED -> context.toast(R.string.camera_disabled_by_admin_error) - CameraState.ERROR_DO_NOT_DISTURB_MODE_ENABLED -> context.toast(R.string.camera_dnd_error, Toast.LENGTH_LONG) + CameraState.ERROR_DO_NOT_DISTURB_MODE_ENABLED -> context.toast( + id = R.string.camera_dnd_error, + length = Toast.LENGTH_LONG + ) + CameraState.ERROR_OTHER_RECOVERABLE_ERROR -> {} } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Config.kt b/app/src/main/kotlin/org/fossify/camera/helpers/Config.kt similarity index 68% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/Config.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/Config.kt index 0f0bfd39..3cd426b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Config.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/Config.kt @@ -1,11 +1,11 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.content.Context import android.os.Environment import androidx.camera.core.CameraSelector -import com.simplemobiletools.camera.models.CaptureMode -import com.simplemobiletools.camera.models.TimerMode -import com.simplemobiletools.commons.helpers.BaseConfig +import org.fossify.camera.models.CaptureMode +import org.fossify.camera.models.TimerMode +import org.fossify.commons.helpers.BaseConfig import java.io.File class Config(context: Context) : BaseConfig(context) { @@ -15,9 +15,13 @@ class Config(context: Context) : BaseConfig(context) { var savePhotosFolder: String get(): String { - var path = prefs.getString(SAVE_PHOTOS, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()) + var path = prefs.getString( + SAVE_PHOTOS, + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString() + ) if (!File(path).exists() || !File(path).isDirectory) { - path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString() + path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + .toString() savePhotosFolder = path } return path!! @@ -30,7 +34,8 @@ class Config(context: Context) : BaseConfig(context) { var volumeButtonsAsShutter: Boolean get() = prefs.getBoolean(VOLUME_BUTTONS_AS_SHUTTER, false) - set(volumeButtonsAsShutter) = prefs.edit().putBoolean(VOLUME_BUTTONS_AS_SHUTTER, volumeButtonsAsShutter).apply() + set(volumeButtonsAsShutter) = prefs.edit() + .putBoolean(VOLUME_BUTTONS_AS_SHUTTER, volumeButtonsAsShutter).apply() var flipPhotos: Boolean get() = prefs.getBoolean(FLIP_PHOTOS, true) @@ -50,38 +55,48 @@ class Config(context: Context) : BaseConfig(context) { var backPhotoResIndex: Int get() = prefs.getInt(BACK_PHOTO_RESOLUTION_INDEX, 0) - set(backPhotoResIndex) = prefs.edit().putInt(BACK_PHOTO_RESOLUTION_INDEX, backPhotoResIndex).apply() + set(backPhotoResIndex) = prefs.edit().putInt(BACK_PHOTO_RESOLUTION_INDEX, backPhotoResIndex) + .apply() var backVideoResIndex: Int get() = prefs.getInt(BACK_VIDEO_RESOLUTION_INDEX, 0) - set(backVideoResIndex) = prefs.edit().putInt(BACK_VIDEO_RESOLUTION_INDEX, backVideoResIndex).apply() + set(backVideoResIndex) = prefs.edit().putInt(BACK_VIDEO_RESOLUTION_INDEX, backVideoResIndex) + .apply() var frontPhotoResIndex: Int get() = prefs.getInt(FRONT_PHOTO_RESOLUTION_INDEX, 0) - set(frontPhotoResIndex) = prefs.edit().putInt(FRONT_PHOTO_RESOLUTION_INDEX, frontPhotoResIndex).apply() + set(frontPhotoResIndex) = prefs.edit() + .putInt(FRONT_PHOTO_RESOLUTION_INDEX, frontPhotoResIndex).apply() var frontVideoResIndex: Int get() = prefs.getInt(FRONT_VIDEO_RESOLUTION_INDEX, 0) - set(frontVideoResIndex) = prefs.edit().putInt(FRONT_VIDEO_RESOLUTION_INDEX, frontVideoResIndex).apply() + set(frontVideoResIndex) = prefs.edit() + .putInt(FRONT_VIDEO_RESOLUTION_INDEX, frontVideoResIndex).apply() var savePhotoMetadata: Boolean get() = prefs.getBoolean(SAVE_PHOTO_METADATA, true) - set(savePhotoMetadata) = prefs.edit().putBoolean(SAVE_PHOTO_METADATA, savePhotoMetadata).apply() + set(savePhotoMetadata) = prefs.edit().putBoolean(SAVE_PHOTO_METADATA, savePhotoMetadata) + .apply() var savePhotoVideoLocation: Boolean get() = prefs.getBoolean(SAVE_PHOTO_VIDEO_LOCATION, false) - set(savePhotoVideoLocation) = prefs.edit().putBoolean(SAVE_PHOTO_VIDEO_LOCATION, savePhotoVideoLocation).apply() + set(savePhotoVideoLocation) = prefs.edit() + .putBoolean(SAVE_PHOTO_VIDEO_LOCATION, savePhotoVideoLocation).apply() var photoQuality: Int get() = prefs.getInt(PHOTO_QUALITY, 80) set(photoQuality) = prefs.edit().putInt(PHOTO_QUALITY, photoQuality).apply() var captureMode: CaptureMode - get() = CaptureMode.values()[prefs.getInt(CAPTURE_MODE, CaptureMode.MINIMIZE_LATENCY.ordinal)] + get() = CaptureMode.values()[prefs.getInt( + CAPTURE_MODE, + CaptureMode.MINIMIZE_LATENCY.ordinal + )] set(captureMode) = prefs.edit().putInt(CAPTURE_MODE, captureMode.ordinal).apply() var timerMode: TimerMode - get() = TimerMode.values().getOrNull(prefs.getInt(TIMER_MODE, TimerMode.OFF.ordinal)) ?: TimerMode.OFF + get() = TimerMode.values().getOrNull(prefs.getInt(TIMER_MODE, TimerMode.OFF.ordinal)) + ?: TimerMode.OFF set(timerMode) = prefs.edit().putInt(TIMER_MODE, timerMode.ordinal).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt b/app/src/main/kotlin/org/fossify/camera/helpers/Constants.kt similarity index 96% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/Constants.kt index 0a245e1a..db9609a6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/Constants.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/Constants.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers const val ORIENT_PORTRAIT = 0 const val ORIENT_LANDSCAPE_LEFT = 1 diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java b/app/src/main/kotlin/org/fossify/camera/helpers/GestureDetectorListener.java similarity index 89% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java rename to app/src/main/kotlin/org/fossify/camera/helpers/GestureDetectorListener.java index 209a9a20..670aeac2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java +++ b/app/src/main/kotlin/org/fossify/camera/helpers/GestureDetectorListener.java @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers; +package org.fossify.camera.helpers; import android.view.GestureDetector; import android.view.MotionEvent; diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageQualityManager.kt b/app/src/main/kotlin/org/fossify/camera/helpers/ImageQualityManager.kt similarity index 72% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageQualityManager.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/ImageQualityManager.kt index accff2ca..f7d77348 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageQualityManager.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/ImageQualityManager.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.content.Context import android.graphics.ImageFormat @@ -6,14 +6,15 @@ import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraManager import androidx.appcompat.app.AppCompatActivity import androidx.camera.core.CameraSelector -import com.simplemobiletools.camera.extensions.config -import com.simplemobiletools.camera.models.CameraSelectorImageQualities -import com.simplemobiletools.camera.models.MySize -import com.simplemobiletools.commons.extensions.showErrorToast +import org.fossify.camera.extensions.config +import org.fossify.camera.models.CameraSelectorImageQualities +import org.fossify.camera.models.MySize +import org.fossify.commons.extensions.showErrorToast class ImageQualityManager(private val activity: AppCompatActivity) { companion object { - private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK) + private val CAMERA_LENS = + arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK) } private val cameraManager = activity.getSystemService(Context.CAMERA_SERVICE) as CameraManager @@ -25,10 +26,14 @@ class ImageQualityManager(private val activity: AppCompatActivity) { for (cameraId in cameraManager.cameraIdList) { try { val characteristics = cameraManager.getCameraCharacteristics(cameraId) - val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING) ?: continue + val lensFacing = + characteristics.get(CameraCharacteristics.LENS_FACING) ?: continue if (lensFacing in CAMERA_LENS) { - val configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) ?: continue - val imageSizes = configMap.getOutputSizes(ImageFormat.JPEG).map { MySize(it.width, it.height) } + val configMap = + characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) + ?: continue + val imageSizes = configMap.getOutputSizes(ImageFormat.JPEG) + .map { MySize(it.width, it.height) } val cameraSelector = lensFacing.toCameraSelector() imageQualities.add(CameraSelectorImageQualities(cameraSelector, imageSizes)) } @@ -50,7 +55,9 @@ class ImageQualityManager(private val activity: AppCompatActivity) { fun getUserSelectedResolution(cameraSelector: CameraSelector): MySize { val resolutions = getSupportedResolutions(cameraSelector) val isFrontCamera = cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA - var index = mediaSizeStore.getCurrentSizeIndex(isPhotoCapture = true, isFrontCamera = isFrontCamera) + var index = mediaSizeStore.getCurrentSizeIndex( + isPhotoCapture = true, isFrontCamera = isFrontCamera + ) index = index.coerceAtMost(resolutions.lastIndex).coerceAtLeast(0) return resolutions[index] } @@ -61,7 +68,9 @@ class ImageQualityManager(private val activity: AppCompatActivity) { .flatMap { it.qualities } .sortedByDescending { it.pixels } .distinctBy { it.getAspectRatio(activity) } - .sortedByDescending { it.getAspectRatio(activity).split(":").firstOrNull()?.toIntOrNull() } + .sortedByDescending { + it.getAspectRatio(activity).split(":").firstOrNull()?.toIntOrNull() + } .filter { it.isSupported(fullScreenSize.isSixteenToNine()) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageSaver.kt b/app/src/main/kotlin/org/fossify/camera/helpers/ImageSaver.kt similarity index 95% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageSaver.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/ImageSaver.kt index 10c8e42c..35d7f6a7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageSaver.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/ImageSaver.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.annotation.SuppressLint import android.content.ContentResolver @@ -11,13 +11,13 @@ import androidx.camera.core.ImageCaptureException import androidx.camera.core.ImageProxy import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability import androidx.exifinterface.media.ExifInterface -import com.simplemobiletools.camera.helpers.ImageUtil.CodecFailedException -import com.simplemobiletools.camera.helpers.ImageUtil.imageToJpegByteArray -import com.simplemobiletools.camera.helpers.ImageUtil.jpegImageToJpegByteArray -import com.simplemobiletools.camera.models.MediaOutput -import com.simplemobiletools.commons.extensions.copyTo -import com.simplemobiletools.commons.helpers.ensureBackgroundThread -import com.simplemobiletools.commons.helpers.isQPlus +import org.fossify.camera.helpers.ImageUtil.CodecFailedException +import org.fossify.camera.helpers.ImageUtil.imageToJpegByteArray +import org.fossify.camera.helpers.ImageUtil.jpegImageToJpegByteArray +import org.fossify.camera.models.MediaOutput +import org.fossify.commons.extensions.copyTo +import org.fossify.commons.helpers.ensureBackgroundThread +import org.fossify.commons.helpers.isQPlus import java.io.* import java.util.* @@ -141,10 +141,12 @@ class ImageSaver private constructor( saveError = SaveError.ENCODE_FAILED errorMessage = "Failed to encode Image" } + CodecFailedException.FailureType.DECODE_FAILED -> { saveError = SaveError.CROP_FAILED errorMessage = "Failed to crop Image" } + CodecFailedException.FailureType.UNKNOWN -> { saveError = SaveError.UNKNOWN errorMessage = "Failed to transcode Image" diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageUtil.kt b/app/src/main/kotlin/org/fossify/camera/helpers/ImageUtil.kt similarity index 95% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageUtil.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/ImageUtil.kt index e67efd30..5aaba1c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ImageUtil.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/ImageUtil.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.graphics.* import androidx.annotation.IntRange @@ -25,9 +25,15 @@ object ImageUtil { jpegImageToJpegByteArray(image, image.cropRect, jpegQuality) } } + ImageFormat.YUV_420_888 -> { - yuvImageToJpegByteArray(image, if (shouldCropImage) image.cropRect else null, jpegQuality) + yuvImageToJpegByteArray( + image, + if (shouldCropImage) image.cropRect else null, + jpegQuality + ) } + else -> { // Unrecognized image format byteArrayOf() @@ -223,7 +229,10 @@ object ImageUtil { /** * Exception for error during transcoding image. */ - class CodecFailedException internal constructor(message: String, val failureType: FailureType) : Exception(message) { + class CodecFailedException internal constructor( + message: String, + val failureType: FailureType + ) : Exception(message) { enum class FailureType { ENCODE_FAILED, DECODE_FAILED, UNKNOWN } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaActionSound.kt b/app/src/main/kotlin/org/fossify/camera/helpers/MediaActionSound.kt similarity index 86% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaActionSound.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/MediaActionSound.kt index 8c86e6ea..9cad9d8f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaActionSound.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/MediaActionSound.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.content.Context import android.media.AudioAttributes @@ -9,7 +9,7 @@ import android.os.Handler import android.os.Looper import android.util.Log import androidx.annotation.RawRes -import com.simplemobiletools.camera.R +import org.fossify.camera.R import java.io.File /** @@ -31,7 +31,14 @@ class MediaActionSound(private val context: Context) { private const val STATE_LOADING = 1 private const val STATE_LOADING_PLAY_REQUESTED = 2 private const val STATE_LOADED = 3 - private val SOUNDS = arrayOf(SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING, TIMER_COUNTDOWN, TIMER_COUNTDOWN_2_SECONDS) + private val SOUNDS = arrayOf( + SHUTTER_CLICK, + FOCUS_COMPLETE, + START_VIDEO_RECORDING, + STOP_VIDEO_RECORDING, + TIMER_COUNTDOWN, + TIMER_COUNTDOWN_2_SECONDS + ) } sealed class MediaSound { @@ -73,7 +80,10 @@ class MediaActionSound(private val context: Context) { if (status != 0) { sound.state = STATE_NOT_LOADED sound.loadId = 0 - Log.e(TAG, "OnLoadCompleteListener() error: $status loading sound: ${sound.mediaSound}") + Log.e( + TAG, + "OnLoadCompleteListener() error: $status loading sound: ${sound.mediaSound}" + ) return@OnLoadCompleteListener } when (sound.state) { @@ -83,7 +93,10 @@ class MediaActionSound(private val context: Context) { sound.state = STATE_LOADED } - else -> Log.e(TAG, "OnLoadCompleteListener() called in wrong state: ${sound.state} for sound: ${sound.mediaSound}") + else -> Log.e( + TAG, + "OnLoadCompleteListener() called in wrong state: ${sound.state} for sound: ${sound.mediaSound}" + ) } } @@ -129,7 +142,7 @@ class MediaActionSound(private val context: Context) { } fun load(mediaSound: MediaSound) { - val sound = sounds.firstOrNull() { it.mediaSound == mediaSound } ?: return + val sound = sounds.firstOrNull { it.mediaSound == mediaSound } ?: return synchronized(sound) { when (sound.state) { STATE_NOT_LOADED -> { @@ -170,7 +183,10 @@ class MediaActionSound(private val context: Context) { playWithSoundPool(sound) } - else -> Log.e(TAG, "play() called in wrong state: ${sound.state} for sound: $mediaSound") + else -> Log.e( + TAG, + "play() called in wrong state: ${sound.state} for sound: $mediaSound" + ) } } } @@ -187,7 +203,11 @@ class MediaActionSound(private val context: Context) { private fun getSoundDuration(mediaSound: MediaSound): Long { releaseMediaPlayer() mediaPlayer = when (mediaSound) { - is MediaSound.ManufacturerSound -> MediaPlayer.create(context, Uri.fromFile(File(mediaSound.path))) + is MediaSound.ManufacturerSound -> MediaPlayer.create( + context, + Uri.fromFile(File(mediaSound.path)) + ) + is MediaSound.RawResSound -> MediaPlayer.create(context, mediaSound.resId) } return mediaPlayer!!.duration.toLong() @@ -201,7 +221,10 @@ class MediaActionSound(private val context: Context) { soundPool!!.stop(sound.streamId) } - else -> Log.w(TAG, "stop() should be called after sound is loaded for sound: $mediaSound") + else -> Log.w( + TAG, + "stop() should be called after sound is loaded for sound: $mediaSound" + ) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaOutputHelper.kt b/app/src/main/kotlin/org/fossify/camera/helpers/MediaOutputHelper.kt similarity index 81% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaOutputHelper.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/MediaOutputHelper.kt index 047cfe9c..d16c2aec 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaOutputHelper.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/MediaOutputHelper.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.content.ContentValues import android.net.Uri @@ -6,15 +6,30 @@ import android.os.Environment import android.os.ParcelFileDescriptor import android.provider.DocumentsContract import android.provider.MediaStore -import com.simplemobiletools.camera.extensions.config -import com.simplemobiletools.camera.extensions.getOutputMediaFileName -import com.simplemobiletools.camera.extensions.getOutputMediaFilePath -import com.simplemobiletools.camera.extensions.getRandomMediaName -import com.simplemobiletools.camera.models.MediaOutput -import com.simplemobiletools.commons.activities.BaseSimpleActivity -import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.isOreoPlus -import com.simplemobiletools.commons.helpers.isQPlus +import org.fossify.camera.extensions.config +import org.fossify.camera.extensions.getOutputMediaFileName +import org.fossify.camera.extensions.getOutputMediaFilePath +import org.fossify.camera.extensions.getRandomMediaName +import org.fossify.camera.models.MediaOutput +import org.fossify.commons.activities.BaseSimpleActivity +import org.fossify.commons.extensions.createDocumentUriFromRootTree +import org.fossify.commons.extensions.createDocumentUriUsingFirstParentTreeUri +import org.fossify.commons.extensions.getAndroidSAFUri +import org.fossify.commons.extensions.getDocumentFile +import org.fossify.commons.extensions.getDoesFilePathExist +import org.fossify.commons.extensions.getFileOutputStreamSync +import org.fossify.commons.extensions.getFilenameFromPath +import org.fossify.commons.extensions.getMimeType +import org.fossify.commons.extensions.getRealPathFromURI +import org.fossify.commons.extensions.hasProperStoredAndroidTreeUri +import org.fossify.commons.extensions.hasProperStoredFirstParentUri +import org.fossify.commons.extensions.hasProperStoredTreeUri +import org.fossify.commons.extensions.isAccessibleWithSAFSdk30 +import org.fossify.commons.extensions.isRestrictedSAFOnlyRoot +import org.fossify.commons.extensions.needsStupidWritePermissions +import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.helpers.isOreoPlus +import org.fossify.commons.helpers.isQPlus import java.io.File import java.io.OutputStream @@ -114,7 +129,11 @@ class MediaOutputHelper( if (isQPlus()) { put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM) } else { - put(MediaStore.MediaColumns.DATA, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()) + put( + MediaStore.MediaColumns.DATA, + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + .toString() + ) } } } @@ -154,7 +173,8 @@ class MediaOutputHelper( DocumentsContract.Document.COLUMN_MIME_TYPE, videoFileName ) ?: return null - val fileDescriptor = contentResolver.openFileDescriptor(documentUri, MODE) ?: return null + val fileDescriptor = + contentResolver.openFileDescriptor(documentUri, MODE) ?: return null mediaOutput = MediaOutput.FileDescriptorMediaOutput(fileDescriptor, documentUri) } return mediaOutput @@ -216,13 +236,17 @@ class MediaOutputHelper( if (activity.getDoesFilePathExist(path)) { activity.createDocumentUriFromRootTree(path) } else { - documentFile.createFile(path.getMimeType(), path.getFilenameFromPath())?.uri + documentFile.createFile( + path.getMimeType(), + path.getFilenameFromPath() + )?.uri } } catch (e: Exception) { null } } } + activity.isAccessibleWithSAFSdk30(path) -> { try { activity.createDocumentUriUsingFirstParentTreeUri(path) @@ -230,6 +254,7 @@ class MediaOutputHelper( null } ?: Uri.fromFile(targetFile) } + else -> return Uri.fromFile(targetFile) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaSizeStore.kt b/app/src/main/kotlin/org/fossify/camera/helpers/MediaSizeStore.kt similarity index 95% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaSizeStore.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/MediaSizeStore.kt index dd3f9762..da7dd273 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaSizeStore.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/MediaSizeStore.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers class MediaSizeStore(private val config: Config) { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaSoundHelper.kt b/app/src/main/kotlin/org/fossify/camera/helpers/MediaSoundHelper.kt similarity index 96% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaSoundHelper.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/MediaSoundHelper.kt index c7ab0e8c..faaac613 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/MediaSoundHelper.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/MediaSoundHelper.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.content.Context diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/PhotoProcessor.kt b/app/src/main/kotlin/org/fossify/camera/helpers/PhotoProcessor.kt similarity index 72% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/PhotoProcessor.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/PhotoProcessor.kt index d3cf91ff..b8fcec9f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/PhotoProcessor.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/PhotoProcessor.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -7,18 +7,33 @@ import android.net.Uri import android.os.AsyncTask import android.os.Environment import androidx.exifinterface.media.ExifInterface -import com.simplemobiletools.camera.R -import com.simplemobiletools.camera.activities.MainActivity -import com.simplemobiletools.camera.extensions.config -import com.simplemobiletools.camera.extensions.getOutputMediaFilePath -import com.simplemobiletools.commons.extensions.* +import org.fossify.camera.R +import org.fossify.camera.activities.MainActivity +import org.fossify.camera.extensions.config +import org.fossify.camera.extensions.getOutputMediaFilePath +import org.fossify.commons.extensions.copyTo +import org.fossify.commons.extensions.degreesFromOrientation +import org.fossify.commons.extensions.getDocumentFile +import org.fossify.commons.extensions.getParentPath +import org.fossify.commons.extensions.getSomeDocumentFile +import org.fossify.commons.extensions.hasProperStoredTreeUri +import org.fossify.commons.extensions.internalStoragePath +import org.fossify.commons.extensions.isPathOnOTG +import org.fossify.commons.extensions.needsStupidWritePermissions +import org.fossify.commons.extensions.saveImageRotation +import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.extensions.toast import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.OutputStream class PhotoProcessor( - val activity: MainActivity, val saveUri: Uri?, val deviceOrientation: Int, val previewRotation: Int, val isUsingFrontCamera: Boolean, + val activity: MainActivity, + val saveUri: Uri?, + val deviceOrientation: Int, + val previewRotation: Int, + val isUsingFrontCamera: Boolean, val isThirdPartyIntent: Boolean ) : AsyncTask() { @@ -49,12 +64,15 @@ class PhotoProcessor( if (activity.needsStupidWritePermissions(path)) { if (!activity.hasProperStoredTreeUri(activity.isPathOnOTG(path))) { activity.toast(R.string.save_error_internal_storage) - activity.config.savePhotosFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString() + activity.config.savePhotosFolder = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + .toString() return "" } var document = activity.getDocumentFile(path.getParentPath()) - document = document?.createFile("", path.substring(path.lastIndexOf('/') + 1)) ?: activity.getDocumentFile(path) + document = document?.createFile("", path.substring(path.lastIndexOf('/') + 1)) + ?: activity.getDocumentFile(path) if (document == null) { activity.toast(R.string.save_error_internal_storage) return "" @@ -75,7 +93,10 @@ class PhotoProcessor( null } - val orient = exif?.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED) + val orient = exif?.getAttributeInt( + ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_UNDEFINED + ) ?: ExifInterface.ORIENTATION_UNDEFINED val imageRot = orient.degreesFromOrientation() @@ -96,9 +117,17 @@ class PhotoProcessor( matrix.preScale(if (isPortrait) -1f else 1f, if (isPortrait) 1f else -1f) try { - image = Bitmap.createBitmap(image, 0, 0, image.width, image.height, matrix, false) + image = Bitmap.createBitmap( + image, + 0, + 0, + image.width, + image.height, + matrix, + false + ) } catch (e: OutOfMemoryError) { - activity.toast(com.simplemobiletools.commons.R.string.out_of_memory_error) + activity.toast(org.fossify.commons.R.string.out_of_memory_error) } } } @@ -121,7 +150,8 @@ class PhotoProcessor( } else { val documentFile = activity.getSomeDocumentFile(path) if (documentFile != null) { - val parcelFileDescriptor = activity.contentResolver.openFileDescriptor(documentFile.uri, "rw") + val parcelFileDescriptor = + activity.contentResolver.openFileDescriptor(documentFile.uri, "rw") val fileDescriptor = parcelFileDescriptor!!.fileDescriptor ExifInterface(fileDescriptor) } else { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/PinchToZoomOnScaleGestureListener.kt b/app/src/main/kotlin/org/fossify/camera/helpers/PinchToZoomOnScaleGestureListener.kt similarity index 93% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/PinchToZoomOnScaleGestureListener.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/PinchToZoomOnScaleGestureListener.kt index 3289e433..d003db31 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/PinchToZoomOnScaleGestureListener.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/PinchToZoomOnScaleGestureListener.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.view.ScaleGestureDetector import androidx.camera.core.CameraControl diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/SimpleLocationManager.kt b/app/src/main/kotlin/org/fossify/camera/helpers/SimpleLocationManager.kt similarity index 91% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/SimpleLocationManager.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/SimpleLocationManager.kt index a39327f5..346ad5c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/SimpleLocationManager.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/SimpleLocationManager.kt @@ -1,12 +1,12 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import android.Manifest import android.location.Location import android.location.LocationListener import android.location.LocationManager import androidx.annotation.RequiresPermission -import com.simplemobiletools.camera.extensions.checkLocationPermission -import com.simplemobiletools.commons.activities.BaseSimpleActivity +import org.fossify.camera.extensions.checkLocationPermission +import org.fossify.commons.activities.BaseSimpleActivity class SimpleLocationManager(private val activity: BaseSimpleActivity) { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/TabSelectedListener.kt b/app/src/main/kotlin/org/fossify/camera/helpers/TabSelectedListener.kt similarity index 83% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/TabSelectedListener.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/TabSelectedListener.kt index 64daa70c..a6c78dc8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/TabSelectedListener.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/TabSelectedListener.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import com.google.android.material.tabs.TabLayout diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/VideoQualityManager.kt b/app/src/main/kotlin/org/fossify/camera/helpers/VideoQualityManager.kt similarity index 70% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/VideoQualityManager.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/VideoQualityManager.kt index 7a864f97..7f89fafb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/VideoQualityManager.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/VideoQualityManager.kt @@ -1,22 +1,23 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import androidx.appcompat.app.AppCompatActivity import androidx.camera.core.CameraSelector import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.video.Quality import androidx.camera.video.QualitySelector -import com.simplemobiletools.camera.extensions.config -import com.simplemobiletools.camera.extensions.toVideoQuality -import com.simplemobiletools.camera.models.CameraSelectorVideoQualities -import com.simplemobiletools.camera.models.VideoQuality -import com.simplemobiletools.commons.extensions.showErrorToast +import org.fossify.camera.extensions.config +import org.fossify.camera.extensions.toVideoQuality +import org.fossify.camera.models.CameraSelectorVideoQualities +import org.fossify.camera.models.VideoQuality +import org.fossify.commons.extensions.showErrorToast class VideoQualityManager( private val activity: AppCompatActivity, ) { companion object { private val QUALITIES = listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD) - private val CAMERA_SELECTORS = arrayOf(CameraSelector.DEFAULT_BACK_CAMERA, CameraSelector.DEFAULT_FRONT_CAMERA) + private val CAMERA_SELECTORS = + arrayOf(CameraSelector.DEFAULT_BACK_CAMERA, CameraSelector.DEFAULT_FRONT_CAMERA) } private val videoQualities = mutableListOf() @@ -33,7 +34,12 @@ class VideoQualityManager( .filter(QUALITIES::contains) .also { allQualities -> val qualities = allQualities.map { it.toVideoQuality() } - videoQualities.add(CameraSelectorVideoQualities(camSelector, qualities)) + videoQualities.add( + CameraSelectorVideoQualities( + camSelector, + qualities + ) + ) } } } catch (e: Exception) { @@ -45,7 +51,10 @@ class VideoQualityManager( fun getUserSelectedQuality(cameraSelector: CameraSelector): VideoQuality { val isFrontCamera = cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA - val selectionIndex = mediaSizeStore.getCurrentSizeIndex(isPhotoCapture = false, isFrontCamera = isFrontCamera).coerceAtLeast(0) + val selectionIndex = mediaSizeStore.getCurrentSizeIndex( + isPhotoCapture = false, + isFrontCamera = isFrontCamera + ).coerceAtLeast(0) return getSupportedQualities(cameraSelector).getOrElse(selectionIndex) { VideoQuality.HD } } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ZoomCalculator.kt b/app/src/main/kotlin/org/fossify/camera/helpers/ZoomCalculator.kt similarity index 86% rename from app/src/main/kotlin/com/simplemobiletools/camera/helpers/ZoomCalculator.kt rename to app/src/main/kotlin/org/fossify/camera/helpers/ZoomCalculator.kt index 1e2aa294..41eb0343 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/ZoomCalculator.kt +++ b/app/src/main/kotlin/org/fossify/camera/helpers/ZoomCalculator.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.helpers +package org.fossify.camera.helpers import androidx.camera.core.ZoomState @@ -7,7 +7,8 @@ class ZoomCalculator { fun calculateZoomRatio(zoomState: ZoomState, pinchToZoomScale: Float): Float { val clampedRatio = zoomState.zoomRatio * speedUpZoomBy2X(pinchToZoomScale) // Clamp the ratio with the zoom range. - return clampedRatio.coerceAtLeast(zoomState.minZoomRatio).coerceAtMost(zoomState.maxZoomRatio) + return clampedRatio.coerceAtLeast(zoomState.minZoomRatio) + .coerceAtMost(zoomState.maxZoomRatio) } private fun speedUpZoomBy2X(scaleFactor: Float): Float { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXInitializer.kt b/app/src/main/kotlin/org/fossify/camera/implementations/CameraXInitializer.kt similarity index 74% rename from app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXInitializer.kt rename to app/src/main/kotlin/org/fossify/camera/implementations/CameraXInitializer.kt index 88b01e69..a15000a7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXInitializer.kt +++ b/app/src/main/kotlin/org/fossify/camera/implementations/CameraXInitializer.kt @@ -1,11 +1,11 @@ -package com.simplemobiletools.camera.implementations +package org.fossify.camera.implementations import android.net.Uri import androidx.camera.view.PreviewView -import com.simplemobiletools.camera.helpers.CameraErrorHandler -import com.simplemobiletools.camera.helpers.MediaOutputHelper -import com.simplemobiletools.camera.helpers.MediaSoundHelper -import com.simplemobiletools.commons.activities.BaseSimpleActivity +import org.fossify.camera.helpers.CameraErrorHandler +import org.fossify.camera.helpers.MediaOutputHelper +import org.fossify.camera.helpers.MediaSoundHelper +import org.fossify.commons.activities.BaseSimpleActivity class CameraXInitializer(private val activity: BaseSimpleActivity) { @@ -18,7 +18,8 @@ class CameraXInitializer(private val activity: BaseSimpleActivity) { initInPhotoMode: Boolean, ): CameraXPreview { val cameraErrorHandler = newCameraErrorHandler() - val mediaOutputHelper = newMediaOutputHelper(cameraErrorHandler, outputUri, isThirdPartyIntent) + val mediaOutputHelper = + newMediaOutputHelper(cameraErrorHandler, outputUri, isThirdPartyIntent) return CameraXPreview( activity, previewView, diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt b/app/src/main/kotlin/org/fossify/camera/implementations/CameraXPreview.kt similarity index 81% rename from app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt rename to app/src/main/kotlin/org/fossify/camera/implementations/CameraXPreview.kt index b641097f..fbdd7c80 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt +++ b/app/src/main/kotlin/org/fossify/camera/implementations/CameraXPreview.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.implementations +package org.fossify.camera.implementations import android.annotation.SuppressLint import android.content.Context @@ -8,13 +8,45 @@ import android.os.Handler import android.os.Looper import android.util.Rational import android.util.Size -import android.view.* +import android.view.Display +import android.view.GestureDetector import android.view.GestureDetector.SimpleOnGestureListener -import androidx.camera.core.* -import androidx.camera.core.ImageCapture.* +import android.view.MotionEvent +import android.view.OrientationEventListener +import android.view.ScaleGestureDetector +import android.view.Surface +import androidx.camera.core.Camera +import androidx.camera.core.CameraSelector +import androidx.camera.core.CameraState +import androidx.camera.core.DisplayOrientedMeteringPointFactory +import androidx.camera.core.FocusMeteringAction +import androidx.camera.core.ImageCapture +import androidx.camera.core.ImageCapture.Builder +import androidx.camera.core.ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY +import androidx.camera.core.ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY +import androidx.camera.core.ImageCapture.ERROR_CAPTURE_FAILED +import androidx.camera.core.ImageCapture.FLASH_MODE_AUTO +import androidx.camera.core.ImageCapture.FLASH_MODE_OFF +import androidx.camera.core.ImageCapture.FLASH_MODE_ON +import androidx.camera.core.ImageCapture.Metadata +import androidx.camera.core.ImageCapture.OnImageCapturedCallback +import androidx.camera.core.ImageCaptureException +import androidx.camera.core.ImageProxy +import androidx.camera.core.Preview +import androidx.camera.core.UseCase +import androidx.camera.core.UseCaseGroup +import androidx.camera.core.ViewPort import androidx.camera.lifecycle.ProcessCameraProvider -import androidx.camera.video.* +import androidx.camera.video.FallbackStrategy +import androidx.camera.video.FileDescriptorOutputOptions +import androidx.camera.video.FileOutputOptions +import androidx.camera.video.MediaStoreOutputOptions +import androidx.camera.video.Quality +import androidx.camera.video.QualitySelector +import androidx.camera.video.Recorder +import androidx.camera.video.Recording import androidx.camera.video.VideoCapture +import androidx.camera.video.VideoRecordEvent import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView.ScaleType import androidx.core.content.ContextCompat @@ -24,18 +56,36 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.window.layout.WindowMetricsCalculator import com.bumptech.glide.load.ImageHeaderParser.UNKNOWN_ORIENTATION -import com.simplemobiletools.camera.R -import com.simplemobiletools.camera.extensions.* -import com.simplemobiletools.camera.helpers.* -import com.simplemobiletools.camera.interfaces.MyPreview -import com.simplemobiletools.camera.models.CaptureMode -import com.simplemobiletools.camera.models.MediaOutput -import com.simplemobiletools.camera.models.MySize -import com.simplemobiletools.camera.models.ResolutionOption -import com.simplemobiletools.commons.activities.BaseSimpleActivity -import com.simplemobiletools.commons.extensions.toast -import com.simplemobiletools.commons.helpers.PERMISSION_ACCESS_FINE_LOCATION -import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import org.fossify.camera.R +import org.fossify.camera.extensions.checkLocationPermission +import org.fossify.camera.extensions.config +import org.fossify.camera.extensions.toAppFlashMode +import org.fossify.camera.extensions.toCameraSelector +import org.fossify.camera.extensions.toCameraXFlashMode +import org.fossify.camera.extensions.toCameraXQuality +import org.fossify.camera.extensions.toLensFacing +import org.fossify.camera.helpers.BitmapUtils +import org.fossify.camera.helpers.CameraErrorHandler +import org.fossify.camera.helpers.FLASH_ALWAYS_ON +import org.fossify.camera.helpers.FLASH_ON +import org.fossify.camera.helpers.ImageQualityManager +import org.fossify.camera.helpers.ImageSaver +import org.fossify.camera.helpers.ImageUtil +import org.fossify.camera.helpers.MediaOutputHelper +import org.fossify.camera.helpers.MediaSizeStore +import org.fossify.camera.helpers.MediaSoundHelper +import org.fossify.camera.helpers.PinchToZoomOnScaleGestureListener +import org.fossify.camera.helpers.SimpleLocationManager +import org.fossify.camera.helpers.VideoQualityManager +import org.fossify.camera.interfaces.MyPreview +import org.fossify.camera.models.CaptureMode +import org.fossify.camera.models.MediaOutput +import org.fossify.camera.models.MySize +import org.fossify.camera.models.ResolutionOption +import org.fossify.commons.activities.BaseSimpleActivity +import org.fossify.commons.extensions.toast +import org.fossify.commons.helpers.PERMISSION_ACCESS_FINE_LOCATION +import org.fossify.commons.helpers.ensureBackgroundThread class CameraXPreview( private val activity: BaseSimpleActivity, @@ -58,34 +108,36 @@ class CameraXPreview( private val config = activity.config private val contentResolver = activity.contentResolver private val mainExecutor = ContextCompat.getMainExecutor(activity) - private val displayManager = activity.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager + private val displayManager = + activity.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager private val windowMetricsCalculator = WindowMetricsCalculator.getOrCreate() private val videoQualityManager = VideoQualityManager(activity) private val imageQualityManager = ImageQualityManager(activity) private val mediaSizeStore = MediaSizeStore(config) - private val orientationEventListener = object : OrientationEventListener(activity, SensorManager.SENSOR_DELAY_NORMAL) { - @SuppressLint("RestrictedApi") - override fun onOrientationChanged(orientation: Int) { - if (orientation == UNKNOWN_ORIENTATION) { - return - } + private val orientationEventListener = + object : OrientationEventListener(activity, SensorManager.SENSOR_DELAY_NORMAL) { + @SuppressLint("RestrictedApi") + override fun onOrientationChanged(orientation: Int) { + if (orientation == UNKNOWN_ORIENTATION) { + return + } - val rotation = when (orientation) { - in 45 until 135 -> Surface.ROTATION_270 - in 135 until 225 -> Surface.ROTATION_180 - in 225 until 315 -> Surface.ROTATION_90 - else -> Surface.ROTATION_0 - } + val rotation = when (orientation) { + in 45 until 135 -> Surface.ROTATION_270 + in 135 until 225 -> Surface.ROTATION_180 + in 225 until 315 -> Surface.ROTATION_90 + else -> Surface.ROTATION_0 + } - if (lastRotation != rotation) { - preview?.targetRotation = rotation - imageCapture?.targetRotation = rotation - videoCapture?.targetRotation = rotation - lastRotation = rotation + if (lastRotation != rotation) { + preview?.targetRotation = rotation + imageCapture?.targetRotation = rotation + videoCapture?.targetRotation = rotation + lastRotation = rotation + } } } - } private val cameraHandler = Handler(Looper.getMainLooper()) private val photoModeRunnable = Runnable { if (imageCapture == null) { @@ -143,14 +195,16 @@ class CameraXPreview( bindCameraUseCases() setupCameraObservers() } catch (e: Exception) { - val errorMessage = if (switching) R.string.camera_switch_error else R.string.camera_open_error + val errorMessage = + if (switching) R.string.camera_switch_error else R.string.camera_open_error activity.toast(errorMessage) } }, mainExecutor) } private fun bindCameraUseCases() { - val cameraProvider = cameraProvider ?: throw IllegalStateException("Camera initialization failed.") + val cameraProvider = + cameraProvider ?: throw IllegalStateException("Camera initialization failed.") val resolution = if (isPhotoCapture) { imageQualityManager.getUserSelectedResolution(cameraSelector).also { @@ -281,6 +335,7 @@ class CameraXPreview( listener.setHasFrontAndBackCamera(hasFrontCamera() && hasBackCamera()) listener.setCameraAvailable(true) } + CameraState.Type.PENDING_OPEN, CameraState.Type.CLOSING, CameraState.Type.CLOSED -> { @@ -309,7 +364,12 @@ class CameraXPreview( @SuppressLint("ClickableViewAccessibility") // source: https://stackoverflow.com/a/60095886/10552591 private fun setupZoomAndFocus() { - val scaleGesture = camera?.let { ScaleGestureDetector(activity, PinchToZoomOnScaleGestureListener(it.cameraInfo, it.cameraControl)) } + val scaleGesture = camera?.let { + ScaleGestureDetector( + activity, + PinchToZoomOnScaleGestureListener(it.cameraInfo, it.cameraControl) + ) + } val gestureDetector = GestureDetector(activity, object : SimpleOnGestureListener() { override fun onDown(event: MotionEvent): Boolean { listener.onTouchPreview() @@ -326,10 +386,11 @@ class CameraXPreview( val yPos = event.y val autoFocusPoint = factory.createPoint(xPos, yPos, AF_SIZE) val autoExposurePoint = factory.createPoint(xPos, yPos, AE_SIZE) - val focusMeteringAction = FocusMeteringAction.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF) - .addPoint(autoExposurePoint, FocusMeteringAction.FLAG_AE) - .disableAutoCancel() - .build() + val focusMeteringAction = + FocusMeteringAction.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF) + .addPoint(autoExposurePoint, FocusMeteringAction.FLAG_AE) + .disableAutoCancel() + .build() camera?.cameraControl?.startFocusAndMetering(focusMeteringAction) listener.onFocusCamera(event.rawX, event.rawY) true @@ -399,9 +460,11 @@ class CameraXPreview( } val resolutions = if (isPhotoCapture) { - imageQualityManager.getSupportedResolutions(cameraSelector).map { it.toResolutionOption() } + imageQualityManager.getSupportedResolutions(cameraSelector) + .map { it.toResolutionOption() } } else { - videoQualityManager.getSupportedQualities(cameraSelector).map { it.toResolutionOption() } + videoQualityManager.getSupportedQualities(cameraSelector) + .map { it.toResolutionOption() } } if (resolutions.size > 2) { @@ -424,7 +487,8 @@ class CameraXPreview( private fun toggleResolutions(resolutions: List) { if (resolutions.size >= 2) { - val currentIndex = mediaSizeStore.getCurrentSizeIndex(isPhotoCapture, isFrontCameraInUse()) + val currentIndex = + mediaSizeStore.getCurrentSizeIndex(isPhotoCapture, isFrontCameraInUse()) val nextIndex = if (currentIndex >= resolutions.lastIndex) { 0 @@ -611,6 +675,7 @@ class CameraXPreview( } }.build().let { videoCapture!!.output.prepareRecording(activity, it) } } + is MediaOutput.FileMediaOutput -> { FileOutputOptions.Builder(mediaOutput.file).apply { if (config.savePhotoVideoLocation) { @@ -618,6 +683,7 @@ class CameraXPreview( } }.build().let { videoCapture!!.output.prepareRecording(activity, it) } } + is MediaOutput.MediaStoreOutput -> { MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).apply { setContentValues(mediaOutput.contentValues) diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt b/app/src/main/kotlin/org/fossify/camera/implementations/CameraXPreviewListener.kt similarity index 91% rename from app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt rename to app/src/main/kotlin/org/fossify/camera/implementations/CameraXPreviewListener.kt index a13f7387..e5c7c454 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt +++ b/app/src/main/kotlin/org/fossify/camera/implementations/CameraXPreviewListener.kt @@ -1,8 +1,8 @@ -package com.simplemobiletools.camera.implementations +package org.fossify.camera.implementations import android.graphics.Bitmap import android.net.Uri -import com.simplemobiletools.camera.models.ResolutionOption +import org.fossify.camera.models.ResolutionOption interface CameraXPreviewListener { fun onInitPhotoMode() @@ -30,6 +30,7 @@ interface CameraXPreviewListener { isFrontCamera: Boolean, onSelect: (index: Int, changed: Boolean) -> Unit, ) + fun showFlashOptions(photoCapture: Boolean) fun adjustPreviewView(requiresCentering: Boolean) } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/interfaces/MyPreview.kt b/app/src/main/kotlin/org/fossify/camera/interfaces/MyPreview.kt similarity index 86% rename from app/src/main/kotlin/com/simplemobiletools/camera/interfaces/MyPreview.kt rename to app/src/main/kotlin/org/fossify/camera/interfaces/MyPreview.kt index f3b770a8..990f38bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/interfaces/MyPreview.kt +++ b/app/src/main/kotlin/org/fossify/camera/interfaces/MyPreview.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.interfaces +package org.fossify.camera.interfaces interface MyPreview { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/CameraSelectorImageQualities.kt b/app/src/main/kotlin/org/fossify/camera/models/CameraSelectorImageQualities.kt similarity index 78% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/CameraSelectorImageQualities.kt rename to app/src/main/kotlin/org/fossify/camera/models/CameraSelectorImageQualities.kt index b354f453..5b36e7c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/CameraSelectorImageQualities.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/CameraSelectorImageQualities.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import androidx.camera.core.CameraSelector diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/CameraSelectorVideoQualities.kt b/app/src/main/kotlin/org/fossify/camera/models/CameraSelectorVideoQualities.kt similarity index 78% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/CameraSelectorVideoQualities.kt rename to app/src/main/kotlin/org/fossify/camera/models/CameraSelectorVideoQualities.kt index cca1c2ed..ea24d267 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/CameraSelectorVideoQualities.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/CameraSelectorVideoQualities.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import androidx.camera.core.CameraSelector diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/CaptureMode.kt b/app/src/main/kotlin/org/fossify/camera/models/CaptureMode.kt similarity index 70% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/CaptureMode.kt rename to app/src/main/kotlin/org/fossify/camera/models/CaptureMode.kt index 0d6f9229..a0533410 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/CaptureMode.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/CaptureMode.kt @@ -1,7 +1,7 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import androidx.annotation.StringRes -import com.simplemobiletools.camera.R +import org.fossify.camera.R enum class CaptureMode(@StringRes val stringResId: Int) { MINIMIZE_LATENCY(R.string.minimize_latency), diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/MediaOutput.kt b/app/src/main/kotlin/org/fossify/camera/models/MediaOutput.kt similarity index 95% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/MediaOutput.kt rename to app/src/main/kotlin/org/fossify/camera/models/MediaOutput.kt index 58803472..5ff05f2d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/MediaOutput.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/MediaOutput.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import android.content.ContentValues import android.net.Uri diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt b/app/src/main/kotlin/org/fossify/camera/models/MySize.kt similarity index 94% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt rename to app/src/main/kotlin/org/fossify/camera/models/MySize.kt index 2d14b1b5..fcd8efe4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/MySize.kt @@ -1,9 +1,9 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import android.content.Context import androidx.annotation.DrawableRes import androidx.annotation.IdRes -import com.simplemobiletools.camera.R +import org.fossify.camera.R data class MySize(val width: Int, val height: Int, val isFullScreen: Boolean = false) { companion object { @@ -63,7 +63,7 @@ data class MySize(val width: Int, val height: Int, val isFullScreen: Boolean = f isNineteenToEight() -> "19:8" isSquare() -> "1:1" isTwoToOne() -> "2:1" - else -> context.resources.getString(com.simplemobiletools.commons.R.string.other) + else -> context.resources.getString(org.fossify.commons.R.string.other) } @DrawableRes diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/ResolutionOption.kt b/app/src/main/kotlin/org/fossify/camera/models/ResolutionOption.kt similarity index 80% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/ResolutionOption.kt rename to app/src/main/kotlin/org/fossify/camera/models/ResolutionOption.kt index 39b9eac6..f2c668e4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/ResolutionOption.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/ResolutionOption.kt @@ -1,4 +1,4 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import androidx.annotation.DrawableRes import androidx.annotation.IdRes diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/TimerMode.kt b/app/src/main/kotlin/org/fossify/camera/models/TimerMode.kt similarity index 88% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/TimerMode.kt rename to app/src/main/kotlin/org/fossify/camera/models/TimerMode.kt index bdbbe5e0..8bd3cec6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/TimerMode.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/TimerMode.kt @@ -1,6 +1,6 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models -import com.simplemobiletools.camera.R +import org.fossify.camera.R enum class TimerMode(val millisInFuture: Long) { OFF(0), diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/VideoQuality.kt b/app/src/main/kotlin/org/fossify/camera/models/VideoQuality.kt similarity index 87% rename from app/src/main/kotlin/com/simplemobiletools/camera/models/VideoQuality.kt rename to app/src/main/kotlin/org/fossify/camera/models/VideoQuality.kt index c548d2ed..1497ed51 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/VideoQuality.kt +++ b/app/src/main/kotlin/org/fossify/camera/models/VideoQuality.kt @@ -1,9 +1,9 @@ -package com.simplemobiletools.camera.models +package org.fossify.camera.models import android.content.Context import androidx.annotation.DrawableRes import androidx.annotation.IdRes -import com.simplemobiletools.camera.R +import org.fossify.camera.R enum class VideoQuality(val width: Int, val height: Int) { UHD(3840, 2160), @@ -13,7 +13,8 @@ enum class VideoQuality(val width: Int, val height: Int) { val pixels: Int = width * height - val megaPixels: String = String.format("%.1f", (width * height.toFloat()) / VideoQuality.ONE_MEGA_PIXEL) + val megaPixels: String = + String.format("%.1f", (width * height.toFloat()) / VideoQuality.ONE_MEGA_PIXEL) val ratio = width / height.toFloat() @@ -51,7 +52,7 @@ enum class VideoQuality(val width: Int, val height: Int) { isNineteenToEight() -> "19:8" isSquare() -> "1:1" isTwoToOne() -> "2:1" - else -> context.resources.getString(com.simplemobiletools.commons.R.string.other) + else -> context.resources.getString(org.fossify.commons.R.string.other) } @DrawableRes diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/receivers/HardwareShutterReceiver.kt b/app/src/main/kotlin/org/fossify/camera/receivers/HardwareShutterReceiver.kt similarity index 81% rename from app/src/main/kotlin/com/simplemobiletools/camera/receivers/HardwareShutterReceiver.kt rename to app/src/main/kotlin/org/fossify/camera/receivers/HardwareShutterReceiver.kt index 413900a9..4f3c3e65 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/receivers/HardwareShutterReceiver.kt +++ b/app/src/main/kotlin/org/fossify/camera/receivers/HardwareShutterReceiver.kt @@ -1,9 +1,9 @@ -package com.simplemobiletools.camera.receivers +package org.fossify.camera.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.simplemobiletools.camera.activities.MainActivity +import org.fossify.camera.activities.MainActivity class HardwareShutterReceiver : BroadcastReceiver() { diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/views/FocusCircleView.kt b/app/src/main/kotlin/org/fossify/camera/views/FocusCircleView.kt similarity index 89% rename from app/src/main/kotlin/com/simplemobiletools/camera/views/FocusCircleView.kt rename to app/src/main/kotlin/org/fossify/camera/views/FocusCircleView.kt index 8a75b6d6..f3d94915 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/views/FocusCircleView.kt +++ b/app/src/main/kotlin/org/fossify/camera/views/FocusCircleView.kt @@ -1,12 +1,11 @@ -package com.simplemobiletools.camera.views +package org.fossify.camera.views import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.os.Handler import android.view.ViewGroup -import com.simplemobiletools.camera.extensions.config -import com.simplemobiletools.commons.extensions.getProperPrimaryColor +import org.fossify.commons.extensions.getProperPrimaryColor class FocusCircleView(context: Context) : ViewGroup(context) { private val CIRCLE_RADIUS = 50f diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/views/ShadowDrawable.kt b/app/src/main/kotlin/org/fossify/camera/views/ShadowDrawable.kt similarity index 81% rename from app/src/main/kotlin/com/simplemobiletools/camera/views/ShadowDrawable.kt rename to app/src/main/kotlin/org/fossify/camera/views/ShadowDrawable.kt index eaaaa812..56eb8141 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/views/ShadowDrawable.kt +++ b/app/src/main/kotlin/org/fossify/camera/views/ShadowDrawable.kt @@ -1,17 +1,25 @@ -package com.simplemobiletools.camera.views +package org.fossify.camera.views import android.content.Context import android.content.res.ColorStateList -import android.graphics.* +import android.graphics.Bitmap +import android.graphics.BlurMaskFilter +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.ColorFilter +import android.graphics.Paint +import android.graphics.PorterDuff +import android.graphics.Rect import android.graphics.drawable.Drawable import androidx.annotation.DrawableRes import androidx.annotation.StyleRes import androidx.core.content.ContextCompat -import com.simplemobiletools.camera.R +import org.fossify.camera.R import kotlin.math.ceil import kotlin.math.roundToInt -class ShadowDrawable(context: Context, private val drawable: Drawable, @StyleRes styleResId: Int) : Drawable() { +class ShadowDrawable(context: Context, private val drawable: Drawable, @StyleRes styleResId: Int) : + Drawable() { companion object { private const val SHARED_BITMAP_BUFFER_SIZE = 640 @@ -63,12 +71,23 @@ class ShadowDrawable(context: Context, private val drawable: Drawable, @StyleRes } } if (styleResId != 0) { - val obtainStyledAttributes = context.obtainStyledAttributes(styleResId, R.styleable.ShadowDrawable) + val obtainStyledAttributes = + context.obtainStyledAttributes(styleResId, R.styleable.ShadowDrawable) shadowColor = - obtainStyledAttributes.getColor(R.styleable.ShadowDrawable_android_shadowColor, ContextCompat.getColor(context, com.simplemobiletools.commons.R.color.md_grey_400_dark)) - shadowDx = obtainStyledAttributes.getFloat(R.styleable.ShadowDrawable_android_shadowDx, 0f).toInt() - shadowDy = obtainStyledAttributes.getFloat(R.styleable.ShadowDrawable_android_shadowDy, 0f).toInt() - val shadowRadius = obtainStyledAttributes.getFloat(R.styleable.ShadowDrawable_android_shadowRadius, 0.0f).coerceAtLeast(0.0f) + obtainStyledAttributes.getColor( + R.styleable.ShadowDrawable_android_shadowColor, + ContextCompat.getColor(context, org.fossify.commons.R.color.md_grey_400_dark) + ) + shadowDx = + obtainStyledAttributes.getFloat(R.styleable.ShadowDrawable_android_shadowDx, 0f) + .toInt() + shadowDy = + obtainStyledAttributes.getFloat(R.styleable.ShadowDrawable_android_shadowDy, 0f) + .toInt() + val shadowRadius = obtainStyledAttributes.getFloat( + R.styleable.ShadowDrawable_android_shadowRadius, + 0.0f + ).coerceAtLeast(0.0f) shadowRadiusCeiling = ceil(shadowRadius).toInt() val alpha = Color.alpha(shadowColor) if (shadowRadius > 0.0f && alpha > 0) { @@ -103,9 +122,13 @@ class ShadowDrawable(context: Context, private val drawable: Drawable, @StyleRes if (sharedBitmap != null) { sharedBitmap.eraseColor(0) } else { - sharedBitmap = Bitmap.createBitmap(SHARED_BITMAP_BUFFER_SIZE, SHARED_BITMAP_BUFFER_SIZE, Bitmap.Config.ARGB_8888) + sharedBitmap = Bitmap.createBitmap( + SHARED_BITMAP_BUFFER_SIZE, + SHARED_BITMAP_BUFFER_SIZE, + Bitmap.Config.ARGB_8888 + ) sharedDrawableBitmapBuffer.set(sharedBitmap) - sharedDrawableCanvasBuffer.set(Canvas(sharedBitmap!!)) + sharedDrawableCanvasBuffer.set(Canvas(sharedBitmap)) } createBitmap = sharedBitmap canvas2 = sharedDrawableCanvasBuffer.get()!! @@ -150,10 +173,13 @@ class ShadowDrawable(context: Context, private val drawable: Drawable, @StyleRes outputBufferCanvas!!.drawBitmap(createBitmap, srcRect, destRect, bitmapPaint) srcRect[0, 0, unionBounds.width()] = unionBounds.height() destRect.set(unionBounds) - canvas.drawBitmap(outputBuffer!!, srcRect, destRect, bitmapPaint) + canvas.drawBitmap(outputBuffer, srcRect, destRect, bitmapPaint) } - @Deprecated("Deprecated in Java", ReplaceWith("PixelFormat.TRANSLUCENT", "android.graphics.PixelFormat")) + @Deprecated( + "Deprecated in Java", + ReplaceWith("PixelFormat.TRANSLUCENT", "android.graphics.PixelFormat") + ) override fun getOpacity(): Int { return drawable.opacity } diff --git a/app/src/main/res/drawable-v26/ic_launcher_foreground.xml b/app/src/main/res/drawable-v26/ic_launcher_foreground.xml deleted file mode 100644 index 2fa81ce3..00000000 --- a/app/src/main/res/drawable-v26/ic_launcher_foreground.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..82a87d26 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml index 4b16f51e..82a87d26 100644 --- a/app/src/main/res/drawable/ic_launcher_monochrome.xml +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -1,3 +1,9 @@ - - + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 25aa66bd..a3c9e037 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -42,7 +42,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - - - - - - - - - - - - - - - + + - + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml index b9bf82a7..7b4ef572 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml index fe4c0f72..c8173849 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml index 794a0ba8..e5ae9a17 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml index 213d4eca..6c1d2603 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml index 9958c2c4..cc384dc6 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml index 8390cf09..5250a44f 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml index 80e20d58..81ba15b5 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml index b73af9bd..064533a6 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml index 968374cf..c0477c1e 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml index 791c1a46..20f9f44a 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml index c559382f..dd752f85 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml index cb8e9f0f..eee16d21 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml index 77975833..cfe22da4 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml index a6163778..00a28a52 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml index c0ce2da8..8c55541a 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml index 64e53a68..f500e3c1 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml index 17b0961f..64fd7f8b 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml index 044ebd10..74726f57 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 63732e1c..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png deleted file mode 100644 index 42e50cf6..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png deleted file mode 100644 index ac6abf35..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png deleted file mode 100644 index 2d20b405..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png deleted file mode 100644 index a9addc9b..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png deleted file mode 100644 index ded2df1d..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png deleted file mode 100644 index 503ea184..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png deleted file mode 100644 index faa72271..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index cc546c32..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_green.png b/app/src/main/res/mipmap-hdpi/ic_launcher_green.png deleted file mode 100644 index 0ec20a55..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png deleted file mode 100644 index 61d62bc5..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png deleted file mode 100644 index 21ed5c91..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png deleted file mode 100644 index 07c253cf..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png deleted file mode 100644 index d0252249..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png deleted file mode 100644 index a4eb5a82..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png deleted file mode 100644 index 2bd7bed4..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png deleted file mode 100644 index c70cd1fa..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_red.png b/app/src/main/res/mipmap-hdpi/ic_launcher_red.png deleted file mode 100644 index 18bf5ec7..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_red.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png deleted file mode 100644 index 9b3e647c..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png deleted file mode 100644 index 6c1e5a3b..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index d26657fc..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png deleted file mode 100644 index c56d1f25..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png deleted file mode 100644 index 76d776d9..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png deleted file mode 100644 index 67078fe8..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png deleted file mode 100644 index 39e16bd6..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png deleted file mode 100644 index e42e73b0..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png deleted file mode 100644 index 97c29bcc..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png deleted file mode 100644 index 6fff618e..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index be6004b0..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png deleted file mode 100644 index 28f9d4d7..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png deleted file mode 100644 index 7b97362e..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png deleted file mode 100644 index 3dd23db4..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png deleted file mode 100644 index 5df9048b..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png deleted file mode 100644 index 03ff77a9..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png deleted file mode 100644 index 261744b6..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png deleted file mode 100644 index e4d91888..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png deleted file mode 100644 index 8441caf1..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png deleted file mode 100644 index 9985b2b5..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png deleted file mode 100644 index 7e0ca081..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png deleted file mode 100644 index 3318608f..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 855d766a..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png deleted file mode 100644 index bcc07827..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png deleted file mode 100644 index b0f5900d..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png deleted file mode 100644 index 38bbf295..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png deleted file mode 100644 index c0ade623..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png deleted file mode 100644 index 7cf930cf..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png deleted file mode 100644 index 13765eb0..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png deleted file mode 100644 index d7a07d09..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 50c62830..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png deleted file mode 100644 index fba17147..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png deleted file mode 100644 index f5ac90cb..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png deleted file mode 100644 index 305c26f0..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png deleted file mode 100644 index b896e8ac..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png deleted file mode 100644 index 5124f66a..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png deleted file mode 100644 index 7778983a..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png deleted file mode 100644 index 9d5029bf..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png deleted file mode 100644 index ac8702ae..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png deleted file mode 100644 index 5e67224e..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png deleted file mode 100644 index 619854a3..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png deleted file mode 100644 index a405b0a0..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 5fe2ef75..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png deleted file mode 100644 index 680719a3..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png deleted file mode 100644 index 6357caf2..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png deleted file mode 100644 index 497f9497..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png deleted file mode 100644 index 374f3dea..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png deleted file mode 100644 index a0307bb3..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png deleted file mode 100644 index b50b199d..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png deleted file mode 100644 index 624e02c2..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 129e4765..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png deleted file mode 100644 index f3fa7018..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png deleted file mode 100644 index 48e5ffd3..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png deleted file mode 100644 index ce8b7d35..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png deleted file mode 100644 index 4b05d848..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png deleted file mode 100644 index 14c925f1..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png deleted file mode 100644 index 24aef3ee..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png deleted file mode 100644 index 738c25d5..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png deleted file mode 100644 index d55b94e1..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png deleted file mode 100644 index bc6359fe..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png deleted file mode 100644 index 2ca8b65d..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png deleted file mode 100644 index 9f43c079..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png and /dev/null differ diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index a2249eff..15287a96 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1,6 +1,5 @@ - الكاميرا البسيطة الكاميرا وضع الالتقاط زيادة الجودة diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index b5e4cfda..e535fd38 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -1,6 +1,5 @@ - Sadə Kamera Kamera Kamera əlçatan deyil Kameranı açarkən xəta baş verdi diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 763f8018..01bedb8e 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,6 +1,5 @@ - Обикновена Камера Камера Камерата не е налична Възникна грешка при достъпа до камерата diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1cf7bd8d..3b66c6ad 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,6 +1,5 @@ - Jednoduchý fotoaparát Fotoaparát Režim snímání Maximalizovat kvalitu diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 96fa53ee..04a239fe 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -34,7 +34,6 @@ Gem Exif-metadata i fotos Fotokomprimeringskvalitet Lukker - Simpelt Kamera Minimér ventetid Maksimér kvalitet Skift mellem foto- og videotilstand diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8d5fceea..3e8bb5de 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,6 +1,5 @@ - Fossify Camera Kamera Aufnahmemodus Qualität maximieren diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ddcf1795..ae2955e3 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,6 +1,5 @@ - Απλή Κάμερα Κάμερα Λειτουργία καταγραφής Μέγιστη ποιότητα diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5babb8ad..c2df5255 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,6 +1,5 @@ - Simple Camera Cámara Modo de captura Maximiza la calidad diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index f5952768..7eb7846a 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -1,6 +1,5 @@ - Lihtne kaamera Kaamera Pildistamisrežiim Eelista parimat kvaliteeti diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index eeede714..a6b3daec 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -1,4 +1,2 @@ - - Kamera - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index e8b67e8b..a048c679 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1,6 +1,5 @@ - Yksinkertainen kamera Kamera Kaappaustila Paras mahdollinen laatu diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 7973182a..aa76c878 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,6 +1,5 @@ - Fossify Camera Appareil photo Mode capture Maximiser la qualité diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 5c9a9f42..35bcb910 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -1,6 +1,5 @@ - Cámara sinxela Cámara Modo de captura Maximizala calidade diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index cebf6803..8dfe59b6 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -6,7 +6,6 @@ रिज़ॉल्यूशन बदलें परेशान न करें मोड सक्षम है। कृपया अक्षम करें और पुनः प्रयास करें अपर्याप्त स्टोरेज के कारण वीडियो रिकॉर्डिंग विफल रही - Fossify Camera कब्जा प्रकार गुणवत्ता अधिकतम करें कैमरे तक पहुंचने में त्रुटि उत्पन्न हुई diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 56a3bccd..0a148b44 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -1,6 +1,5 @@ - Jednostavna kamera Kamera Način snimanja Maksimiraj kvalitetu diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index daa7044a..c87c17ce 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,6 +1,5 @@ - Egyszerű kamera Kamera Rögzítési mód Minőség maximalizálása diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 30cb461f..dbbca78b 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -1,6 +1,5 @@ - Kamera Fossify Kamera Mode tangkapan Tingkatkan kualitas diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3d24e03e..af73190f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,6 +1,5 @@ - Fotocamera Semplice Fotocamera Modalità di cattura Massimizza la qualità diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 7467c168..4021c2e2 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -1,6 +1,5 @@ - מצלמה פשוטה מצלמה המצלמה לא זמינה אירעה שגיאה בגישה למצלמה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a999206b..45fc903e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,6 +1,5 @@ - シンプル カメラ カメラ 撮影モード 品質の最大化 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 16a9c540..518dcd6b 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,6 +1,5 @@ - 심플 카메라 카메라 카메라를 사용할 수 없습니다 카메라에 액세스하는 중에 오류가 발생했습니다 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index af376c07..b7e4b6db 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -1,6 +1,5 @@ - Paprasta kamera Kamera Fotografavimo veiksena Pagerinti kokybę diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 10004b90..a4ecc2d6 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -1,6 +1,5 @@ - സിമ്പിൾ ക്യാമറ ക്യാമറ ക്യാമറ ലഭ്യമല്ല ക്യാമറ ആക്‌സസ് ചെയ്യുന്നതിൽ ഒരു പിശക് സംഭവിച്ചു diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index a7f1f0cd..6b75ddf9 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -1,6 +1,5 @@ - Enkelt kamera Kamera Kamera utilgjengelig Fikk ikke tilgang til kameraet diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 8d6a53e4..f98145fd 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -1,6 +1,5 @@ - सिम्पल क्यामेरा क्यामेरा क्यामेरा उपलब्ध छैन क्यामेरा पहुचहुनमा समस्या आयो diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 95638ffd..54ca0f4b 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,6 +1,5 @@ - Eenvoudige Camera Opnamemodus Kwaliteit maximaliseren Vertraging minimaliseren diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 8fe87a97..d6419c08 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -1,6 +1,5 @@ - Einfelt kamera Kamera Opptaksmodus Best kvalitet diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 49c2fa65..d4c82ddc 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,6 +1,5 @@ - Prosty aparat Aparat Tryb przechwytywania Maksymalizuj jakość diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a9a862d4..67487a1d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,6 +1,5 @@ - Câmera Simples Câmera Modo de captura Maximizar a qualidade diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 32a9ea0a..64437e13 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -45,5 +45,4 @@ Guardar localização dos vídeos e das fotos Qualidade de compressão da foto Obturador - Câmara \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 94216808..ea4ab584 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,7 +1,6 @@ - Cameră simplă - Camera + Cameră Cameră indisponibilă A apărut o eroare la accesarea camerei S-a produs o eroare la crearea fișierului video diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f755e205..8d03cfad 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,6 +1,5 @@ - Простая камера Камера Режим съёмки Максимальное качество diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index c2117b7a..8ec4d7a6 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -1,6 +1,5 @@ - Jednoduchý fotoaparát Fotoaparát Režim snímania Maximálna kvalita diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index b9bb831e..d24382b3 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1,6 +1,5 @@ - Enostavna kamera Kamera Način slikanja Povečanje kakovosti diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 89c4a0da..2f72dab7 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,6 +1,5 @@ - Једноставна камера Камера Режим снимања Максимизирајте квалитет diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8f524174..9221cf66 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,6 +1,5 @@ - Basit Kamera Kamera Çekim modu Kaliteyi en üst düzeye çıkar diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 94bcb472..63b964ac 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,6 +1,5 @@ - Проста Камера Камера Режим зйомки Максимальна якість diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 70a4d674..b382b0b7 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -35,7 +35,6 @@ Hiển thị bản xem trước ảnh sau khi chụp Độ phân giải camera sau Âm thanh chụp - Máy ảnh Fossify Ảnh chụp Lấy nét trước khi chụp Tắt đèn flash khi khởi động diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index caea93e4..d1fbe2d7 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - 简单相机 相机 拍照模式 最高画质 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a09ed3bd..92640674 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,6 +1,5 @@ - Simple 相機 相機 拍攝模式 極致畫質 diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index aaab27c1..83d4780c 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -1,20 +1,5 @@ - com.simplemobiletools.camera - - - Allow changing the photo compression quality - Added optional exif metadata saving, enabled by default - Added a toggle for flipping front camera photos horizontally - - Add an option to focus the photo before capture\n - Add an option to use the volume buttons as shutter - - Added an automatic flash mode - - Added more color customization options\n - Your settings have been cleared, please reset them\n - Moved the resolution picker onto the main screen - - + org.fossify.camera + Fossify Camera diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..07fea199 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #106D20 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4f4dc2a..d7735218 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,5 @@ - Simple Camera Camera Capture mode Maximize quality diff --git a/fastlane/Appfile b/fastlane/Appfile index 34821e38..2e636284 100644 --- a/fastlane/Appfile +++ b/fastlane/Appfile @@ -1,2 +1,2 @@ json_key_file("fastlane/fastlane.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one -package_name("com.simplemobiletools.camera") # e.g. com.krausefx.app +package_name("org.fossify.camera") # e.g. com.krausefx.app diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2a01e632..0e5c0f0b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,8 +10,8 @@ androidx-lifecycle = "2.6.1" androidx-window = "1.2.0-beta01" androidx-camera = "1.3.0-beta02" androidx-ktx = "2.6.1" -#Simple tools -simple-commons = "73d78e5cd3" +#Fossify +commons = "6500fc4111" #Gradle gradlePlugins-agp = "8.6.1" #build @@ -21,9 +21,9 @@ app-build-minimumSDK = "29" app-build-javaVersion = "VERSION_17" app-build-kotlinJVMTarget = "17" #versioning -app-version-appId = "com.simplemobiletools.camera" -app-version-versionCode = "89" -app-version-versionName = "5.7.2" +app-version-appId = "org.fossify.camera" +app-version-versionCode = "1" +app-version-versionName = "1.0.0" [libraries] #Android X androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "androidx-camera" } @@ -36,8 +36,8 @@ androidx-window = { module = "androidx.window:window", version.ref = "androidx-w androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidx-ktx" } androidx-exifinterface = { module = "androidx.exifinterface:exifinterface", version.ref = "androidx-exif-interface" } androidx-documentfile = { module = "androidx.documentfile:documentfile", version.ref = "androidx-document-file" } -#Simple Mobile Tools -simple-tools-commons = { module = "com.github.SimpleMobileTools:Simple-Commons", version.ref = "simple-commons" } +#Fossify +fossify-commons = { module = "org.fossify:commons", version.ref = "commons" } [bundles] androidx-camera = [ "androidx-camera-core", diff --git a/graphics/foreground.svg b/graphics/foreground.svg new file mode 100644 index 00000000..3cfa2ff3 --- /dev/null +++ b/graphics/foreground.svg @@ -0,0 +1,12 @@ + + + + diff --git a/graphics/icon.svg b/graphics/icon.svg new file mode 100644 index 00000000..7f9a0c80 --- /dev/null +++ b/graphics/icon.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file