diff --git a/CHANGELOG.md b/CHANGELOG.md index cf380c1a7..2724e8b8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Theme: light/dark/black and poly/monochrome settings - Video: speed and muted state indicators - Info: option to set date from other item +- Info: improved DNG tags display - warn and optionally set metadata date before moving undated items ### Changed diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt index e70895276..7185661ea 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt @@ -74,7 +74,10 @@ import deckers.thibault.aves.utils.UriUtils.tryParseId import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch import java.nio.charset.Charset import java.nio.charset.StandardCharsets import java.text.ParseException @@ -163,15 +166,24 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { // tags val tags = dir.tags if (dir is ExifDirectoryBase) { - if (dir.isGeoTiff()) { - // split GeoTIFF tags in their own directory - val byGeoTiff = tags.groupBy { ExifTags.isGeoTiffTag(it.tagType) } - metadataMap["GeoTIFF"] = HashMap().apply { - byGeoTiff[true]?.map { exifTagMapper(it) }?.let { putAll(it) } + when { + dir.isGeoTiff() -> { + // split GeoTIFF tags in their own directory + val geoTiffDirMap = metadataMap["GeoTIFF"] ?: HashMap() + metadataMap["GeoTIFF"] = geoTiffDirMap + val byGeoTiff = tags.groupBy { ExifTags.isGeoTiffTag(it.tagType) } + byGeoTiff[true]?.map { exifTagMapper(it) }?.let { geoTiffDirMap.putAll(it) } + byGeoTiff[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } } - byGeoTiff[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } - } else { - dirMap.putAll(tags.map { exifTagMapper(it) }) + mimeType == MimeTypes.DNG -> { + // split DNG tags in their own directory + val dngDirMap = metadataMap["DNG"] ?: HashMap() + metadataMap["DNG"] = dngDirMap + val byDng = tags.groupBy { ExifTags.isDngTag(it.tagType) } + byDng[true]?.map { exifTagMapper(it) }?.let { dngDirMap.putAll(it) } + byDng[false]?.map { exifTagMapper(it) }?.let { dirMap.putAll(it) } + } + else -> dirMap.putAll(tags.map { exifTagMapper(it) }) } } else if (dir.isPngTextDir()) { metadataMap.remove(thisDirName) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt index 7b00eae14..313791999 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/DngTags.kt @@ -128,100 +128,102 @@ object DngTags { WHITE_LEVEL to "White Level", DEFAULT_SCALE to "Default Scale", DEFAULT_CROP_ORIGIN to "Default Crop Origin", - DEFAULT_CROP_SIZE to "DefaultCropSize", - COLOR_MATRIX_1 to "ColorMatrix1", - COLOR_MATRIX_2 to "ColorMatrix2", - CAMERA_CALIBRATION_1 to "CameraCalibration1", - CAMERA_CALIBRATION_2 to "CameraCalibration2", - REDUCTION_MATRIX_1 to "ReductionMatrix1", - REDUCTION_MATRIX_2 to "ReductionMatrix2", - ANALOG_BALANCE to "AnalogBalance", - AS_SHOT_NEUTRAL to "AsShotNeutral", - AS_SHOT_WHITE_XY to "AsShotWhiteXY", - BASELINE_EXPOSURE to "BaselineExposure", - BASELINE_NOISE to "BaselineNoise", - BASELINE_SHARPNESS to "BaselineSharpness", - BAYER_GREEN_SPLIT to "BayerGreenSplit", - LINEAR_RESPONSE_LIMIT to "LinearResponseLimit", + DEFAULT_CROP_SIZE to "Default Crop Size", + COLOR_MATRIX_1 to "Color Matrix 1", + COLOR_MATRIX_2 to "Color Matrix 2", + CAMERA_CALIBRATION_1 to "Camera Calibration 1", + CAMERA_CALIBRATION_2 to "Camera Calibration 2", + REDUCTION_MATRIX_1 to "Reduction Matrix 1", + REDUCTION_MATRIX_2 to "Reduction Matrix 2", + ANALOG_BALANCE to "Analog Balance", + AS_SHOT_NEUTRAL to "As Shot Neutral", + AS_SHOT_WHITE_XY to "As Shot White XY", + BASELINE_EXPOSURE to "Baseline Exposure", + BASELINE_NOISE to "Baseline Noise", + BASELINE_SHARPNESS to "Baseline Sharpness", + BAYER_GREEN_SPLIT to "Bayer Green Split", + LINEAR_RESPONSE_LIMIT to "Linear Response Limit", CAMERA_SERIAL_NUMBER to "Camera Serial Number", - LENS_INFO to "LensInfo", - CHROMA_BLUR_RADIUS to "ChromaBlurRadius", - ANTI_ALIAS_STRENGTH to "AntiAliasStrength", - SHADOW_SCALE to "ShadowScale", - DNG_PRIVATE_DATA to "DNGPrivateData", - MAKER_NOTE_SAFETY to "MakerNoteSafety", - CALIBRATION_ILLUMINANT_1 to "CalibrationIlluminant1", - CALIBRATION_ILLUMINANT_2 to "CalibrationIlluminant2", + LENS_INFO to "Lens Info", + CHROMA_BLUR_RADIUS to "Chroma Blur Radius", + ANTI_ALIAS_STRENGTH to "Anti Alias Strength", + SHADOW_SCALE to "Shadow Scale", + DNG_PRIVATE_DATA to "DNG Private Data", + MAKER_NOTE_SAFETY to "Maker Note Safety", + CALIBRATION_ILLUMINANT_1 to "Calibration Illuminant 1", + CALIBRATION_ILLUMINANT_2 to "Calibration Illuminant 2", BEST_QUALITY_SCALE to "Best Quality Scale", - RAW_DATA_UNIQUE_ID to "RawDataUniqueID", + RAW_DATA_UNIQUE_ID to "Raw Data Unique ID", ORIGINAL_RAW_FILE_NAME to "Original Raw File Name", - ORIGINAL_RAW_FILE_DATA to "OriginalRawFileData", - ACTIVE_AREA to "ActiveArea", - MASKED_AREAS to "MaskedAreas", - AS_SHOT_ICC_PROFILE to "AsShotICCProfile", - AS_SHOT_PRE_PROFILE_MATRIX to "AsShotPreProfileMatrix", - CURRENT_ICC_PROFILE to "CurrentICCProfile", - CURRENT_PRE_PROFILE_MATRIX to "CurrentPreProfileMatrix", - COLORIMETRIC_REFERENCE to "ColorimetricReference", - CAMERA_CALIBRATION_SIGNATURE to "CameraCalibrationSignature", - PROFILE_CALIBRATION_SIGNATURE to "ProfileCalibrationSignature", - EXTRA_CAMERA_PROFILES to "ExtraCameraProfiles", - AS_SHOT_PROFILE_NAME to "AsShotProfileName", - NOISE_REDUCTION_APPLIED to "NoiseReductionApplied", - PROFILE_NAME to "ProfileName", - PROFILE_HUE_SAT_MAP_DIMS to "ProfileHueSatMapDims", - PROFILE_HUE_SAT_MAP_DATA_1 to "ProfileHueSatMapData1", - PROFILE_HUE_SAT_MAP_DATA_2 to "ProfileHueSatMapData2", - PROFILE_TONE_CURVE to "ProfileToneCurve", - PROFILE_EMBED_POLICY to "ProfileEmbedPolicy", - PROFILE_COPYRIGHT to "ProfileCopyright", - FORWARD_MATRIX_1 to "ForwardMatrix1", - FORWARD_MATRIX_2 to "ForwardMatrix2", - PREVIEW_APPLICATION_NAME to "PreviewApplicationName", - PREVIEW_APPLICATION_VERSION to "PreviewApplicationVersion", - PREVIEW_SETTINGS_NAME to "PreviewSettingsName", - PREVIEW_SETTINGS_DIGEST to "PreviewSettingsDigest", - PREVIEW_COLOR_SPACE to "PreviewColorSpace", - PREVIEW_DATE_TIME to "PreviewDateTime", - RAW_IMAGE_DIGEST to "RawImageDigest", - ORIGINAL_RAW_FILE_DIGEST to "OriginalRawFileDigest", - SUB_TILE_BLOCK_SIZE to "SubTileBlockSize", - ROW_INTERLEAVE_FACTOR to "RowInterleaveFactor", - PROFILE_LOOK_TABLE_DIMS to "ProfileLookTableDims", - PROFILE_LOOK_TABLE_DATA to "ProfileLookTableData", - OPCODE_LIST_1 to "OpcodeList1", - OPCODE_LIST_2 to "OpcodeList2", - OPCODE_LIST_3 to "OpcodeList3", - NOISE_PROFILE to "NoiseProfile", - ORIGINAL_DEFAULT_FINAL_SIZE to "OriginalDefaultFinalSize", - ORIGINAL_BEST_QUALITY_FINAL_SIZE to "OriginalBestQualityFinalSize", - ORIGINAL_DEFAULT_CROP_SIZE to "OriginalDefaultCropSize", - PROFILE_HUE_SAT_MAP_ENCODING to "ProfileHueSatMapEncoding", - PROFILE_LOOK_TABLE_ENCODING to "ProfileLookTableEncoding", - BASELINE_EXPOSURE_OFFSET to "BaselineExposureOffset", - DEFAULT_BLACK_RENDER to "DefaultBlackRender", - NEW_RAW_IMAGE_DIGEST to "NewRawImageDigest", - RAW_TO_PREVIEW_GAIN to "RawToPreviewGain", - DEFAULT_USER_CROP to "DefaultUserCrop", - DEPTH_FORMAT to "DepthFormat", - DEPTH_NEAR to "DepthNear", - DEPTH_FAR to "DepthFar", - DEPTH_UNITS to "DepthUnits", - DEPTH_MEASURE_TYPE to "DepthMeasureType", - ENHANCE_PARAMS to "EnhanceParams", - PROFILE_GAIN_TABLE_MAP to "ProfileGainTableMap", - SEMANTIC_NAME to "SemanticName", - SEMANTIC_INSTANCE_ID to "SemanticInstanceID", - CALIBRATION_ILLUMINANT_3 to "CalibrationIlluminant3", - CAMERA_CALIBRATION_3 to "CameraCalibration3", - COLOR_MATRIX_3 to "ColorMatrix3", - FORWARD_MATRIX_3 to "ForwardMatrix3", - ILLUMINANT_DATA_1 to "IlluminantData1", - ILLUMINANT_DATA_2 to "IlluminantData2", - ILLUMINANT_DATA_3 to "IlluminantData3", - MASK_SUB_AREA to "MaskSubArea", - PROFILE_HUE_SAT_MAP_DATA_3 to "ProfileHueSatMapData3", - REDUCTION_MATRIX_3 to "ReductionMatrix3", - RGB_TABLES to "RGBTables", + ORIGINAL_RAW_FILE_DATA to "Original Raw File Data", + ACTIVE_AREA to "Active Area", + MASKED_AREAS to "Masked Areas", + AS_SHOT_ICC_PROFILE to "As Shot ICC Profile", + AS_SHOT_PRE_PROFILE_MATRIX to "As Shot Pre Profile Matrix", + CURRENT_ICC_PROFILE to "Current ICC Profile", + CURRENT_PRE_PROFILE_MATRIX to "Current Pre Profile Matrix", + COLORIMETRIC_REFERENCE to "Colorimetric Reference", + CAMERA_CALIBRATION_SIGNATURE to "Camera Calibration Signature", + PROFILE_CALIBRATION_SIGNATURE to "Profile Calibration Signature", + EXTRA_CAMERA_PROFILES to "Extra Camera Profiles", + AS_SHOT_PROFILE_NAME to "As Shot Profile Name", + NOISE_REDUCTION_APPLIED to "Noise Reduction Applied", + PROFILE_NAME to "Profile Name", + PROFILE_HUE_SAT_MAP_DIMS to "Profile Hue Sat Map Dims", + PROFILE_HUE_SAT_MAP_DATA_1 to "Profile Hue Sat Map Data 1", + PROFILE_HUE_SAT_MAP_DATA_2 to "Profile Hue Sat Map Data 2", + PROFILE_TONE_CURVE to "Profile Tone Curve", + PROFILE_EMBED_POLICY to "Profile Embed Policy", + PROFILE_COPYRIGHT to "Profile Copyright", + FORWARD_MATRIX_1 to "Forward Matrix 1", + FORWARD_MATRIX_2 to "Forward Matrix 2", + PREVIEW_APPLICATION_NAME to "Preview Application Name", + PREVIEW_APPLICATION_VERSION to "Preview Application Version", + PREVIEW_SETTINGS_NAME to "Preview Settings Name", + PREVIEW_SETTINGS_DIGEST to "Preview Settings Digest", + PREVIEW_COLOR_SPACE to "Preview Color Space", + PREVIEW_DATE_TIME to "Preview Date Time", + RAW_IMAGE_DIGEST to "Raw Image Digest", + ORIGINAL_RAW_FILE_DIGEST to "Original Raw File Digest", + SUB_TILE_BLOCK_SIZE to "Sub Tile Block Size", + ROW_INTERLEAVE_FACTOR to "Row Interleave Factor", + PROFILE_LOOK_TABLE_DIMS to "Profile Look Table Dims", + PROFILE_LOOK_TABLE_DATA to "Profile Look Table Data", + OPCODE_LIST_1 to "Opcode List 1", + OPCODE_LIST_2 to "Opcode List 2", + OPCODE_LIST_3 to "Opcode List 3", + NOISE_PROFILE to "Noise Profile", + ORIGINAL_DEFAULT_FINAL_SIZE to "Original Default Final Size", + ORIGINAL_BEST_QUALITY_FINAL_SIZE to "Original Best Quality Final Size", + ORIGINAL_DEFAULT_CROP_SIZE to "Original Default Crop Size", + PROFILE_HUE_SAT_MAP_ENCODING to "Profile Hue Sat Map Encoding", + PROFILE_LOOK_TABLE_ENCODING to "Profile Look Table Encoding", + BASELINE_EXPOSURE_OFFSET to "Baseline Exposure Offset", + DEFAULT_BLACK_RENDER to "Default Black Render", + NEW_RAW_IMAGE_DIGEST to "New Raw Image Digest", + RAW_TO_PREVIEW_GAIN to "Raw To Preview Gain", + DEFAULT_USER_CROP to "Default User Crop", + DEPTH_FORMAT to "Depth Format", + DEPTH_NEAR to "Depth Near", + DEPTH_FAR to "Depth Far", + DEPTH_UNITS to "Depth Units", + DEPTH_MEASURE_TYPE to "Depth Measure Type", + ENHANCE_PARAMS to "Enhance Params", + PROFILE_GAIN_TABLE_MAP to "Profile Gain Table Map", + SEMANTIC_NAME to "Semantic Name", + SEMANTIC_INSTANCE_ID to "Semantic Instance ID", + CALIBRATION_ILLUMINANT_3 to "Calibration Illuminant 3", + CAMERA_CALIBRATION_3 to "Camera Calibration 3", + COLOR_MATRIX_3 to "Color Matrix 3", + FORWARD_MATRIX_3 to "Forward Matrix 3", + ILLUMINANT_DATA_1 to "Illuminant Data 1", + ILLUMINANT_DATA_2 to "Illuminant Data 2", + ILLUMINANT_DATA_3 to "Illuminant Data 3", + MASK_SUB_AREA to "Mask Sub Area", + PROFILE_HUE_SAT_MAP_DATA_3 to "Profile Hue Sat Map Data 3", + REDUCTION_MATRIX_3 to "Reduction Matrix 3", + RGB_TABLES to "RGB Tables", ) + + val tags = tagNameMap.keys } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt index 291035e71..34043d3bb 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/ExifTags.kt @@ -49,46 +49,6 @@ object ExifTags { // obsoleted by the 6.0 ExtraSamples (338) private const val TAG_MATTEING = 0x80e3 - /* - GeoTIFF - */ - - // ModelPixelScaleTag (optional) - // Tag = 33550 (830E.H) - // Type = DOUBLE - // Count = 3 - const val TAG_MODEL_PIXEL_SCALE = 0x830e - - // ModelTiepointTag (conditional) - // Tag = 33922 (8482.H) - // Type = DOUBLE - // Count = 6*K, K = number of tiepoints - const val TAG_MODEL_TIEPOINT = 0x8482 - - // ModelTransformationTag (conditional) - // Tag = 34264 (85D8.H) - // Type = DOUBLE - // Count = 16 - const val TAG_MODEL_TRANSFORMATION = 0x85d8 - - // GeoKeyDirectoryTag (mandatory) - // Tag = 34735 (87AF.H) - // Type = UNSIGNED SHORT - // Count = variable, >= 4 - const val TAG_GEO_KEY_DIRECTORY = 0x87af - - // GeoDoubleParamsTag (optional) - // Tag = 34736 (87BO.H) - // Type = DOUBLE - // Count = variable - private const val TAG_GEO_DOUBLE_PARAMS = 0x87b0 - - // GeoAsciiParamsTag (optional) - // Tag = 34737 (87B1.H) - // Type = ASCII - // Count = variable - private const val TAG_GEO_ASCII_PARAMS = 0x87b1 - /* Photoshop https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ @@ -100,15 +60,6 @@ object ExifTags { // Type = UNDEFINED private const val TAG_IMAGE_SOURCE_DATA = 0x935c - private val geotiffTags = listOf( - TAG_GEO_ASCII_PARAMS, - TAG_GEO_DOUBLE_PARAMS, - TAG_GEO_KEY_DIRECTORY, - TAG_MODEL_PIXEL_SCALE, - TAG_MODEL_TIEPOINT, - TAG_MODEL_TRANSFORMATION, - ) - private val tagNameMap = hashMapOf( TAG_X_POSITION to "X Position", TAG_Y_POSITION to "Y Position", @@ -118,20 +69,16 @@ object ExifTags { TAG_RATING_PERCENT to "Rating Percent", // SGI TAG_MATTEING to "Matteing", - // GeoTIFF - TAG_GEO_ASCII_PARAMS to "Geo Ascii Params", - TAG_GEO_DOUBLE_PARAMS to "Geo Double Params", - TAG_GEO_KEY_DIRECTORY to "Geo Key Directory", - TAG_MODEL_PIXEL_SCALE to "Model Pixel Scale", - TAG_MODEL_TIEPOINT to "Model Tiepoint", - TAG_MODEL_TRANSFORMATION to "Model Transformation", // Photoshop TAG_IMAGE_SOURCE_DATA to "Image Source Data", ).apply { putAll(DngTags.tagNameMap) + putAll(GeoTiffTags.tagNameMap) } - fun isGeoTiffTag(tag: Int) = geotiffTags.contains(tag) + fun isDngTag(tag: Int) = DngTags.tags.contains(tag) + + fun isGeoTiffTag(tag: Int) = GeoTiffTags.tags.contains(tag) fun getTagName(tag: Int): String? { return tagNameMap[tag] diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt new file mode 100644 index 000000000..208165fc3 --- /dev/null +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/GeoTiffTags.kt @@ -0,0 +1,50 @@ +package deckers.thibault.aves.metadata + +object GeoTiffTags { + // ModelPixelScaleTag (optional) + // Tag = 33550 (830E.H) + // Type = DOUBLE + // Count = 3 + const val TAG_MODEL_PIXEL_SCALE = 0x830e + + // ModelTiepointTag (conditional) + // Tag = 33922 (8482.H) + // Type = DOUBLE + // Count = 6*K, K = number of tiepoints + const val TAG_MODEL_TIEPOINT = 0x8482 + + // ModelTransformationTag (conditional) + // Tag = 34264 (85D8.H) + // Type = DOUBLE + // Count = 16 + const val TAG_MODEL_TRANSFORMATION = 0x85d8 + + // GeoKeyDirectoryTag (mandatory) + // Tag = 34735 (87AF.H) + // Type = UNSIGNED SHORT + // Count = variable, >= 4 + const val TAG_GEO_KEY_DIRECTORY = 0x87af + + // GeoDoubleParamsTag (optional) + // Tag = 34736 (87BO.H) + // Type = DOUBLE + // Count = variable + private const val TAG_GEO_DOUBLE_PARAMS = 0x87b0 + + // GeoAsciiParamsTag (optional) + // Tag = 34737 (87B1.H) + // Type = ASCII + // Count = variable + private const val TAG_GEO_ASCII_PARAMS = 0x87b1 + + val tagNameMap = hashMapOf( + TAG_GEO_ASCII_PARAMS to "Geo Ascii Params", + TAG_GEO_DOUBLE_PARAMS to "Geo Double Params", + TAG_GEO_KEY_DIRECTORY to "Geo Key Directory", + TAG_MODEL_PIXEL_SCALE to "Model Pixel Scale", + TAG_MODEL_TIEPOINT to "Model Tiepoint", + TAG_MODEL_TRANSFORMATION to "Model Transformation", + ) + + val tags = tagNameMap.keys +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt index 61b17d9c9..03090ea4d 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt @@ -69,13 +69,13 @@ object MetadataExtractorHelper { - If the ModelPixelScaleTag is included in an IFD, then a ModelTiepointTag SHALL also be included. */ fun ExifDirectoryBase.isGeoTiff(): Boolean { - if (!this.containsTag(ExifTags.TAG_GEO_KEY_DIRECTORY)) return false + if (!this.containsTag(GeoTiffTags.TAG_GEO_KEY_DIRECTORY)) return false - val modelTiepoint = this.containsTag(ExifTags.TAG_MODEL_TIEPOINT) - val modelTransformation = this.containsTag(ExifTags.TAG_MODEL_TRANSFORMATION) + val modelTiepoint = this.containsTag(GeoTiffTags.TAG_MODEL_TIEPOINT) + val modelTransformation = this.containsTag(GeoTiffTags.TAG_MODEL_TRANSFORMATION) if (!modelTiepoint && !modelTransformation) return false - val modelPixelScale = this.containsTag(ExifTags.TAG_MODEL_PIXEL_SCALE) + val modelPixelScale = this.containsTag(GeoTiffTags.TAG_MODEL_PIXEL_SCALE) if ((modelTransformation && modelPixelScale) || (modelPixelScale && !modelTiepoint)) return false return true diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt index 15d64b552..fa810a2b4 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt @@ -26,7 +26,7 @@ object MimeTypes { private const val CR2 = "image/x-canon-cr2" private const val CRW = "image/x-canon-crw" private const val DCR = "image/x-kodak-dcr" - private const val DNG = "image/x-adobe-dng" + const val DNG = "image/x-adobe-dng" private const val ERF = "image/x-epson-erf" private const val K25 = "image/x-kodak-k25" private const val KDC = "image/x-kodak-kdc"