ariane/app/src/main/java/oppen/ariane/ui/GemViewModel.kt

77 lines
2.1 KiB
Kotlin
Raw Normal View History

package oppen.ariane.ui
2020-08-15 14:52:27 +00:00
import android.net.Uri
2020-08-15 14:52:27 +00:00
import androidx.lifecycle.ViewModel
import oppen.ariane.Ariane
import oppen.ariane.io.gemini.Datasource
import oppen.ariane.io.GemState
import oppen.ariane.io.bookmarks.BookmarksDatasource
2020-08-15 14:52:27 +00:00
import java.net.URI
2020-09-10 16:33:10 +00:00
class GemViewModel: ViewModel() {
2020-08-15 14:52:27 +00:00
2020-08-21 15:12:00 +00:00
private lateinit var gemini: Datasource
2020-09-07 21:15:18 +00:00
private lateinit var bookmarks: BookmarksDatasource
private var onState: (state: GemState) -> Unit = {}
private val history = mutableListOf<URI>()
2020-11-09 22:02:23 +00:00
fun initialise(home: String, gemini: Datasource, bookmarks: BookmarksDatasource, onState: (state: GemState) -> Unit){
2020-08-21 15:12:00 +00:00
this.gemini = gemini
2020-09-07 21:15:18 +00:00
this.bookmarks = bookmarks
2020-08-15 14:52:27 +00:00
this.onState = onState
2020-11-09 22:02:23 +00:00
request(home)
2020-08-17 20:25:39 +00:00
}
2020-08-15 14:52:27 +00:00
fun request(address: String) {
request(URI.create(address))
}
fun request(uri: URI){
gemini.request(uri){ state ->
if(state is GemState.ResponseGemtext) {
when {
history.isEmpty() -> history.add(uri)
!history.takeLast(5).contains(uri) -> {
println("Adding $uri to runtime history")
history.add(uri)
}
}
}
onState(state)
2020-08-15 14:52:27 +00:00
}
}
fun requestInlineImage(uri: URI, onImageReady: (cacheUri: Uri?) -> Unit){
gemini.request(uri){ state ->
when (state) {
is GemState.ResponseImage -> onImageReady(state.cacheUri)
else -> onState(state)
}
}
}
fun canGoBack(): Boolean = history.size > 1
2020-08-15 20:20:15 +00:00
@ExperimentalStdlibApi
fun goBack(){
when {
history.size >= 2 -> {
logHistory()
val previous = history[history.size - 2]
history.removeLast()
println("Requesting history item: $previous")
request(previous)
logHistory()
2020-08-17 20:25:39 +00:00
}
}
}
private fun logHistory(){
history.forEach { uri ->
println("History: $uri")
}
}
2020-08-15 14:52:27 +00:00
}