From c060a45edf6488eea4ade06fddd99505fa0489a4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 14 Jan 2017 19:14:44 +0100 Subject: [PATCH] properly open some special attachments, like k9 mail ones --- app/build.gradle | 1 + .../gallery/extensions/context.kt | 2 +- .../gallery/fragments/PhotoFragment.kt | 61 ++++++++++++++++++- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 883e2ea9e..ea032b188 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,7 @@ dependencies { compile 'com.bignerdranch.android:recyclerview-multiselect:0.2' compile 'com.google.code.gson:gson:2.8.0' compile 'com.github.chrisbanes:PhotoView:1.3.1' + compile 'it.sephiroth.android.exif:library:1.0.1' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/context.kt index 0dfc9826f..f110d95a5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/context.kt @@ -22,7 +22,7 @@ fun Context.getRealPathFromURI(uri: Uri): String? { val index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) return cursor.getString(index) } - } catch (e: IllegalArgumentException) { + } catch (e: Exception) { } finally { cursor?.close() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt index 31b340227..c495d4965 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -2,6 +2,8 @@ package com.simplemobiletools.gallery.fragments import android.content.res.Configuration import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Matrix import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -18,9 +20,13 @@ import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.extensions.getRealPathFromURI import com.simplemobiletools.gallery.helpers.MEDIUM import com.simplemobiletools.gallery.models.Medium +import it.sephiroth.android.library.exif2.ExifInterface import kotlinx.android.synthetic.main.pager_photo_item.view.* import uk.co.senab.photoview.PhotoView import uk.co.senab.photoview.PhotoViewAttacher +import java.io.File +import java.io.FileOutputStream +import java.io.IOException class PhotoFragment : ViewPagerFragment() { lateinit var medium: Medium @@ -31,9 +37,42 @@ class PhotoFragment : ViewPagerFragment() { val view = inflater.inflate(R.layout.pager_photo_item, container, false) medium = arguments.getSerializable(MEDIUM) as Medium - if (medium.path.startsWith("content://")) + + if (medium.path.startsWith("content://")) { + val originalPath = medium.path medium.path = context.getRealPathFromURI(Uri.parse(medium.path)) ?: "" + if (medium.path.isEmpty()) { + var inputStream = context.contentResolver.openInputStream(Uri.parse(originalPath)) + val exif = ExifInterface() + exif.readExif(inputStream, ExifInterface.Options.OPTION_ALL) + val tag = exif.getTag(ExifInterface.TAG_ORIENTATION) + val orientation = tag?.getValueAsInt(-1) ?: -1 + + inputStream = context.contentResolver.openInputStream(Uri.parse(originalPath)) + val original = BitmapFactory.decodeStream(inputStream) + val rotated = rotateViaMatrix(original, orientation) + exif.setTagValue(ExifInterface.TAG_ORIENTATION, 1) + exif.removeCompressedThumbnail() + + val uri = Uri.parse(originalPath) + val file = File(context.cacheDir, uri.lastPathSegment) + var out: FileOutputStream? = null + try { + out = FileOutputStream(file) + rotated.compress(Bitmap.CompressFormat.JPEG, 100, out) + } catch (e: Exception) { + } finally { + try { + out?.close() + } catch (e: IOException) { + } + } + exif.writeExif(rotated, file.absolutePath, 100) + medium.path = file.absolutePath + } + } + subsamplingView = view.photo_view.apply { setOnClickListener({ photoClicked() }) } glideView = view.glide_view.apply { setOnPhotoTapListener(object : PhotoViewAttacher.OnPhotoTapListener { @@ -55,6 +94,26 @@ class PhotoFragment : ViewPagerFragment() { return view } + private fun degreesForRotation(orientation: Int): Int { + return when (orientation) { + 8 -> 270 + 3 -> 180 + 6 -> 90 + else -> 0 + } + } + + private fun rotateViaMatrix(original: Bitmap, orientation: Int): Bitmap { + val degrees = degreesForRotation(orientation).toFloat() + return if (degrees == 0f) { + original + } else { + val matrix = Matrix() + matrix.setRotate(degrees) + Bitmap.createBitmap(original, 0, 0, original.width, original.height, matrix, true) + } + } + private fun loadImage(medium: Medium) { if (medium.isGif()) { Glide.with(this)