Richtige Verwendung der Google API (Navigation) in einer sauberen Android-ArchitekturAndroid

Forum für diejenigen, die für Android programmieren
Guest
 Richtige Verwendung der Google API (Navigation) in einer sauberen Android-Architektur

Post by Guest »

Ich habe eine Frage zur Verwendung von Google APIs (in meinem Fall NavigationAPI) in einer sauberen Architektur.
Um die Google-Navigation verwenden zu können, ist ein Navigator-Objekt von NavigationApi erforderlich. getNavigator-API.
Anfangs dachte ich, dass es in Ordnung ist, alle notwendigen Implementierungen in der DATA-Schicht unterzubringen, diese Schicht soll jedoch nur Daten (lokal, remote) enthalten und den Zugriff darauf ermöglichen. Dann ist Navigator jedoch stark von SupportNavigationFragment abhängig, das sich in der Präsentationsebene befindet. Wie wir wissen, sollten niedrigere Schichten nicht von höheren Schichten abhängen.
Als nächstes dachte ich, dass alle erwähnten Implementierungen in Fragment verschoben werden sollten, aber ich bin nicht 100 % sicher, ob das richtig ist auch wenn es vernünftig klingt. Hat jemand Erfahrung mit Google API in Clean Arch?
Funktionalität, die ich benötige:

Code: Select all

private var navigator: Navigator? = null

override fun initializeNavigator(activity: FragmentActivity) {
NavigationApi.getNavigator(activity, object : NavigationApi.NavigatorListener {
override fun onNavigatorReady(navigator: Navigator?) {
navigator = navigator
addListeners()
}

override fun onError(errorCode: Int) {
handleError(errorCode)
}
})
}

override fun startNavigation() {
navigator?.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE)
navigator?.startGuidance()
}

override fun stopNavigation() {
navigator?.stopGuidance()
navigator?.clearDestinations()
}

override fun getRouteSummary(waypoint: Waypoint, options: RoutingOptions) = callbackFlow {
navigator?.let { navigator ->
val pendingRoute = navigator.setDestination(waypoint, options)
pendingRoute.setOnResultListener { code ->
_navigationStateFlow.value = NavigationState.SUMMARY
val result = trySend(
NavigationSummary(
response = code,
meters = navigator.currentTimeAndDistance.meters,
seconds = navigator.currentTimeAndDistance.seconds
)
)
}

awaitClose {
…
}
}
}

private fun addListeners() {
val arrivalListener = Navigator.ArrivalListener {
navigator?.clearDestinations()
}
navigator?.addArrivalListener(arrivalListener)

val routeChangedListener = Navigator.RouteChangedListener {
…
}
navigator?.addRouteChangedListener(routeChangedListener)
}

private fun handleError(errorCode: Int) {
when (errorCode) {
NavigationApi.ErrorCode.NOT_AUTHORIZED -> {
…
}

NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED -> {
...
}

NavigationApi.ErrorCode.NETWORK_ERROR -> {
…
}

NavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING -> {
…
}

else -> {
...
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post