ariane/app/src/main/java/oppen/tva/ui/TvaActivity.kt

78 lines
2.6 KiB
Kotlin

package oppen.tva.ui
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.inputmethod.EditorInfo
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import oppen.tva.R
import oppen.tva.databinding.ActivityTvaBinding
import oppen.tva.io.TvaState
import oppen.tva.io.history.CacheInterface
import oppen.tva.ui.gemtext.GemtextAdapter
class TvaActivity : AppCompatActivity() {
private val model by viewModels<TvaViewModel>()
private lateinit var binding: ActivityTvaBinding
private val adapter = GemtextAdapter{ uri ->
model.request(uri)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_tva)
binding.viewmodel = model
binding.lifecycleOwner = this
binding.gemtextRecycler.layoutManager = LinearLayoutManager(this)
binding.gemtextRecycler.adapter = adapter
model.initialise(CacheInterface.default(this)){ state ->
when(state){
is TvaState.AppQuery -> TODO()
is TvaState.Requesting -> TODO()
is TvaState.NotGeminiRequest -> externalProtocol(state)
is TvaState.GeminiResponse -> renderGemtext(state)
TvaState.GeminiPrintWriterError -> TODO()
}
}
binding.addressEdit.setOnEditorActionListener { _, actionId, _ ->
when (actionId) {
EditorInfo.IME_ACTION_GO -> {
model.request(binding.addressEdit.text.toString())
return@setOnEditorActionListener true
}
else -> return@setOnEditorActionListener false
}
}
}
private fun externalProtocol(state: TvaState.NotGeminiRequest) {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(state.uri.toString()))
startActivity(browserIntent)
}
private fun renderGemtext(state: TvaState.GeminiResponse) = runOnUiThread {
if(state.header.startsWith("2") && state.header.contains("text/gemini")) {
binding.addressEdit.setText(state.uri.toString())
adapter.render(state.lines)
}else{
println("Server returned an error - or non gemtext mimetype: ${state.header}")
}
}
@ExperimentalStdlibApi
override fun onBackPressed() {
if(model.canGoBack()){
model.goBack()
}else{
super.onBackPressed()
}
}
}