mirror of https://git.sr.ht/~oppen/ariane
save images to downloads
This commit is contained in:
parent
eb0f12aa8c
commit
f5176d632e
|
@ -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"
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
Loading…
Reference in New Issue