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 }