1
0
mirror of https://gitlab.shinice.net/pixeldroid/PixelDroid synced 2025-02-06 10:23:29 +01:00

Restore EXIF rotation after stripping EXIF metadata

This commit is contained in:
Matthieu 2022-10-25 12:50:32 +02:00
parent a339fdab7d
commit de602b0124
2 changed files with 31 additions and 14 deletions

View File

@ -1,5 +1,6 @@
package org.pixeldroid.app.postCreation package org.pixeldroid.app.postCreation
import android.R.attr.orientation
import android.app.Application import android.app.Application
import android.content.ClipData import android.content.ClipData
import android.content.Intent import android.content.Intent
@ -10,10 +11,12 @@ import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.net.toFile import androidx.core.net.toFile
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.exifinterface.media.ExifInterface
import androidx.lifecycle.* import androidx.lifecycle.*
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.arthenica.ffmpegkit.FFmpegKit import com.arthenica.ffmpegkit.FFmpegKit
import com.jarsilio.android.scrambler.exceptions.UnsupportedFileFormatException import com.jarsilio.android.scrambler.exceptions.UnsupportedFileFormatException
import com.jarsilio.android.scrambler.stripMetadata
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
@ -37,9 +40,10 @@ import retrofit2.HttpException
import java.io.File import java.io.File
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.io.IOException import java.io.IOException
import java.net.URI
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.ceil import kotlin.math.ceil
import com.jarsilio.android.scrambler.stripMetadata
// Models the UI state for the PostCreationActivity // Models the UI state for the PostCreationActivity
data class PostCreationActivityUiState( data class PostCreationActivityUiState(
@ -255,22 +259,24 @@ class PostCreationViewModel(application: Application, clipdata: ClipData? = null
val strippedImage = File.createTempFile("temp_img", ".$extension", getApplication<PixelDroidApplication>().cacheDir) val strippedImage = File.createTempFile("temp_img", ".$extension", getApplication<PixelDroidApplication>().cacheDir)
val imageUri = data.imageUri
val (strippedOrNot, size) = try { val (strippedOrNot, size) = try {
stripMetadata(data.imageUri, strippedImage, getApplication<PixelDroidApplication>().contentResolver) val orientation = ExifInterface(getApplication<PixelDroidApplication>().contentResolver.openInputStream(imageUri)!!).getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
stripMetadata(imageUri, strippedImage, getApplication<PixelDroidApplication>().contentResolver)
// Restore EXIF orientation
val exifInterface = ExifInterface(strippedImage)
exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, orientation.toString())
exifInterface.saveAttributes()
Pair(strippedImage.inputStream(), strippedImage.length()) Pair(strippedImage.inputStream(), strippedImage.length())
} catch (e: FileNotFoundException){ } catch (e: UnsupportedFileFormatException){
strippedImage.delete()
_uiState.update { currentUiState ->
currentUiState.copy(
userMessage = getApplication<PixelDroidApplication>().getString(R.string.file_not_found,
data.imageUri)
)
}
return
} catch (e: UnsupportedFileFormatException){
strippedImage.delete() strippedImage.delete()
if(imageUri != data.imageUri) File(URI(imageUri.toString())).delete()
val imageInputStream = try { val imageInputStream = try {
getApplication<PixelDroidApplication>().contentResolver.openInputStream(data.imageUri)!! getApplication<PixelDroidApplication>().contentResolver.openInputStream(imageUri)!!
} catch (e: FileNotFoundException){ } catch (e: FileNotFoundException){
_uiState.update { currentUiState -> _uiState.update { currentUiState ->
currentUiState.copy( currentUiState.copy(
@ -281,6 +287,16 @@ class PostCreationViewModel(application: Application, clipdata: ClipData? = null
return return
} }
Pair(imageInputStream, data.size) Pair(imageInputStream, data.size)
} catch (e: IOException){
strippedImage.delete()
if(imageUri != data.imageUri) File(URI(imageUri.toString())).delete()
_uiState.update { currentUiState ->
currentUiState.copy(
userMessage = getApplication<PixelDroidApplication>().getString(R.string.file_not_found,
data.imageUri)
)
}
return
} }
val type = data.imageUri.getMimeType(getApplication<PixelDroidApplication>().contentResolver) val type = data.imageUri.getMimeType(getApplication<PixelDroidApplication>().contentResolver)
@ -327,12 +343,14 @@ class PostCreationViewModel(application: Application, clipdata: ClipData? = null
) )
} }
strippedImage.delete() strippedImage.delete()
if(imageUri != data.imageUri) File(URI(imageUri.toString())).delete()
e.printStackTrace() e.printStackTrace()
postSub?.dispose() postSub?.dispose()
sub.dispose() sub.dispose()
}, },
{ {
strippedImage.delete() strippedImage.delete()
if(imageUri != data.imageUri) File(URI(imageUri.toString())).delete()
data.progress = 100 data.progress = 100
if (getPhotoData().value!!.all { it.progress == 100 && it.uploadId != null }) { if (getPhotoData().value!!.all { it.progress == 100 && it.uploadId != null }) {
_uiState.update { currentUiState -> _uiState.update { currentUiState ->

View File

@ -15,7 +15,6 @@ import android.view.WindowManager
import android.webkit.MimeTypeMap import android.webkit.MimeTypeMap
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.annotation.FloatRange
import androidx.annotation.StyleRes import androidx.annotation.StyleRes
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent