diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 10b6c4d..2cc3b5a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="oppen.tva">
+
+ imageState = state
+ val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
+ intent.addCategory(Intent.CATEGORY_OPENABLE)
+ intent.type = "image/*"
+ intent.putExtra(Intent.EXTRA_TITLE, File(state.uri.path).name)
+ startActivityForResult(intent, CREATE_IMAGE_FILE_REQ)
+ }
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ if(resultCode == RESULT_OK && requestCode == CREATE_IMAGE_FILE_REQ){
+ if(imageState == null) return
+ data?.data?.let{ uri ->
+ val cachedFile = File(imageState!!.cacheUri.path ?: "")
+ contentResolver.openFileDescriptor(uri, "w")?.use { fileDescriptor ->
+ FileOutputStream(fileDescriptor.fileDescriptor).use { destOutput ->
+ val sourceChannel = FileInputStream(cachedFile).channel
+ val destChannel = destOutput.channel
+ sourceChannel.transferTo(0, sourceChannel.size(), destChannel)
+ sourceChannel.close()
+ destChannel.close()
+ }
+ }
+ }
+ }
}
private fun loadingView(visible: Boolean) = runOnUiThread {
diff --git a/app/src/main/java/oppen/tva/ui/content_image/ImageDialog.kt b/app/src/main/java/oppen/tva/ui/content_image/ImageDialog.kt
index 2fec1fc..1d1427f 100644
--- a/app/src/main/java/oppen/tva/ui/content_image/ImageDialog.kt
+++ b/app/src/main/java/oppen/tva/ui/content_image/ImageDialog.kt
@@ -1,15 +1,20 @@
package oppen.tva.ui.content_image
import android.content.Context
+import android.graphics.Bitmap
+import android.net.Uri
+import android.view.MenuInflater
import android.view.View
import androidx.appcompat.app.AppCompatDialog
+import androidx.appcompat.widget.PopupMenu
import kotlinx.android.synthetic.main.dialog_content_image.view.*
import oppen.tva.R
import oppen.tva.io.TvaState
+import java.io.FileOutputStream
object ImageDialog {
- fun show(context: Context, state: TvaState.ResponseImage){
+ fun show(context: Context, state: TvaState.ResponseImage, onDownloadRequest: (state: TvaState.ResponseImage) -> Unit){
val dialog = AppCompatDialog(context, R.style.AppTheme)
val view = View.inflate(context, R.layout.dialog_content_image, null)
@@ -21,6 +26,37 @@ object ImageDialog {
dialog.dismiss()
}
+ view.image_overflow.setOnClickListener {
+ val overflowMenu = PopupMenu(context, view.image_overflow)
+ val inflater: MenuInflater = overflowMenu.menuInflater
+ inflater.inflate(R.menu.image_overflow_menu, overflowMenu.menu)
+ overflowMenu.setOnMenuItemClickListener { menuItem ->
+ if(menuItem.itemId == R.id.image_overflow_save_image){
+ onDownloadRequest(state)
+ }
+ true
+ }
+
+ overflowMenu.show()
+ }
+
dialog.show()
}
+
+ /**
+ *
+ * Save bitmap using Storage Access Framework Uri
+ * @param bitmap
+ * @param uri - must be a SAF Uri
+ * @param onComplete
+ */
+ fun publicExport(context: Context, bitmap: Bitmap?, uri: Uri, onComplete: (uri: Uri) -> Unit) {
+ context.contentResolver.openFileDescriptor(uri, "w")?.use {
+ FileOutputStream(it.fileDescriptor).use { outputStream ->
+ bitmap?.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)
+ }
+ bitmap?.recycle()
+ onComplete(uri)
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_content_image.xml b/app/src/main/res/layout/dialog_content_image.xml
index 2e1fcfe..f4f1a7d 100644
--- a/app/src/main/res/layout/dialog_content_image.xml
+++ b/app/src/main/res/layout/dialog_content_image.xml
@@ -29,8 +29,7 @@
android:src="@drawable/vector_close" />
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0b87e1b..8e997a1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -24,4 +24,5 @@
Reload
Submit
Search
+ Save Image
\ No newline at end of file