diff --git a/configs.gradle b/configs.gradle index ab9f684c..a0af1b81 100644 --- a/configs.gradle +++ b/configs.gradle @@ -110,7 +110,6 @@ ext { mapboxAnnotationPluginVersion = "0.9.0" mapboxSdkVersion = "9.7.1" mapboxSdkTurfVersion = "7.2.0" - robolectricShadowsMultidexVersion = "4.13" robolectricVersion = "4.13" supportVersion = "1.0.0" volleyVersion = "1.2.1" @@ -123,13 +122,12 @@ ext { mapboxSDKTurf = "com.mapbox.mapboxsdk:mapbox-sdk-turf:$mapboxSdkTurfVersion" mapboxAnnotationPlugin = "com.mapbox.mapboxsdk:mapbox-android-plugin-annotation-v9:$mapboxAnnotationPluginVersion" robolectric = "org.robolectric:robolectric:$robolectricVersion" - robolectricShadowsMultidex = "org.robolectric:shadows-multidex:$robolectricShadowsMultidexVersion" } ext.mapboxDependencies = { instance, configuration -> configuration.implementation("com.mapbox.maps:android:$mapboxSdkVersion") { - transitive = true; + transitive = true exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'support-annotations' exclude group: 'com.android.support', module: 'support-fragment' diff --git a/library/build.gradle b/library/build.gradle index 1b842ea4..c628ddf5 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -13,7 +13,7 @@ buildscript { apply plugin: 'realm-android' apply plugin: 'maven-publish' -version '0.10.6-2-SNAPSHOT' +version '0.10.8-SNAPSHOT' project.version = this.version @@ -42,7 +42,6 @@ android { versionCode 1 versionName this.version testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' - multiDexEnabled true } buildTypes { @@ -57,11 +56,11 @@ android { properties.containsKey("mapbox.sdk.token")) { buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", "\"" + localProperties["mapbox.sdk.token"] + "\"" } else { - println("One of the required config variables is not set in your local.properties"); + println("One of the required config variables is not set in your local.properties") buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", "\"sample_key\"" } } else { - println("local.properties does not exist"); + println("local.properties does not exist") buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", "\"sample_key\"" } } @@ -77,11 +76,11 @@ android { properties.containsKey("mapbox.sdk.token")) { buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", "\"" + localProperties["mapbox.sdk.token"] + "\"" } else { - println("One of the required config variables is not set in your local.properties"); + println("One of the required config variables is not set in your local.properties") buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", "\"sample_key\"" } } else { - println("local.properties does not exist"); + println("local.properties does not exist") buildConfigField "String", "MAPBOX_SDK_ACCESS_TOKEN", "\"sample_key\"" } @@ -107,7 +106,7 @@ android { dependencies { configuration -> implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation (mapboxSDK) { - transitive = true; + transitive = true exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'support-annotations' exclude group: 'com.android.support', module: 'support-fragment' @@ -120,9 +119,9 @@ dependencies { configuration -> implementation mapboxAnnotationPlugin // Comment the line below when creating releases - The line is for development of the library & utils - //implementation (project(":utils")) { + implementation (project(":utils")) { // Uncomment the line below when creating releases - implementation('io.ona.kujaku:utils:0.10.6-SNAPSHOT') { + implementation('io.ona.kujaku:utils:0.10.8-SNAPSHOT') { transitive = true exclude group: 'com.mapbox.mapboxsdk', module: 'mapbox-android-sdk' exclude group: 'com.android.support', module: 'support-v4' @@ -134,8 +133,6 @@ dependencies { configuration -> implementation 'com.jakewharton.threetenabp:threetenabp:1.1.1' implementation 'com.jakewharton.timber:timber:5.0.1' - implementation 'androidx.multidex:multidex:2.0.1' - customDependencies(this, configuration) appPermissionsDependencies(configuration) infoWindowDependencies(this, configuration) @@ -147,7 +144,6 @@ private static void testDependencies(instance, configuration) { configuration.testImplementation instance.junit configuration.testImplementation instance.robolectric - configuration.testImplementation instance.robolectricShadowsMultidex configuration.testImplementation 'org.mockito:mockito-inline:5.2.0' diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index b069283b..9ab78274 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + diff --git a/library/src/main/java/io/ona/kujaku/helpers/PermissionsHelper.java b/library/src/main/java/io/ona/kujaku/helpers/PermissionsHelper.java index 2ba9daa5..021e0091 100644 --- a/library/src/main/java/io/ona/kujaku/helpers/PermissionsHelper.java +++ b/library/src/main/java/io/ona/kujaku/helpers/PermissionsHelper.java @@ -9,23 +9,33 @@ import com.karumi.dexter.Dexter; import com.karumi.dexter.listener.multi.MultiplePermissionsListener; +import java.util.ArrayList; +import java.util.List; + import io.ona.kujaku.utils.KujakuMultiplePermissionListener; +import timber.log.Timber; public class PermissionsHelper { public static void checkPermissions(String TAG, Context context) { if (context instanceof Activity) { + List permissions = new ArrayList<>(); + permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S) { + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } final Activity activity = (Activity) context; MultiplePermissionsListener dialogMultiplePermissionListener = new KujakuMultiplePermissionListener(activity); Dexter.withActivity(activity) - .withPermissions(Manifest.permission.ACCESS_FINE_LOCATION, (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) ? Manifest.permission.MANAGE_EXTERNAL_STORAGE : Manifest.permission.WRITE_EXTERNAL_STORAGE) + .withPermissions(permissions) .withListener(dialogMultiplePermissionListener) .check(); } else { - Log.wtf(TAG, "KujakuMapView was not started in an activity!! This is very bad or it is being used in tests. We are going to ignore the permissions check! Good luck"); + Timber.tag(TAG).wtf("KujakuMapView was not started in an activity!! This is very bad or it is being used in tests. We are going to ignore the permissions check! Good luck"); } } } diff --git a/library/src/test/java/io/ona/kujaku/helpers/PermissionsHelperTest.java b/library/src/test/java/io/ona/kujaku/helpers/PermissionsHelperTest.java new file mode 100644 index 00000000..b7f2483d --- /dev/null +++ b/library/src/test/java/io/ona/kujaku/helpers/PermissionsHelperTest.java @@ -0,0 +1,56 @@ +package io.ona.kujaku.helpers; + +import static org.junit.Assert.assertFalse; + +import android.app.Activity; +import android.content.Context; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import com.karumi.dexter.MultiplePermissionsReport; +import io.ona.kujaku.utils.KujakuMultiplePermissionListener; + +@RunWith(RobolectricTestRunner.class) +public class PermissionsHelperTest { + + @Mock + Context mockContext; + + @Before + public void setUp() { + MockitoAnnotations.openMocks(this); + // Use a real context + mockContext = Robolectric.setupActivity(Activity.class).getApplicationContext(); + } + + @Test + public void testOnPermissionsCheckedWhenAnyPermissionPermanentlyDenied() { + MultiplePermissionsReport report = Mockito.mock(MultiplePermissionsReport.class); + Mockito.when(report.isAnyPermissionPermanentlyDenied()).thenReturn(true); + Mockito.when(report.areAllPermissionsGranted()).thenReturn(false); + KujakuMultiplePermissionListener listener = new KujakuMultiplePermissionListener(mockContext); + listener.onPermissionsChecked(report); + + // Check that the dialog was created with the expected properties + Mockito.verify(report).isAnyPermissionPermanentlyDenied(); + } + + @Test + public void testOnPermissionsCheckedWhenAnyPermissionNotPermanentlyDenied() { + MultiplePermissionsReport report = Mockito.mock(MultiplePermissionsReport.class); + Mockito.when(report.isAnyPermissionPermanentlyDenied()).thenReturn(false); + Mockito.when(report.areAllPermissionsGranted()).thenReturn(false); + KujakuMultiplePermissionListener listener = new KujakuMultiplePermissionListener(mockContext); + listener.onPermissionsChecked(report); + + boolean result = report.isAnyPermissionPermanentlyDenied(); + + // Use the result in your assertions or further logic + assertFalse(result); + } +} diff --git a/sample/build.gradle b/sample/build.gradle index 605c46ae..5cd408b7 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -28,7 +28,6 @@ android { versionCode getMasterCommitCount() versionName getVersionName() - multiDexEnabled true testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } @@ -95,8 +94,6 @@ dependencies { configuration -> exclude group: "com.android.support", module: "appcompat-v7" } - implementation 'androidx.multidex:multidex:2.0.1' - testImplementation junit testImplementation robolectric } @@ -111,7 +108,7 @@ private static void libraryModuleDevelopment(instance, configuration) { } configuration.implementation(instance.project(":utils")) { - transitive = true; + transitive = true exclude group: 'com.mapbox.mapboxsdk', module: 'mapbox-android-sdk' exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'appcompat-v7' @@ -119,7 +116,7 @@ private static void libraryModuleDevelopment(instance, configuration) { } configuration.implementation(instance.mapboxSDK) { - transitive = true; + transitive = true exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'support-annotations' exclude group: 'com.android.support', module: 'support-fragment' 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 7260838f..e9703d27 100644 --- a/sample/src/main/java/io/ona/kujaku/sample/MyApplication.java +++ b/sample/src/main/java/io/ona/kujaku/sample/MyApplication.java @@ -1,6 +1,5 @@ package io.ona.kujaku.sample; -import androidx.multidex.MultiDexApplication; import io.ona.kujaku.KujakuLibrary; import io.ona.kujaku.sample.repository.KujakuRepository; import io.ona.kujaku.sample.repository.PointsRepository; @@ -8,7 +7,9 @@ import static io.ona.kujaku.sample.util.Constants.DATABASE_NAME; -public class MyApplication extends MultiDexApplication { +import android.app.Application; + +public class MyApplication extends Application { private static final String TAG = MyApplication.class.getName(); diff --git a/utils/build.gradle b/utils/build.gradle index fb65ccbc..f7c56d47 100644 --- a/utils/build.gradle +++ b/utils/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'maven-publish' apply plugin: 'jacoco' -version '0.10.6-SNAPSHOT' +version '0.10.8-SNAPSHOT' project.version = this.version