From 5f04c74daae286061af27a3dedc04db0d9c0bd56 Mon Sep 17 00:00:00 2001 From: femsci Date: Fri, 3 Mar 2023 23:48:17 +0100 Subject: [PATCH] Add basic REST communication. Initial minimum viable product. --- .idea/vcs.xml | 7 ++ app/src/main/AndroidManifest.xml | 2 +- .../java/net/femsci/automfa/AutoMFAGateway.kt | 87 ++++++++++++++++--- .../java/net/femsci/automfa/MainActivity.kt | 15 ++-- .../java/net/femsci/automfa/MessageModel.kt | 3 + app/src/main/res/layout/activity_main.xml | 40 +++++++-- build.gradle | 4 +- 7 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/net/femsci/automfa/MessageModel.kt diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..5b07abe --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d74b11..537f15e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.AutoMFA" + android:usesCleartextTraffic="true" tools:targetApi="31"> @@ -27,7 +28,6 @@ diff --git a/app/src/main/java/net/femsci/automfa/AutoMFAGateway.kt b/app/src/main/java/net/femsci/automfa/AutoMFAGateway.kt index 9618f49..825e328 100644 --- a/app/src/main/java/net/femsci/automfa/AutoMFAGateway.kt +++ b/app/src/main/java/net/femsci/automfa/AutoMFAGateway.kt @@ -1,24 +1,91 @@ package net.femsci.automfa +import android.util.JsonWriter +import java.io.OutputStreamWriter import java.net.HttpURLConnection +import java.net.URI import java.net.URL +import java.util.concurrent.Executors +import java.util.concurrent.FutureTask +import java.util.concurrent.TimeUnit class AutoMFAGateway { companion object { - lateinit var url: URL + lateinit var uri: URI + var connected: Boolean = false + + private fun createClient(path: String, post: Boolean): HttpURLConnection { + val url = URL("${uri.scheme}://${uri.authority}$path") + val http = url.openConnection() as HttpURLConnection + + if(post) { + http.requestMethod = "POST" + http.doOutput = true + } else { + http.requestMethod = "GET" + } + + http.setRequestProperty("User-Agent", "AutoMFA v1.0.0E") + http.setRequestProperty("Content-Type", "application/json") + http.setRequestProperty("Accept", "application/json") + + return http + } fun connect(addr: String): Boolean { - return try { - url = URL(addr) - println("url: $url") - val http = url.openConnection() as HttpURLConnection - http.requestMethod = "GET" + val task = FutureTask { + try { + uri = URI(addr) + val http = createClient("/ping", false) - println("r: ${http.responseCode}") - http.responseCode == 200 - } catch(e: Exception) { - e.printStackTrace() + println("r: ${http.responseCode}") + http.responseCode == 200 + } catch (e: Exception) { + e.printStackTrace() + false + } + } + + val exe = Executors.newCachedThreadPool() + exe.submit(task) + return try { + val result = task.get(5, TimeUnit.SECONDS) + connected = result + result + } catch(_: Exception) { + connected = false + return false + } + + } + + fun publish(message: MessageModel): Boolean + { + val task = FutureTask { + try { + val http = createClient("/data/publish", true) + + val out = http.outputStream + val writer = OutputStreamWriter(out, "UTF-8") + val json = JsonWriter(writer) + json.beginObject().name("MessageRaw").value(message.messageRaw).name("Timestamp").value(message.timestamp).endObject().toString() + json.flush() + + println("r: ${http.responseCode}") + http.responseCode == 200 + } catch (e: Exception) { + e.printStackTrace() + false + } + } + + val exe = Executors.newCachedThreadPool() + exe.submit(task) + return try { + task.get(5, TimeUnit.SECONDS) + } catch(_: Exception) + { false } } diff --git a/app/src/main/java/net/femsci/automfa/MainActivity.kt b/app/src/main/java/net/femsci/automfa/MainActivity.kt index 9b2feff..57d15ab 100644 --- a/app/src/main/java/net/femsci/automfa/MainActivity.kt +++ b/app/src/main/java/net/femsci/automfa/MainActivity.kt @@ -6,9 +6,9 @@ import android.view.Menu import android.view.MenuItem import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import androidx.core.widget.addTextChangedListener import androidx.navigation.ui.AppBarConfiguration import net.femsci.automfa.databinding.ActivityMainBinding +import java.time.Instant class MainActivity : AppCompatActivity(), MessageListener { @@ -22,14 +22,14 @@ class MainActivity : AppCompatActivity(), MessageListener { setContentView(binding.root) binding.btnServer.setOnClickListener { - val addr = binding.srvAddr.text.toString(); + val addr = binding.srvAddr.text.toString() if (AutoMFAGateway.connect(addr)) { - binding.txtStatus.setTextColor(Color.GREEN); - binding.txtStatus.text = "Connection established." + binding.txtStatus.setTextColor(Color.GREEN) + binding.txtStatus.text = "Connection established." } else { - binding.txtStatus.setTextColor(Color.RED); - binding.txtStatus.text = "Connection failed..." + binding.txtStatus.setTextColor(Color.RED) + binding.txtStatus.text = "Connection failed..." } } @@ -54,5 +54,8 @@ class MainActivity : AppCompatActivity(), MessageListener { override fun messageReceived(msg: String) { Toast.makeText(this, "New msg: $msg", Toast.LENGTH_SHORT).show() + if (AutoMFAGateway.connected) { + AutoMFAGateway.publish(MessageModel(Instant.now().toEpochMilli(), msg)) + } } } diff --git a/app/src/main/java/net/femsci/automfa/MessageModel.kt b/app/src/main/java/net/femsci/automfa/MessageModel.kt new file mode 100644 index 0000000..79f0871 --- /dev/null +++ b/app/src/main/java/net/femsci/automfa/MessageModel.kt @@ -0,0 +1,3 @@ +package net.femsci.automfa + +data class MessageModel(val timestamp: Long, val messageRaw: String) \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fc04a40..e05adde 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -12,24 +12,48 @@ android:layout_height="match_parent" android:orientation="vertical"> - - + + + +