SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/dialog/DlgFocusPoint.kt

137 lines
3.6 KiB
Kotlin

package jp.juggler.subwaytooter.dialog
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.view.View
import android.view.WindowManager
import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.api.TootApiClient
import jp.juggler.subwaytooter.api.TootApiResult
import jp.juggler.subwaytooter.api.TootTask
import jp.juggler.subwaytooter.api.TootTaskRunner
import jp.juggler.subwaytooter.api.entity.TootAttachment
import jp.juggler.subwaytooter.view.FocusPointView
import jp.juggler.util.LogCategory
import jp.juggler.util.dismissSafe
import jp.juggler.util.showToast
import jp.juggler.util.withCaption
@SuppressLint("InflateParams")
class DlgFocusPoint(val activity : Activity, val attachment : TootAttachment) :
View.OnClickListener {
companion object {
val log = LogCategory("DlgFocusPoint")
}
val dialog : Dialog
val focusPointView : FocusPointView
var bitmap : Bitmap? = null
init {
val viewRoot = activity.layoutInflater.inflate(R.layout.dlg_focus_point, null, false)
focusPointView = viewRoot.findViewById(R.id.ivFocus)
viewRoot.findViewById<View>(R.id.btnClose).setOnClickListener(this)
this.dialog = Dialog(activity)
dialog.setContentView(viewRoot)
dialog.setOnDismissListener {
bitmap?.recycle()
}
}
override fun onClick(v : View) {
when(v.id) {
R.id.btnClose -> dialog.dismissSafe()
}
}
fun setCallback(callback : FocusPointView.Callback?) : DlgFocusPoint {
focusPointView.callback = callback
return this
}
fun show() {
val url = attachment.preview_url
if(url == null) {
activity.showToast(false, "missing image url")
return
}
TootTaskRunner(activity).run(object : TootTask {
private val options = BitmapFactory.Options()
private fun decodeBitmap(
data : ByteArray,
@Suppress("SameParameterValue") pixel_max : Int
) : Bitmap? {
options.inJustDecodeBounds = true
options.inScaled = false
options.outWidth = 0
options.outHeight = 0
BitmapFactory.decodeByteArray(data, 0, data.size, options)
var w = options.outWidth
var h = options.outHeight
if(w <= 0 || h <= 0) {
log.e("can't decode bounds.")
return null
}
var bits = 0
while(w > pixel_max || h > pixel_max) {
++ bits
w = w shr 1
h = h shr 1
}
options.inJustDecodeBounds = false
options.inSampleSize = 1 shl bits
return BitmapFactory.decodeByteArray(data, 0, data.size, options)
}
var bitmap : Bitmap? = null
override suspend fun background(client : TootApiClient) : TootApiResult? {
try {
val (result, data) = client.getHttpBytes(url)
data ?: return result
bitmap = decodeBitmap(data, 1024)
if(bitmap == null) return TootApiResult("image decode failed.")
return result
} catch(ex : Throwable) {
return TootApiResult(ex.withCaption("preview loading failed."))
}
}
override suspend fun handleResult(result : TootApiResult?) {
val bitmap = this.bitmap
if(bitmap == null) {
activity.showToast(true, result?.error ?: "?")
dialog.dismissSafe()
return
}
if(activity.isFinishing) {
bitmap.recycle()
dialog.dismissSafe()
return
}
this@DlgFocusPoint.bitmap = bitmap
focusPointView.setAttachment(attachment, bitmap)
dialog.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT
)
dialog.show()
}
})
}
}