diff --git a/androidshared/src/main/java/org/odk/collect/androidshared/system/OpenGLVersionChecker.kt b/androidshared/src/main/java/org/odk/collect/androidshared/system/OpenGLVersionChecker.kt new file mode 100644 index 00000000000..99ddbc053f0 --- /dev/null +++ b/androidshared/src/main/java/org/odk/collect/androidshared/system/OpenGLVersionChecker.kt @@ -0,0 +1,28 @@ +package org.odk.collect.androidshared.system + +import android.app.ActivityManager +import android.content.Context + +/** + * Checks if the device supports the given OpenGL ES version. + * + * Note: This approach may not be 100% reliable because `reqGlEsVersion` indicates + * the highest version of OpenGL ES that the device's hardware is guaranteed to support + * at runtime. However, it might not always reflect the actual version available. + * + * For a more reliable method, refer to https://developer.android.com/develop/ui/views/graphics/opengl/about-opengl#version-check. + * This recommended approach is more complex to implement but offers better accuracy. + */ +object OpenGLVersionChecker { + @JvmStatic + fun isOpenGLv2Supported(context: Context): Boolean { + return (context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) + .deviceConfigurationInfo.reqGlEsVersion >= 0x20000 + } + + @JvmStatic + fun isOpenGLv3Supported(context: Context): Boolean { + return (context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) + .deviceConfigurationInfo.reqGlEsVersion >= 0x30000 + } +} diff --git a/collect_app/src/main/AndroidManifest.xml b/collect_app/src/main/AndroidManifest.xml index 00cb93ce1cd..1a50a0ccfe4 100644 --- a/collect_app/src/main/AndroidManifest.xml +++ b/collect_app/src/main/AndroidManifest.xml @@ -26,6 +26,9 @@ the specific language governing permissions and limitations under the License. + diff --git a/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java b/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java index 9e4b76999dc..882a0967295 100644 --- a/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java +++ b/google-maps/src/main/java/org/odk/collect/googlemaps/GoogleMapConfigurator.java @@ -4,7 +4,6 @@ import static org.odk.collect.androidshared.ui.PrefUtils.getInt; import static kotlin.collections.SetsKt.setOf; -import android.app.ActivityManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -14,6 +13,7 @@ import com.google.android.gms.maps.GoogleMap; +import org.odk.collect.androidshared.system.OpenGLVersionChecker; import org.odk.collect.androidshared.system.PlayServicesChecker; import org.odk.collect.androidshared.ui.ToastUtils; import org.odk.collect.maps.MapConfigurator; @@ -55,10 +55,11 @@ private static boolean isGooglePlayServicesAvailable(Context context) { } private static boolean isGoogleMapsSdkAvailable(Context context) { - // The Google Maps SDK for Android requires OpenGL ES version 2. - // See https://developers.google.com/maps/documentation/android-sdk/config - return ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)) - .getDeviceConfigurationInfo().reqGlEsVersion >= 0x20000; + /* + * The Google Maps SDK for Android requires OpenGL ES version 2. + * See: https://developers.google.com/maps/documentation/android-sdk/config + */ + return OpenGLVersionChecker.isOpenGLv2Supported(context); } @Override public void showUnavailableMessage(Context context) { diff --git a/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java b/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java index 2a173ec51e7..aa757526ee0 100644 --- a/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java +++ b/mapbox/src/main/java/org/odk/collect/mapbox/MapboxMapConfigurator.java @@ -10,6 +10,7 @@ import com.mapbox.maps.Style; +import org.odk.collect.androidshared.system.OpenGLVersionChecker; import org.odk.collect.androidshared.ui.PrefUtils; import org.odk.collect.androidshared.ui.ToastUtils; import org.odk.collect.maps.MapConfigurator; @@ -42,8 +43,11 @@ public MapboxMapConfigurator() { } @Override public boolean isAvailable(Context context) { - // If the app builds that means mapbox is available - return true; + /* + * The Mapbox SDK for Android requires OpenGL ES version 3. + * See: https://github.com/mapbox/mapbox-maps-android/blob/main/CHANGELOG.md#1100-november-29-2023 + */ + return OpenGLVersionChecker.isOpenGLv3Supported(context); } @Override public void showUnavailableMessage(Context context) {