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"> package="oppen.tva">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:name=".Tva" android:name=".Tva"

View File

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

View File

@ -1,15 +1,20 @@
package oppen.tva.ui.content_image package oppen.tva.ui.content_image
import android.content.Context import android.content.Context
import android.graphics.Bitmap
import android.net.Uri
import android.view.MenuInflater
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatDialog import androidx.appcompat.app.AppCompatDialog
import androidx.appcompat.widget.PopupMenu
import kotlinx.android.synthetic.main.dialog_content_image.view.* import kotlinx.android.synthetic.main.dialog_content_image.view.*
import oppen.tva.R import oppen.tva.R
import oppen.tva.io.TvaState import oppen.tva.io.TvaState
import java.io.FileOutputStream
object ImageDialog { 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 dialog = AppCompatDialog(context, R.style.AppTheme)
val view = View.inflate(context, R.layout.dialog_content_image, null) val view = View.inflate(context, R.layout.dialog_content_image, null)
@ -21,6 +26,37 @@ object ImageDialog {
dialog.dismiss() 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() 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" /> android:src="@drawable/vector_close" />
<androidx.appcompat.widget.AppCompatImageButton <androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/history_overflow" android:id="@+id/image_overflow"
android:visibility="gone"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" 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="reload">Reload</string>
<string name="submit">Submit</string> <string name="submit">Submit</string>
<string name="search">Search</string> <string name="search">Search</string>
<string name="save_image">Save Image</string>
</resources> </resources>