From 43912252cff8dcbe9a71ce4369fd5565ef449fac Mon Sep 17 00:00:00 2001 From: Martin Ndegwa Date: Mon, 29 Jul 2024 15:43:15 +0300 Subject: [PATCH] =?UTF-8?q?Upgrade=20depdencies=20+=20Migration=20refactor?= =?UTF-8?q?=20=E2=AC=86=EF=B8=8F=20=E2=99=BB=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- build.gradle | 34 ++-- configs.gradle | 2 +- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- jacoco-report.gradle | 32 ++++ library/build.gradle | 45 ++--- library/src/main/AndroidManifest.xml | 1 - .../java/io/ona/kujaku/KujakuLibrary.java | 5 +- .../ona/kujaku/data/realm/RealmDatabase.java | 5 +- .../io/ona/kujaku/tasks/GenericAsyncTask.java | 4 +- .../java/io/ona/kujaku/utils/LogUtil.java | 4 +- library/src/main/res/values/colors.xml | 1 + .../MapboxOfflineDownloaderServiceTest.java | 1 - .../kujaku/services/TrackingServiceTest.java | 69 ++++---- publish.gradle | 14 +- sample/build.gradle | 50 ++---- .../io/ona/kujaku/sample/MyApplication.java | 6 +- .../BaseNavigationDrawerActivity.java | 4 + .../activities/CGRIntegrationActivity.java | 3 +- .../sample/repository/BaseRepository.java | 5 +- .../sample/repository/KujakuRepository.java | 43 +---- .../sample/repository/PointsRepository.java | 7 +- .../res/layout/mapbox_mapview_internal.xml | 163 ++++++++++++++++++ sample/src/main/res/values/colors.xml | 2 + utils/build.gradle | 35 +--- .../kujaku/helpers/MapBoxStyleHelperTest.java | 3 - .../utils/config/DataSourceConfigTest.java | 5 - .../utils/config/InfoWindowConfigTest.java | 2 - .../kujaku/utils/config/KujakuConfigTest.java | 5 - .../utils/config/SortFieldConfigTest.java | 6 +- 31 files changed, 328 insertions(+), 233 deletions(-) create mode 100644 jacoco-report.gradle create mode 100644 sample/src/main/res/layout/mapbox_mapview_internal.xml diff --git a/README.md b/README.md index 6a3f6f7db..1950bc989 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Kujaku (Peacock) ![Build Status](https://github.com/onaio/kujaku/actions/workflows/ci.yml/badge.svg) ![Download](https://badgen.net/maven/v/maven-central/io.ona.kujaku/library) [![Coverage Status](https://coveralls.io/repos/github/onaio/kujaku/badge.svg)](https://coveralls.io/github/onaio/kujaku) -A mapping and check-in library for Android using **MapBox SDK (Version 8.3.3)** +A mapping and check-in library for Android using **MapBox SDK (Version 9.7.1)** ## IMPORTANT UPDATE diff --git a/build.gradle b/build.gradle index 7457e1ccb..c4c41fa2f 100644 --- a/build.gradle +++ b/build.gradle @@ -3,18 +3,16 @@ buildscript { repositories { google() - jcenter() mavenCentral() maven{ url "https://plugins.gradle.org/m2/" } } dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' + classpath 'com.android.tools.build:gradle:8.4.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' - classpath 'gradle.plugin.org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.12.0' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.1' + classpath 'gradle.plugin.org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.12.2' + classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2' //classpath 'com.palantir:jacoco-coverage:0.4.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -27,10 +25,10 @@ apply from: 'configs.gradle' allprojects { repositories { google() - jcenter() mavenCentral() mavenLocal() maven { url "https://jitpack.io" } + maven { url "https://repository.liferay.com/nexus/content/repositories/public" } maven { url "https://dl.cloudsmith.io/public/terraframe/geoprism-registry/maven/" } @@ -61,7 +59,7 @@ task clean(type: Delete) { apply plugin: 'java' coveralls { - jacocoReportPath = "${buildDir}/reports/jacoco/jacocoFullReport/jacocoFullReport.xml" + jacocoReportPath = layout.buildDirectory.dir("reports/jacoco/jacocoFullReport/jacocoFullReport.xml") sourceDirs += ["utils/src/main/java" , "library/src/main/java" , "sample/src/main/java" @@ -69,6 +67,19 @@ coveralls { } task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') { + + mustRunAfter ":library:testDebugUnitTest" + mustRunAfter ":utils:testDebugUnitTest" + mustRunAfter ":sample:testDebugUnitTest" + + mustRunAfter ":library:connectedDebugAndroidTest" + mustRunAfter ":utils:connectedDebugAndroidTest" + mustRunAfter ":sample:connectedDebugAndroidTest" + + mustRunAfter ":library:jacocoTestReport" + mustRunAfter ":utils:jacocoTestReport" + mustRunAfter ":sample:jacocoTestReport" + description = 'Generates an aggregate report from all subprojects' additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs) @@ -97,12 +108,11 @@ task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') { sourceDirectories.from = sourcePaths classDirectories.from = classPaths - getReports().getXml().setDestination(file("${buildDir}/reports/jacoco/jacocoFullReport/jacocoFullReport.xml")) - getReports().getHtml().setDestination(file("${buildDir}/reports/jacoco/jacocoFullReport/html")) - reports { - html.enabled true - xml.enabled true + xml.required.set(true) + html.required.set(true) + xml.outputLocation = layout.buildDirectory.file("reports/jacoco/jacocoFullReport/jacocoFullReport.xml") + html.outputLocation = layout.buildDirectory.dir("reports/jacoco/jacocoFullReport/html") } jacocoClasspath = files(jacocoClasspathPaths) diff --git a/configs.gradle b/configs.gradle index e5fe9db7d..b95df6d08 100644 --- a/configs.gradle +++ b/configs.gradle @@ -112,7 +112,7 @@ ext { robolectricShadowsMultidexVersion = "4.13" robolectricVersion = "4.13" supportVersion = "1.0.0" - volleyVersion = "1.2.0" + volleyVersion = "1.2.1" targetSdkVersion = 34 // Dependency names diff --git a/gradle.properties b/gradle.properties index 1dc978101..350875f4e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,6 +31,7 @@ POM_SETTING_DEVELOPER_ID=opensrp POM_SETTING_DEVELOPER_NAME=OpenSRP Onadev android.useAndroidX=true android.enableJetifier=true +android.nonFinalResIds=false android.jetifier.ignorelist=shadows,bcprov-jdk18on #android.jetifier.blacklist=shadows,bcprov-jdk15on diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 28c8d73df..8e9ae2342 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun Aug 21 19:58:31 EAT 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/jacoco-report.gradle b/jacoco-report.gradle new file mode 100644 index 000000000..9d95776c3 --- /dev/null +++ b/jacoco-report.gradle @@ -0,0 +1,32 @@ +// createDebugCoverageReport is not available when android.buildTypes.debug.testCoverageEnabled is false +task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'connectedDebugAndroidTest']) { + //, 'createDebugCoverageReport']) { + + reports { + xml.required.set(true) + html.required.set(true) + xml.outputLocation = layout.buildDirectory.file("reports/jacoco/jacocoRootReport/merged.xml") + html.outputLocation = layout.buildDirectory.dir("reports/jacoco/jacocoRootReport/html") + } + + def fileFilter = [ + "**/R.class", + "**/R\$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "**/*Test*.*", + "android/**/*.*", + "io/realm/*.*", + "**/org/mockito/**", + "**/mockito-extensions/**"] + def debugTree = fileTree(dir: layout.buildDirectory.file("intermediates/javac/debug/compileDebugJavaWithJavac/classes/"), excludes: fileFilter) + def mainSrc = "${project.projectDir}/src/main/java" + + sourceDirectories.setFrom([mainSrc]) + classDirectories.setFrom(files([debugTree])) + executionData.setFrom(fileTree(dir: layout.buildDirectory, includes: + [ + "outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec", + "outputs/code_coverage/debugAndroidTest/connected/**/coverage.ec", + ])) +} \ No newline at end of file diff --git a/library/build.gradle b/library/build.gradle index 7e1d8cfeb..cf59d3a3e 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -4,15 +4,13 @@ apply plugin: 'jacoco' buildscript { repositories { mavenCentral() - jcenter() } dependencies { - classpath "io.realm:realm-gradle-plugin:4.1.1" + classpath "io.realm:realm-gradle-plugin:10.18.0" } } apply plugin: 'realm-android' -apply plugin: 'com.jfrog.bintray' apply plugin: 'maven-publish' version '0.10.2-SNAPSHOT' @@ -25,15 +23,21 @@ jacoco { android { + namespace "io.ona.kujaku" + compileSdk rootProject.ext.compileSdkVersion + buildFeatures { + buildConfig = true + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { - minSdkVersion 19 + minSdkVersion 21 targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName this.version @@ -64,7 +68,7 @@ android { debug { // See bug https://github.com/vanniktech/gradle-android-junit-jacoco-plugin/issues/183 - testCoverageEnabled false + testCoverageEnabled true if (project.rootProject.file("local.properties").exists()) { Properties properties = new Properties() @@ -124,13 +128,13 @@ dependencies { configuration -> exclude group: 'com.android.support', module: 'support-v4' } - implementation 'androidx.appcompat:appcompat:1.0.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'com.google.android.material:material:1.12.0' implementation 'org.simpleframework:simple-xml:2.7.1' implementation 'com.jakewharton.threetenabp:threetenabp:1.1.1' implementation 'com.jakewharton.timber:timber:5.0.1' - implementation 'androidx.multidex:multidex:2.0.0' + implementation 'androidx.multidex:multidex:2.0.1' customDependencies(this, configuration) appPermissionsDependencies(configuration) @@ -154,7 +158,7 @@ private static void testDependencies(instance, configuration) { configuration.androidTestImplementation "org.mockito:mockito-android:$mockitoVersion" configuration.androidTestImplementation "org.mockito:mockito-core:$mockitoVersion" - configuration.androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.1.0', { + configuration.androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.6.1', { exclude group: 'com.android.support', module: 'support-annotations' exclude group: 'net.sf.kxml', module: 'kxml2' }) @@ -184,28 +188,7 @@ tasks.withType(Test) { jacoco.excludes = ['jdk.internal.*'] } -// createDebugCoverageReport is not available when android.buildTypes.debug.testCoverageEnabled is false -task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) { //, 'createDebugCoverageReport']) { - - reports { - xml.enabled = true - html.enabled = true - } - - getReports().getXml().setDestination(file("${buildDir}/reports/jacoco/jacocoRootReport/merged.xml")) - getReports().getHtml().setDestination(file("${buildDir}/reports/jacoco/jacocoRootReport/html")) - - def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*' - , 'android/**/*.*', "io/realm/*.*"] - def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) - def mainSrc = "${project.projectDir}/src/main/java" - - sourceDirectories.setFrom([mainSrc]) - classDirectories.setFrom(files([debugTree])) - executionData.setFrom(fileTree(dir: project.buildDir, includes: [ - 'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec' - ])) -} // Add github packages, maven-central and sonatype publishing apply from: '../publish.gradle' +apply from: '../jacoco-report.gradle' diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index e21ec3d3a..9155830c6 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ diff --git a/library/src/main/java/io/ona/kujaku/KujakuLibrary.java b/library/src/main/java/io/ona/kujaku/KujakuLibrary.java index 573a58583..25ad67557 100644 --- a/library/src/main/java/io/ona/kujaku/KujakuLibrary.java +++ b/library/src/main/java/io/ona/kujaku/KujakuLibrary.java @@ -26,9 +26,6 @@ import static android.content.Context.ALARM_SERVICE; import static timber.log.Timber.DebugTree; -/** - * @author Vincent Karuri - */ public class KujakuLibrary { private static boolean enableMapDownloadResume; @@ -63,7 +60,7 @@ public static void init(Context context) { AndroidThreeTen.init(context); if (Timber.treeCount() < 1) { - Timber.plant(new DebugTree()); + Timber.plant((Timber.Tree) (Object) new DebugTree()); } } diff --git a/library/src/main/java/io/ona/kujaku/data/realm/RealmDatabase.java b/library/src/main/java/io/ona/kujaku/data/realm/RealmDatabase.java index 3d4ac08bb..dc58fd72b 100644 --- a/library/src/main/java/io/ona/kujaku/data/realm/RealmDatabase.java +++ b/library/src/main/java/io/ona/kujaku/data/realm/RealmDatabase.java @@ -157,9 +157,10 @@ public MapBoxOfflineQueueTask getNextTask() { RealmResults realmResults = realm.where(MapBoxOfflineQueueTask.class) .equalTo("taskStatus", MapBoxOfflineQueueTask.TASK_STATUS_NOT_STARTED) - .findAllSorted("dateUpdated", Sort.ASCENDING); + .sort("dateUpdated", Sort.ASCENDING) + .findAll(); - if (realmResults.size() > 0) { + if (!realmResults.isEmpty()) { return realmResults.first(); } diff --git a/library/src/main/java/io/ona/kujaku/tasks/GenericAsyncTask.java b/library/src/main/java/io/ona/kujaku/tasks/GenericAsyncTask.java index a6d92358f..9e86af226 100644 --- a/library/src/main/java/io/ona/kujaku/tasks/GenericAsyncTask.java +++ b/library/src/main/java/io/ona/kujaku/tasks/GenericAsyncTask.java @@ -16,17 +16,15 @@ public class GenericAsyncTask { private final AsyncTaskCallable toCall; private OnFinishedListener onFinishedListener; - private ExecutorService executorService; - public GenericAsyncTask(@NonNull AsyncTaskCallable toCall) { this.toCall = toCall; } public void execute() { + ExecutorService executorService = Executors.newSingleThreadExecutor(); try { - executorService = Executors.newSingleThreadExecutor(); Future result = executorService.submit(toCall); diff --git a/library/src/main/java/io/ona/kujaku/utils/LogUtil.java b/library/src/main/java/io/ona/kujaku/utils/LogUtil.java index 20540de75..ab23b2749 100644 --- a/library/src/main/java/io/ona/kujaku/utils/LogUtil.java +++ b/library/src/main/java/io/ona/kujaku/utils/LogUtil.java @@ -2,9 +2,7 @@ import android.util.Log; -/** - * Created by Ephraim Kigamba - ekigamba@ona.io on 31/07/2018 - */ +import io.ona.kujaku.BuildConfig; public class LogUtil { diff --git a/library/src/main/res/values/colors.xml b/library/src/main/res/values/colors.xml index a862c58d9..d761eaae2 100644 --- a/library/src/main/res/values/colors.xml +++ b/library/src/main/res/values/colors.xml @@ -6,4 +6,5 @@ #2979FF #3498db #ffffff + #1E8CAB diff --git a/library/src/test/java/io/ona/kujaku/services/MapboxOfflineDownloaderServiceTest.java b/library/src/test/java/io/ona/kujaku/services/MapboxOfflineDownloaderServiceTest.java index 350602bc8..4d1ef5131 100644 --- a/library/src/test/java/io/ona/kujaku/services/MapboxOfflineDownloaderServiceTest.java +++ b/library/src/test/java/io/ona/kujaku/services/MapboxOfflineDownloaderServiceTest.java @@ -43,7 +43,6 @@ import java.util.UUID; import java.util.concurrent.CountDownLatch; -import io.ona.kujaku.BuildConfig; import io.ona.kujaku.data.MapBoxDeleteTask; import io.ona.kujaku.data.MapBoxDownloadTask; import io.ona.kujaku.data.realm.RealmDatabase; diff --git a/library/src/test/java/io/ona/kujaku/services/TrackingServiceTest.java b/library/src/test/java/io/ona/kujaku/services/TrackingServiceTest.java index 7c3f5971b..e6e40d76e 100644 --- a/library/src/test/java/io/ona/kujaku/services/TrackingServiceTest.java +++ b/library/src/test/java/io/ona/kujaku/services/TrackingServiceTest.java @@ -12,6 +12,7 @@ import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; @@ -111,7 +112,7 @@ public void testStartingServiceWithoutGpsProvider() { ShadowLocationManager shadowLocationManager = shadowOf(locationManager); shadowLocationManager.setProviderEnabled(GPS_PROVIDER, false); - controller.create().startCommand(0,0); + controller.create().startCommand(0, 0); assertEquals(TrackingService.TrackingServiceStatus.STOPPED_GPS, TrackingService.getTrackingServiceStatus()); @@ -127,7 +128,7 @@ public void testStartingServiceWithGpsProvider() { ShadowLocationManager shadowLocationManager = shadowOf(locationManager); shadowLocationManager.setProviderEnabled(GPS_PROVIDER, true); - controller.create().startCommand(0,0); + controller.create().startCommand(0, 0); assertEquals(TrackingService.TrackingServiceStatus.WAITING_FIRST_FIX, TrackingService.getTrackingServiceStatus()); assertTrue(TrackingService.isRunning()); @@ -171,23 +172,23 @@ public void testParcelableTrackingServiceSaveBatteryOptions() { @Test public void testTrackingServiceDefaultUiConfiguration() { - TrackingServiceDefaultUIConfiguration uiTrackingService = new TrackingServiceDefaultUIConfiguration(); - assertTrue(uiTrackingService.displayIcons()); + TrackingServiceDefaultUIConfiguration uiTrackingService = new TrackingServiceDefaultUIConfiguration(); + assertTrue(uiTrackingService.displayIcons()); - assertEquals(uiTrackingService.getBackgroundDrawable(), R.drawable.circle_button_black_border); - assertEquals(uiTrackingService.getRecordingDrawable(), R.drawable.ic_recording_red); - assertEquals(uiTrackingService.getStoppedDrawable(), R.drawable.ic_recording_gray); + assertEquals(uiTrackingService.getBackgroundDrawable(), R.drawable.circle_button_black_border); + assertEquals(uiTrackingService.getRecordingDrawable(), R.drawable.ic_recording_red); + assertEquals(uiTrackingService.getStoppedDrawable(), R.drawable.ic_recording_gray); - assertEquals(uiTrackingService.getLayoutWidth(), R.dimen.tracking_service_location_dimen); - assertEquals(uiTrackingService.getLayoutHeight(), R.dimen.tracking_service_location_dimen); + assertEquals(uiTrackingService.getLayoutWidth(), R.dimen.tracking_service_location_dimen); + assertEquals(uiTrackingService.getLayoutHeight(), R.dimen.tracking_service_location_dimen); - assertEquals(uiTrackingService.getLayoutMarginLeft(), R.dimen.tracking_service_location_margin); - assertEquals(uiTrackingService.getLayoutMarginTop(), R.dimen.tracking_service_location_margin); - assertEquals(uiTrackingService.getLayoutMarginRight(), R.dimen.tracking_service_location_margin); - assertEquals(uiTrackingService.getLayoutMarginBottom(), R.dimen.tracking_service_location_margin); + assertEquals(uiTrackingService.getLayoutMarginLeft(), R.dimen.tracking_service_location_margin); + assertEquals(uiTrackingService.getLayoutMarginTop(), R.dimen.tracking_service_location_margin); + assertEquals(uiTrackingService.getLayoutMarginRight(), R.dimen.tracking_service_location_margin); + assertEquals(uiTrackingService.getLayoutMarginBottom(), R.dimen.tracking_service_location_margin); - assertEquals(uiTrackingService.getPadding(), R.dimen.tracking_service_location_padding); - assertEquals(uiTrackingService.getLayoutGravity(), Gravity.TOP | Gravity.LEFT); + assertEquals(uiTrackingService.getPadding(), R.dimen.tracking_service_location_padding); + assertEquals(uiTrackingService.getLayoutGravity(), Gravity.TOP | Gravity.LEFT); } @Test @@ -240,9 +241,9 @@ public void testServiceWithLocationInDistanceTolerance() throws InterruptedExcep controller.get().registerTrackingServiceListener(new TrackingServiceListener() { @Override public void onFirstLocationReceived(KujakuLocation location) { - assertEquals(location.getLatitude(), locationDeparture.getLatitude(),0); - assertEquals(location.getLongitude(), locationDeparture.getLongitude(),0); - assertEquals(location.getTag(), 0,0); + assertEquals(location.getLatitude(), locationDeparture.getLatitude(), 0); + assertEquals(location.getLongitude(), locationDeparture.getLongitude(), 0); + assertEquals(location.getTag(), 0, 0); latch1.countDown(); } @@ -269,7 +270,7 @@ public void onServiceDisconnected() { } }); - controller.create().startCommand(0,0); + controller.create().startCommand(0, 0); Thread.sleep(2000); // TaskService thread waiting for running @@ -297,20 +298,20 @@ public void onServiceDisconnected() { List list = controller.get().getRecordedKujakuLocations(); assertEquals(list.size(), 4); - assertEquals(list.get(0).getLatitude(), location_1.getLatitude(),0); - assertEquals(list.get(0).getLongitude(), location_1.getLongitude(),0); + assertEquals(list.get(0).getLatitude(), location_1.getLatitude(), 0); + assertEquals(list.get(0).getLongitude(), location_1.getLongitude(), 0); - assertEquals(list.get(1).getLatitude(), location_2.getLatitude(),0); - assertEquals(list.get(1).getLongitude(), location_2.getLongitude(),0); + assertEquals(list.get(1).getLatitude(), location_2.getLatitude(), 0); + assertEquals(list.get(1).getLongitude(), location_2.getLongitude(), 0); - assertEquals(list.get(2).getLatitude(), location_3.getLatitude(),0); - assertEquals(list.get(2).getLongitude(), location_3.getLongitude(),0); + assertEquals(list.get(2).getLatitude(), location_3.getLatitude(), 0); + assertEquals(list.get(2).getLongitude(), location_3.getLongitude(), 0); - assertEquals(list.get(3).getLatitude(), locationDeparture.getLatitude(),0); - assertEquals(list.get(3).getLongitude(), locationDeparture.getLongitude(),0); + assertEquals(list.get(3).getLatitude(), locationDeparture.getLatitude(), 0); + assertEquals(list.get(3).getLongitude(), locationDeparture.getLongitude(), 0); assertEquals(list.size(), TrackingService.getCurrentRecordedKujakuLocations().size()); - controller.startCommand(0,0); + controller.startCommand(0, 0); assertEquals(list.size(), TrackingService.getPreviousRecordedKujakuLocations().size()); controller.destroy(); @@ -362,7 +363,7 @@ public long getGpsMinDistance() { ShadowLocationManager shadowLocationManager = shadowOf(locationManager); shadowLocationManager.setProviderEnabled(GPS_PROVIDER, true); - controller.create().startCommand(0,0); + controller.create().startCommand(0, 0); Thread.sleep(2000); // TaskService thread waiting for running @@ -392,11 +393,11 @@ public long getGpsMinDistance() { List list = controller.get().getRecordedKujakuLocations(); assertEquals(5, list.size()); - assertEquals(list.get(0).getTag(), startTag,0); - assertEquals(list.get(1).getTag(), takeLocationTag,0); - assertEquals(list.get(2).getTag(), nextTag,0); - assertEquals(list.get(3).getTag(), nextTag,0); - assertEquals(list.get(4).getTag(), takeLocationTag,0); + assertEquals(list.get(0).getTag(), startTag, 0); + assertEquals(list.get(1).getTag(), takeLocationTag, 0); + assertEquals(list.get(2).getTag(), nextTag, 0); + assertEquals(list.get(3).getTag(), nextTag, 0); + assertEquals(list.get(4).getTag(), takeLocationTag, 0); controller.destroy(); } diff --git a/publish.gradle b/publish.gradle index c6a5ecc67..2a31f894b 100644 --- a/publish.gradle +++ b/publish.gradle @@ -3,7 +3,7 @@ apply plugin: 'signing' task sourceJar(type: Jar) { from android.sourceSets.main.java.srcDirs - classifier "sources" + getArchiveClassifier().set("sources") } task javaDoc(type: Javadoc) { @@ -15,7 +15,7 @@ task javaDoc(type: Javadoc) { } task javadocJar(type: Jar, dependsOn: javaDoc) { - classifier = 'javadoc' + getArchiveClassifier().set('javadoc') from javaDoc.destinationDir } @@ -43,7 +43,7 @@ def getGithubPackagesAccessToken() { return hasProperty('githubAccessToken') ? githubAccessToken : System.getenv("GITHUB_ACCESS_TOKEN") != null ? System.getenv("GITHUB_ACCESS_TOKEN") : "" } -def getDate() { +static def getDate() { return new Date().format('yyyy-MM-dd HH:mm:ss') } @@ -77,10 +77,10 @@ publishing { } pom { - if (project.name.equals("utils")) { + if (project.name == "utils") { name = 'Kujaku Utils' description = 'Utilities for Mapping and check-in library for Android using MapBox SDK' - } else if (project.name.equals("library")) { + } else if (project.name == "library") { name = 'Kujaku Library' description = 'Mapping and check-in library for Android using MapBox SDK' } @@ -95,8 +95,8 @@ publishing { } developers { developer { - id = 'ekigamba' - name = 'Ephraim Kigamba' + id = 'opensrp' + name = 'OpenSRP Dev' } developer { diff --git a/sample/build.gradle b/sample/build.gradle index 5af0e0fb0..4922f2646 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -8,6 +8,12 @@ jacoco { android { + namespace "io.ona.kujaku.sample" + + buildFeatures { + buildConfig = true + } + compileSdk rootProject.ext.compileSdkVersion compileOptions { @@ -40,7 +46,7 @@ android { debug { // See bug https://github.com/vanniktech/gradle-android-junit-jacoco-plugin/issues/183 - testCoverageEnabled false + testCoverageEnabled true buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", localProperties["mapbox.sdk.token"] buildConfigField "String", "CGR_USERNAME", localProperties["cgr.username"] buildConfigField "String", "CGR_PASSWORD", localProperties["cgr.password"] @@ -67,28 +73,29 @@ dependencies { configuration -> implementation 'com.cocoahero.android:geojson:1.0.1@jar' implementation "com.android.volley:volley:${volleyVersion}" - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1', { exclude group: 'com.android.support', module: 'support-annotations' }) implementation 'com.github.GrenderG:Toasty:1.3.0' - implementation 'net.zetetic:android-database-sqlcipher:3.5.9@aar' - implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0' + implementation 'net.zetetic:sqlcipher-android:4.6.0@aar' + implementation 'androidx.sqlite:sqlite:2.4.0' + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' firebaseCrashlytics(configuration) - implementation 'androidx.appcompat:appcompat:1.0.0' - implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'com.google.android.material:material:1.12.0' - implementation 'com.jakewharton.timber:timber:4.7.1' + implementation 'com.jakewharton.timber:timber:5.0.1' - implementation ('com.cgr.adapter:cgradapter-android:0.18.1') { + implementation ('com.cgr.adapter:cgradapter-android:0.19.2') { exclude group: "com.android.support", module: "appcompat-v7" } - implementation 'androidx.multidex:multidex:2.0.0' + implementation 'androidx.multidex:multidex:2.0.1' testImplementation junit testImplementation robolectric @@ -143,25 +150,4 @@ tasks.withType(Test) { jacoco.excludes = ['jdk.internal.*'] } -// createDebugCoverageReport is not available when android.buildTypes.debug.testCoverageEnabled is false -task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) { //, 'createDebugCoverageReport']) { - - reports { - xml.enabled = true - html.enabled = true - } - - getReports().getXml().setDestination(file("${buildDir}/reports/jacoco/jacocoRootReport/merged.xml")) - getReports().getHtml().setDestination(file("${buildDir}/reports/jacoco/jacocoRootReport/html")) - - def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*' - , 'android/**/*.*', "io/realm/*.*", "io/ona/kujaku/sample/activities/*.*"] - def debugTree = fileTree(dir: "${buildDir}/intermediates/javac/debug/classes", excludes: fileFilter) - def mainSrc = "${project.projectDir}/src/main/java" - - sourceDirectories.setFrom(files([mainSrc])) - classDirectories.setFrom(files([debugTree])) - executionData.setFrom(fileTree(dir: project.buildDir, includes: [ - 'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec' - ])) -} +apply from: '../jacoco-report.gradle' diff --git a/sample/src/main/java/io/ona/kujaku/sample/MyApplication.java b/sample/src/main/java/io/ona/kujaku/sample/MyApplication.java index 902fbf2dd..7260838fc 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/MyApplication.java +++ b/sample/src/main/java/io/ona/kujaku/sample/MyApplication.java @@ -8,10 +8,6 @@ import static io.ona.kujaku.sample.util.Constants.DATABASE_NAME; -/** - * Created by Ephraim Kigamba - ekigamba@ona.io on 15/11/2017. - */ - public class MyApplication extends MultiDexApplication { private static final String TAG = MyApplication.class.getName(); @@ -31,7 +27,7 @@ public void onCreate() { KujakuLibrary.init(this); // must initialize KujakuLibrary getRepository(); // initialize KujakuRepository - Timber.plant(new Timber.DebugTree()); + Timber.plant((Timber.Tree)(Object)new Timber.DebugTree()); } public static MyApplication getInstance() { diff --git a/sample/src/main/java/io/ona/kujaku/sample/activities/BaseNavigationDrawerActivity.java b/sample/src/main/java/io/ona/kujaku/sample/activities/BaseNavigationDrawerActivity.java index 71ed4f698..3082ed462 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/activities/BaseNavigationDrawerActivity.java +++ b/sample/src/main/java/io/ona/kujaku/sample/activities/BaseNavigationDrawerActivity.java @@ -264,4 +264,8 @@ protected void setSelectedNavigationItem(@IdRes int navigationItem) { } navigationView.setCheckedItem(navigationItem); } + + public static final class RES_CONSTANTS{ + public static final int ACTION_SETTINGS = R.id.action_settings; + } } diff --git a/sample/src/main/java/io/ona/kujaku/sample/activities/CGRIntegrationActivity.java b/sample/src/main/java/io/ona/kujaku/sample/activities/CGRIntegrationActivity.java index 43bade75b..f4c836940 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/activities/CGRIntegrationActivity.java +++ b/sample/src/main/java/io/ona/kujaku/sample/activities/CGRIntegrationActivity.java @@ -42,6 +42,7 @@ import org.commongeoregistry.adapter.dataaccess.GeoObject; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; import io.ona.kujaku.callables.AsyncTaskCallable; @@ -192,7 +193,7 @@ public Object[] call() throws Exception { client.getIdService().populate(30); GeoObject country = client.getGeoObjectByCode("1", "Cambodia"); - ChildTreeNode countryChildren = client.getChildGeoObjects(country.getUid(), country.getType().getCode(), adminHierarchy, true); + ChildTreeNode countryChildren = client.getChildGeoObjects(country.getUid(), country.getType().getCode(), adminHierarchy, true, Calendar.getInstance().getTime()); return new Object[]{country, countryChildren}; } diff --git a/sample/src/main/java/io/ona/kujaku/sample/repository/BaseRepository.java b/sample/src/main/java/io/ona/kujaku/sample/repository/BaseRepository.java index 0ad1c920a..9b69481ca 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/repository/BaseRepository.java +++ b/sample/src/main/java/io/ona/kujaku/sample/repository/BaseRepository.java @@ -1,10 +1,7 @@ package io.ona.kujaku.sample.repository; -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; -/** - * @author Vincent Karuri - */ public class BaseRepository { private KujakuRepository repository; diff --git a/sample/src/main/java/io/ona/kujaku/sample/repository/KujakuRepository.java b/sample/src/main/java/io/ona/kujaku/sample/repository/KujakuRepository.java index dc8ce21b1..c282b5c36 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/repository/KujakuRepository.java +++ b/sample/src/main/java/io/ona/kujaku/sample/repository/KujakuRepository.java @@ -1,14 +1,10 @@ package io.ona.kujaku.sample.repository; import android.content.Context; -import android.util.Log; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteOpenHelper; +import net.zetetic.database.sqlcipher.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteOpenHelper; -/** - * @author Vincent Karuri - */ public class KujakuRepository extends SQLiteOpenHelper { private static final String TAG = PointsRepository.class.getName(); @@ -19,7 +15,7 @@ public class KujakuRepository extends SQLiteOpenHelper { public KujakuRepository(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, null, version); - SQLiteDatabase.loadLibs(context); // this must be added + System.loadLibrary("sqlcipher"); } @Override @@ -37,39 +33,6 @@ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVers } - public SQLiteDatabase getReadableDatabase() { - return getReadableDatabase(password); - } - - public SQLiteDatabase getWritableDatabase() { - return getWritableDatabase(password); // could add password field if you wanted - } - - @Override - public synchronized SQLiteDatabase getReadableDatabase(String password) { - try { - if (readableDatabase == null || !readableDatabase.isOpen()) { - readableDatabase = super.getReadableDatabase(password); - } - return readableDatabase; - } catch (Exception e) { - Log.e(TAG, "Database Error. " + e.getMessage()); - } - return readableDatabase; - } - - @Override - public synchronized SQLiteDatabase getWritableDatabase(String password) { - try { - if (writableDatabase == null || !writableDatabase.isOpen()) { - writableDatabase = super.getWritableDatabase(password); - } - } catch (Exception e) { - Log.e(TAG, "Database Error. " + e.getMessage()); - } - return writableDatabase; - } - @Override public synchronized void close() { if (readableDatabase != null) { diff --git a/sample/src/main/java/io/ona/kujaku/sample/repository/PointsRepository.java b/sample/src/main/java/io/ona/kujaku/sample/repository/PointsRepository.java index be2d10902..6d1e2a312 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/repository/PointsRepository.java +++ b/sample/src/main/java/io/ona/kujaku/sample/repository/PointsRepository.java @@ -1,9 +1,11 @@ package io.ona.kujaku.sample.repository; +import android.annotation.SuppressLint; +import android.database.Cursor; import android.util.Log; -import net.sqlcipher.Cursor; -import net.sqlcipher.database.SQLiteDatabase; + +import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.apache.commons.lang3.StringUtils; @@ -120,6 +122,7 @@ private List readPoints(Cursor cursor) { return points; } + @SuppressLint("Range") private Point createPoint(Cursor cursor) { return new Point( cursor.getInt(cursor.getColumnIndex(ID)), diff --git a/sample/src/main/res/layout/mapbox_mapview_internal.xml b/sample/src/main/res/layout/mapbox_mapview_internal.xml new file mode 100644 index 000000000..14dc13fae --- /dev/null +++ b/sample/src/main/res/layout/mapbox_mapview_internal.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +