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