Sfoglia il codice sorgente

Upload of fake data to HTTP Post works.

Thomas Chef 3 anni fa
parent
commit
a13fbf0698

+ 9 - 0
app/build.gradle

@@ -67,6 +67,15 @@ dependencies {
     api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.coroutines"
     implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3")
 
+    // Retrofit
+    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+
+    // Okhttp3 for the POST requests
+    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+
+    // Gson to convert raw JSON to pretty JSON
+    implementation 'com.google.code.gson:gson:2.8.9'
+
     // UI
     implementation "androidx.constraintlayout:constraintlayout:$rootProject.constraintLayoutVersion"
     implementation "com.google.android.material:material:$rootProject.materialVersion"

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -7,6 +7,8 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
 
+    <uses-permission android:name="android.permission.INTERNET" />
+
 
     <application
         android:name=".JourneyGpsTrackerApplication"
@@ -18,6 +20,7 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/Theme.JourneyGPSTracker"
+        android:usesCleartextTraffic="true"
         tools:targetApi="31">
         <service
             android:name=".TrackingService"

+ 5 - 0
app/src/main/java/com/flacksta/chef/journeygpstracker/MainActivity.kt

@@ -9,6 +9,7 @@ import androidx.activity.result.contract.ActivityResultContracts
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.content.ContextCompat
 import androidx.fragment.app.Fragment
+import com.flacksta.chef.journeygpstracker.backend.BackendClient
 import com.flacksta.chef.journeygpstracker.databinding.ActivityMainScreenBinding
 import com.google.android.gms.location.*
 
@@ -83,6 +84,10 @@ class MainActivity : AppCompatActivity() {
         mTrackingServiceIntent = Intent(this, mTrackingService.javaClass)
         startForegroundService(mTrackingServiceIntent)
 
+        // Testing with Http POST:
+        val bec:BackendClient = BackendClient()
+        bec.rawJSON()
+
     }
 
     private fun loadFragment(fragment: Fragment) {

+ 13 - 0
app/src/main/java/com/flacksta/chef/journeygpstracker/backend/BackendAPI.kt

@@ -0,0 +1,13 @@
+package com.flacksta.chef.journeygpstracker.backend
+
+import okhttp3.RequestBody
+import okhttp3.ResponseBody
+import retrofit2.Response
+import retrofit2.http.*
+
+interface BackendAPI {
+
+    // Raw JSON-Data
+    @POST("registerGPSlocation.php")
+    suspend fun uploadGPSPositions(@Body requestBody: RequestBody): Response<ResponseBody>
+}

+ 87 - 0
app/src/main/java/com/flacksta/chef/journeygpstracker/backend/BackendClient.kt

@@ -0,0 +1,87 @@
+package com.flacksta.chef.journeygpstracker.backend
+
+import android.util.Log
+import com.google.gson.GsonBuilder
+import com.google.gson.JsonParser
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.RequestBody.Companion.toRequestBody
+import org.json.JSONArray
+import org.json.JSONObject
+import retrofit2.Retrofit
+
+
+// Info: https://johncodeos.com/how-to-make-post-get-put-and-delete-requests-with-retrofit-using-kotlin/
+
+class BackendClient {
+
+    public fun rawJSON() {
+
+        // Create Retrofit
+        val retrofit = Retrofit.Builder()
+                .baseUrl("http://chef.maya.se/gpsapi/") //registerGPSlocation.php")
+                .build()
+
+        // Create Service
+        val service = retrofit.create(BackendAPI::class.java)
+
+        /* From the IPhone version
+        struct GPS_POS_LOG: Codable {
+            var latitude: Double
+            var longitude: Double
+            var ts: String
+            var horizAcc: Int32
+        }*/
+
+        // Create JSON using JSONObject
+        val jsonObject = JSONObject()
+        jsonObject.put("name", "Jack")
+        jsonObject.put("salary", "3540")
+        jsonObject.put("age", "23")
+
+        val jo = JSONObject()
+        jo.put("latitude", "2.3")
+        jo.put("longitude", "2.4")
+        jo.put("ts", "2017-08-02T14:15:01")
+        jo.put("horizAcc", "67")
+
+        val ja = JSONArray()
+        ja.put(jo)
+        ja.put(jo)
+
+        // Convert JSONObject to String
+        var jsonObjectString = ja.toString()
+
+        // Create RequestBody ( We're not using any converter, like GsonConverter, MoshiConverter e.t.c, that's why we use RequestBody )
+        val requestBody = jsonObjectString.toRequestBody("application/json".toMediaTypeOrNull())
+
+        CoroutineScope(Dispatchers.IO).launch {
+            // Do the POST request and get response
+            val response = service.uploadGPSPositions(requestBody)
+
+            withContext(Dispatchers.Main) {
+                if (response.isSuccessful) {
+
+                    // Convert raw JSON to pretty JSON using GSON library
+                    val gson = GsonBuilder().setPrettyPrinting().create()
+                    val prettyJson = gson.toJson(
+                            JsonParser.parseString(
+                                    response.body()
+                                            ?.string() // About this thread blocking annotation : https://github.com/square/retrofit/issues/3255
+                            )
+                    )
+                    Log.i("Thc", "HTTP Reply: $prettyJson")
+
+
+                } else {
+
+                    Log.e("Thc","RETROFIT_ERROR:" + response.code().toString())
+
+                }
+            }
+        }
+    }
+}