handle input responses
This commit is contained in:
parent
da3a9f4c75
commit
6eb9c142cc
|
@ -6,16 +6,23 @@ import android.content.Intent
|
||||||
import android.content.Intent.ACTION_VIEW
|
import android.content.Intent.ACTION_VIEW
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.text.InputType
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
|
import android.widget.EditText
|
||||||
|
import android.widget.FrameLayout
|
||||||
|
import android.widget.FrameLayout.LayoutParams.MATCH_PARENT
|
||||||
|
import android.widget.FrameLayout.LayoutParams.WRAP_CONTENT
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.view.setMargins
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import dev.lowrespalmtree.comet.databinding.ActivityMainBinding
|
import dev.lowrespalmtree.comet.databinding.ActivityMainBinding
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
|
|
||||||
|
|
||||||
@ExperimentalCoroutinesApi
|
@ExperimentalCoroutinesApi
|
||||||
class MainActivity : AppCompatActivity(), ContentAdapter.ContentAdapterListen {
|
class MainActivity : AppCompatActivity(), ContentAdapter.ContentAdapterListen {
|
||||||
private lateinit var binding: ActivityMainBinding
|
private lateinit var binding: ActivityMainBinding
|
||||||
|
@ -130,6 +137,27 @@ class MainActivity : AppCompatActivity(), ContentAdapter.ContentAdapterListen {
|
||||||
Log.d(TAG, "handleEvent: $event")
|
Log.d(TAG, "handleEvent: $event")
|
||||||
if (!event.handled) {
|
if (!event.handled) {
|
||||||
when (event) {
|
when (event) {
|
||||||
|
is PageViewModel.InputEvent -> {
|
||||||
|
val editText = EditText(this).apply { inputType = InputType.TYPE_CLASS_TEXT }
|
||||||
|
val inputView = FrameLayout(this).apply {
|
||||||
|
addView(FrameLayout(this@MainActivity).apply {
|
||||||
|
addView(editText)
|
||||||
|
val params = FrameLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
|
||||||
|
params.setMargins(resources.getDimensionPixelSize(R.dimen.text_margin))
|
||||||
|
layoutParams = params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
AlertDialog.Builder(this)
|
||||||
|
.setMessage(if (event.prompt.isNotEmpty()) event.prompt else "Input required")
|
||||||
|
.setView(inputView)
|
||||||
|
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||||
|
val newUri = event.uri.buildUpon().query(editText.text.toString()).build()
|
||||||
|
openUrl(newUri.toString(), base = currentUrl)
|
||||||
|
}
|
||||||
|
.setOnDismissListener { updateState(PageViewModel.State.IDLE) }
|
||||||
|
.create()
|
||||||
|
.show()
|
||||||
|
}
|
||||||
is PageViewModel.SuccessEvent -> {
|
is PageViewModel.SuccessEvent -> {
|
||||||
currentUrl = event.uri
|
currentUrl = event.uri
|
||||||
visitedUrls.add(event.uri)
|
visitedUrls.add(event.uri)
|
||||||
|
|
|
@ -25,6 +25,7 @@ class PageViewModel : ViewModel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class Event(var handled: Boolean = false)
|
abstract class Event(var handled: Boolean = false)
|
||||||
|
data class InputEvent(val uri: Uri, val prompt: String) : Event()
|
||||||
data class SuccessEvent(val uri: String) : Event()
|
data class SuccessEvent(val uri: String) : Event()
|
||||||
data class RedirectEvent(val uri: String, val redirects: Int) : Event()
|
data class RedirectEvent(val uri: String, val redirects: Int) : Event()
|
||||||
data class FailureEvent(
|
data class FailureEvent(
|
||||||
|
@ -73,6 +74,8 @@ class PageViewModel : ViewModel() {
|
||||||
|
|
||||||
Log.i(TAG, "sendRequest: got ${response.code} with meta \"${response.meta}\"")
|
Log.i(TAG, "sendRequest: got ${response.code} with meta \"${response.meta}\"")
|
||||||
when (response.code.getCategory()) {
|
when (response.code.getCategory()) {
|
||||||
|
Response.Code.Category.INPUT ->
|
||||||
|
handleInputResponse(response, uri)
|
||||||
Response.Code.Category.SUCCESS ->
|
Response.Code.Category.SUCCESS ->
|
||||||
handleSuccessResponse(response, uri)
|
handleSuccessResponse(response, uri)
|
||||||
Response.Code.Category.REDIRECT ->
|
Response.Code.Category.REDIRECT ->
|
||||||
|
@ -89,6 +92,10 @@ class PageViewModel : ViewModel() {
|
||||||
event.postValue(FailureEvent("Error", message))
|
event.postValue(FailureEvent("Error", message))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleInputResponse(response: Response, uri: Uri) {
|
||||||
|
event.postValue(InputEvent(uri, response.meta))
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun handleSuccessResponse(response: Response, uri: Uri) {
|
private suspend fun handleSuccessResponse(response: Response, uri: Uri) {
|
||||||
state.postValue(State.RECEIVING)
|
state.postValue(State.RECEIVING)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package dev.lowrespalmtree.comet
|
package dev.lowrespalmtree.comet
|
||||||
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.util.Log
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transform a relative URI to an absolute Gemini URI
|
* Transform a relative URI to an absolute Gemini URI
|
||||||
|
|
Reference in a new issue