diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 7a27c04503..3dd868e56f 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -23,7 +23,6 @@ plugins { alias(libs.plugins.org.owasp.dependencycheck) alias(libs.plugins.com.diffplug.spotless) apply false alias(libs.plugins.android.junit5) apply false - } tasks.dokkaHtmlMultiModule { @@ -35,6 +34,8 @@ tasks.dokkaHtmlMultiModule { } } +apply(from = "mapbox.gradle.kts") + allprojects { repositories { gradlePluginPortal() @@ -42,14 +43,12 @@ allprojects { google() mavenCentral() maven(url = "https://oss.sonatype.org/content/repositories/snapshots") + maven(url = "https://s01.oss.sonatype.org/content/repositories/snapshots") maven(url = "https://jcenter.bintray.com/") apply(plugin = "org.owasp.dependencycheck") tasks.dependencyCheckAggregate{ dependencyCheck.formats.add("XML") } - configurations.all{ - resolutionStrategy.force ("com.google.android.gms:play-services-location:19.0.1") - } } } diff --git a/android/geowidget/src/main/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragment.kt b/android/geowidget/src/main/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragment.kt index e7c2f59587..ece0226525 100644 --- a/android/geowidget/src/main/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragment.kt +++ b/android/geowidget/src/main/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragment.kt @@ -34,6 +34,7 @@ import com.mapbox.geojson.MultiPoint import com.mapbox.geojson.Point import com.mapbox.mapboxsdk.Mapbox import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException import com.mapbox.mapboxsdk.geometry.LatLngBounds import com.mapbox.mapboxsdk.maps.Style import com.mapbox.mapboxsdk.style.expressions.Expression @@ -91,7 +92,13 @@ class GeoWidgetFragment : Fragment() { savedInstanceState: Bundle?, ): View { Mapbox.getInstance(requireContext(), BuildConfig.MAPBOX_SDK_TOKEN) - return setupViews() + val view = setupViews() + mapView.onCreate(savedInstanceState) + return view + } + + fun setKujakuMapview(kujakuMapView: KujakuMapView) { + mapView = kujakuMapView } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -124,24 +131,29 @@ class GeoWidgetFragment : Fragment() { } private fun setUpMapView(): KujakuMapView { - return KujakuMapView(requireActivity()).apply { - id = R.id.kujaku_widget - val builder = Style.Builder().fromUri(context.getString(R.string.style_map_fhir_core)) - getMapAsync { mapboxMap -> - mapboxMap.setStyle(builder) { style -> - geoJsonSource = style.getSourceAs(context.getString(R.string.data_set_quest)) - addIconsLayer(style) - addMapStyle(style) - if (geoJsonSource != null && featureCollection != null) { - geoJsonSource!!.setGeoJson(featureCollection) + return try { + KujakuMapView(requireActivity()).apply { + id = R.id.kujaku_widget + val builder = Style.Builder().fromUri(context.getString(R.string.style_map_fhir_core)) + getMapAsync { mapboxMap -> + mapboxMap.setStyle(builder) { style -> + geoJsonSource = style.getSourceAs(context.getString(R.string.data_set_quest)) + addIconsLayer(style) + addMapStyle(style) + if (geoJsonSource != null && featureCollection != null) { + geoJsonSource!!.setGeoJson(featureCollection) + } } } - } - if (showAddLocationButton) { - setOnAddLocationListener(this) + if (showAddLocationButton) { + setOnAddLocationListener(this) + } + setOnClickLocationListener(this) } - setOnClickLocationListener(this) + } catch (e: MapboxConfigurationException) { + Timber.e(e) + mapView } } diff --git a/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragmentTest.kt b/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragmentTest.kt index f0caf64fc1..7de4415728 100644 --- a/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragmentTest.kt +++ b/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetFragmentTest.kt @@ -17,6 +17,7 @@ package org.smartregister.fhircore.geowidget.screens import android.os.Build +import android.os.Bundle import com.mapbox.geojson.FeatureCollection import com.mapbox.mapboxsdk.style.sources.GeoJsonSource import dagger.hilt.android.testing.HiltAndroidRule @@ -75,7 +76,7 @@ class GeoWidgetFragmentTest { } @Test - fun test_add_and_cancel_location_points() { + fun testAddAndCancelLocationPoints() { // Mock dependencies val mockFeatureCollection = mockk(relaxed = true) val mockGeoJsonSource = mockk(relaxed = true) @@ -89,4 +90,28 @@ class GeoWidgetFragmentTest { // Verify mocks verify { kujakuMapView.addPoint(any(), any()) } } + + @Test + fun testOnCreateViewAddsSavedStateToMapView() { + val activity = Robolectric.buildActivity(GeoWidgetTestActivity::class.java).create().get() + + val geowidgetFragment = GeoWidgetFragment() + + var kujakuMapView = mockk(relaxed = true) + + geowidgetFragment.setKujakuMapview(kujakuMapView) + + activity.supportFragmentManager + .beginTransaction() + .add(android.R.id.content, geowidgetFragment, "") + .commitNow() + + every { kujakuMapView.parent } returns null + + val savedInstanceBundle: Bundle = mockk() + + geowidgetFragment.onCreateView(activity.layoutInflater, null, savedInstanceBundle) + + verify { kujakuMapView.onCreate(savedInstanceBundle) } + } } diff --git a/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetTestActivity.kt b/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetTestActivity.kt index 2a7f244a83..3a0ced7ad2 100644 --- a/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetTestActivity.kt +++ b/android/geowidget/src/test/java/org/smartregister/fhircore/geowidget/screens/GeoWidgetTestActivity.kt @@ -17,6 +17,9 @@ package org.smartregister.fhircore.geowidget.screens import androidx.appcompat.app.AppCompatActivity +import dagger.hilt.android.AndroidEntryPoint +import org.smartregister.fhircore.engine.util.annotation.ExcludeFromJacocoGeneratedReport -/** Created by Ephraim Kigamba - nek.eam@gmail.com on 22-08-2022. */ +@ExcludeFromJacocoGeneratedReport +@AndroidEntryPoint class GeoWidgetTestActivity : AppCompatActivity() diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 5fc75791b8..fcdb8a2e25 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -41,7 +41,7 @@ knowledge = "0.1.0-alpha03-preview5-SNAPSHOT" kotlin = "1.9.22" kotlinx-coroutines = "1.7.3" kotlinx-serialization-json = "1.6.0" -kujaku-library = "0.9.0" +kujaku-library = "0.10.2-SNAPSHOT" ktlint = "0.50.0" leakcanary-android = "2.10" lifecycle= "2.7.0" @@ -148,7 +148,7 @@ kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx- ktlint-main = { group = "com.pinterest", name = "ktlint", version.ref = "ktlint"} ktlint-cli-ruleset = { group = "com.pinterest.ktlint", name = "ktlint-cli-ruleset-core", version.ref = "ktlint" } ktlint-rule-engine-core = { group = "com.pinterest.ktlint", name = "ktlint-rule-engine-core", version.ref = "ktlint" } -kujaku-library = { group = "io.ona.kujaku", name = "library", version.ref = "kujaku-library" } +kujaku-library = { group = "io.ona.kujaku", name ="library", version.ref = "kujaku-library" } leakcanary-android = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "leakcanary-android" } lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" } lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } diff --git a/android/mapbox.gradle.kts b/android/mapbox.gradle.kts new file mode 100644 index 0000000000..cee1cefe39 --- /dev/null +++ b/android/mapbox.gradle.kts @@ -0,0 +1,32 @@ +import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.InputStreamReader +import java.util.Properties + +fun readProperties(file: String): Properties { + val properties = Properties() + val localProperties = File(file) + if (localProperties.isFile) { + InputStreamReader(FileInputStream(localProperties), Charsets.UTF_8).use { reader + -> + properties.load(reader) + } + } + else throw FileNotFoundException("\u001B[34mFile $file not found\u001B[0m") + + return properties +} + +val mapboxSdkToken = System.getenv("MAPBOX_SDK_TOKEN") ?: readProperties((project.properties["localPropertiesFile"] ?: "${rootProject.projectDir}/local.properties").toString()).getProperty("MAPBOX_SDK_TOKEN") + +allprojects { + repositories { + maven { + url = uri("https://api.mapbox.com/downloads/v2/releases/maven") + credentials.username = "mapbox" + credentials.password = mapboxSdkToken + authentication.create("basic") + } + } +} \ No newline at end of file