Camera.kt (3876B) - raw
1 package me.rhunk.snapenhance.common.config.impl 2 3 import android.content.Context 4 import android.hardware.camera2.CameraCharacteristics 5 import android.hardware.camera2.CameraManager 6 import me.rhunk.snapenhance.common.Constants 7 import me.rhunk.snapenhance.common.config.* 8 import me.rhunk.snapenhance.common.logger.AbstractLogger 9 10 class Camera : ConfigContainer() { 11 companion object { 12 private val defaultResolutions = listOf("3264x2448", "3264x1840", "3264x1504", "2688x1512", "2560x1920", "2448x2448", "2340x1080", "2160x1080", "1920x1440", "1920x1080", "1600x1200", "1600x960", "1600x900", "1600x736", "1600x720", "1560x720", "1520x720", "1440x1080", "1440x720", "1280x720", "1080x1080", "1080x720", "960x720", "720x720", "720x480", "640x480", "352x288", "320x240", "176x144").toTypedArray() 13 private val customFrameRates = arrayOf("5", "10", "20", "25", "30", "48", "60", "90", "120") 14 } 15 16 private lateinit var _overrideFrontResolution: PropertyValue<String> 17 private lateinit var _overrideBackResolution: PropertyValue<String> 18 19 override fun lateInit(context: Context) { 20 val backResolutions = mutableListOf<String>() 21 val frontResolutions = mutableListOf<String>() 22 23 context.getSystemService(CameraManager::class.java).apply { 24 if (context.packageName == Constants.SNAPCHAT_PACKAGE_NAME) return@apply // prevent snapchat from crashing 25 26 runCatching { 27 cameraIdList.forEach { cameraId -> 28 val characteristics = getCameraCharacteristics(cameraId) 29 val isSelfie = characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT 30 31 (frontResolutions.takeIf { isSelfie } ?: backResolutions).addAll( 32 characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)?.let { 33 it.outputFormats.flatMap { format -> it.getOutputSizes(format).toList() } 34 }?.sortedByDescending { it.width * it.height }?.map { "${it.width}x${it.height}" }?.distinct() ?: emptyList() 35 ) 36 } 37 }.onFailure { 38 AbstractLogger.directError("Failed to get camera resolutions", it) 39 backResolutions.addAll(defaultResolutions) 40 frontResolutions.addAll(defaultResolutions) 41 } 42 } 43 44 _overrideFrontResolution = unique("override_front_resolution", *frontResolutions.toTypedArray()) 45 { addFlags(ConfigFlag.NO_TRANSLATE) } 46 _overrideBackResolution = unique("override_back_resolution", *backResolutions.toTypedArray()) 47 { addFlags(ConfigFlag.NO_TRANSLATE) } 48 } 49 50 val disableCameras = multiple("disable_cameras", "front", "back") { addNotices(FeatureNotice.INTERNAL_BEHAVIOR); requireRestart() } 51 val immersiveCameraPreview = boolean("immersive_camera_preview") { addNotices(FeatureNotice.UNSTABLE); versionCheck = RES_OBF_VERSION_CHECK.copy(isDisabled = true) } 52 val blackPhotos = boolean("black_photos") 53 val frontCustomFrameRate = unique("front_custom_frame_rate", *customFrameRates) { requireRestart(); addFlags(ConfigFlag.NO_TRANSLATE) } 54 val backCustomFrameRate = unique("back_custom_frame_rate", *customFrameRates) { requireRestart(); addFlags(ConfigFlag.NO_TRANSLATE) } 55 val hevcRecording = boolean("hevc_recording") { requireRestart() } 56 val forceCameraSourceEncoding = boolean("force_camera_source_encoding") 57 val startupDefaultCamera = unique("startup_default_camera", "front", "back") { requireRestart() } 58 val overrideFrontResolution get() = _overrideFrontResolution 59 val overrideBackResolution get() = _overrideBackResolution 60 61 val customResolution = string("custom_resolution") { addNotices(FeatureNotice.UNSTABLE); inputCheck = { it.matches(Regex("\\d+x\\d+")) } } 62 }