From 3e5101aab82e481fe52f689bc34fcfa361b972d6 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 17 Jul 2025 16:50:39 +0200 Subject: [PATCH 01/14] Also support lower android version --- app/build.gradle | 4 +-- app/src/main/AndroidManifest.xml | 3 +- .../java/org/mapcomplete/MainActivity.java | 31 ++++++++++++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cb92a36e..06e24348 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,8 +5,8 @@ android { compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "org.mapcomplete" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion + minSdk 30 + targetSdkVersion targetSdkVersion versionCode 9 versionName "debug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 817307d1..1bebc67d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - + + { - System.out.println("Back button pressed"); - if (this.backbutton != null) { - Databridge.sendAnswerTo(this.backbutton, "backbutton pressed"); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getOnBackInvokedDispatcher().registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_OVERLAY, + () -> { + System.out.println("Back button pressed"); + if (this.backbutton != null) { + Databridge.sendAnswerTo(this.backbutton, "backbutton pressed"); + } } - } - ); + ); + } } + @Override + public void onBackPressed() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + System.out.println("Back button pressed (old)"); + if (this.backbutton != null) { + Databridge.sendAnswerTo(this.backbutton, "backbutton pressed"); + } + }else{ + super.onBackPressed(); + } + + } + + private boolean hasGeolocationPermission() { return ContextCompat.checkSelfPermission( From b7b29d20e40bde9144c719a2b59484c04cc79b9f Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sun, 20 Jul 2025 16:34:22 +0200 Subject: [PATCH 02/14] Reverse min and target SDK version --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 06e24348..14e6c8c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,9 +5,9 @@ android { compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "org.mapcomplete" - minSdk 30 - targetSdkVersion targetSdkVersion - versionCode 9 + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 11 versionName "debug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { From 17f87a9611771926937505c16d71a3972dcf7d25 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 21 Jul 2025 20:17:34 +0200 Subject: [PATCH 03/14] Revert "Reverse min and target SDK version" This reverts commit b7b29d20e40bde9144c719a2b59484c04cc79b9f. --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 14e6c8c4..06e24348 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,9 +5,9 @@ android { compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "org.mapcomplete" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 11 + minSdk 30 + targetSdkVersion targetSdkVersion + versionCode 9 versionName "debug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { From 4bb7346a3b3c8ea471592f2a3a57049053399767 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 21 Jul 2025 21:15:53 +0200 Subject: [PATCH 04/14] Add automatic builds for lower android versions --- .forgejo/workflows/on_release.yml | 14 +++++++------- app/build.gradle | 8 +++++++- scripts/compile_version.sh | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 8 deletions(-) create mode 100755 scripts/compile_version.sh diff --git a/.forgejo/workflows/on_release.yml b/.forgejo/workflows/on_release.yml index a9706bcf..471ef209 100644 --- a/.forgejo/workflows/on_release.yml +++ b/.forgejo/workflows/on_release.yml @@ -46,15 +46,15 @@ jobs: ./gradlew assembleRelease rm -rf app/build/outputs/apk/release/baselineProfiles rm -rf app/build/outputs/apk/release/output-metadata.json - - - name: Upload APK to hetzner - shell: bash - run: | TAG=$( echo ${{ env.GITHUB_REF_NAME }} ) scp app/build/outputs/apk/release/app-release.apk hetzner:~/public/apk/mapcomplete-$TAG.apk - if [[ ! $tag =~ -sfw$ ]]; then - ssh hetzner 'rm -f public/apk/mapcomplete-latest.apk && cp "public/apk/$(ls -v public/apk/ | tail -n 1)" public/apk/mapcomplete-latest.apk' - fi + ssh hetzner 'rm -f public/apk/mapcomplete-latest.apk && cp "public/apk/$(ls -v public/apk/ | tail -n 1)" public/apk/mapcomplete-latest.apk' + # Build versions vor legacy + ./scripts/compile_version.shs $TAG 9-PIE 28 + ./scripts/compile_version.sh $TAG 10-QUINCE-TART 29 + ./scripts/compile_version.sh $TAG 11-RED-VELVET-CAKE 30 + ./scripts/compile_version.sh $TAG 12-SNOW-CONE 31 + ./scripts/compile_version.sh $TAG 13-TIRAMISU 32 - name: Upload APK to forgejo releases (MapComplete) uses: https://source.mapcomplete.org/actions/forgejo-release@v2.6.0 diff --git a/app/build.gradle b/app/build.gradle index 06e24348..6e52ddef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ android { compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "org.mapcomplete" - minSdk 30 + minSdk 33 targetSdkVersion targetSdkVersion versionCode 9 versionName "debug" @@ -75,3 +75,9 @@ try { } catch(Exception e) { logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") } +android { + lintOptions { + checkReleaseBuilds false + abortOnError false + } +} diff --git a/scripts/compile_version.sh b/scripts/compile_version.sh new file mode 100755 index 00000000..b43d25cc --- /dev/null +++ b/scripts/compile_version.sh @@ -0,0 +1,16 @@ +#! /bin/bash + +# Edit the 'build.gradle' file to a certain target sdk +TAG="$1" +LABEL="$2" +VERSION="$3" + +echo "Setting $VERSION" +# sed -i "s/compileSdkVersion *[0-9]\+/compileSdkVersion $VERSION/" app/build.gradle +sed -i "s/minSdk *[0-9]\+/minSdk $VERSION/" app/build.gradle +sed -i "s/targetSdkVersion *[0-9]\+/targetSdkVersion $VERSION/" app/build.gradle + +./gradlew build + +scp app/build/outputs/apk/release/app-release.apk hetzner:~/public/apk/mapcomplete-$TAG-$LABEL.apk +ssh hetzner "cp ~/public/apk/mapcomplete-$TAG-$LABEL.apk ~/public/apk/mapcomplete-latest-$LABEL.apk" From bdbf5511323675428307fe4f30ad43864a304539 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 21 Jul 2025 22:14:07 +0200 Subject: [PATCH 05/14] Disable insets unless android >= 15 --- .../java/org/mapcomplete/MainActivity.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/mapcomplete/MainActivity.java b/app/src/main/java/org/mapcomplete/MainActivity.java index 85b61c6c..eae6d9b3 100644 --- a/app/src/main/java/org/mapcomplete/MainActivity.java +++ b/app/src/main/java/org/mapcomplete/MainActivity.java @@ -67,18 +67,20 @@ public class MainActivity extends BridgeActivity { }); super.onCreate(savedInstanceState); - WindowCompat.setDecorFitsSystemWindows(getWindow(), false); - Databridge.addResponder("insets", (responder) -> { - var view = getWindow().getDecorView(); - var insets = view.getRootWindowInsets(); - var topInsetPxSize= insets.getInsetsIgnoringVisibility(WindowInsets.Type.statusBars()).top; - var bottomInsetPxSize= insets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()).bottom; - - var json = "{ \"top\": "+topInsetPxSize+", \"bottom\":"+bottomInsetPxSize+"}"; - Log.i("insets","Inset sizes are:"+topInsetPxSize+" bottom:"+ bottomInsetPxSize); - Databridge.sendAnswerTo(responder, json); - }); + var useInsets = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE; + WindowCompat.setDecorFitsSystemWindows(getWindow(), useInsets); + if(useInsets) { + Databridge.addResponder("insets", (responder) -> { + var view = getWindow().getDecorView(); + var insets = view.getRootWindowInsets(); + var topInsetPxSize = insets.getInsetsIgnoringVisibility(WindowInsets.Type.statusBars()).top; + var bottomInsetPxSize = insets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()).bottom; + var json = "{ \"top\": " + topInsetPxSize + ", \"bottom\":" + bottomInsetPxSize + "}"; + Log.i("insets", "Inset sizes are:" + topInsetPxSize + " bottom:" + bottomInsetPxSize); + Databridge.sendAnswerTo(responder, json); + }); + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_OVERLAY, From a48aaffec4ca59a2129834207e72ee3df85d2cd6 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 21 Jul 2025 22:28:13 +0200 Subject: [PATCH 06/14] Disable insets unless android >= 15 --- app/src/main/java/org/mapcomplete/MainActivity.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mapcomplete/MainActivity.java b/app/src/main/java/org/mapcomplete/MainActivity.java index eae6d9b3..4ec5fc1d 100644 --- a/app/src/main/java/org/mapcomplete/MainActivity.java +++ b/app/src/main/java/org/mapcomplete/MainActivity.java @@ -67,8 +67,9 @@ public class MainActivity extends BridgeActivity { }); super.onCreate(savedInstanceState); - var useInsets = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE; - WindowCompat.setDecorFitsSystemWindows(getWindow(), useInsets); + var useInsets = Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE; + Log.i("Insets","Using insets:"+useInsets+", sdk_int:"+Build.VERSION.SDK_INT+" "+Build.VERSION_CODES.UPSIDE_DOWN_CAKE); + WindowCompat.setDecorFitsSystemWindows(getWindow(), !useInsets); if(useInsets) { Databridge.addResponder("insets", (responder) -> { var view = getWindow().getDecorView(); @@ -80,6 +81,8 @@ public class MainActivity extends BridgeActivity { Log.i("insets", "Inset sizes are:" + topInsetPxSize + " bottom:" + bottomInsetPxSize); Databridge.sendAnswerTo(responder, json); }); + }else{ + Log.i("insets","Not enabling insets, version to low"); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { From 3aa85d562e692ea3d8b9a7a7ca58931ede87ec5c Mon Sep 17 00:00:00 2001 From: Midgard Date: Tue, 22 Jul 2025 16:57:03 +0200 Subject: [PATCH 07/14] Fix spelling in application description And reword the line about images for clarity --- metadata/en-US/full_description.txt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/metadata/en-US/full_description.txt b/metadata/en-US/full_description.txt index a627fea4..1fed9fa5 100644 --- a/metadata/en-US/full_description.txt +++ b/metadata/en-US/full_description.txt @@ -1,15 +1,15 @@ -MapComplete has more then 70 maps, each showing features withing a certain topic. For example: +MapComplete has more than 70 maps, each showing features within a certain topic. For example: -- Restaurants, including information about vegan, vegetarian, glutenfree and lactosefree options +- Restaurants, including information about vegan, vegetarian, gluten-free and lactose-free options - Shops -- healthcare providers such as doctors, pharmacies, dentists, physical therapists,... +- Healthcare providers such as doctors, pharmacies, dentists, physical therapists... - Vending machines - Drinking water fountains - Public bookcases - Public toilets -- Defibrillators (AED) +- Defibrillators (AEDs) - Bicycle pumps and bicycle shops -- Artworks and status +- Artworks and statues - Benches - Waste baskets and containers - Pubs @@ -17,7 +17,7 @@ MapComplete has more then 70 maps, each showing features withing a certain topic - Charging stations - Surveillance cameras - Advertisement billboards -- cClimbing gyms +- Climbing gyms - Schools - Memorials - Hackerspaces @@ -25,6 +25,5 @@ MapComplete has more then 70 maps, each showing features withing a certain topic When selecting an item, all the relevant information is shown in a user-friendly way. Unknown information can be easily added by answering the questions, which will be saved into OpenStreetMap directly (this requires a free account). -An (anonymous) review can left for some types of features, which is hosted by https://Mangrove.reviews, an libre and open data review project. -Images can be added via Panoramax, but will also be pulled from various sources such as Wikipedia and Mapillary. - +An (anonymous) review can be left for some types of features, hosted by https://Mangrove.reviews, a libre and open data review project. +Images are fetched from various sources, such as Panoramax, Wikipedia and Mapillary. New images can be contributed to Panoramax directly from within MapComplete. From c15e95245eb6f278295c77da9644d53bfb30a113 Mon Sep 17 00:00:00 2001 From: wjtje Date: Mon, 11 Aug 2025 11:50:57 +0200 Subject: [PATCH 08/14] Enable EdgeToEdge mode by default, also on android versions lower that 15 --- app/src/main/java/org/mapcomplete/MainActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/mapcomplete/MainActivity.java b/app/src/main/java/org/mapcomplete/MainActivity.java index 4ec5fc1d..e297f306 100644 --- a/app/src/main/java/org/mapcomplete/MainActivity.java +++ b/app/src/main/java/org/mapcomplete/MainActivity.java @@ -11,6 +11,7 @@ import android.view.Window; import android.view.WindowInsets; import android.window.OnBackInvokedDispatcher; +import androidx.activity.EdgeToEdge; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -67,6 +68,8 @@ public class MainActivity extends BridgeActivity { }); super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + var useInsets = Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE; Log.i("Insets","Using insets:"+useInsets+", sdk_int:"+Build.VERSION.SDK_INT+" "+Build.VERSION_CODES.UPSIDE_DOWN_CAKE); WindowCompat.setDecorFitsSystemWindows(getWindow(), !useInsets); From b0824407b1cd373cf1bd4b3034ac54be9549b875 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 19 Aug 2025 17:37:30 +0200 Subject: [PATCH 09/14] Fix build script --- .forgejo/workflows/on_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/on_release.yml b/.forgejo/workflows/on_release.yml index 471ef209..f9a8abed 100644 --- a/.forgejo/workflows/on_release.yml +++ b/.forgejo/workflows/on_release.yml @@ -50,7 +50,7 @@ jobs: scp app/build/outputs/apk/release/app-release.apk hetzner:~/public/apk/mapcomplete-$TAG.apk ssh hetzner 'rm -f public/apk/mapcomplete-latest.apk && cp "public/apk/$(ls -v public/apk/ | tail -n 1)" public/apk/mapcomplete-latest.apk' # Build versions vor legacy - ./scripts/compile_version.shs $TAG 9-PIE 28 + ./scripts/compile_version.sh $TAG 9-PIE 28 ./scripts/compile_version.sh $TAG 10-QUINCE-TART 29 ./scripts/compile_version.sh $TAG 11-RED-VELVET-CAKE 30 ./scripts/compile_version.sh $TAG 12-SNOW-CONE 31 From 5f0fb91b4915d579722934752c19db4443c92d0f Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 19 Aug 2025 18:23:52 +0200 Subject: [PATCH 10/14] Fix build script --- .forgejo/workflows/on_release.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/on_release.yml b/.forgejo/workflows/on_release.yml index f9a8abed..aee47435 100644 --- a/.forgejo/workflows/on_release.yml +++ b/.forgejo/workflows/on_release.yml @@ -44,18 +44,21 @@ jobs: export keyPassword=${{ secrets.KEY_PASSWORD }} ./gradlew build ./gradlew assembleRelease - rm -rf app/build/outputs/apk/release/baselineProfiles - rm -rf app/build/outputs/apk/release/output-metadata.json TAG=$( echo ${{ env.GITHUB_REF_NAME }} ) scp app/build/outputs/apk/release/app-release.apk hetzner:~/public/apk/mapcomplete-$TAG.apk ssh hetzner 'rm -f public/apk/mapcomplete-latest.apk && cp "public/apk/$(ls -v public/apk/ | tail -n 1)" public/apk/mapcomplete-latest.apk' - # Build versions vor legacy + # Build versions for legacy versions ./scripts/compile_version.sh $TAG 9-PIE 28 ./scripts/compile_version.sh $TAG 10-QUINCE-TART 29 ./scripts/compile_version.sh $TAG 11-RED-VELVET-CAKE 30 ./scripts/compile_version.sh $TAG 12-SNOW-CONE 31 ./scripts/compile_version.sh $TAG 13-TIRAMISU 32 + - name: clean intermediate files + run: | + rm -rf app/build/outputs/apk/release/baselineProfiles + rm -rf app/build/outputs/apk/release/output-metadata.json + - name: Upload APK to forgejo releases (MapComplete) uses: https://source.mapcomplete.org/actions/forgejo-release@v2.6.0 with: From 817e8198b5e4c30572d7d3f082d60fc10a7be21e Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 20 Aug 2025 14:28:48 +0200 Subject: [PATCH 11/14] Formatting --- .forgejo/workflows/on_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/on_release.yml b/.forgejo/workflows/on_release.yml index aee47435..fd1a0309 100644 --- a/.forgejo/workflows/on_release.yml +++ b/.forgejo/workflows/on_release.yml @@ -58,7 +58,7 @@ jobs: run: | rm -rf app/build/outputs/apk/release/baselineProfiles rm -rf app/build/outputs/apk/release/output-metadata.json - + - name: Upload APK to forgejo releases (MapComplete) uses: https://source.mapcomplete.org/actions/forgejo-release@v2.6.0 with: From ea7cadde4e17d27df013ec3b3497a494e709d476 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 3 Sep 2025 00:17:20 +0200 Subject: [PATCH 12/14] Attempt to support lower android versions too --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6e52ddef..5a28623f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,9 +5,9 @@ android { compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "org.mapcomplete" - minSdk 33 + minSdk 28 targetSdkVersion targetSdkVersion - versionCode 9 + versionCode 10 versionName "debug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { From 1180d3cfdd1cf9ea9f439c9a3c4ab9ec490ccda1 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 3 Sep 2025 01:09:05 +0200 Subject: [PATCH 13/14] Attempt to support lower android versions too --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5a28623f..3642aaff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "org.mapcomplete" minSdk 28 - targetSdkVersion targetSdkVersion + targetSdkVersion 35 versionCode 10 versionName "debug" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" From dc3f3f5ac3d4d42bed7aeb58ff5386a063dbac06 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 3 Sep 2025 01:09:19 +0200 Subject: [PATCH 14/14] Add inset fallback if insets are not used, add exit functionality --- app/src/main/java/org/mapcomplete/MainActivity.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mapcomplete/MainActivity.java b/app/src/main/java/org/mapcomplete/MainActivity.java index e297f306..2698fe72 100644 --- a/app/src/main/java/org/mapcomplete/MainActivity.java +++ b/app/src/main/java/org/mapcomplete/MainActivity.java @@ -20,7 +20,7 @@ import androidx.core.view.WindowCompat; import com.getcapacitor.BridgeActivity; import com.getcapacitor.JSObject; import com.getcapacitor.PluginCall; - +import android.app.Activity; public class MainActivity extends BridgeActivity { private PluginCall locationRequest = null; @@ -67,6 +67,11 @@ public class MainActivity extends BridgeActivity { responder.setKeepAlive(true); }); + Databridge.addResponder("exit", responder -> { + Log.i("databridge","got exit request"); + finishAffinity(); + }); + super.onCreate(savedInstanceState); EdgeToEdge.enable(this); @@ -86,6 +91,10 @@ public class MainActivity extends BridgeActivity { }); }else{ Log.i("insets","Not enabling insets, version to low"); + Databridge.addResponder("insets", (responder) -> { + var json = "{ \"top\": 0, \"bottom\": 0}"; + Databridge.sendAnswerTo(responder, json); + }); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {