improve history - a lot

This commit is contained in:
Jonathan Fisher 2020-11-13 18:48:32 +00:00
parent 5bae07bef3
commit 2c0e1018ac
4 changed files with 23 additions and 47 deletions

View File

@ -3,7 +3,7 @@ package oppen.ariane.io.gemini
import android.net.Uri
import java.net.URI
class AddressBuilder{
class AddressBuilder {
private var uri: Uri = Uri.EMPTY

View File

@ -7,6 +7,8 @@ import java.net.URI
interface Datasource {
fun request(uri: URI, forceDownload: Boolean, onUpdate: (state: GemState) -> Unit)
fun request(uri: URI, onUpdate: (state: GemState) -> Unit)
fun canGoBack(): Boolean
fun goBack(onUpdate: (state: GemState) -> Unit)
companion object{
fun factory(context: Context): Datasource {

View File

@ -10,20 +10,18 @@ import oppen.isGemini
import oppen.toURI
import oppen.toUri
import java.io.*
import java.lang.IllegalStateException
import java.net.ConnectException
import java.net.URI
import javax.net.ssl.*
const val GEMINI_SCHEME = "gemini"
class GeminiDatasource(
private val context: Context): Datasource {
class GeminiDatasource(private val context: Context): Datasource {
private val prefs = PreferenceManager.getDefaultSharedPreferences(context)
private var last: URI? = null
private val addressBuilder = AddressBuilder()
private val runtimeHistory = mutableListOf<URI>()
private var forceDownload = false
override fun request(uri: URI, onUpdate: (state: GemState) -> Unit) = request(uri, false, onUpdate)
@ -42,7 +40,6 @@ class GeminiDatasource(
val cached = RuntimeCache.get(uri)
when {
cached != null -> {
last = uri
onUpdate(GemState.ResponseGemtext(uri, cached.first, cached.second))
return
}
@ -59,11 +56,9 @@ class GeminiDatasource(
val parsedUri = addressBuilder.request(uri).uri()
if(parsedUri.isGemini()){
val cached = RuntimeCache.get(parsedUri)
if(cached != null){
last = parsedUri.toURI()
onUpdate(GemState.ResponseGemtext(parsedUri.toURI(), cached.first, cached.second))
}else{
request(parsedUri.toURI(), forceDownload, onUpdate)
when {
cached != null -> onUpdate(GemState.ResponseGemtext(parsedUri.toURI(), cached.first, cached.second))
else -> request(parsedUri.toURI(), forceDownload, onUpdate)
}
}else{
onUpdate(GemState.NotGeminiRequest(uri))
@ -81,7 +76,6 @@ class GeminiDatasource(
*
*/
private fun geminiRequest(uri: URI, onUpdate: (state: GemState) -> Unit){
last = uri
val port = if(uri.port == -1) 1965 else uri.port
val protocol = prefs.getString("tls_protocol", "TLS")
@ -184,9 +178,13 @@ class GeminiDatasource(
val processed = GemtextHelper.findCodeBlocks(lines)
when {
uri.toString().startsWith("gemini://") -> RuntimeCache.put(uri, header, processed)
!uri.toString().startsWith("gemini://") -> throw IllegalStateException("Not a Gemini Uri")
}
RuntimeCache.put(uri, header, processed)
if(runtimeHistory.isEmpty() || runtimeHistory.last().toString() != uri.toString()) runtimeHistory.add(uri)
onUpdate(GemState.ResponseGemtext(uri, header, processed))
}
@ -236,4 +234,11 @@ class GeminiDatasource(
}
}
}
override fun canGoBack(): Boolean = runtimeHistory.size > 1
override fun goBack(onUpdate: (state: GemState) -> Unit) {
runtimeHistory.removeLast()
request(runtimeHistory.last(), onUpdate)
}
}

View File

@ -14,8 +14,6 @@ class GemViewModel: ViewModel() {
private lateinit var bookmarks: BookmarksDatasource
private var onState: (state: GemState) -> Unit = {}
private val history = mutableListOf<URI>()
fun initialise(home: String, gemini: Datasource, bookmarks: BookmarksDatasource, onState: (state: GemState) -> Unit){
this.gemini = gemini
this.bookmarks = bookmarks
@ -30,15 +28,6 @@ class GemViewModel: ViewModel() {
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)
}
}
@ -59,26 +48,6 @@ class GemViewModel: ViewModel() {
}
}
fun canGoBack(): Boolean = history.size > 1
@ExperimentalStdlibApi
fun goBack(){
when {
history.size >= 2 -> {
logHistory()
val previous = history[history.size - 2]
history.removeLast()
println("Requesting history item: $previous")
request(previous)
logHistory()
}
}
}
private fun logHistory(){
history.forEach { uri ->
println("History: $uri")
}
}
fun canGoBack(): Boolean = gemini.canGoBack()
fun goBack() = gemini.goBack(onState)
}