updating Commons to 3.17.23, use image rotating functions from there

This commit is contained in:
tibbi 2018-04-01 15:24:56 +02:00
parent 543f68e18d
commit 6f361a7296
8 changed files with 33 additions and 85 deletions

View File

@ -46,7 +46,7 @@ ext {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:3.17.16' implementation 'com.simplemobiletools:commons:3.17.23'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.6.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.6.0'
implementation 'com.android.support:multidex:1.0.3' implementation 'com.android.support:multidex:1.0.3'
implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1'

View File

@ -65,7 +65,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private var mCurrAsyncTask: GetDirectoriesAsynctask? = null private var mCurrAsyncTask: GetDirectoriesAsynctask? = null
private var mZoomListener: MyRecyclerView.MyZoomListener? = null private var mZoomListener: MyRecyclerView.MyZoomListener? = null
private var mStoredUseEnglish = false
private var mStoredAnimateGifs = true private var mStoredAnimateGifs = true
private var mStoredCropThumbnails = true private var mStoredCropThumbnails = true
private var mStoredScrollHorizontally = true private var mStoredScrollHorizontally = true
@ -117,10 +116,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
config.isThirdPartyIntent = false config.isThirdPartyIntent = false
if (mStoredUseEnglish != config.useEnglish) {
restartActivity()
return
}
if (mStoredAnimateGifs != config.animateGifs) { if (mStoredAnimateGifs != config.animateGifs) {
getRecyclerAdapter()?.updateAnimateGifs(config.animateGifs) getRecyclerAdapter()?.updateAnimateGifs(config.animateGifs)
@ -236,7 +231,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener {
private fun storeStateVariables() { private fun storeStateVariables() {
config.apply { config.apply {
mStoredUseEnglish = useEnglish
mStoredAnimateGifs = animateGifs mStoredAnimateGifs = animateGifs
mStoredCropThumbnails = cropThumbnails mStoredCropThumbnails = cropThumbnails
mStoredScrollHorizontally = scrollHorizontally mStoredScrollHorizontally = scrollHorizontally

View File

@ -63,7 +63,6 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
private var mZoomListener: MyRecyclerView.MyZoomListener? = null private var mZoomListener: MyRecyclerView.MyZoomListener? = null
private var mSearchMenuItem: MenuItem? = null private var mSearchMenuItem: MenuItem? = null
private var mStoredUseEnglish = false
private var mStoredAnimateGifs = true private var mStoredAnimateGifs = true
private var mStoredCropThumbnails = true private var mStoredCropThumbnails = true
private var mStoredScrollHorizontally = true private var mStoredScrollHorizontally = true
@ -110,11 +109,6 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (mStoredUseEnglish != config.useEnglish) {
restartActivity()
return
}
if (mStoredAnimateGifs != config.animateGifs) { if (mStoredAnimateGifs != config.animateGifs) {
getMediaAdapter()?.updateAnimateGifs(config.animateGifs) getMediaAdapter()?.updateAnimateGifs(config.animateGifs)
} }
@ -232,7 +226,6 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener {
private fun storeStateVariables() { private fun storeStateVariables() {
config.apply { config.apply {
mStoredUseEnglish = useEnglish
mStoredAnimateGifs = animateGifs mStoredAnimateGifs = animateGifs
mStoredCropThumbnails = cropThumbnails mStoredCropThumbnails = cropThumbnails
mStoredScrollHorizontally = scrollHorizontally mStoredScrollHorizontally = scrollHorizontally

View File

@ -6,7 +6,10 @@ import android.os.Bundle
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.dialogs.SecurityDialog import com.simplemobiletools.commons.dialogs.SecurityDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.handleHiddenFolderPasswordProtection
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT
import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS import com.simplemobiletools.commons.helpers.SHOW_ALL_TABS
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
@ -89,7 +92,7 @@ class SettingsActivity : SimpleActivity() {
settings_use_english_holder.setOnClickListener { settings_use_english_holder.setOnClickListener {
settings_use_english.toggle() settings_use_english.toggle()
config.useEnglish = settings_use_english.isChecked config.useEnglish = settings_use_english.isChecked
useEnglishToggled() System.exit(0)
} }
} }

View File

@ -56,7 +56,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mShowAll = false private var mShowAll = false
private var mIsSlideshowActive = false private var mIsSlideshowActive = false
private var mSkipConfirmationDialog = false private var mSkipConfirmationDialog = false
private var mRotationDegrees = 0f private var mRotationDegrees = 0
private var mPrevHashcode = 0 private var mPrevHashcode = 0
private var mSlideshowHandler = Handler() private var mSlideshowHandler = Handler()
@ -66,7 +66,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private var mAreSlideShowMediaVisible = false private var mAreSlideShowMediaVisible = false
private var mIsOrientationLocked = false private var mIsOrientationLocked = false
private var mStoredUseEnglish = false
private var mStoredReplaceZoomableImages = false private var mStoredReplaceZoomableImages = false
private var mMediaFiles = ArrayList<Medium>() private var mMediaFiles = ArrayList<Medium>()
@ -101,11 +100,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
return return
} }
if (mStoredUseEnglish != config.useEnglish) {
restartActivity()
return
}
if (mStoredReplaceZoomableImages != config.replaceZoomableImages) { if (mStoredReplaceZoomableImages != config.replaceZoomableImages) {
mPrevHashcode = 0 mPrevHashcode = 0
refreshViewPager() refreshViewPager()
@ -256,13 +250,13 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
findItem(R.id.menu_share_1).isVisible = !config.replaceShare findItem(R.id.menu_share_1).isVisible = !config.replaceShare
findItem(R.id.menu_share_2).isVisible = config.replaceShare findItem(R.id.menu_share_2).isVisible = config.replaceShare
findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() findItem(R.id.menu_rotate).isVisible = currentMedium.isImage()
findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0f findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0
findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.') findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.')
findItem(R.id.menu_unhide).isVisible = currentMedium.name.startsWith('.') findItem(R.id.menu_unhide).isVisible = currentMedium.name.startsWith('.')
findItem(R.id.menu_lock_orientation).isVisible = mRotationDegrees == 0f findItem(R.id.menu_lock_orientation).isVisible = mRotationDegrees == 0
findItem(R.id.menu_lock_orientation).title = getString(if (mIsOrientationLocked) R.string.unlock_orientation else R.string.lock_orientation) findItem(R.id.menu_lock_orientation).title = getString(if (mIsOrientationLocked) R.string.unlock_orientation else R.string.lock_orientation)
findItem(R.id.menu_rotate).setShowAsAction( findItem(R.id.menu_rotate).setShowAsAction(
if (mRotationDegrees != 0f) { if (mRotationDegrees != 0) {
MenuItem.SHOW_AS_ACTION_ALWAYS MenuItem.SHOW_AS_ACTION_ALWAYS
} else { } else {
MenuItem.SHOW_AS_ACTION_IF_ROOM MenuItem.SHOW_AS_ACTION_IF_ROOM
@ -304,7 +298,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun storeStateVariables() { private fun storeStateVariables() {
config.apply { config.apply {
mStoredUseEnglish = useEnglish
mStoredReplaceZoomableImages = replaceZoomableImages mStoredReplaceZoomableImages = replaceZoomableImages
} }
} }
@ -543,7 +536,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
val oldLastModified = getCurrentFile().lastModified() val oldLastModified = getCurrentFile().lastModified()
if (oldPath.isJpg()) { if (oldPath.isJpg()) {
copyFile(getCurrentFile(), tmpFile) copyFile(getCurrentFile(), tmpFile)
saveExifRotation(ExifInterface(tmpFile.absolutePath)) saveExifRotation(ExifInterface(tmpFile.absolutePath), mRotationDegrees)
} else { } else {
val bitmap = BitmapFactory.decodeFile(oldPath) val bitmap = BitmapFactory.decodeFile(oldPath)
saveFile(tmpFile, bitmap, it as FileOutputStream) saveFile(tmpFile, bitmap, it as FileOutputStream)
@ -563,7 +556,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
it.flush() it.flush()
it.close() it.close()
mRotationDegrees = 0f mRotationDegrees = 0
invalidateOptionsMenu() invalidateOptionsMenu()
// we cannot refresh a specific image in Glide Cache, so just clear it all // we cannot refresh a specific image in Glide Cache, so just clear it all
@ -584,29 +577,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
@TargetApi(Build.VERSION_CODES.N) @TargetApi(Build.VERSION_CODES.N)
private fun tryRotateByExif(path: String): Boolean { private fun tryRotateByExif(path: String): Boolean {
try { return if (saveImageRotation(path, mRotationDegrees)) {
if (!isPathOnSD(path)) { mRotationDegrees = 0
saveExifRotation(ExifInterface(path)) invalidateOptionsMenu()
mRotationDegrees = 0f toast(R.string.file_saved)
invalidateOptionsMenu() true
toast(R.string.file_saved) } else {
return true false
} else if (isNougatPlus()) {
val documentFile = getSomeDocumentFile(path)
if (documentFile != null) {
val parcelFileDescriptor = contentResolver.openFileDescriptor(documentFile.uri, "rw")
val fileDescriptor = parcelFileDescriptor.fileDescriptor
saveExifRotation(ExifInterface(fileDescriptor))
mRotationDegrees = 0f
invalidateOptionsMenu()
toast(R.string.file_saved)
return true
}
}
} catch (e: Exception) {
showErrorToast(e)
} }
return false
} }
private fun copyFile(source: File, destination: File) { private fun copyFile(source: File, destination: File) {
@ -625,32 +603,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
private fun saveFile(file: File, bitmap: Bitmap, out: FileOutputStream) { private fun saveFile(file: File, bitmap: Bitmap, out: FileOutputStream) {
val matrix = Matrix() val matrix = Matrix()
matrix.postRotate(mRotationDegrees) matrix.postRotate(mRotationDegrees.toFloat())
val bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true) val bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
bmp.compress(file.absolutePath.getCompressionFormat(), 90, out) bmp.compress(file.absolutePath.getCompressionFormat(), 90, out)
} }
private fun saveExifRotation(exif: ExifInterface) {
val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
val orientationDegrees = (degreesForRotation(orientation) + mRotationDegrees) % 360
exif.setAttribute(ExifInterface.TAG_ORIENTATION, rotationFromDegrees(orientationDegrees))
exif.saveAttributes()
}
private fun degreesForRotation(orientation: Int) = when (orientation) {
ExifInterface.ORIENTATION_ROTATE_270 -> 270f
ExifInterface.ORIENTATION_ROTATE_180 -> 180f
ExifInterface.ORIENTATION_ROTATE_90 -> 90f
else -> 0f
}
private fun rotationFromDegrees(degrees: Float) = when (degrees) {
270f -> ExifInterface.ORIENTATION_ROTATE_270
180f -> ExifInterface.ORIENTATION_ROTATE_180
90f -> ExifInterface.ORIENTATION_ROTATE_90
else -> ExifInterface.ORIENTATION_NORMAL
}.toString()
private fun isShowHiddenFlagNeeded(): Boolean { private fun isShowHiddenFlagNeeded(): Boolean {
val file = File(mPath) val file = File(mPath)
if (file.isHidden) { if (file.isHidden) {
@ -943,7 +900,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View
if (mPos != position) { if (mPos != position) {
mPos = position mPos = position
updateActionbarTitle() updateActionbarTitle()
mRotationDegrees = 0f mRotationDegrees = 0
supportInvalidateOptionsMenu() supportInvalidateOptionsMenu()
scheduleSwipe() scheduleSwipe()
} }

View File

@ -229,8 +229,8 @@ class PhotoFragment : ViewPagerFragment() {
} }
} }
private fun loadBitmap(degrees: Float = 0f) { private fun loadBitmap(degrees: Int = 0) {
if (degrees == 0f) { if (degrees == 0) {
var targetWidth = if (ViewPagerActivity.screenWidth == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth var targetWidth = if (ViewPagerActivity.screenWidth == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth
var targetHeight = if (ViewPagerActivity.screenHeight == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight var targetHeight = if (ViewPagerActivity.screenHeight == 0) Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight
if (useHalfResolution) { if (useHalfResolution) {
@ -371,7 +371,7 @@ class PhotoFragment : ViewPagerFragment() {
} }
} }
fun rotateImageViewBy(degrees: Float) { fun rotateImageViewBy(degrees: Int) {
view.subsampling_view.beGone() view.subsampling_view.beGone()
loadBitmap(degrees) loadBitmap(degrees)
} }

View File

@ -30,8 +30,9 @@ class GlideDecoder : ImageDecoder {
.override(targetWidth, targetHeight) .override(targetWidth, targetHeight)
val degrees = getRotationDegrees(orientation) val degrees = getRotationDegrees(orientation)
if (degrees != 0f) if (degrees != 0) {
options.transform(GlideRotateTransformation(context, getRotationDegrees(orientation))) options.transform(GlideRotateTransformation(context, getRotationDegrees(orientation)))
}
val drawable = Glide.with(context) val drawable = Glide.with(context)
.load(uri) .load(uri)
@ -61,9 +62,9 @@ class GlideDecoder : ImageDecoder {
// rotating backwards intentionally, as SubsamplingScaleImageView will rotate it properly at displaying // rotating backwards intentionally, as SubsamplingScaleImageView will rotate it properly at displaying
private fun getRotationDegrees(orientation: Int) = when (orientation) { private fun getRotationDegrees(orientation: Int) = when (orientation) {
ExifInterface.ORIENTATION_ROTATE_270 -> 90f ExifInterface.ORIENTATION_ROTATE_270 -> 90
ExifInterface.ORIENTATION_ROTATE_180 -> 180f ExifInterface.ORIENTATION_ROTATE_180 -> 180
ExifInterface.ORIENTATION_ROTATE_90 -> 270f ExifInterface.ORIENTATION_ROTATE_90 -> 270
else -> 0f else -> 0
} }
} }

View File

@ -7,13 +7,13 @@ import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest import java.security.MessageDigest
class GlideRotateTransformation(context: Context, val rotateRotationAngle: Float) : BitmapTransformation(context) { class GlideRotateTransformation(context: Context, val rotateRotationAngle: Int) : BitmapTransformation(context) {
override fun transform(pool: BitmapPool, bitmap: Bitmap, outWidth: Int, outHeight: Int): Bitmap { override fun transform(pool: BitmapPool, bitmap: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
if (rotateRotationAngle % 360 == 0f) if (rotateRotationAngle % 360 == 0)
return bitmap return bitmap
val matrix = Matrix() val matrix = Matrix()
matrix.postRotate(rotateRotationAngle) matrix.postRotate(rotateRotationAngle.toFloat())
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true) return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
} }