save images to downloads

This commit is contained in:
Öppen 2020-08-21 16:46:08 +01:00
parent eb0f12aa8c
commit f5176d632e
6 changed files with 81 additions and 6 deletions

View File

@ -3,6 +3,7 @@
package="oppen.tva">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".Tva"

View File

@ -17,10 +17,10 @@ import oppen.hideKeyboard
import oppen.tva.R
import oppen.tva.Tva
import oppen.tva.databinding.ActivityTvaBinding
import oppen.tva.io.gemini.GeminiResponse
import oppen.tva.io.gemini.RuntimeCache
import oppen.tva.io.TvaState
import oppen.tva.io.gemini.Datasource
import oppen.tva.io.gemini.GeminiResponse
import oppen.tva.io.gemini.RuntimeCache
import oppen.tva.io.history.tabs.TabHistoryInterface
import oppen.tva.io.history.uris.HistoryInterface
import oppen.tva.ui.content_image.ImageDialog
@ -33,8 +33,13 @@ import oppen.tva.ui.modals_menus.set_home.SetHomeDialog
import oppen.tva.ui.modals_menus.tabs.NewTabPopup
import oppen.tva.ui.modals_menus.tabs.TabsDialog
import oppen.visibleRetainingSpace
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.net.URLEncoder
const val CREATE_IMAGE_FILE_REQ = 628
class TvaActivity : AppCompatActivity() {
@ -208,9 +213,37 @@ class TvaActivity : AppCompatActivity() {
TextDialog.show(this, state)
}
var imageState: TvaState.ResponseImage? = null
private fun renderImage(state: TvaState.ResponseImage) = runOnUiThread{
loadingView(false)
ImageDialog.show(this, state)
ImageDialog.show(this, state){ state ->
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 {

View File

@ -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)
}
}
}

View File

@ -29,8 +29,7 @@
android:src="@drawable/vector_close" />
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/history_overflow"
android:visibility="gone"
android:id="@+id/image_overflow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/image_overflow_save_image"
android:title="@string/save_image" />
</menu>

View File

@ -24,4 +24,5 @@
<string name="reload">Reload</string>
<string name="submit">Submit</string>
<string name="search">Search</string>
<string name="save_image">Save Image</string>
</resources>