lots of cosmetic improvements

This commit is contained in:
Öppen 2020-08-16 22:30:24 +01:00
parent 9114f69ec2
commit 328ace5d27
5 changed files with 85 additions and 44 deletions

View File

@ -2,10 +2,21 @@ package oppen
import android.app.AlertDialog import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.view.View
fun String.alert(context: Context){ fun String.alert(context: Context){
AlertDialog.Builder(context) AlertDialog.Builder(context)
.setMessage(this) .setMessage(this)
.setPositiveButton("OK"){_, _ ->} .setPositiveButton("OK"){_, _ ->}
.show() .show()
}
fun View.visible(visible: Boolean) = when {
visible -> this.visibility = View.VISIBLE
else -> this.visibility = View.GONE
}
fun View.visibleRetainingSpace(visible: Boolean) = when {
visible -> this.visibility = View.VISIBLE
else -> this.visibility = View.INVISIBLE
} }

View File

@ -35,12 +35,14 @@ class GeminiDatasource: Datasource{
when { when {
address.startsWith("//") -> { address.startsWith("//") -> {
//just missing protocol //just missing protocol
onUpdate(TvaState.Requesting(uri))
request(URI.create("gemini:$address"), onUpdate) request(URI.create("gemini:$address"), onUpdate)
return return
} }
address.startsWith("/") -> { address.startsWith("/") -> {
//internal navigation //internal navigation
val internalNav = "gemini://${last?.host}$address" val internalNav = "gemini://${last?.host}$address"
onUpdate(TvaState.Requesting(uri))
request(URI.create(internalNav), onUpdate) request(URI.create(internalNav), onUpdate)
return return
} }
@ -48,6 +50,7 @@ class GeminiDatasource: Datasource{
//looks like a relative link //looks like a relative link
val lastAddress = last.toString() val lastAddress = last.toString()
val relAddress = "${lastAddress.substring(0, lastAddress.lastIndexOf("/") + 1)}$address" val relAddress = "${lastAddress.substring(0, lastAddress.lastIndexOf("/") + 1)}$address"
onUpdate(TvaState.Requesting(uri))
request(URI.create(relAddress), onUpdate) request(URI.create(relAddress), onUpdate)
return return
} }

View File

@ -13,6 +13,7 @@ import oppen.tva.R
import oppen.tva.databinding.ActivityTvaBinding import oppen.tva.databinding.ActivityTvaBinding
import oppen.tva.io.TvaState import oppen.tva.io.TvaState
import oppen.tva.io.history.CacheInterface import oppen.tva.io.history.CacheInterface
import oppen.visibleRetainingSpace
class TvaActivity : AppCompatActivity() { class TvaActivity : AppCompatActivity() {
@ -35,7 +36,7 @@ class TvaActivity : AppCompatActivity() {
model.initialise(CacheInterface.default(this)){ state -> model.initialise(CacheInterface.default(this)){ state ->
when(state){ when(state){
is TvaState.AppQuery -> TODO() is TvaState.AppQuery -> TODO()
is TvaState.Requesting -> TODO() is TvaState.Requesting -> loadingView(true)
is TvaState.NotGeminiRequest -> externalProtocol(state) is TvaState.NotGeminiRequest -> externalProtocol(state)
is TvaState.GeminiResponse -> renderGemtext(state) is TvaState.GeminiResponse -> renderGemtext(state)
TvaState.GeminiPrintWriterError -> TODO() TvaState.GeminiPrintWriterError -> TODO()
@ -58,19 +59,26 @@ class TvaActivity : AppCompatActivity() {
} }
private fun externalProtocol(state: TvaState.NotGeminiRequest) { private fun externalProtocol(state: TvaState.NotGeminiRequest) {
loadingView(false)
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(state.uri.toString())) val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(state.uri.toString()))
startActivity(browserIntent) startActivity(browserIntent)
} }
private fun renderGemtext(state: TvaState.GeminiResponse) = runOnUiThread { private fun renderGemtext(state: TvaState.GeminiResponse) = runOnUiThread {
loadingView(false)
if(state.header.startsWith("2") && state.header.contains("text/gemini")) { if(state.header.startsWith("2") && state.header.contains("text/gemini")) {
binding.addressEdit.setText(state.uri.toString()) binding.addressEdit.setText(state.uri.toString())
adapter.render(state.lines) adapter.render(state.lines)
}else{ }else{
println("Server returned an error - or non gemtext mimetype: ${state.header}") "Server returned an error - or non gemtext mimetype not implemented yet: ${state.header}".alert(this)
} }
} }
private fun loadingView(visible: Boolean) = runOnUiThread {
binding.progressBar.visibleRetainingSpace(visible)
if(visible) binding.appBar.setExpanded(true)
}
@ExperimentalStdlibApi @ExperimentalStdlibApi
override fun onBackPressed() { override fun onBackPressed() {
if(model.canGoBack()){ if(model.canGoBack()){

View File

@ -41,11 +41,11 @@ class TvaViewModel: ViewModel() {
fun request(uri: URI){ fun request(uri: URI){
gemini.request(uri){ state -> gemini.request(uri){ state ->
when(state){ when(state){
is TvaState.Requesting -> {} is TvaState.Requesting -> onState(state)
is TvaState.AppQuery -> {} is TvaState.AppQuery -> {}
is TvaState.NotGeminiRequest -> onState(state) is TvaState.NotGeminiRequest -> onState(state)
is TvaState.GeminiResponse -> renderGemini(state) is TvaState.GeminiResponse -> renderGemini(state)
TvaState.GeminiPrintWriterError -> {} TvaState.GeminiPrintWriterError -> onState(state)
} }
} }
} }

View File

@ -28,53 +28,72 @@
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:paddingTop="@dimen/default_margin" <RelativeLayout
android:paddingBottom="@dimen/default_margin"> android:id="@+id/address_bar"
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_margin="@dimen/button_margin"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/vector_home" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/address_edit"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:paddingTop="@dimen/default_margin"
android:layout_toRightOf="@+id/home" android:paddingBottom="@dimen/default_margin">
android:layout_toLeftOf="@+id/tabs"
android:singleLine="true"
android:textSize="14sp"
android:imeOptions="actionGo"
android:hint="@string/gemini_protocol"/>
<androidx.appcompat.widget.AppCompatImageButton <androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/tabs" android:id="@+id/home"
android:layout_toLeftOf="@+id/more" android:layout_width="wrap_content"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_centerVertical="true"
android:layout_centerVertical="true" android:layout_margin="@dimen/button_margin"
android:layout_margin="@dimen/button_margin" android:background="?android:attr/selectableItemBackgroundBorderless"
android:background="?android:attr/selectableItemBackgroundBorderless" android:src="@drawable/vector_home" />
android:src="@drawable/vector_tab" />
<androidx.appcompat.widget.AppCompatImageButton <androidx.appcompat.widget.AppCompatEditText
android:id="@+id/more" android:id="@+id/address_edit"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" android:layout_centerVertical="true"
android:layout_centerVertical="true" android:layout_toRightOf="@+id/home"
android:layout_margin="@dimen/button_margin" android:layout_toLeftOf="@+id/tabs"
android:background="?android:attr/selectableItemBackgroundBorderless" android:inputType="textNoSuggestions|textUri"
android:src="@drawable/vector_overflow" /> android:singleLine="true"
android:textSize="14sp"
android:imeOptions="actionGo"
android:hint="@string/gemini_protocol"/>
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/tabs"
android:layout_toLeftOf="@+id/more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_margin="@dimen/button_margin"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/vector_tab" />
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_margin="@dimen/button_margin"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/vector_overflow" />
</RelativeLayout>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="2dp"
android:indeterminateTint="#ffffff"
style="?android:attr/progressBarStyleHorizontal"
android:layout_below="@+id/address_bar"
android:indeterminate="true" />
</RelativeLayout> </RelativeLayout>
</com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>