Skip to content

Commit

Permalink
Return of the open map feature
Browse files Browse the repository at this point in the history
  • Loading branch information
Antoine Robiez committed Mar 15, 2024
1 parent d454bf5 commit ac3a572
Show file tree
Hide file tree
Showing 11 changed files with 82 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -295,19 +295,5 @@ private fun AVALayoutPreview() {


fun openMap(context: Context, coordinates: String?, name: String) {
val venueCoordinatesUri = Uri.parse(
"geo:" + coordinates +
"?q=" + Uri.encode(name)
)
try {
val intent = Intent(Intent.ACTION_VIEW, venueCoordinatesUri)
context.startActivity(intent)
} catch (e: Exception) {
Toast.makeText(context, R.string.no_maps_app_found, Toast.LENGTH_SHORT).show()
// Open in Webview
CustomTabUtil.openChromeTab(
context,
"https://www.google.com/maps/?q=" + coordinates?.replace(" ", "")
)
}

}
32 changes: 1 addition & 31 deletions iosApp/RobotConf/UI/Location/LocationVenueView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,20 +44,7 @@ struct LocationVenueView: View {
.padding(.horizontal, 8)

Button(stringResource(MR.strings().locations)) {
if let coordinates = content.clCoordinates {
let placemark = MKPlacemark(coordinate: coordinates)
let mapItem = MKMapItem(placemark: placemark)
mapItem.name = content.name
mapItem.openInMaps()
} else {
let geoCoder = CLGeocoder()
geoCoder.geocodeAddressString(content.address) { (placemarks, error) in
guard let placemark = placemarks?.first else { return }
let mapItem = MKMapItem(placemark: MKPlacemark(placemark: placemark))
mapItem.name = content.name
mapItem.openInMaps()
}
}

}.padding(.vertical, 8)
.padding(.horizontal, 16)
.foregroundColor(Color.primary)
Expand All @@ -84,20 +71,3 @@ struct LocationVenueView_Previews: PreviewProvider {
}
#endif

extension LocationVenueViewModel.Content {
var clCoordinates: CLLocationCoordinate2D? {
get {
let coords = coordinates?.split(separator: ",") ?? []
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.numberStyle = .decimal
if coords.count == 2,
let latitude = formatter.number(from: String(coords[0]))?.doubleValue,
let longitude = formatter.number(from: String(coords[1]))?.doubleValue {
return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
} else {
return nil
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.androidmakers.di

import fr.androidmakers.domain.interactor.OpenMapUseCase
import fr.androidmakers.domain.utils.UrlOpener
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module
Expand All @@ -8,4 +9,6 @@ actual val domainPlatformModule = module {
single {
UrlOpener(androidContext())
}

factory { OpenMapUseCase(get(), get()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import fr.androidmakers.domain.interactor.GetFavoriteSessionsUseCase
import fr.androidmakers.domain.interactor.GetPartnersUseCase
import fr.androidmakers.domain.interactor.OpenCocUseCase
import fr.androidmakers.domain.interactor.OpenFaqUseCase
import fr.androidmakers.domain.interactor.OpenMapUseCase
import fr.androidmakers.domain.interactor.OpenPartnerLinkUseCase
import fr.androidmakers.domain.interactor.OpenXAccountUseCase
import fr.androidmakers.domain.interactor.OpenXHashtagUseCase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package fr.androidmakers.di

import fr.androidmakers.domain.interactor.OpenMapUseCase
import fr.androidmakers.domain.utils.UrlOpener
import org.koin.dsl.module

actual val domainPlatformModule = module {
single {
UrlOpener()
}

factory { OpenMapUseCase() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package fr.androidmakers.domain.interactor

import android.content.Context
import android.content.Intent
import android.net.Uri
import fr.androidmakers.domain.utils.UrlOpener

actual class OpenMapUseCase(
private val context: Context,
private val urlOpener: UrlOpener
) {
actual operator fun invoke(coordinates: String, name: String) {
val venueCoordinatesUri = Uri.parse(
"geo:" + coordinates +
"?q=" + Uri.encode(name)
)
try {
val intent = Intent(Intent.ACTION_VIEW, venueCoordinatesUri)
context.startActivity(intent)
} catch (e: Exception) {
// Open in Webview
urlOpener.openUrl(
url = "https://www.google.com/maps/?q=" + coordinates.replace(" ", "")
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package fr.androidmakers.domain.interactor

expect class OpenMapUseCase {
operator fun invoke(coordinates: String, name: String)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package fr.androidmakers.domain.interactor

import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.NativePtr
import kotlinx.cinterop.cValuesOf
import kotlinx.cinterop.objcPtr
import platform.CoreLocation.CLGeocoder
import platform.CoreLocation.CLLocationCoordinate2D
import platform.CoreLocation.CLLocationCoordinate2DMake
import platform.CoreLocation.CLLocationDegrees
import platform.Foundation.NSLocale
import platform.Foundation.NSNumberFormatter
import platform.Foundation.NSNumberFormatterDecimalStyle
import platform.Foundation.NSNumberFormatterStyle
import platform.MapKit.MKMapItem
import platform.MapKit.MKPlacemark

actual class OpenMapUseCase {
@OptIn(ExperimentalForeignApi::class)
actual operator fun invoke(coordinates: String, name: String) {
val coordinateArray = coordinates.split(",")
if (coordinateArray.size == 2) {
val latitude = coordinateArray[0].toDoubleOrNull()
val longitude = coordinateArray[1].toDoubleOrNull()
if (latitude != null && longitude != null) {
val coordinate = CLLocationCoordinate2DMake(latitude, longitude)
val placemark = MKPlacemark(coordinate, addressDictionary = null)
val mapItem = MKMapItem(placemark)
mapItem.name = name
mapItem.openInMapsWithLaunchOptions(emptyMap<Any?, Any>())
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import org.koin.dsl.module
val viewModelModule = module {
factory { SpeakerListViewModel(get()) }
factory { SponsorsViewModel(get()) }
factory { VenueViewModel(get(), get()) }
factory { VenueViewModel(get(), get(), get()) }


}
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,9 @@ fun VenuePager() {
)
VenueLayout(
uiVenue = uiVenue,
onClickOnMap = {}
onClickOnMap = {
viewModel.openMapUseCase(uiVenue.coordinates ?: "", uiVenue.name)
}
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package com.androidmakers.ui.venue

import fr.androidmakers.domain.interactor.GetAfterpartyVenueUseCase
import fr.androidmakers.domain.interactor.GetConferenceVenueUseCase
import fr.androidmakers.domain.interactor.OpenMapUseCase
import moe.tlaster.precompose.viewmodel.ViewModel


class VenueViewModel(
val getConferenceVenueUseCase: GetConferenceVenueUseCase,
val getAfterpartyVenueUseCase: GetAfterpartyVenueUseCase
val getAfterpartyVenueUseCase: GetAfterpartyVenueUseCase,
val openMapUseCase: OpenMapUseCase,
): ViewModel() {
// NOTHING for the moment
}

0 comments on commit ac3a572

Please sign in to comment.