diff --git a/app/src/main/java/corewala/buran/OmniTerm.kt b/app/src/main/java/corewala/buran/OmniTerm.kt index 7728fa3..58a5c37 100644 --- a/app/src/main/java/corewala/buran/OmniTerm.kt +++ b/app/src/main/java/corewala/buran/OmniTerm.kt @@ -35,6 +35,9 @@ class OmniTerm(private val listener: Listener) { listener.request("$searchbase$encoded") } + fun resolve(link: String): String{ + return uri.resolve(link) + } fun navigation(link: String) { navigation(link, true) @@ -51,9 +54,7 @@ class OmniTerm(private val listener: Listener) { private fun navigation(link: String, invokeListener: Boolean) { when { link.startsWith(GEM_SCHEME) -> uri.set(link) - link.startsWith("//") -> uri.set("gemini:$link") - link.contains(":") -> listener.openExternal(link) - else -> uri.resolve(link) + else -> listener.openExternal(link) } val address = uri.toString().replace("//", "/").replace("gemini:/", "gemini://") diff --git a/app/src/main/java/corewala/buran/OppenURI.kt b/app/src/main/java/corewala/buran/OppenURI.kt index 6d88f9a..7b163a1 100644 --- a/app/src/main/java/corewala/buran/OppenURI.kt +++ b/app/src/main/java/corewala/buran/OppenURI.kt @@ -25,9 +25,9 @@ class OppenURI constructor(private var ouri: String) { extractHost() } - fun resolve(reference: String) { + fun resolve(reference: String): String{ if(ouri == "$SCHEME$host") ouri = "$ouri/" - return when { + when { reference.startsWith(SCHEME) -> set(reference) reference.startsWith(SOLIDUS) -> ouri = "$SCHEME$host$reference" reference.startsWith(TRAVERSE) -> { @@ -42,6 +42,7 @@ class OppenURI constructor(private var ouri: String) { } } } + return ouri } fun traverse(): OppenURI{ diff --git a/app/src/main/java/corewala/buran/io/gemini/GeminiDatasource.kt b/app/src/main/java/corewala/buran/io/gemini/GeminiDatasource.kt index 472c663..71f9e83 100644 --- a/app/src/main/java/corewala/buran/io/gemini/GeminiDatasource.kt +++ b/app/src/main/java/corewala/buran/io/gemini/GeminiDatasource.kt @@ -6,6 +6,7 @@ import androidx.preference.PreferenceManager import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import corewala.buran.Buran +import corewala.buran.OppenURI import corewala.buran.io.GemState import corewala.buran.io.database.history.BuranHistory import corewala.buran.io.keymanager.BuranKeyManager @@ -121,7 +122,7 @@ class GeminiDatasource(private val context: Context, val history: BuranHistory): when { header.code == GeminiResponse.INPUT -> onUpdate(GemState.ResponseInput(uri, header)) - header.code == GeminiResponse.REDIRECT -> request(URI.create(header.meta).toString(), false, false, onUpdate) + header.code == GeminiResponse.REDIRECT -> request(resolve(uri.host, header.meta), false, false, onUpdate) header.code == GeminiResponse.CLIENT_CERTIFICATE_REQUIRED -> onUpdate(GemState.ClientCertRequired(uri, header)) header.code != GeminiResponse.SUCCESS -> onUpdate(GemState.ResponseError(header)) header.meta.startsWith("text/gemini") -> getGemtext(bufferedReader, uri, header, onUpdate) @@ -217,6 +218,12 @@ class GeminiDatasource(private val context: Context, val history: BuranHistory): } } + private fun resolve(host: String, address: String): String{ + val ouri = OppenURI() + ouri.set(host) + return ouri.resolve(address) + } + override fun canGoBack(): Boolean = runtimeHistory.isEmpty() || runtimeHistory.size > 1 override fun goBack(onUpdate: (state: GemState) -> Unit) { diff --git a/app/src/main/java/corewala/buran/ui/GemActivity.kt b/app/src/main/java/corewala/buran/ui/GemActivity.kt index 61c3420..4f5b6d3 100644 --- a/app/src/main/java/corewala/buran/ui/GemActivity.kt +++ b/app/src/main/java/corewala/buran/ui/GemActivity.kt @@ -85,13 +85,9 @@ class GemActivity : AppCompatActivity() { lateinit var adapter: AbstractGemtextAdapter private val onLink: (link: URI, longTap: Boolean, adapterPosition: Int) -> Unit = { uri, longTap, position: Int -> + val globalURI = omniTerm.resolve(uri.toString()) + if(longTap){ - var globalURI: String - if(!uri.toString().contains("//") and !uri.toString().contains(":")){ - globalURI = (omniTerm.getCurrent() + uri.toString()).replace("//", "/").replace("gemini:/", "gemini://") - } else { - globalURI = uri.toString() - } Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, globalURI) @@ -105,7 +101,7 @@ class GemActivity : AppCompatActivity() { binding.addressEdit.hint = getString(R.string.main_input_hint) inSearch = false } - omniTerm.navigation(uri.toString()) + omniTerm.navigation(globalURI) }else{ Snackbar.make(binding.root, getString(R.string.no_internet), Snackbar.LENGTH_LONG).show() }