2020-08-15 14:52:27 +00:00
|
|
|
package oppen.tva.ui
|
|
|
|
|
|
|
|
import androidx.lifecycle.ViewModel
|
2020-08-20 13:55:59 +00:00
|
|
|
import oppen.tva.Tva
|
2020-08-21 15:12:00 +00:00
|
|
|
import oppen.tva.io.gemini.Datasource
|
2020-08-15 14:52:27 +00:00
|
|
|
import oppen.tva.io.TvaState
|
2020-08-20 13:52:24 +00:00
|
|
|
import oppen.tva.io.history.tabs.TabHistoryInterface
|
|
|
|
import oppen.tva.io.history.tabs.Tab
|
2020-08-15 14:52:27 +00:00
|
|
|
import java.net.URI
|
|
|
|
|
|
|
|
class TvaViewModel: ViewModel() {
|
|
|
|
|
2020-08-21 15:12:00 +00:00
|
|
|
private lateinit var gemini: Datasource
|
2020-08-15 14:52:27 +00:00
|
|
|
private var onState: (state: TvaState) -> Unit = {}
|
|
|
|
private var activeTab = 0
|
|
|
|
|
2020-08-20 13:52:24 +00:00
|
|
|
private lateinit var cache: TabHistoryInterface
|
2020-08-17 20:25:39 +00:00
|
|
|
var tabs = mutableListOf<Tab>()
|
2020-08-15 14:52:27 +00:00
|
|
|
|
2020-08-21 15:12:00 +00:00
|
|
|
fun initialise(cache: TabHistoryInterface, gemini: Datasource, onState: (state: TvaState) -> Unit){
|
2020-08-15 14:52:27 +00:00
|
|
|
this.cache = cache
|
2020-08-21 15:12:00 +00:00
|
|
|
this.gemini = gemini
|
2020-08-15 14:52:27 +00:00
|
|
|
this.onState = onState
|
|
|
|
|
|
|
|
cache.getTabs { tabs, activeIndex ->
|
|
|
|
this.tabs.addAll(tabs)
|
|
|
|
if(tabs.isEmpty()){
|
|
|
|
this.tabs.add(Tab(0))
|
|
|
|
activeTab = 0
|
2020-08-20 13:55:59 +00:00
|
|
|
request(URI.create(Tva.DEFAULT_HOME_CAPSULE))
|
2020-08-17 20:25:39 +00:00
|
|
|
onState(TvaState.TabChange(1))
|
2020-08-15 14:52:27 +00:00
|
|
|
}else{
|
|
|
|
activeTab = activeIndex
|
|
|
|
request(tabs[activeTab].history.last())
|
2020-08-17 20:25:39 +00:00
|
|
|
onState(TvaState.TabChange(tabs.size))
|
2020-08-15 14:52:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-17 20:25:39 +00:00
|
|
|
fun newTab(uri: URI) {
|
|
|
|
val newTab = Tab(tabs.size)
|
|
|
|
tabs.add(newTab)
|
|
|
|
activeTab = newTab.index
|
|
|
|
onState(TvaState.TabChange(tabs.size))
|
|
|
|
request(uri)
|
|
|
|
}
|
|
|
|
|
2020-08-15 14:52:27 +00:00
|
|
|
fun request(address: String) {
|
|
|
|
request(URI.create(address))
|
|
|
|
}
|
|
|
|
|
|
|
|
fun request(uri: URI){
|
|
|
|
gemini.request(uri){ state ->
|
|
|
|
when(state){
|
|
|
|
is TvaState.AppQuery -> {}
|
2020-08-20 14:16:22 +00:00
|
|
|
is TvaState.ResponseInput -> onState(state)
|
2020-08-18 16:17:04 +00:00
|
|
|
is TvaState.ResponseGemtext -> renderGemini(state)
|
2020-08-21 15:12:00 +00:00
|
|
|
is TvaState.ResponseImage -> onState(state)
|
2020-08-21 15:59:07 +00:00
|
|
|
is TvaState.ResponseAudio -> onState(state)
|
2020-08-18 16:17:04 +00:00
|
|
|
is TvaState.Requesting -> onState(state)
|
|
|
|
is TvaState.ResponseError -> onState(state)
|
2020-08-15 20:33:44 +00:00
|
|
|
is TvaState.NotGeminiRequest -> onState(state)
|
2020-08-18 16:17:04 +00:00
|
|
|
is TvaState.ResponseText -> onState(state)
|
2020-08-15 14:52:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-21 15:12:00 +00:00
|
|
|
private fun renderGemini(state: TvaState.ResponseGemtext) {
|
2020-08-15 14:52:27 +00:00
|
|
|
if(tabs[activeTab].history.isEmpty() || tabs[activeTab].history.last() != state.uri){
|
|
|
|
tabs[activeTab].add(state.uri)
|
|
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
|
|
request(previous)
|
|
|
|
}
|
2020-08-16 20:06:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
fun persistTabState() = cache.update(tabs, activeTab)
|
2020-08-17 20:25:39 +00:00
|
|
|
|
|
|
|
fun changeTab(changeIndex: Int) {
|
|
|
|
activeTab = changeIndex
|
|
|
|
request(tabs[activeTab].history.last())
|
|
|
|
}
|
|
|
|
|
|
|
|
fun deleteTab(deleteIndex: Int) {
|
|
|
|
|
|
|
|
if(deleteIndex > activeTab){
|
|
|
|
tabs.removeAt(deleteIndex)
|
|
|
|
}else if(deleteIndex < activeTab){
|
|
|
|
tabs.removeAt(deleteIndex)
|
|
|
|
activeTab--
|
|
|
|
}else if(deleteIndex == activeTab){
|
|
|
|
if(tabs.size > 1){
|
|
|
|
tabs.removeAt(deleteIndex)
|
|
|
|
if(activeTab < tabs.size - 1){
|
|
|
|
activeTab--
|
|
|
|
}else{
|
|
|
|
activeTab = tabs.size -1
|
|
|
|
}
|
|
|
|
request(tabs[activeTab].history.last())
|
|
|
|
}else{
|
|
|
|
//Only one tab - we want a fresh state
|
|
|
|
tabs.first().history.clear()
|
|
|
|
onState(TvaState.Blank)
|
|
|
|
}
|
|
|
|
}
|
2020-08-18 16:17:04 +00:00
|
|
|
onState(TvaState.TabChange(tabs.size))
|
2020-08-17 20:25:39 +00:00
|
|
|
}
|
2020-08-15 14:52:27 +00:00
|
|
|
}
|