diff --git a/app/src/main/java/com/simplemobiletools/gallery/Utils.kt b/app/src/main/java/com/simplemobiletools/gallery/Utils.kt index 996431483..1bc42c651 100644 --- a/app/src/main/java/com/simplemobiletools/gallery/Utils.kt +++ b/app/src/main/java/com/simplemobiletools/gallery/Utils.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.gallery import android.Manifest +import android.annotation.TargetApi import android.app.Activity import android.content.Context import android.content.Intent @@ -125,7 +126,7 @@ class Utils { View.SYSTEM_UI_FLAG_IMMERSIVE } - fun getRealPathFromURI(context: Context, uri: Uri): String { + fun getRealPathFromURI(context: Context, uri: Uri): String? { var cursor: Cursor? = null try { val projection = arrayOf(MediaStore.Images.Media.DATA) @@ -157,5 +158,14 @@ class Utils { } return document } + + @TargetApi(Build.VERSION_CODES.KITKAT) + fun saveTreeUri(context: Context, resultData: Intent) { + val treeUri = resultData.data + Config.newInstance(context).treeUri = treeUri.toString() + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + context.contentResolver.takePersistableUriPermission(treeUri, takeFlags) + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 711375db6..40a9a7b8e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.gallery.activities import android.app.Activity +import android.content.Intent import android.graphics.Bitmap import android.media.MediaScannerConnection import android.net.Uri @@ -8,14 +9,18 @@ import android.os.Bundle import android.util.Log import android.view.Menu import android.view.MenuItem +import com.simplemobiletools.gallery.Config +import com.simplemobiletools.gallery.Constants import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.Utils +import com.simplemobiletools.gallery.dialogs.WritePermissionDialog import com.simplemobiletools.gallery.extensions.toast import com.theartofdev.edmodo.cropper.CropImageView import kotlinx.android.synthetic.main.activity_edit.* import java.io.File import java.io.FileOutputStream import java.io.IOException +import java.io.OutputStream class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener { val TAG: String = EditActivity::class.java.simpleName @@ -93,9 +98,25 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener return } - var out: FileOutputStream? = null + var out: OutputStream? = null try { - out = FileOutputStream(file) + if (Utils.needsStupidWritePermissions(this, path)) { + if (!file.canWrite() && Config.newInstance(this).treeUri.isEmpty()) { + WritePermissionDialog(this, object : WritePermissionDialog.OnWritePermissionListener { + override fun onConfirmed() { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + startActivityForResult(intent, Constants.OPEN_DOCUMENT_TREE) + } + }) + return + } + + val document = Utils.getFileDocument(this, path) + out = contentResolver.openOutputStream(document.uri) + } else { + out = FileOutputStream(file) + } + bitmap.compress(getCompressionFormat(file), 90, out) setResult(Activity.RESULT_OK, intent) } catch (e: Exception) { @@ -116,6 +137,13 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener }) } + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == Constants.OPEN_DOCUMENT_TREE && resultCode == Activity.RESULT_OK && resultData != null) { + Utils.saveTreeUri(this, resultData) + } + } + private fun getCompressionFormat(file: File): Bitmap.CompressFormat { return when (file.extension.toLowerCase()) { "png" -> Bitmap.CompressFormat.PNG