diff --git a/app/build.gradle b/app/build.gradle index f9cfa9d..486ef27 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,5 +57,6 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.7.2' + implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2' } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/converters/Converters.kt b/app/src/main/java/uca/baptistearthur/geocaching/converters/Converters.kt index aee4f74..3014669 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/converters/Converters.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/converters/Converters.kt @@ -1,14 +1,16 @@ package uca.baptistearthur.geocaching.converters -import android.os.Build -import androidx.annotation.RequiresApi +import android.util.Log import androidx.room.TypeConverter import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import org.osmdroid.util.GeoPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import uca.baptistearthur.geocaching.model.Address import uca.baptistearthur.geocaching.model.Place import uca.baptistearthur.geocaching.model.RoadTripEntity -import java.time.format.DateTimeFormatter import java.util.* class Converters { @@ -23,13 +25,13 @@ class Converters { } @TypeConverter - fun toString(places: List): String { + fun toString(places: List): String { return Gson().toJson(places) } @TypeConverter - fun toPlaces(value: String): List { - val listType = object : TypeToken>() {}.type + fun toPlaces(value: String): List { + val listType = object : TypeToken>() {}.type return Gson().fromJson(value, listType) } diff --git a/app/src/main/java/uca/baptistearthur/geocaching/data/Stub.kt b/app/src/main/java/uca/baptistearthur/geocaching/data/Stub.kt index 3cf4b06..9ba0996 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/data/Stub.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/data/Stub.kt @@ -1,6 +1,7 @@ package uca.baptistearthur.geocaching.data import org.osmdroid.util.GeoPoint +import uca.baptistearthur.geocaching.model.Address import uca.baptistearthur.geocaching.model.Place import uca.baptistearthur.geocaching.model.RoadTripEntity import java.util.Date @@ -12,25 +13,25 @@ class Stub { 1, "France", Date(), - listOf(GeoPoint(49.3, 49.3)).toMutableList() + listOf(Place(49.3, 49.3)).toMutableList() ), RoadTripEntity( 2, "Italie", Date(), - listOf(GeoPoint(48.866667, 2.34533), GeoPoint(98.866667, 2.333333)).toMutableList() + listOf(Place(48.866667, 2.34533), Place(98.866667, 2.333333)).toMutableList() ), RoadTripEntity( 3, "Danemark", Date(), - listOf(GeoPoint(48.866667, 2.333333), GeoPoint(48.866667, 2.333333)).toMutableList() + listOf(Place(48.866667, 2.333333), Place(48.866667, 2.333333)).toMutableList() ), RoadTripEntity( 4, "Islande", Date(), - listOf(GeoPoint(48.866667, 2.333333), GeoPoint(48.866667, 2.333333), GeoPoint(48.866667, 2.333333)).toMutableList() + listOf(Place(48.866667, 2.333333), Place(48.866667, 2.333333), Place(48.866667, 2.333333)).toMutableList() ), ) return list.toMutableList() diff --git a/app/src/main/java/uca/baptistearthur/geocaching/model/Address.kt b/app/src/main/java/uca/baptistearthur/geocaching/model/Address.kt new file mode 100644 index 0000000..4670812 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/model/Address.kt @@ -0,0 +1,5 @@ +package uca.baptistearthur.geocaching.model + +data class Address( + val country: String, + val displayName: String) \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt b/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt index 9a49d28..8c5b8bf 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt @@ -1,6 +1,18 @@ package uca.baptistearthur.geocaching.model +import android.util.Log +import kotlinx.coroutines.* +import org.osmdroid.util.GeoPoint +import uca.baptistearthur.geocaching.network.AddressNetwork -data class Place( - val latitude: Double, - val longitude: Double -) +class Place(private val lat: Double, + private val lon: Double, + var address: Address = Address("unknown", "unknown")) + : GeoPoint(lat, lon){ + suspend fun initAddress() { + AddressNetwork.retrofit.let { + CoroutineScope(Dispatchers.IO).async { + address = it.getAddress(lat, lon) + }.await() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTripEntity.kt b/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTripEntity.kt index 009d5e3..f052044 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTripEntity.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTripEntity.kt @@ -1,5 +1,6 @@ package uca.baptistearthur.geocaching.model +import android.provider.Telephony.Mms.Addr import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey @@ -12,10 +13,10 @@ class RoadTripEntity( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name="name") val name: String, @ColumnInfo(name="date") val date: Date, - @ColumnInfo(name="places") val places: MutableList + @ColumnInfo(name="places") val places: MutableList ){ - fun addPlaceToRoadTripList(place: GeoPoint) = places.add(place) - fun addPlaceToRoadTripList(latitude: Double, longitude: Double) = places.add(GeoPoint(latitude, longitude)) + fun addPlaceToRoadTripList(place: Place) = places.add(place) + fun addPlaceToRoadTripList(latitude: Double, longitude: Double) = places.add(Place(latitude, longitude)) fun toJSON(): String = Gson().toJson(this) } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/network/AddressAPI.kt b/app/src/main/java/uca/baptistearthur/geocaching/network/AddressAPI.kt new file mode 100644 index 0000000..100aca2 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/network/AddressAPI.kt @@ -0,0 +1,15 @@ +package uca.baptistearthur.geocaching.network + +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.Query +import uca.baptistearthur.geocaching.model.Address + +interface AddressAPI { + @GET("/v1/reverse") + suspend fun getAddress( + @Query("lat") lat: Double, + @Query("lon") lon: Double + ): Address +} \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/network/AddressDeserializer.kt b/app/src/main/java/uca/baptistearthur/geocaching/network/AddressDeserializer.kt new file mode 100644 index 0000000..d823d67 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/network/AddressDeserializer.kt @@ -0,0 +1,22 @@ +package uca.baptistearthur.geocaching.network + +import android.util.Log +import com.google.gson.JsonDeserializationContext +import com.google.gson.JsonDeserializer +import com.google.gson.JsonElement +import uca.baptistearthur.geocaching.model.Address +import java.lang.reflect.Type + +class AddressDeserializer : JsonDeserializer
{ + + override fun deserialize( + json: JsonElement?, + typeOfT: Type?, + context: JsonDeserializationContext? + ): Address = json?.asJsonObject!!.let{ + Address( + it.get("address").asJsonObject.get("country").asString, + it.get("display_name").asString + ) + } +} diff --git a/app/src/main/java/uca/baptistearthur/geocaching/network/AddressNetwork.kt b/app/src/main/java/uca/baptistearthur/geocaching/network/AddressNetwork.kt new file mode 100644 index 0000000..931cd36 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/network/AddressNetwork.kt @@ -0,0 +1,43 @@ +package uca.baptistearthur.geocaching.network + +import com.google.gson.GsonBuilder +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Converter +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import uca.baptistearthur.geocaching.model.Address +import java.lang.reflect.Type + + +object AddressNetwork { + private val base_url = "https://forward-reverse-geocoding.p.rapidapi.com/v1/reverse/" + private val key = "19516a9900mshce10de76f99976bp10f192jsn8c8d82222baa" + + private val interceptor = HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BODY + } + + private val gson = GsonBuilder().apply { + registerTypeAdapter(Address::class.java, AddressDeserializer()) + }.create() + + private val client = OkHttpClient.Builder() + .addInterceptor { chain -> + val request = chain.request().newBuilder() + .addHeader("X-RapidAPI-Key", key) + .build() + chain.proceed(request) + } + .addInterceptor(interceptor) + .build() + + val retrofit: AddressAPI by lazy { + Retrofit.Builder() + .baseUrl(base_url) + .client(client) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build() + .create(AddressAPI::class.java) + } + } diff --git a/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/PlacesAdapter.kt b/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/PlacesAdapter.kt index de3570f..20303bf 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/PlacesAdapter.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/recyclerview/PlacesAdapter.kt @@ -6,7 +6,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.osmdroid.util.GeoPoint import uca.baptistearthur.geocaching.R -import uca.baptistearthur.geocaching.model.Place class PlacesAdapter (val places: List) : RecyclerView.Adapter(){ diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt index ed7df80..5a4f2b7 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt @@ -2,12 +2,16 @@ package uca.baptistearthur.geocaching.ui.activity import android.annotation.SuppressLint import android.os.Bundle +import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.ui.NavigationUI import androidx.navigation.ui.setupWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView +import kotlinx.coroutines.* import uca.baptistearthur.geocaching.R +import uca.baptistearthur.geocaching.network.AddressAPI +import uca.baptistearthur.geocaching.network.AddressNetwork class MainWindow: AppCompatActivity() { diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt index e03a433..fb6ee20 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt @@ -1,38 +1,21 @@ package uca.baptistearthur.geocaching.ui.fragment -import android.content.Context -import android.content.pm.PackageManager -import android.location.LocationManager import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import org.osmdroid.config.Configuration import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.ScaleBarOverlay -import android.Manifest.permission.ACCESS_FINE_LOCATION -import android.location.Location -import android.location.LocationListener import android.util.Log -import android.widget.ProgressBar -import androidx.activity.result.contract.ActivityResultContracts import org.osmdroid.bonuspack.routing.OSRMRoadManager -import org.osmdroid.bonuspack.routing.RoadManager -import org.osmdroid.config.IConfigurationProvider -import org.osmdroid.library.BuildConfig import org.osmdroid.tileprovider.tilesource.TileSourceFactory -import org.osmdroid.tileprovider.util.StorageUtils.getStorage import org.osmdroid.views.overlay.compass.CompassOverlay import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider -import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider -import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay import uca.baptistearthur.geocaching.R -import uca.baptistearthur.geocaching.model.Place import uca.baptistearthur.geocaching.ui.overlay.AddMarkerOverlay -import uca.baptistearthur.geocaching.ui.overlay.RecenterOverlay open class Map : Fragment() { protected lateinit var map : MapView @@ -71,7 +54,6 @@ open class Map : Fragment() { // Add Marker Overlay val addMarker = AddMarkerOverlay(OSRMRoadManager(context, userAgent)) map.overlays.add(addMarker); - addMarker.addPlaces(listOf(GeoPoint(50.5, 10.1), GeoPoint(52.5, 33.33), GeoPoint(66.0, 33.35)), map) } override fun onCreateView( diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt index 63ca18e..131800a 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt @@ -14,7 +14,6 @@ import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay import org.osmdroid.views.overlay.Polyline import uca.baptistearthur.geocaching.R -import uca.baptistearthur.geocaching.model.Place class AddMarkerOverlay(val roadManager: RoadManager) : Overlay() { diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt index 131134c..38bb090 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt @@ -12,11 +12,15 @@ import android.view.MotionEvent import android.widget.EditText import android.widget.Toast import androidx.core.content.ContextCompat +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay import uca.baptistearthur.geocaching.R +import uca.baptistearthur.geocaching.model.Address import uca.baptistearthur.geocaching.model.Place import uca.baptistearthur.geocaching.model.RoadTripEntity import java.util.* @@ -76,7 +80,13 @@ class NewRoadtripOverlay(val points: Collection) : Overlay() { .setPositiveButton(R.string.confirm) { _, _ -> val userInput = input.text.toString() if (userInput.isNotBlank()) { - val places: MutableList = points.map { GeoPoint(it.position.latitude, it.position.longitude) }.toMutableList() + val places: MutableList = points.map { Place(it.position.latitude, it.position.longitude) }.toMutableList() + CoroutineScope(Dispatchers.Main).launch { + places.forEach{ + it.initAddress() + Log.d("GeoMap", it.address.displayName) + } + } val newRoadTrip = RoadTripEntity( id = 0, // auto-generated ID name = input.text.toString(), diff --git a/app/src/main/res/layout/roadtrip_detail.xml b/app/src/main/res/layout/roadtrip_detail.xml index da576aa..27d5de1 100644 --- a/app/src/main/res/layout/roadtrip_detail.xml +++ b/app/src/main/res/layout/roadtrip_detail.xml @@ -29,15 +29,17 @@ android:textColor="@color/main_turquoise_50" android:textSize="15sp" android:paddingLeft="10dp" + android:paddingRight="10dp" android:paddingBottom="5dp"/> - + android:layout_weight="1" />