2020-08-15 14:52:27 +00:00
|
|
|
package oppen.tva.ui
|
|
|
|
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
|
|
import oppen.tva.io.Datasource
|
|
|
|
import oppen.tva.io.TvaState
|
|
|
|
import oppen.tva.io.history.CacheInterface
|
|
|
|
import oppen.tva.io.history.Tab
|
|
|
|
import java.net.URI
|
|
|
|
|
|
|
|
class TvaViewModel: ViewModel() {
|
|
|
|
|
|
|
|
private val gemini = Datasource.factory()
|
|
|
|
private var onState: (state: TvaState) -> Unit = {}
|
|
|
|
private var activeTab = 0
|
|
|
|
|
|
|
|
private lateinit var cache: CacheInterface
|
|
|
|
private var tabs = mutableListOf<Tab>()
|
|
|
|
|
|
|
|
fun initialise(cache: CacheInterface, onState: (state: TvaState) -> Unit){
|
|
|
|
this.cache = cache
|
|
|
|
this.onState = onState
|
|
|
|
|
|
|
|
|
|
|
|
cache.getTabs { tabs, activeIndex ->
|
|
|
|
this.tabs.addAll(tabs)
|
|
|
|
if(tabs.isEmpty()){
|
|
|
|
this.tabs.add(Tab(0))
|
|
|
|
activeTab = 0
|
|
|
|
request(URI.create("gemini://gemini.circumlunar.space/"))
|
|
|
|
}else{
|
|
|
|
activeTab = activeIndex
|
|
|
|
request(tabs[activeTab].history.last())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun request(address: String) {
|
|
|
|
request(URI.create(address))
|
|
|
|
}
|
|
|
|
|
|
|
|
fun request(uri: URI){
|
|
|
|
gemini.request(uri){ state ->
|
|
|
|
when(state){
|
|
|
|
is TvaState.Requesting -> {}
|
|
|
|
is TvaState.AppQuery -> {}
|
|
|
|
is TvaState.NotGeminiRequest -> {}
|
|
|
|
is TvaState.GeminiResponse -> renderGemini(state)
|
|
|
|
TvaState.GeminiPrintWriterError -> {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun renderGemini(state: TvaState.GeminiResponse) {
|
|
|
|
if(tabs[activeTab].history.isEmpty() || tabs[activeTab].history.last() != state.uri){
|
|
|
|
tabs[activeTab].add(state.uri)
|
|
|
|
cache.update(tabs, activeTab)
|
|
|
|
}
|
|
|
|
|
|
|
|
onState(state)
|
|
|
|
|
|
|
|
}
|
2020-08-15 20:20:15 +00:00
|
|
|
|
|
|
|
fun canGoBack(): Boolean {
|
|
|
|
println("canGoBack()...")
|
|
|
|
tabs[activeTab].history.forEachIndexed{ index, uri ->
|
|
|
|
println("canGoBack history $index: $uri")
|
|
|
|
}
|
|
|
|
return tabs[activeTab].history.size > 1
|
|
|
|
}
|
|
|
|
|
|
|
|
@ExperimentalStdlibApi
|
|
|
|
fun goBack(){
|
|
|
|
val previous = tabs[activeTab].getPrevious()
|
|
|
|
|
|
|
|
if(previous == null){
|
|
|
|
println("Previous history URI is null")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
tabs[activeTab].history.removeLast()
|
|
|
|
cache.update(tabs, activeTab)
|
|
|
|
request(previous)
|
|
|
|
}
|
2020-08-15 14:52:27 +00:00
|
|
|
}
|